从MySQL转储中删除DEFINER子句

我有我的一个数据库的MySQL转储。 里面有DEFINER子句,看起来像,

"DEFINER=`root`@`localhost`" 

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

我不认为有一种方法可以忽略向转储添加DEFINER 。 但是在创build转储文件后有办法删除它们。

  1. 在文本编辑器中打开转储文件,并用空string“”replace所有出现的DEFINER=root@localhost

  2. 编辑转储(或pipe道输出)使用perl

     perl -p -i.bak -e "s/DEFINER=\`\w.*\`@\`\d[0-3].*[0-3]\`//g" mydatabase.sql 
  3. 通过sedpipe道输出:

     mysqldump ... | sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' > triggers_backup.sql 

您可以使用SED删除

 sed -i 's/DEFINER=[^*]*\*/\*/g' mydump.sql 

在MacOS中:

 sed -i '' 's/DEFINER=[^*]*\*/\*/g' mydump.sql 

由于MySQL版本5.7.8,您可以使用mysqlpump的--skip-definer definer选项,例如:

 mysqlpump --skip-definer -h localhost -u user -p yourdatabase 

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

按照其他人的build议,这里是一个如何在转储完成后从转储中删除DEFINER的例子:

 mysqldump -u user --password='password' -h localhost database | grep -v "50013 DEFINER" > dump.sql 

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

只要删除! 之前的代码和DEFINER,其余的评论成为一个正规的评论。

例:

 /*!50017 DEFINER=`user`@`111.22.33.44`*/ 

无能为力,只要这样做..

 /* 50017 DEFINER=`user`@`111.22.33.44`*/ 

最简单的正则expression式,但是,要删除! 和数字

 mysqldump | /usr/bin/perl -pe 's/\!\d+ DEFINER/DEFINER/' > dumpfile.sql 

删除!#### DEFINER并replaceDEFINER …你也可以删除DEFINER,这并不重要 – 一旦“!” 离开了

正如其他人提到的那样,用任何正则expression式来剥离定义者都不是太复杂。 但是其他的例子剥离了我的视图定义。

这是为我工作的正则expression式:

 sed -e 's/DEFINER=[^ ]* / /' 

对于一个自动化的解决scheme,你可以看看mysqlmigrate 。 这是一个mysqldump的Bash包装,它允许你迁移数据库并忽略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 

不知道是否有帮助,但我使用SQLyog社区版,可在: –

https://code.google.com/p/sqlyog/wiki/Downloads

当转储SQL或复制到另一个数据库它可以让你'忽略DEFINER'

它是免费的,并提供了很多人需要的基本function

还有一个可用的付费版本: –

https://www.webyog.com/product/sqlyog

干杯

这是一个完整的工作解决scheme,用于删除MySQL 5.6.x和Linux的DEFINER信息(在CentOS 6.5上testing)。

