从MySQL转储中删除DEFINER子句
我有我的一个数据库的MySQL转储。 里面有DEFINER子句,看起来像,
"DEFINER=`root`@`localhost`"
也就是说,这些DEFINER子句在我的CREATE VIEW和CREATE PROCEDURE语句上。 有没有办法从我的转储文件中删除这些DEFINER子句?
我不认为有一种方法可以忽略向转储添加DEFINER
。 但是在创build转储文件后有办法删除它们。
-
在文本编辑器中打开转储文件,并用空string“”replace所有出现的
DEFINER=root@localhost
-
编辑转储(或pipe道输出)使用
perl
:perl -p -i.bak -e "s/DEFINER=\`\w.*\`@\`\d[0-3].*[0-3]\`//g" mydatabase.sql
-
通过
sed
pipe道输出: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。