我正在使用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输出用于创建触发器的原始分隔符?
由于
答案 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)
就我而言,引起问题的触发器没有BEGIN
和END
语句。因此,我应用了相应的DROP TRIGGER
和CREATE 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;;