Os logs binários do MySQL contém uma espécie de histórico com todas as consultas SQL que são feitas em um servidor. Esses logs servem principalmente para fazer duas coisas: replicar esses dados em um servidor secundário (modelo mestre-escravo) e efetuar backups diferenciais.
Na configuração do MySQL, o log binário é configurado com duas linhas:
log-bin=/var/lib/mysql/mysql-bin.log server-id=1
A opção log-bin indica qual o padrão de arquivos que o MySQL vai gravar. Nesse exemplo, teremos os seguintes arquivos:
- mysql-bin.XXXXXX – Onde XXXXXX é um número sequencial, que são os logs binários em si. Vão ser vários arquivos com um tamanho máximo (por padrão, 1GB).
- mysql-bin.index – Índice com todos os arquivos de log binário atuais.
Muitas vezes acontece da pessoa configurar isso e não tratar esses logs binários. Em um banco de dados com muito movimento, esses logs binários podem crescer assustadoramente e ocupar todo o espaço em disco.
Conheço duas formas de fazer a rotação. A que nunca deve ser feita é simplesmente apagar os arquivos de logs binários do sistema de arquivos. Como o MySQL lida com isso, nada melhor do que tratar essa limpeza com o próprio.
A primeira é utilizando a opção expire_logs_days no my.cnf. Exemplo:
expire_logs_days = 7
Os logs que forem mais velhos do que 7 dias serão excluídos do MySQL automaticamente.
Outra forma de fazer isso é via o próprio MySQL. Conecte-se a um prompt MySQL e execute:
mysql> SHOW BINARY LOGS; +------------------+------------+ | Log_name | File_size | +------------------+------------+ | mysql-bin.000858 | 1073769033 | | mysql-bin.000859 | 1073772184 | | mysql-bin.000860 | 1073769005 | | mysql-bin.000861 | 1073809148 | | mysql-bin.000862 | 1073765575 | | mysql-bin.000863 | 1073797185 | | mysql-bin.000864 | 1073757152 | | mysql-bin.000865 | 1073763101 | | mysql-bin.000866 | 1073771131 | | mysql-bin.000867 | 1073770555 | | mysql-bin.000868 | 1073744076 | | mysql-bin.000869 | 1073818669 | | mysql-bin.000870 | 1073754790 | | mysql-bin.000871 | 1073770448 | | mysql-bin.000872 | 1073755079 | | mysql-bin.000873 | 1073744861 | | mysql-bin.000874 | 1073807803 | | mysql-bin.000875 | 1073777945 | | mysql-bin.000876 | 1073741999 | | mysql-bin.000877 | 718403419 | +------------------+------------+ 20 rows in set (0.00 sec)
Com isso, dá pra ver que temos muitos logs binários e quais os seus tamanhos. Então podemos apagar da seguinte forma:
PURGE BINARY LOGS BEFORE '2010-07-04 12:27:59';
Isso apaga os logs binários até a data/hora especificada.
Ou pode-se fazer por nome de arquivo também:
PURGE BINARY LOGS TO 'mysql-bin.000874';
Apaga todos os logs binários anteriores a sequência 000874.
Usar o expire_logs_days é a melhor opção, mas nada lhe impede que você utilize o crontab e o comando PURGE para se certificar que isto está sendo feito :)