mysqldump触发分隔符语法

时间:2013-02-05 17:37:09

标签: mysql triggers mysqldump delimiter

我正在使用mysqldump进行包含触发器的备份,并且在执行导入时会产生以下分隔符语法错误:

  

第1059行的错误:DELIMITER必须后跟一个delimiter字符或字符串

     

第1060行的错误1064(42000):您的SQL语法出错;从正确的语法检查与MySQL服务器版本对应的手册,以便在“第5行”附近使用

第1059行在触发器声明之前设置分隔符:DELIMITER ;;

第1060行是:/ !50003 CREATE / / !50017 DEFINER = user @ % / / *!50003 TRIGGER {{ 1}}。database

使用DELIMITER $$输入触发器。但是,备份时生成的sql文件有DELIMITER ;;而不是$$。我手动更改了DELIMITER ;;在mysqldump文件中使用DELIMITER $$并使用mysqlworkbench成功导入。有没有办法让mysqldump输出用于创建触发器的原始分隔符?

由于

2 个答案:

答案 0 :(得分:1)

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死于向我们提供这些信息。

答案 1 :(得分: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;;