Log Binário – MySQL

Sempre me perguntam a respeito do log binário do MySQL, porque se não houver um cuidado especial com estes arquivos ele pode sobrecarregar file system do servidor que hospeda o MySQL.

Segue abaixo a parte do manual do MySQL que trata a respeito.

O log binário deve substituiu o log de atualizações. O log de atualizações será removido do MySQL 5.0. O log binário contém toda informação que está disponível no log de atualizações em um formato mais eficiente e de maneira transacionalmente segura.

O log binário, como o antigo log de atualização, apenas registra instruções que realmente atualizam os dados. Assim um UPDATE ou um DELETE com um WHERE que não encontra nenhum registro não é gravado no log. Ele ignora mesmo instruções UPDATE que definam a uma coluna um valor que ela já tenha.

O propósito principal do log binário é poder atualizar o banco de dados durante uma operação de restauração de forma mais completa possível, já que o log binário conteria todas as atualizações feitas depois que um backup foi realizado.

O log binário é também usado para replicar um mysqld slave a partir de um master. See Secção 4.11, “Replicação no MySQL”.

O log binário também contém informação sobre o tempo que cada consulta leva para atualizar o banco de dados. Ele não contém consultas que não modificam dados. Se você quiser registrar todas as consultas (por exemplo, para encontrar um consulta com problema) você deve usar o log geral de consultas. SeeSecção 4.10.2, “O Log de Consultas”.

Quando iniciado com a opção --log-bin[=nome_arquivo], o mysqld escreve um arquivo de log contendo todos comandos SQL que atualizam dados. Se nenhum arquivo for fornecido, ele aponta para o nome da máquina seguido de -bin. Se for fornecido o nome do arquivo, mas ele não tiver o caminho, o arquivo é escrito no diretório de dados.

Se você fornecer uma extensão à --log-bin=nome_arquivo.extensão, a extensão será removida sem aviso.

mysqld irá acrescentar uma extensão ao nome de arquivo do log binário que é um número que é incrementado cada vez que mysqladmin refreshmysqladmin flush-logs, a instrução FLUSH LOGS forem executados ou o servidor for reiniciado. Um novo log binário também será automaticamente criado quando o tamanho do log atual alcançar max_binlog_size. Nota se você estiver usando transações: uma transação é escrita em um bloco no arquivo de log binário, já que ele nunca é separado entre diversos logs binários. Desta forma, se você tiver grnades transações, você pode ter logs binários maiores que max_binlog_size.

Você pode deletar todos os arquivos de log binário com o comando RESET MASTER (see Secção 4.6.5, “Sintaxe de RESET), ou apenas alguns deles com PURGE MASTER LOGS (see Secção 4.11.7, “Instruções SQL para Controle do Servidor Master”).

Você pode utilizar as seguintes opções ao mysqld para afetar o que é documentado pelo log binário (tenha certeza de ler as notas que seguem esta tabela):

Opção Descrição
binlog-do-db=nome_banco_dados Diz ao master que ele deve registrar atualizações no log binário se o banco de dado atual (ex.: aquele selecionado por USE) é ‘nome_banco_dados’. Todos os outros bancos de dados que não forem explicitamente mencionados são ignorados. Note que se você utilizá-lo você deve se assegurar que você só faz atualizações no banco de dados atual. (Exemplo: binlog-do-db=algum_bancodados) Exemplo do que não funciona como você poderia esperar: se o servidor é iniciado com binlog-do-db=sales, e você fizer USE prices; UPDATE sales.january SET amount=amount+1000;, esta consulta não será gravada no log binário.
binlog-ignore-db=nome_banco_dados Diz ao master que atualizações onde o banco de dados atual (ex.: aquele selecionado com USE) é ‘nome_banco_dados’ não deve ser gravado no log binário. Note que se você usar esta opção você deve ter certeza que você só faz atualizações no banco de dados atual. (Exemplo: binlog-ignore-db=algum_banco_dados) Exemplo do que não funciona como você poderia esperar: se o servidor é iniciado com binlog-do-db=sales, e você fizerUSE prices; UPDATE sales.january SET amount=amount+1000;, esta consulta será gravada no log binário.

