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.

Foi útil?

Solução

Quando se trata de um log binário vazio, ele é específico da versão:

  • 120 no MySQL 5.6
  • 107 no MySQL 5.5
  • 106 no MySQL 5.1
  • 98 no MySQL 4.1/5.0

Já discuti isso muitas vezes no DBA StackExchange

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a dba.stackexchange
scroll top