从MySQL Dumps中删除DEFINER子句

Fas*_*ack 104 mysql

我有一个我的数据库的MySQL转储.在其中,有DEFINER条款,看起来像,

"DEFINER=`root`@`localhost`" 
Run Code Online (Sandbox Code Playgroud)

也就是说,这些DEFINER条款在我的CREATE VIEW和CREATE PROCEDURE语句中.有没有办法从我的转储文件中删除这些DEFINER子句?

Abh*_*hay 96

我认为没有办法忽略DEFINER在转储中添加s.但是有一些方法可以在创建转储文件后删除它们.

  1. 在文本编辑器中打开转储文件,并用DEFINER=root@localhost空字符串替换所有出现的字符串""

  2. 使用以下命令编辑转储(或管道输出)perl:

    perl -p -i.bak -e "s/DEFINER=\`\w.*\`@\`\d[0-3].*[0-3]\`//g" mydatabase.sql
    
    Run Code Online (Sandbox Code Playgroud)
  3. 管道输出通过sed:

    mysqldump ... | sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' > triggers_backup.sql
    
    Run Code Online (Sandbox Code Playgroud)

  • `sed`命令不会从过程和函数中删除DEFINER子句.以下是处理视图,触发器,过程和函数的增强版本:`sed -e's/DEFINER []*= []*[^*]*\*/\*/'| sed -e's/DEFINER []*= []*[^*]*程序/程序/'| sed -e's/DEFINER []*= []*[^*]*FUNCTION/FUNCTION /'` (19认同)
  • 不,不是mysqldump,而是mysql**p**ump 拥有--skip-definer。 (7认同)
  • 仅供参考 --- 尽管在此回答时情况并非如此,但 MySQL > 5.6 现在附带了一个支持“--skip-definer”作为选项的 mysqldump(1):https://dev.mysql.com /doc/refman/5.7/en/mysqlpump.html#option_mysqlpump_skip-definer (5认同)
  • 我建议提一下,除了删除DEFINER之外,还可以将其设置为CURRENT_USER:sed -E's / DEFINER =`[^`] +`@`[^`] +`/ DEFINER = CURRENT_USER / g' dump.sql> new_dump.sql`它具有保留限制/访问控制的优点。 (2认同)

Ric*_*ins 64

您可以使用SED删除

sed -i 's/DEFINER=[^*]*\*/\*/g' mydump.sql
Run Code Online (Sandbox Code Playgroud)

在MacOS中:

sed -i '' 's/DEFINER=[^*]*\*/\*/g' mydump.sql
Run Code Online (Sandbox Code Playgroud)


max*_*xhb 47

从mysql 5.7.8开始,你可以使用--skip-definermysqlpump 的选项,例如:

mysqlpump --skip-definer -h localhost -u user -p yourdatabase
Run Code Online (Sandbox Code Playgroud)

请参阅http://dev.mysql.com/doc/refman/5.7/en/mysqlpump.html#option_mysqlpump_skip-definer上的更新的mysql手册

  • 对于谁想知道`mysqldump`和`mysqlpump`之间有什么区别 - 这里有相关的问题:https://dba.stackexchange.com/questions/118846/mysqldump-vs-mysqlpump (7认同)

Jon*_*han 17

根据其他人的建议,这里是一个如何在转储完成后从转储中删除DEFINER的示例:

mysqldump -u user --password='password' -h localhost database | grep -v "50013 DEFINER" > dump.sql
Run Code Online (Sandbox Code Playgroud)

  • 对于触发器,行看起来像/*!50003 CREATE*//*!50017 DEFINER =`user` @`localhost`*//*!50003触发my_triggername之前插入my_table FOR EACH ROW ....*/;; 并且`grep -v`将完全删除这些行.(虽然50017!= 50013) (3认同)

小智 16

我使用这些想法从我自己的mysqldump输出中去除DEFINER子句,但我采用了一种更简单的方法:

只需!在代码和DEFINER之前删除它,其余的注释就成为常规注释.

例:

/*!50017 DEFINER=`user`@`111.22.33.44`*/
Run Code Online (Sandbox Code Playgroud)

变得无助,就像这样做..

/* 50017 DEFINER=`user`@`111.22.33.44`*/
Run Code Online (Sandbox Code Playgroud)

最简单的正则表达式是删除!和数字

mysqldump | /usr/bin/perl -pe 's/\!\d+ DEFINER/DEFINER/' > dumpfile.sql
Run Code Online (Sandbox Code Playgroud)

删除!#### DEFINER并替换DEFINER ......你也可以删除DEFINER,它并不重要 - 一旦"!" 离开了


Laj*_*res 13

正如其他人所提到的那样,使用任何一种正则表达式来剥离定义者都不是太复杂.但其他例子剥夺了我的视图定义.

这是对我有用的正则表达式:

sed -e 's/DEFINER=[^ ]* / /'
Run Code Online (Sandbox Code Playgroud)


jos*_*ell 10

对于自动化解决方案,您可以查看mysqlmigrate.它是一个Bash包装器mysqldump,允许您迁移数据库并忽略DEFINER语句.例:

$ mysqlmigrate -u root -p pass --ignore-definer from_db to_db
Run Code Online (Sandbox Code Playgroud)

http://thesimplesynthesis.com/post/mysqlmigrate(或GitHub)

否则,是的,需要像Abhay指出的命令:

$ mysqldump -u root -ppass the_db | sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' > the_db.sql
Run Code Online (Sandbox Code Playgroud)


Pau*_*xon 5

一个快速的方法是通过sedmysqldump的输出通过管道传输,以删除包含在条件注释中的语句。我使用它来从语句中删除,但您可以调整正则表达式中的条件注释版本号以满足您的目的。DEFINERDEFINERCREATE TRIGGER

mysqldump -u user --password='password' -h localhost database | \
  sed 's/\/\*!50017 DEFINER=`.*`@`.*`\*\///' 
Run Code Online (Sandbox Code Playgroud)


Jos*_*ile 5

您应该在这里查看答案:https : //dba.stackexchange.com/questions/9249/how-do-i-change-the-definer-of-a-view-in-mysql/29079#29079

我认为解决此问题的最佳方法是,不使用sed或grep或其他任何方法添加额外的字符串解析,而mysqldump可以通过添加--single-transaction来生成良好的转储


小智 5

OSX上另一个删除文件中定义程序的选项:

sed -i '' 's/DEFINER=`[^`][^`]*`@`[^`][^`]*`//g' file.sql
Run Code Online (Sandbox Code Playgroud)