A atualização do sistema introduziu um erro incomum de privilégio mysql

6

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?

    
por Zoredache 26.07.2011 / 00:48

1 resposta

3

Após mais investigação, encontrei um problema com o definidor em algumas das VIEWS no banco de dados de problemas.

Got error: 1449: The user specified as a definer ('cittool'@'%') does not exist when using LOCK TABLES

Esta conta pertencia a um desenvolvedor que não existia mais e foi removido. Com a ajuda dos caras em dba.stackexchange eu consegui construir um script para substituir minhas visualizações por uma conta que realmente existiu.

    
por 26.07.2011 / 23:24

Tags