我有一个MySQL数据库的备份文件。其中包含看起来像这样的DEFINER子句,
"DEFINER=`root`@`localhost`"
我的CREATE VIEW和CREATE PROCEDURE语句中有这些DEFINER子句。有没有办法从我的转储文件中删除这些DEFINER子句?
我有一个MySQL数据库的备份文件。其中包含看起来像这样的DEFINER子句,
"DEFINER=`root`@`localhost`"
我的CREATE VIEW和CREATE PROCEDURE语句中有这些DEFINER子句。有没有办法从我的转储文件中删除这些DEFINER子句?
我认为没有办法忽略在转储过程中添加的DEFINER
,但是可以在创建转储文件后删除它们的方法。
在文本编辑器中打开转储文件,并将所有出现的DEFINER=root@localhost
替换为空字符串""
perl -p -i.bak -e "s/DEFINER=\`\w.*\`@\`\d[0-3].*[0-3]\`//g" mydatabase.sql
mysqldump ... | sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' > triggers_backup.sql
sed -E 's/DEFINER=
[^]+
@[^
]+/DEFINER=CURRENT_USER/g' dump.sql > new_dump.sql
这样有保留限制/访问控制的优点。 - 4thfloorstudiossed
命令无法从存储过程和函数中删除 DEFINER 子句。这里是增强版,可以处理视图、触发器、存储过程和函数:sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' | sed -e 's/DEFINER[ ]*=[ ]*[^*]*PROCEDURE/PROCEDURE/' | sed -e 's/DEFINER[ ]*=[ ]*[^*]*FUNCTION/FUNCTION/'
- Vladimir Strugatsky你可以使用SED来删除
sed -i 's/DEFINER=[^*]*\*/\*/g' mydump.sql
在MacOS中:sed -i '' 's/DEFINER=[^*]*\*/\*/g' mydump.sql
-i extension
“就地编辑文件,并使用指定的扩展名保存备份。如果给定了长度为零的扩展名,则不会保存备份。当进行原位编辑文件时,不建议给出长度为零的扩展名,因为在磁盘空间耗尽等情况下,您会面临损坏或部分内容的风险。” - Chad--skip-definer
选项,例如:mysqlpump --skip-definer -h localhost -u user -p yourdatabase
请查看更新后的MySQL手册,链接在http://dev.mysql.com/doc/refman/5.7/en/mysqlpump.html#option_mysqlpump_skip-definer
mysqldump
和 mysqlpump
有什么区别的人可以参考这个相关问题:https://dba.stackexchange.com/questions/118846/mysqldump-vs-mysqlpump - Scadgeinformation_schema.user
,并非所有用户都可以读取。 - bato3我使用这些想法从自己的mysqldump输出中删除DEFINER子句,但我采取了更简单的方法:
只需在代码和DEFINER之前删除!
,其余注释将变为常规注释。
示例:
/*!50017 DEFINER=`user`@`111.22.33.44`*/
被渲染成无助的,只是做这个..
/* 50017 DEFINER=`user`@`111.22.33.44`*/
最简单的正则表达式是去掉感叹号和数字
mysqldump | /usr/bin/perl -pe 's/\!\d+ DEFINER/DEFINER/' > dumpfile.sql
这将去除!#### DEFINER
并替换为DEFINER...你也可以删除DEFINER,这并不重要——一旦"!"消失了
根据其他人的建议,以下是一个示例,说明在转储完成后如何从转储中删除DEFINER:
mysqldump -u user --password='password' -h localhost database | grep -v "50013 DEFINER" > dump.sql
user
@localhost
/ /*!50003 trigger my_triggername BEFORE INSERT ON my_table FOR EACH ROW .... */;; 使用 grep -v
命令将完全删除这些代码行。(尽管 50017 不等于 50013) - Kenney正如其他人所提到的,使用任何一种正则表达式都不太难去除定义者。但是其他示例为我剥离了视图定义。
这是对我有效的正则表达式:
sed -e 's/DEFINER=[^ ]* / /'
*/
。MySQL 5.6.31。 - Franc Drobničmysqlmigrate
。它是一个 Bash 包装器,可围绕 mysqldump
进行操作,允许您迁移数据库并忽略 DEFINER 语句。例如:$ mysqlmigrate -u root -p pass --ignore-definer from_db to_db
http://thesimplesynthesis.com/post/mysqlmigrate(或GitHub)
否则,是的,像Abhay指出的那样需要一个命令:
$ mysqldump -u root -ppass the_db | sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' > the_db.sql
sed -i '' 's/DEFINER=`[^`][^`]*`@`[^`][^`]*`//g' file.sql