Português do Brasil English
Devin no Facebook  Devin no Twitter  RSS do Site 
Servidores    

Rotação de logs binários no MySQL


Comentários  10
Visualizações  
185,355

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 :)