2013-02-05 32 views
1

我使用mysqldump進行備份,包括觸發器,它在執行導入時,用下面的分隔符語法錯誤的結果:在行1059mysqldump的觸發定界符語法

錯誤:分隔符必須跟一個delimiter字符或字符串

錯誤1064(42000)在行1060:您的SQL語法有錯誤;檢查對應於你的MySQL服務器版本從正確的語法使用近``第5行

1059線觸發statment之前設置分隔符的手冊:DELIMITER ;;

線1060爲:/ 50003 CREATE// 50017 DEFINER = user @%// * 50003 TRIGGER database!。 t_auditclients

觸發器被放入了DELIMITER $$。但是,備份時產生的sql文件具有DELIMITER ;;而不是$$。我手動更改了DELIMITER ;;到mysqldump文件中的DELIMITER $$,並使用mysqlworkbench成功導入。有沒有辦法讓mysqldump輸出成爲用於創建觸發器的原始分隔符?

感謝

+0

轉儲是如何進行的?是否在命令中明確指定了「DELIMITER ;;」? – SparKot

+0

轉儲是從帶有--trigger標誌的命令行獲取的。在dump sql文件中,所有的分隔符命令都是DELIMITER ;; –

+0

我想它的目的是觸發器被註釋掉以支持早期版本(3.x,4.x)中的轉儲。 [MySQL Bug#33494](http://bugs.mysql.com/bug.php?id=33494)。 – SparKot

回答

0

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 

這將創造一個根@本地或任何已取出,並將創建DEFINER更換一個新的文件= CURRENT_USER和所有的50003/50017垃圾都沒有了,它只是起作用。哈利路亞!

注意:爲了使它在OS X上運行,您不能使用sed的內置版本。您可以brew install gnu-sed,然後打開一個新的終端窗口,並執行上述命令,除了使用gsed而不是sed

然後運行SQL當然最簡單的事情就是進入mysql終端,USE一db如果需要,然後SOURCE fileName.sql ...爲了巨大的利潤。

注意:許多Bothans爲了給我們帶來這些信息而死亡。