如何在Mysql中更改VIEW的DEFINER?


35

当我运行mysqldump时,出现错误:

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

这是有道理的,因为foobar不再有旧机器。

如何将所有表的定义器更改为'root'@'localhost'?


4
你有意见吗?表没有定义者,我肯定......还看到dba.stackexchange.com/q/4129/630
GBN

1
@gbn +1您是对的-它们是视图-链接的链接,但我无法使其正常运行。但是,我能够在SQLyog中修改视图,因此可以进行转储。
kfmfe04 2011年

它对我有用。{{全部授予具有授予选项的由“密码”标识的“根” @“%”;}}
穆罕默德·阿泽姆

Answers:


33

我认为您要转储的数据库包含用户以root @'foobar'登录时定义的过程/方法。

现在的解决方案是,您必须替换该过程/方法的定义者

那么您可以生成转储而不会出现错误。

你可以这样做..

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

注意,因为这将更改所有数据库的所有定义器。

试试吧....!

2012年2月9日更新

如我所见,@ gbn提供的链接是@Rolando提供的答案,也可以是Case。请访问链接

由@RolandoMySQLDBA编辑2011-12-16 11:20 EDT

虽然有风险,但是这个答案很好。只是为了澄清一下:您可以在查询中指定数据库,如下所示:

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

1
上面的链接显示了如何使用可能风险较小的ALTER语句来执行此操作...另外,请在UPDATE中检查定义程序的更新
gbn

UPDATE更改了表格,但mysqldump看不到:mysqldump: Got error: 1449: The user specified as a definer ('root'@'%') does not exist when using LOCK TABLES。即使重启mysql。我在跑步mysql-5.5.31
x-yuri 2014年

我的错。我也有一个错误的定义者意见。update mysql.proc方法确实有效。
x-yuri 2014年

没有工作....
カオナシ

3
此答案适用于更改过程和函数的定义器,但不会更改View的定义器。
安东尼·G-莫妮卡的正义

35

更易于使用的--single-transaction开关:

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

1
抱歉,这如何解决原始问题中描述的问题?看来您回答了错误的问题……
dezso 2012年

6
答案的结构是错误的,因为--single-transaction必须在数据库名称之前,但是答案实际上是正确的。指定此选项可以通过更改mysqldump的锁定行为来解决此问题,因此不再出现原始问题中的错误。
Michael-sqlbot 2012年

我面临着同样的问题。工作-单一交易。

不知道它是做什么的,但是虽然有效!谢谢
Sri Harsha Kappala '17

17

最快的解决方案是重新创建定义器以使其存在,只要它不与现有用户产生任何冲突即可。

CREATE USER 'root'@'foobar';


如果用户是'root'@'%',该怎么办?我只是在我们负责的服务器上否认这种事情。
Attila Fulop

@AttilaFulop是的,绝对应该考虑安全性,但是我说这是“最快速”的解决方案,而不是完美的解决方案。导入完成后,可以删除用户以减轻拥有额外用户的风险。
ColinM

你是对的。我只是想提请注意这个特定方面。只要Chuck Norris仍在世,我的同事就应该添加“ root'@'%'并将其保留在那里。永远;)
Attila Fulop

6

导出数据库的所有视图<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

要么:

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

编辑views.sql并重新创建它们:

cat views.sql | mysql <DB>

指定-u-p根据需要进行切换。


这是最干净的答案
Wolfe
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.