【问题标题】:mysqldump trigger delimiter syntaxmysqldump 触发器分隔符语法
【发布时间】:2013-02-05 17:37:09
【问题描述】:

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

第 1059 行出现错误:DELIMITER 必须后跟 delimiter 字符或字符串

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

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

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

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

谢谢

【问题讨论】:

  • 转储是如何进行的? DELIMITER ;; 是否在命令中明确指定?
  • 转储是从带有 --trigger 标志的命令行获取的。在转储 sql 文件中,所有分隔符命令都是 DELIMITER ;;
  • 我猜这是故意的,触发器被注释掉以支持早期版本(3.x,4.x)中的转储。 MySQL Bug #33494.
  • 是的,但问题在于分隔符,因为当我手动将分隔符语句更改为使用 $$ 时,触发器已成功导入。想知道是否有办法让mysql首先输出输入触发器时使用的分隔符。

标签: mysql triggers mysqldump delimiter


【解决方案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 一个 db,然后是 SOURCE fileName.sql ... 以获得丰厚的利润。

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

【讨论】:

    【解决方案2】:

    就我而言,导致问题的触发器没有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;;
    

    【讨论】:

      猜你喜欢
      • 2011-11-23
      • 2013-06-23
      • 1970-01-01
      • 1970-01-01
      • 2011-03-29
      • 2016-05-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多