Usaually,我们必须从Mysql转储(如果与数据和触发器/例程/函数一起)取代以下条目。

 /*!50013 DEFINER=`MYSQLUSER`@`localhost` SQL SECURITY DEFINER */ /*!50013 DEFINER=`MYSQLUSER`@`%` SQL SECURITY DEFINER */ CREATE DEFINER=`MYSQLUSER`@`%` PROCEDURE `PROCEDURENAME`( CREATE DEFINER=`MYSQLUSER`@`localhost` PROCEDURE `PROCEDURENAME`( CREATE DEFINER=`MYSQLUSER`@`%` FUNCTION `FUNCTIONNAME`( CREATE DEFINER=`MYSQLUSER`@`localhost` FUNCTION `FUNCTIONNAME`( /*!50003 CREATE*/ /*!50017 DEFINER=`MYSQLUSER`@`%`*/ /*!50003 TRIGGER `TRIGGERNAME` /*!50003 CREATE*/ /*!50017 DEFINER=`MYSQLUSER`@`localhost`*/ /*!50003 TRIGGER `TRIGGERNAME` 

转储采用下面的mysqldump命令。

 mysqldump -uMYSQLUSER -pPASSWORD DATABASENAME -R > dbdump.sql 

没有DEFINER信息的所需转储文件可以通过以下三个命令获得。

 Command-1 sed -i 's|DEFINER=[^*]*\*|\*|g' [PATH/]dbdump.sql Command-2 find -name [PATH/]dbdump.sql | xargs perl -pi -e "s/ DEFINER=\`MYSQLUSER\`@\`localhost\`//" Command-3 find -name [PATH/]dbdump.sql | xargs perl -pi -e "s/ DEFINER=\`MYSQLUSER\`@\`%\`//" 

如果转储文件位于当前文件夹中,则忽略[path/]。

如果表中的数据非常大,则将转储转换为两个文件,在一个转储文件中转储数据,在其他转储文件中只转储脚本转储(触发器/函数/过程),并运行以上三个命令在第二个转储(脚本)文件。

一个快速的方法是通过sedpipe道输出mysqldump来删除包含在条件注释中的DEFINER语句。 我用它来从CREATE TRIGGER语句中删除DEFINER ,但是你可以调整正则expression式中的条件注释版本号来适应你的目的。

 mysqldump -u user --password='password' -h localhost database | \ sed 's/\/\*!50017 DEFINER=`.*`@`.*`\*\///' 

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

在我看来,解决这个问题的最好方法是不用sed或者grep或者其他的方法来增加额外的stringparsing,相反,mysqldump能够通过添加–single-transaction

OSX的另一个选项是删除定义文件:

 sed -i '' 's/DEFINER=`[^`][^`]*`@`[^`][^`]*`//g' file.sql 

用CURRENT_USERreplace所有的定义者用户。 在我的创build备份的gradle脚本中,我的replace脚本如下所示:

 ant.replaceregexp(file: "$buildDir/sql/setupDB.sql", match: "`${project.ext.prod_db_username}`@`%`", replace: "CURRENT_USER", byline: true); 

这真的只是叫ANT。 那你就不用担心了

在Linux机器上,您可以使用这一行:

 mysql -uuser -ppwd -A --skip-column-names -e"SELECT CONCAT('SHOW CREATE VIEW ',table_schema,'.',table_name,';') FROM information_schema.tables WHERE engine IS NULL and table_schema like 'mydb%'" | mysql -uuser -ppwd -A --skip-column-names | sed -rn 's/.*?VIEW ([^\s]+?) (AS .*?)\s([^\s]+?)\s([^\s]+?)/DROP VIEW \1;\nCREATE VIEW \1 \2;/p' | mysql -uuser -ppwd -A --skip-column-names 

您只需用您的数据库用户凭证和数据库名称/样式replace粗体string。

更多信息: http : //blog.novoj.net/2014/05/16/recreate-mysql-views-without-definer-one-liner-solution-linux/

唯一的办法,我可以得到它在Windows下工作:

安装http://gnuwin32.sourceforge.net/在命令行中添加;sed并将其添加到Windows PATH中:D:\ programs \ GetGnuWin32 \ bin;

 sed -i "s|DEFINER=`mydbuser`@`%%` SQL SECURITY DEFINER||g" "D:/prod_structure.sql" sed -i "s|DEFINER=`mydbuser`@`%%`||g" "D:/prod_structure.sql" mysqldump -P{port} -h{host} -u{user} -p{password} --routines --no-data --lock-tables=false database_prod > D:\prod_structure.sql 

谢谢大家的提示。 懒惰,我写了一个名为“MYsqldump”的脚本:

 DB=$1 HOST=$2 USER=$3 MYSQLDUMP='/usr/bin/mysqldump' PARAMS="--complete-insert --disable-keys=0 --extended-insert=0 --routines=0 --skip-comments" DAY=`date +%d` MONTH=`date +%m` YEAR=`date +%Y` FILE=$DB.$DAY-$MONTH-$YEAR.sql if (( $# < 3 )) ; then echo "" echo "usage: MYsqldump <db> <host> <user>" echo "" exit 1 fi $MYSQLDUMP -h $HOST -u $USER -p $PARAMS $DB | grep -v '/*!50013 DEFINER' > $FILE 

像这样的东西:

 DELIMITER ;;
 CREATE DEFINER =`mydb` @`localhost` FUNCTION`myfunction`()RETURNS int(11)
开始
 (......)
结束 ;;

尝试这个:

 mysqldump --force  - 例程--opt --user = myuser --databases mydb |  sed -e's / DEFINER =`。*`@`。*`\ // g'

对我来说,这个工程: perl -p -i.bak -e "s/DEFINER=[^ |\s]*//g" yourdump.dmp 。 这从每次创build过程中的转储删除了DEFINER = root @ localhost

对所有对象都适用的最简单的正则expression式是:

 sed 's/DEFINER=[^ ]*`//' ... 

请注意, quote-names必须是TRUE (默认情况下)。

希望在更新的版本中,在5.7版本的mysqlpump中引入的开关--skip-definer definer也可以使用mysqldump。