Depois que uma caixa executando o mysql foi atualizada, um script de backup está retornando um erro para bancos de dados com tabelas Innodb.
Um sistema rodando Debian 5 (Lenny) foi atualizado para o Debian 6 (Squeeze), e o sistema estava executando o pacote mysql-server do repositório Debian.
Os backups estão sendo executados por um script que faz backup de vários servidores mysql e faz o backup de cada banco de dados separadamente.
Este é o comando e erro retornado quando é executado em um banco de dados de tabelas Innodb.
$ mysqldump --defaults-extra-file=creds.cnf
--lock-tables --flush-logs --force db_innodb > /dev/null
mysqldump: Got error: 1045: Access denied for user 'backup'@'%'
(using password: YES) when using LOCK TABLE
echo $?
2
Quando o mesmo comando é executado em um banco de dados de tabelas Myisam no mesmo servidor usando a mesma conta, não há erros.
$mysqldump --defaults-extra-file=creds.cnf
--lock-tables --flush-logs --force db_myisam > /dev/null
echo $?
0
A conta de backup regular tem o privilégio de tabela de bloqueio, e os backups estão funcionando bem antes de o sistema ser atualizado. Mas eu também tentei com a conta root e vejo o mesmo erro.
mysql> show grants for 'backup'@'%';
GRANT SELECT, RELOAD, LOCK TABLES, SHOW VIEW
ON *.* TO 'backup'@'%' IDENTIFIED BY PASSWORD '*...'
Eu sei que provavelmente eu poderia simplesmente não usar a opção de tabelas de bloqueio no banco de dados Innodb e usar a opção --single-transaction
, mas isso não funcionará muito bem. Alguns bancos de dados têm tabelas com o mecanismo de armazenamento Myisam e Innodb, e a opção de transação única não tornaria as tabelas Myisam consistentes. Além disso, esse é um script mais antigo e seria necessário um trabalho muito grande para fazer backup de forma diferente com base no mecanismo de armazenamento.
Como o script já passa a opção --force
para o mysqldump, o que significa que estou obtendo dados no backup e não está falhando completamente. Há apenas uma chance de que não seja completamente consistente, se algum estiver trabalhando no meio da noite. O fato de que estou realmente recebendo dados no meu despejo me faz pensar que isso é puramente sobre o privilégio de bloqueio.
Então, quero corrigir o problema com a menor quantidade de alterações. Por que estou recebendo apenas o erro de tabelas de bloqueio apenas em bancos de dados com tabelas baseadas no Innodb? Tenho que conceder mais privilégios para bloquear uma tabela Innodb?