É seguro excluir arquivos mysql-bin?

93

Eu tenho o MM Replication no mysql e quero espremer algum espaço livre na caixa para excluir arquivos desnecessários. Me deparei com esses mysql-binarquivos. /var/db/mysql/Existem centenas desses arquivos mysql-bin.000123, mysql-bin.000223etc. Verifiquei a replicação do mysql fazendo show master statuse show slave statuseles são usando alguns arquivos mysql-bin em certas posições, mas acho que todos os outros arquivos bin são sobras que não serão mais usadas. Nesse caso, é seguro excluir todos os arquivos mysql-bin, exceto os que a replicação está apontando atualmente?

Se for seguro excluir, há algo que eu possa fazer para excluir automaticamente esses arquivos quando não estiverem em uso?


fonte

Respostas:

137

Por favor, não os apague apenas no SO.

Você precisa deixar o mysqld fazer isso por você. Aqui está como o mysqld gerencia:

O arquivo mysql-bin.[index]mantém uma lista de todos os logs binários que o mysqld gerou e girou automaticamente. Os mecanismos para limpar os binlogs em conjunto com mysql-bin.[index]são:

PURGE BINARY LOGS TO 'binlogname';
PURGE BINARY LOGS BEFORE 'datetimestamp';

Isso limpará todos os logs binários antes do log do bin ou do carimbo de data / hora que você acabou de especificar.

Por exemplo, se você executar

PURGE BINARY LOGS TO 'mysql-bin.000223';

isso apagará todos os logs binários antes mysql-bin.000223.

Se você correr

PURGE BINARY LOGS BEFORE DATE(NOW() - INTERVAL 3 DAY) + INTERVAL 0 SECOND;

isso apagará todos os logs binários antes da meia-noite, 3 dias atrás.

Se você deseja que o binlog seja rotacionado automaticamente e fique por três dias, basta definir o seguinte:

mysql> SET GLOBAL expire_logs_days = 3;

adicione isso a /etc/my.cnf

[mysqld]
expire_logs_days=3

e o mysqld irá deletá-los para você

MOSTRAR ESTADO DO ESCRAVO \ G

Isso é crítico. Ao executar SHOW SLAVE STATUS\G, você verá dois logs binários do Master:

  • Master_Log_File
  • Relay_Master_Log_File

Quando a replicação tem pouco ou nenhum atraso, eles geralmente têm o mesmo valor. Quando há muito atraso na replicação, esses valores são diferentes. Apenas para simplificar, escolha o que Relay_Master_Log_Filefor e volte ao Mestre e execute

PURGE BINARY LOGS TO 'Whatever Relay_Master_Log_File Is';

Dessa forma, a replicação não é interrompida.

RolandoMySQLDBA
fonte
1
Observe um erro de digitação - sublinhados, não traços: [mysqld] expire_logs_days=3(e você deve incluir a [mysqld]seção
changokun 12/08/14
@changokun Isso não é um erro de digitação. O my.cnf aceita traços. A execução SET GLOBAL expire_logs_days = 3;do cliente mysql não os aceitará. Exemplo no MySQL Docs: dev.mysql.com/doc/refman/5.5/en/mysqld-option-tables.html
RolandoMySQLDBA
Isso funciona para mim. Pergunta, qual é a diferença entre ... mysql> SET GLOBAL expire_logs_days = 3;e expire-logs-days=3in /etc/my.cnf.. Eles são iguais? Isso é redundante ou não? Ou, é importante executar SET GLOBAL...e adicionar expire-logs-days=..? Obrigado.
Nino Paolo
Remova rapidamente todos os logs, obviamente: PURGE BINARY LOGS BEFORE DATE(NOW());por que não há padrões sãos para isso? Em nenhum lugar, nunca a explicitamente alterou o tamanho do arquivo de log para uma quantidade gigantesca. Eu tinha 10,0 GB de arquivos de log. Depois de executar este comando, o tamanho da minha pasta mysql.bin diminuiu para 1,6 GB.
Michael Trouw
20

Isso realmente depende da sua estratégia de backup. Um dos principais motivos para manter os logs binários atualizados é restaurar o banco de dados para um 'momento específico'. Se o seu banco de dados travar e exigir restauração, você restauraria o backup completo mais recente e, em seguida, reproduziria os logs binários começando com a posição do backup completo.

Portanto, se você fizer um backup completo todos os dias e tiver 7 dias em logs binários, é provável que você possa excluir os últimos 4 a 6 dias em logs binários. Você pode controlar quantos dias de logs binários são mantidos com a expire_logs_daysconfiguração.

Você pode excluir os logs binários de que não precisa, primeiro vendo qual é o log mais antigo que deseja manter:

ls -lh /path/to/binary/logs/mysql-bin.0*

e depois no mysql:

mysql> PURGE BINARY LOGS TO 'mysql-bin.XXXXX';
Derek Downey
fonte
5

Tente o seguinte:

RESET MASTER;

como o documento dizia:

RESET MASTER permite excluir qualquer arquivo de log binário e seu arquivo de índice de log binário relacionado, retornando o mestre ao seu estado antes do início do log binário.

Isso excluirá todos os arquivos de log binário relacionados, que podem não ser o que você deseja.

Morris
fonte