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

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


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

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

评论

你有意见吗?我确定表格没有定义程序...另请参见dba.stackexchange.com/q/4129/630

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

#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开关。