As regras estão avaliadas na seguinte ordem, para decidir se a consulta deve ser escrita no log binário ou não:

  1. Existem as regras binlog-do-db ou binlog-ignore-db?
    • Não: grave a consulta no log binário e saia.
    • Sim: Vá para o passo abaixo.
  2. Então existe algumas regras (binlog-do-db ou binlog-ignore-db ou ambos). Existe um banco de dados atual (algum banco de dados foi selecionado com USE?)?
    • Não: NÃO grave a consulta e saia.
    • Sim: vá para o passo abaixo.
  3. Existe um banco de dados. Existe alguma regra binlog-do-db?
    • Sim: O banco de dados atual se encaixa em qualquer uma das regras binlog-do-db?
      • Sim: grave a consulta e saia.
      • Não: NÃO grave a consulta e saia.
    • Não: Vá para o passo abaixo.
  4. Existem algumas regras binlog-ignore-db. O banco de dados atual se encaixa em qualquer uma das regrasbinlog-ignore-db?
    • Sim: não grave a consulta e saia.
    • Não: grave a consulta e saia.

Então, por exemplo, um slave em execução com apenas binlog-do-db=sales não gravará no log binário qualquer consulta em que o banco de dados atual é diferente de sales (em outras palavras, binlog-do-dbpode, significar algumas vezes, “ignore outros bancos de dados”).

Para saber quais arquivos binários foram usados, o mysqld irá criar também um arquivo de índice para o log binário que contém o nome de todos os arquivos de log binário usados. Por padrão este arquivo tem o mesmo nome que o arquivo de log binário, com a extensão '.index'. Você pode alterar o nome do arquivo de índice do log binário com a opção --log-bin-index=[nome_arquivo]. Você não deve eduitar este arquivo manualmente enquanto o mysqld estiver em execução; fazer isto confundiria o mysqld.

Se estiver sendo usado replicação, os arquivos de log binário antigos não devem ser apagados até ter certeza que nenhum slave irá mais precisar deles. Uma forma de fazer isto é o utilizar mysqladmin flush-logs uma vez por dia e então remover qualquer log com mais de 3 dias. Você pode removê-los manualmente, ou de preferência usando PURGE MASTER LOGS (see Secção 4.11.7, “Instruções SQL para Controle do Servidor Master”) o qual atualizará de forma segura o arquivo de índice do log binário para você (e que pode ter um argumento de data desde o MySQL 4.1)

Uma conexão com o privilégio SUPER pode desabilitar o registro no log binário de suas consultas usando SET SQL_LOG_BIN=0. See Secção 4.11.7, “Instruções SQL para Controle do Servidor Master”.

Você pode examinar o arquivo de log binário com o utilitário mysqlbinlog. Por exemplo, você pode atualizar um servidor MySQL a partir de um log binário como mostrado a seguir:

mysqlbinlog arquivo-log | mysql -h nome_servidor

Veja Secção 4.9.5, “mysqlbinlog, Executando as Consultas a Partir de um Log Binário” para mais informações sobre o utilitário mysqlbinlog e como utilizá-lo.

mysqlbinlog --help irá lhe fornecer mais informações de como usar este programa!

Se você estiver utilizando BEGIN [WORK] ou SET AUTOCOMMIT=0, você deve utilizar o log binário do MySQL para backups no lugar do antigo log de atualização.

O Log binário é feito imedatamente depois que uma consulta terminar mas antes que os bloqueios sejam liberados ou algum commit seja feito. Isto garante que o log seja feito na ordem de execução.

Atualizações em tabelas não transacionais são armazenadas o log binário imediatamentedepois da execução. Para tabelas tranascionais como BDB ou InnoDB, Todas atualizações (UPDATEDELETE ou INSERT) que alteram uma tabela transacional são armazenadas no cache até um COMMIT. Quaisquer atualizações a uma tabela não transacional são armazenadas no log binário de uma vez. Todas as threads irão, no início, alocar um buffer debinlog_cache_size para registrar consultas. Se uma conaulta é maior que o registro, a thread irá criar um arquivo temporário para lidar com a mesma. O arquivo temporário será apagado quando a thread terminar.

max_binlog_cache_size (padrão 4G) pode ser usado para restringir o tamanho total usado para armazenar uma consulta multi-transacional. Se uma transação é maior que isto ela falhará e fará um roll back.

Se você estiver utilizando o log de atualização ou o binário, inserções concorrentes não funcionarão juntas comCREATE ... INSERTINSERT ... SELECT. Isto é para garantir que você possa recriar uma cópia exata de suas tabelas aplicando o log em um backup.

 

Fonte:  Mysql Documentação

Anúncios

Marcado:, ,

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s

%d blogueiros gostam disto: