3

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

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

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

第 1059 行在触发语句之前设置分隔符:DELIMITER ;;

第 1060 行是: / !50003 CREATE / / !50017 DEFINER= user@% / /*!50003 TRIGGER databaset_auditclients

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

谢谢

4

2 回答 2

2

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如果需要的话,一个 db,然后SOURCE fileName.sql......以获得巨大的利润。

注意:许多博萨人为给我们带来了这些信息而死。

于 2016-04-07T16:40:07.220 回答
0

就我而言,导致问题的触发器没有BEGINandEND语句。所以我应用了相应的DROP TRIGGERand CREATE TRIGGER,然后我再次做了一个备份,后者恢复没有问题。IE:

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;;
于 2019-08-07T10:17:36.000 回答