Como determinar se um arquivo de log binário do MySQL está vazio?
Pergunta
Para determinar se um backup do banco de dados é necessário ou não, estou tentando ver se um arquivo binlog do mysql contém algum dado.(Durante um backup, criamos um novo arquivo binlog e gravamos o nome do arquivo.Mais tarde, podemos verificar o conteúdo desse binlog para ver se algo aconteceu desde o último backup.)
Existe alguma maneira de saber quando um arquivo binlog está realmente vazio?Talvez usando o mysqlbinlog
comando?
eu verificaria o position
de SHOW MASTER STATUS
, mas a posição parece variar com a versão do mysql...é constante dentro de uma versão?Minha versão do mysql (5.6.11) inicia um novo log binário na posição 120.
Uma abordagem alternativa seria registrar a hora em que o log binário foi criado e verificar se houve alguma alteração feita depois disso, mas fico nervoso dependendo da velocidade do processo de backup como esse.
Solução
Quando se trata de um log binário vazio, ele é específico da versão:
120
no MySQL 5.6107
no MySQL 5.5106
no MySQL 5.198
no MySQL 4.1/5.0
Já discuti isso muitas vezes no DBA StackExchange
Nov 19, 2014
: Pergunta sobre como replicar um MySQL 5.1 de um banco de dados MySQL 5.6Jun 26, 2013
: É possível converter o binlog mysql do formato de instrução para o formato de linha?Oct 20, 2011
: Como lidar com a replicação My SQL DB Master to Master quando houve uma falta de espaço em discoFeb 04, 2011
: Corrupção do log binário mestre do MySQL- Todos os meus posts onde discuto isso
No seu caso, você precisa executar apenas um comando
SHOW MASTER STATUS;
Isso informa o log binário atual no qual o mysqld está gravando e a posição.Acontece que a posição do log também é o tamanho do arquivo.
Aqui está um exemplo de como verificar um log binário vazio antes de iniciar um backup
MYSQL_USER=root
MYSQL_PASS=rootpassword
MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"
#
# Find out the MySQL Version
#
SQL="SELECT VERSION()"
VERS=`mysql ${MYSQL_CONN} -ANe$"${SQL}"`
MYSQL_VERSION=`echo "${VERS}" | sed 's/\./ /g' | sed 's/ /./' | awk '{print $1}'`
case "${MYSQL_VERSION}" in
"5.0") EMPTY_BINLOG_SIZE=98 ;;
"5.1") EMPTY_BINLOG_SIZE=106 ;;
"5.5") EMPTY_BINLOG_SIZE=107 ;;
"5.6") EMPTY_BINLOG_SIZE=120 ;;
esac
#
# Get the Current Master Log's Position
#
SQL="SHOW MASTER STATUS"
LOGPOS=`mysql ${MYSQL_CONN} -ANe$"${SQL}" | awk '{print $2}'`
#
# Compare log position to an empty log size
#
OK_TO_BACKUP=0
if [ ${LOGPOS} -eq ${EMPTY_BINLOG_SIZE} ]; then OK_TO_BACKUP=1 ; fi
if [ ${OK_TO_BACKUP} -eq 1 ]; then
...
fi
DE UMA CHANCE !!!
SUGESTÃO
Se todas as suas tabelas estiverem usando o mecanismo de armazenamento InnoDB, você poderá despejar os dados em um determinado momento, capturar o arquivo de log e a posição e ainda permitir INSERTs, UPDATEs e DELETEs, todos ao mesmo tempo (não faça isso qualquer DDL durante o backup).Quando você usa mysqldump com as opções --single-transaction
e --master-data=2
, ele gravará o arquivo/posição de log na linha 23.
Acabei de mencionar isso há 6 dias: Replicação Mestre/Mestre/Escravo
Dessa forma, não há necessidade de esperar por um log binário vazio sem tempo de inatividade do aplicativo.