Mysqldump触发器分隔符语法

3
我正在使用mysqldump进行备份,其中包括触发器,但在导入时会出现以下分隔符语法错误:
ERROR at line 1059: DELIMITER必须后跟delimiter字符或字符串
ERROR 1064 (42000) at line 1060: 您的SQL语法存在错误,请检查与您的MySQL服务器版本相应的手册以使用正确的语法,在第5行附近。
在第1059行设置了DELIMITER,在触发器语句之前:DELIMITER;;
第1060行是:/!50003 CREATE/ /!50017 DEFINER = user@%//!50003 TRIGGER database.t_auditclients
该触发器是使用DELIMITER $$放置的。 然而,当备份完成后,生成的SQL文件中有DELIMITER;; 而不是$$ 。我已经在mysqldump文件中手动更改了DELIMITER;;为DELIMITER$$并成功地使用mysqlworkbench导入。是否有办法使mysqldump输出创建触发器所使用的原始分隔符?
谢谢

如何进行转储?命令中是否明确指定了“DELIMITER ;;”? - जलजनक
转储是使用--trigger标志从命令行获取的。在转储SQL文件中,所有分隔符命令都是DELIMITER ;;。 - R D
我猜这是有意的,触发器被注释掉以支持早期版本(3.x、4.x)中的转储。MySQL Bug #33494 - जलजनक
1
是的,但问题在于分隔符,当我手动更改分隔符语句以使用$$时,触发器成功导入。想知道是否有一种方法可以使mysql在首次输入触发器时输出使用的分隔符。 - R D
2个回答

4
在Linux上的解决方法是运行以下命令:
sed -i -- 's/^..!50003\sCREATE.....!50017\sDEFINER=.root...[^`]*`.....!50003\s\([^;]*\)/CREATE DEFINER=CURRENT_USER \1/g;s/^\s*\([^\*]*;\{0,1\}\)\s\{0,1\}\*\/;;$/\1;;/g' fileName.sql

这将创建一个新文件,其中root@localhost或其他内容被删除并替换为CREATE DEFINER=CURRENT_USER,所有50003/50017的东西都消失了,它可以正常工作。哈利路亚!

注意:在OS X上使其工作,您不能使用内置版本的sed。您可以brew install gnu-sed,然后打开一个新的终端窗口,执行上述命令,但使用gsed而不是sed

然后运行SQL当然最简单的方法就是进入mysql终端,必要时USE一个数据库,然后SOURCE fileName.sql... 获得丰厚的利润。

注意:许多Bothans死于为我们带来此信息。


0
在我的情况下,导致问题的触发器没有BEGINEND语句。因此,我应用了相应的DROP TRIGGERCREATE TRIGGER,然后再次进行备份,后来成功地恢复了。即:
DROP TRIGGER `incorrect_trg1`;
DELIMITER ;;

CREATE DEFINER = `root`@`localhost` TRIGGER `incorrect_trg1` BEFORE INSERT ON `table1` FOR EACH ROW 
BEGIN
SET NEW.col = DATE_FORMAT(NEW.col,'%Y%m');
END;;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接