我有一个我的数据库的MySQL转储.在其中,有DEFINER条款,看起来像,
"DEFINER=`root`@`localhost`"
Run Code Online (Sandbox Code Playgroud)
也就是说,这些DEFINER条款在我的CREATE VIEW和CREATE PROCEDURE语句中.有没有办法从我的转储文件中删除这些DEFINER子句?
Abh*_*hay 96
我认为没有办法忽略DEFINER
在转储中添加s.但是有一些方法可以在创建转储文件后删除它们.
在文本编辑器中打开转储文件,并用DEFINER=root@localhost
空字符串替换所有出现的字符串""
perl -p -i.bak -e "s/DEFINER=\`\w.*\`@\`\d[0-3].*[0-3]\`//g" mydatabase.sql
Run Code Online (Sandbox Code Playgroud)mysqldump ... | sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' > triggers_backup.sql
Run Code Online (Sandbox Code Playgroud)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-definer
mysqlpump 的选项,例如:
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手册
Jon*_*han 17
根据其他人的建议,这里是一个如何在转储完成后从转储中删除DEFINER的示例:
mysqldump -u user --password='password' -h localhost database | grep -v "50013 DEFINER" > dump.sql
Run Code Online (Sandbox Code Playgroud)
小智 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)
一个快速的方法是通过sed将mysqldump的输出通过管道传输,以删除包含在条件注释中的语句。我使用它来从语句中删除,但您可以调整正则表达式中的条件注释版本号以满足您的目的。DEFINER
DEFINER
CREATE TRIGGER
mysqldump -u user --password='password' -h localhost database | \
sed 's/\/\*!50017 DEFINER=`.*`@`.*`\*\///'
Run Code Online (Sandbox Code Playgroud)
您应该在这里查看答案: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)
归档时间: |
|
查看次数: |
82921 次 |
最近记录: |