Eu tenho um grande banco de dados MySql (150 GB) e só agora notei que o innodb_file_per_table
está definido para off
o que faz com que todo o banco de dados seja hospedado em um único arquivo ( ibdata1
). Eu quero ativar innodb_file_per_table
e dividir retroativamente o banco de dados em vários arquivos, qual é a melhor maneira de fazer isso?
relate perguntas
-
Existem ferramentas de benchmarking do MySQL? [fechado]
-
Onde posso encontrar o log lento do mysql?
-
Como posso otimizar um mysqldump de um banco de dados grande?
-
Quando é o momento certo para usar o MariaDB em vez do MySQL e por quê?
-
Como um grupo pode rastrear alterações no esquema do banco de dados?
Há realmente apenas uma maneira de fazer isso. Você terá que exportar os dados usando mysqldumps, descartar todos os bancos de dados, desligar o mysqld, excluir ib_logfile0, excluir ib_logfile1, excluir ibdata1, adicionar
innodb_file_per_table
sob o[mysqld]
título, iniciar o mysql.Eu postei esta resposta no StackOverflow em outubro de 2010
Aqui estão as etapas listadas verticalmente:
Etapa 01) MySQLDump todos os bancos de dados em um arquivo de texto SQL (chame-o SQLData.sql)
Etapa 02) Elimine todos os bancos de dados (exceto o esquema mysql)
Etapa 03) Desligar o mysql
CAVEAT : Para limpar totalmente as transações não confirmadas dos arquivos InnoDB, execute este
Etapa 04) Adicione as seguintes linhas ao /etc/my.cnf
Nota: Seja qual for o seu conjunto para innodb_buffer_pool_size, certifique-se de que innodb_log_file_size seja 25% de innodb_buffer_pool_size.
Etapa 05) Excluir ibdata1, ib_logfile0 e ib_logfile1
Neste ponto, deve haver apenas o esquema mysql em /var/lib/mysql
Passo 06) Reinicie o mysql
Isso recriará ibdata1 em 10 MB, ib_logfile0 e ib_logfile1 em 1 G cada
Etapa 07) Recarregue SQLData.sql no mysql
ibdata1 crescerá, mas conterá apenas metadados de tabela
Cada tabela InnoDB existirá fora do ibdata1
Suponha que você tenha uma tabela InnoDB chamada mydb.mytable. Se você entrar em /var/lib/mysql/mydb, verá dois arquivos representando a tabela
ibdata1 nunca mais conterá dados e índices do InnoDB.
Com a opção innodb_file_per_table em /etc/my.cnf, você pode executar OPTIMIZE TABLE mydb.mytable e o arquivo /var/lib/mysql/mydb/mytable.ibd será reduzido.
Eu fiz isso muitas vezes na minha carreira como DBA MySQL
Na verdade, na primeira vez que fiz isso, reduzi um arquivo ibdata1 de 50 GB em 500 MB.
De uma chance. Se você tiver mais dúvidas sobre isso, envie-me um e-mail. Confie em mim. Isso funcionará no curto prazo e no longo prazo. !!!
Existe uma alternativa que extrairá a tabela InnoDB sem reduzir ibdata1.
Etapa 01) Adicione as seguintes linhas ao /etc/my.cnf
Etapa 02)
service mysql restart
Etapa 03) Para extrair uma única tabela InnoDB chamada mydb.mytable, faça o seguinte:
Isto irácriar um arquivo pleus manter o arquivo de estrutura original
Você pode fazer isso para cada tabela InnoDB. Infelizmente, o ibdata1 permanecerá com 150 GB.
Se você deseja recuperar o espaço do ibdata, um dump/restore é sua única opção, como Rolando aponta. Também é provavelmente melhor para o desempenho fazer isso.
No entanto, se você quiser apenas reduzir suas perdas e 'perder' aqueles 150 GB no disco rígido, basta habilitar
innodb_file_per_table
no my.cnf e reiniciar o servidor.Em seguida, para cada tabela, emita:
O problema aqui é que grandes tablespaces demoram um pouco.
O que eu sugiro é configurar um escravo do seu banco de dados ao vivo, execute a conversão no escravo, desligue o mestre/escravo e copie o novo espaço de dados para o mestre ou promova o escravo a mestre assim que ele alcançar .
Você terá dificuldade em fazer essa alteração sem nenhum tempo de inatividade.