Estou usando o MySQL no localhost como uma "ferramenta de consulta" para executar estatísticas no R, ou seja, toda vez que executo um script R, crio um novo banco de dados (A), crio uma nova tabela (B), importo os dados para B , envie uma consulta para obter o que eu preciso e, em seguida, solto B e solto A.
Está funcionando bem para mim, mas percebo que o tamanho do arquivo ibdata está aumentando rapidamente, não guardei nada no MySQL, mas o arquivo ibdata1 já ultrapassava 100 MB.
Estou usando a configuração MySQL mais ou menos padrão para a instalação. Existe uma maneira de reduzir / limpar automaticamente o arquivo ibdata1 após um período fixo de tempo?
Respostas:
Isso
ibdata1
não está diminuindo, é um recurso particularmente irritante do MySQL. Naibdata1
verdade, o arquivo não pode ser reduzido a menos que você exclua todos os bancos de dados, remova os arquivos e recarregue um despejo.Mas você pode configurar o MySQL para que cada tabela, incluindo seus índices, seja armazenada como um arquivo separado. Dessa forma
ibdata1
, não crescerá tão grande. De acordo com o comentário de Bill Karwin, isso é ativado por padrão a partir da versão 5.6.6 do MySQL.Foi há um tempo atrás que eu fiz isso. No entanto, para configurar o servidor para usar arquivos separados para cada tabela, é necessário alterar
my.cnf
para permitir isso:http://dev.mysql.com/doc/refman/5.5/en/innodb-multiple-tablespaces.html
Como você deseja recuperar o espaço, na
ibdata1
verdade você precisa excluir o arquivo:mysqldump
de todos os bancos de dados, procedimentos, gatilhos etc , exceto omysql
eperformance_schema
bancos de dadosibdata1
eib_log
arquivosQuando você inicia o MySQL na etapa 5, os arquivos
ibdata1
eib_log
serão recriados.Agora você está pronto para ir. Quando você cria um novo banco de dados para análise, as tabelas serão localizadas em
ibd*
arquivos separados , e não emibdata1
. Como você geralmente descarta o banco de dados logo depois, osibd*
arquivos serão excluídos.http://dev.mysql.com/doc/refman/5.1/en/drop-database.html
Você provavelmente já viu isso:
http://bugs.mysql.com/bug.php?id=1341
Ao usar o comando
ALTER TABLE <tablename> ENGINE=innodb
ouOPTIMIZE TABLE <tablename>
se pode extrair dados e páginas de índice de ibdata1 para arquivos separados. No entanto, ibdata1 não será reduzido a menos que você execute as etapas acima.Em relação ao
information_schema
, isso não é necessário nem possível cair. Na verdade, é apenas um monte de visualizações somente leitura, não tabelas. E não há arquivos associados a eles, nem mesmo um diretório de banco de dados. Oinformations_schema
está usando o mecanismo db de memória e é descartado e regenerado após a parada / reinicialização do mysqld. Consulte https://dev.mysql.com/doc/refman/5.7/en/information-schema.html .fonte
innodb_file_per_table
por padrão.Adicionando à resposta de John P ,
Para um sistema linux, as etapas 1 a 6 podem ser realizadas com estes comandos:
mysqldump -u [username] -p[root_password] [database_name] > dumpfilename.sql
DROP DATABASE [database_name];
sudo /etc/init.d/mysqld stop
sudo rm /var/lib/mysql/ibdata1
sudo rm /var/lib/mysql/ib_logfile
(e exclua outros ib_logfiles que possam ser nomeadosib_logfile0
,ib_logfile1
etc ...)sudo /etc/init.d/mysqld start
create database [database_name];
mysql -u [username]-p[root_password] [database_name] < dumpfilename.sql
Aviso: estas instruções farão com que você perca outros bancos de dados se houver outros bancos de dados nessa instância do mysql. Verifique se as etapas 1,2 e 6,7 foram modificadas para cobrir todos os bancos de dados que você deseja manter.
fonte
create database database_name;
e depoisgrant all privileges on database_name.* to 'username'@'localhost' identified by 'password';
Password:
prompt (que é uma prática mais segura), basta colocar-p
sem nenhuma senha real.Quando você exclui tabelas innodb, o MySQL não libera o espaço dentro do arquivo ibdata, é por isso que continua crescendo. Esses arquivos quase nunca encolhem.
Como reduzir um arquivo ibdata existente:
http://dev.mysql.com/doc/refman/5.5/en/innodb-resize-system-tablespace.html
Você pode criar um script e agendar o script para execução após um período fixo de tempo, mas para a instalação descrita acima, parece que vários espaços de tabela são uma solução mais fácil.
Se você usar a opção de configuração
innodb_file_per_table
, crie vários espaços de tabela. Ou seja, o MySQL cria arquivos separados para cada tabela em vez de um arquivo compartilhado. Esses arquivos separados são armazenados no diretório do banco de dados e são excluídos quando você exclui esse banco de dados. Isso deve remover a necessidade de reduzir / remover arquivos ibdata no seu caso.Mais informações sobre vários espaços de tabela:
http://dev.mysql.com/doc/refman/5.5/en/innodb-multiple-tablespaces.html
fonte
Eu acho que você pode encontrar uma boa explicação e solução lá:
http://vdachev.net/2007/02/22/mysql-reducing-ibdata1/
fonte
Script rapidamente o procedimento da resposta aceita no bash:
Salvar como
purge_binlogs.sh
e executar comoroot
.Exclui
mysql
,information_schema
,performance_schema
(ebinlog
diretório).Supõe que você tenha credenciais de administrador
/root/.my.cnf
e que seu banco de dados esteja no/var/lib/mysql
diretório padrão .Você também pode limpar os logs binários depois de executar este script para recuperar mais espaço em disco com:
fonte
alldatabases.sql
antes de verificar novamente se todas as tabelas estão em boas condições. Quanto a algumas melhorias: definainnodb_fast_shutdown=0
antes do desligamento, definaautocommit=0
antes de importar o arquivo SQL, executeCOMMIT
e definaautocommit=1
após a importação do arquivo SQL, usemysqlcheck --all-databases
antes de excluir o backup.Se seu objetivo é monitorar o espaço livre do MySQL e você não pode parar o MySQL para reduzir seu arquivo ibdata, faça-o através dos comandos de status da tabela. Exemplo:
MySQL> 5.1.24:
MySQL <5.1.24:
Em seguida, compare esse valor com seu arquivo ibdata:
Fonte: http://dev.mysql.com/doc/refman/5.1/en/show-table-status.html
fonte
Em uma nova versão do mysql-server, as receitas acima esmagarão o banco de dados "mysql". Na versão antiga, funciona. Em algumas tabelas novas, alterna para o tipo de tabela INNODB e, ao fazer isso, você os danifica. A maneira mais fácil é:
fonte
Como já observado, você não pode reduzir o ibdata1 (para fazer isso, é necessário despejar e reconstruir), mas também não há necessidade real.
Usando o autoextend (provavelmente a configuração de tamanho mais comum), ibdata1 pré-aloca o armazenamento, aumentando cada vez que está quase cheio. Isso torna as gravações mais rápidas, pois o espaço já está alocado.
Quando você exclui os dados, eles não diminuem, mas o espaço dentro do arquivo é marcado como não utilizado. Agora, quando você inserir novos dados, eles reutilizarão o espaço vazio no arquivo antes de aumentar o arquivo.
Portanto, ele continuará a crescer se você realmente precisar desses dados. A menos que você realmente precise de espaço para outro aplicativo, provavelmente não há razão para reduzi-lo.
fonte
storage leak
.