Como altero o DEFINER de uma VIEW no Mysql?


35

Quando executo o mysqldump, recebo um erro:

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

Isso faz sentido, porque foobaré uma máquina legada que não existe mais.

Como altero o definidor de todas as minhas tabelas para 'root' @ 'localhost'?


4
Você tem Views? As tabelas não têm definidores, tenho certeza ... Consulte também dba.stackexchange.com/q/4129/630
gbn

11
@gbn +1, você estava certo - eles eram visualizações - thx para o link, mas não consegui fazê-lo funcionar direito. No entanto, consegui modificar as visualizações no SQLyog para poder fazer o despejo.
kfmfe04

Isso funciona para mim. {{conceder tudo ativado . para 'root' @ '%' identificado por 'password' com opção de concessão; }}
Muhammad Azeem

Respostas:


33

O que eu acho é que o banco de dados que você está tentando despejar contém procedimentos / métodos que foram definidos por um usuário enquanto logado como root @ 'foobar'.

Agora, a solução é que você precise substituir o definidor por esses procedimentos / métodos

então você pode gerar o dump sem o erro.

você pode fazer isso como ..

 UPDATE `mysql`.`proc` p SET definer = 'root@localhost' WHERE definer='root@foobar'

Cuidado, pois isso mudará todos os definidores para todos os bancos de dados.

Tente....!

ATUALIZAÇÃO em 9 de fevereiro de 2012

Como eu vi o link fornecido pelo @gbn, que é uma resposta dada pelo @Rolando, também pode ser o caso. Por favor, visite o link

EDIT por @RolandoMySQLDBA 16-12-2011 11:20 EDT

Embora arriscada, essa resposta é boa. Apenas para esclarecer: você pode especificar o banco de dados em sua consulta como este:

 UPDATE `mysql`.`proc` p SET definer = 'root@localhost' WHERE definer='root@foobar' AND db='whateverdbyouwant';

11
O link acima mostra como fazê-lo com as declarações ALTER que pode ser menos arriscado ... Além disso, por favor, verifique o meu atualização para os definidores na sua actualização
GBN

UPDATEmudou a mesa, mas mysqldumpnão vê-lo: mysqldump: Got error: 1449: The user specified as a definer ('root'@'%') does not exist when using LOCK TABLES. Mesmo depois de reiniciar mysql. Estou correndo mysql-5.5.31.
X-yuri

Minha culpa. Também tive visões com um definidor errado. update mysql.procabordagem realmente funciona.
X-yuri #

Não funcionou ....
カオナシ

3
Esta resposta funciona para alterar os definidores de procedimentos e funções, mas não altera o definidor de uma Visualização .
Anthony G - justiça para Monica

35

Mais fácil de usar o --single-transactionswitch:

mysqldump --single-transaction -u username -p db > db.sql

11
Desculpe, como isso resolve o problema descrito na pergunta original? Parece que você respondeu à pergunta errada ...
dezso

6
A estrutura da resposta está incorreta porque - única transação deve ser anterior ao nome do banco de dados, mas a resposta está realmente correta. A especificação dessa opção soluciona o problema alterando o comportamento de bloqueio do mysqldump, para que o erro na pergunta original não ocorra mais.
Michael - sqlbot

eu enfrentei o mesmo problema. trabalhou - única transação.

Não tenho certeza do que faz, mas funcionou! Obrigado
Sri Harsha Kappala

17

A solução mais rápida seria recriar o definidor para que ele exista, desde que não crie conflitos com os usuários existentes.

CREATE USER 'root'@'foobar';


E se o usuário fosse 'root' @ '%'? Simplesmente nego isso em um servidor pelo qual somos responsáveis.
Attila Fulop

@AttilaFulop Sim, a segurança definitivamente deve ser uma consideração, mas eu disse que essa era a solução "mais rápida", não a perfeita. Depois que a importação estiver concluída, o usuário poderá ser excluído para reduzir os riscos de ter usuários extras.
ColinM

Você está certo nisso. Eu só queria chamar a atenção para esse aspecto em particular também. Meus colegas de trabalho adicionariam 'root' @ '%' e deixariam lá enquanto Chuck Norris estivesse vivo, ou seja. forever;)
Attila Fulop

6

Exporte todas as visualizações do banco de dados <DB>:

mysql -BNe "SELECT TABLE_NAME FROM TABLES WHERE TABLE_SCHEMA = '<DB>' AND TABLE_TYPE = 'VIEW'" \
    information_schema | xargs mysqldump --single-transaction --no-data <DB> >views.sql

ou:

mysql -BNe "SELECT TABLE_NAME FROM VIEWS WHERE TABLE_SCHEMA = '<DB>'" \
    information_schema | xargs mysqldump --single-transaction --no-data <DB> >views.sql

Edite views.sqle recrie-os:

cat views.sql | mysql <DB>

Especifique -ue -palterne, se necessário.


Esta é a resposta mais limpa
Wolfe
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.