mysqldump: Got error: 1449: The user specified as a definer ('root'@'foobar') does not exist when using LOCK TABLES
这是有道理的,因为
foobar
是不再存在的旧机器。如何我将所有表的定义器更改为'root'@'localhost'吗?
#1 楼
我认为您要转储的数据库包含用户以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'
评论
此答案适用于更改过程和函数的定义器,但不更改视图的定义器。
– Anthony Geoghegan
17-09-25在11:04
#2 楼
易于使用--single-transaction
开关:mysqldump --single-transaction -u username -p db > db.sql
评论
抱歉,这如何解决原始问题中描述的问题?看来您回答了错误的问题...
– dezso
2012年11月22日20:06
答案的结构是错误的,因为--single-transaction必须在数据库名称之前,但是答案实际上是正确的。指定此选项可通过更改mysqldump的锁定行为来解决此问题,因此不再出现原始问题中的错误。
– Michael-sqlbot
2012年11月23日在3:41
#3 楼
最快的解决方案是重新创建定义器以使其存在,只要它不与现有用户产生任何冲突即可。CREATE USER 'root'@'foobar';
评论
如果用户是'root'@'%',该怎么办?我只是在我们负责的服务器上否认这种事情。
–阿提拉·富洛普(Attila Fulop)
16-09-21在10:04
@AttilaFulop是的,绝对应该考虑安全性,但是我说这是“最快”的解决方案,而不是完美的解决方案。导入完成后,可以删除用户以减轻拥有额外用户的风险。
– ColinM
16-09-22在16:40
你是对的。我只是想提请注意这个特定方面。只要Chuck Norris仍然活着,我的同事就应该添加“ root'@'%',并将其保留在那里。永远;)
–阿提拉·富洛普(Attila Fulop)
16-09-23在6:15
#4 楼
导出数据库的所有视图<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
开关。
评论
你有意见吗?我确定表格没有定义程序...另请参见dba.stackexchange.com/q/4129/630@gbn +1您是对的-它们是视图-链接的链接,但我无法使其正常运行。但是,我能够在SQLyog中修改视图,因此可以进行转储。