MariaDB数据库dump导入触发ERROR 1064(42000)语法错误咨询
问题根因
这个报错和业务数据异常无关,也不是当前安装的MariaDB 10.3.34服务端本身的版本bug,核心诱因是导出dump文件所用的mysqldump工具版本和目标数据库版本不匹配,生成的触发器SQL存在格式缺陷,导入时被客户端解析失败。
你贴出的出错SQL里用了MySQL/MariaDB特有的版本条件注释语法:格式为/*!版本号 执行语句*/,只有当数据库实际版本高于注释里标注的版本号时,注释内部的语句才会被执行。
正常情况下这段触发器定义里应该有三段有效注释:
/*!50003 CREATE*/:版本≥5.0.3时执行CREATE关键字/*!50017 DEFINER=用户@主机*/:版本≥5.0.17时带上触发器的定义者权限配置/*!50003 TRIGGER......*/:版本≥5.0.3时执行完整的触发器创建逻辑
你现在的dump文件里,第二段注释变成了空的/*!50017 */——一般是导出时用了高版本的mysqldump工具,或者导出时加了--skip-definer参数,导致definer配置被清空但注释标记没有被同步删除。mysql命令行客户端解析到连续的空条件注释块时,会把后面的注释闭合符*/识别为非法SQL标记,最终抛出1064语法错误。
补充说明:MariaDB 10.3版本完全支持你触发器里写的SIGNAL语法,不存在服务端不兼容语法的问题。
解决方法
任选以下一种方案即可修复:
- 重新导出备份:使用当前MariaDB 10.3.34自带的mysqldump工具执行导出,不要用其他高版本MariaDB/MySQL安装包附带的mysqldump,从根源避免生成空注释块。
- 修复现有dump文件:直接编辑dump文件,找到出错行,把空的
/*!50017 */片段直接删除,修改后的语句如下,保存后即可正常导入:
DELIMITER ;; /*!50003 CREATE*/ /*!50003 TRIGGER `NotDel_Entries` BEFORE DELETE ON `entries_table` FOR EACH ROW SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'table entries_table does not support deletion'; */;;
- 批量替换修复:如果dump文件太大不好手动编辑,可以用sed命令全局替换掉空的版本注释块,命令如下:
sed -i 's/\/\*!50017 \*\///g' 你的备份文件路径.sql
内容的提问来源于stack exchange,提问作者Benjamin Gerber
相关产品推荐
相关产品推荐

