本文已参与新人创作礼活动,一起开启掘金创作之路
最近在做mysql5.7到mysql8.0的升级,然后今天研发和我说迁移的数据中缺少存储过程,原来是默认情况下,mysqldump并不会导出数据库的存储过程和函数,如果数据库上创建了存储过程且备份是需要备份存储过程,那就需要用参数 -R 来指定。但是在使用mysqldump导存储过程时一直出现下面的错误:
mysqldump: Couldn't execute 'SHOW PACKAGE STATUS WHERE Db = 'auto_test_iam'': You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'PACKAGE STATUS WHERE Db = 'auto_test_iam'' at line 1 (1064)
然后我又调整了参数的顺序,问题依旧:
然后查了权限,发现也没啥问题,查权限命令:
show grants for 'user'@'host'
紧接着开启了general_log:
show variables like 'general_log'; 查看日志是否开启
set global general_log=on; 开启日志功能
show variables like 'general_log_file'; 看看日志文件保存位置
动态查看日志:
依然没什么发现,只看到在show存储过程的时候quit了。然后对比了下mysql和mysqldump的版本,当时也没发现什么猫腻:
至此陷入僵局,google也没什么答案。最后去群里将这个问题暴露出来,然后大佬的一句话给了我方向:
就是说mariadb才有show package status,于是我找到了我“珍藏”许久的mysql二进制包,解压出来,使用里面的mysqldump进行测试:
然后居然成功了!看来就是使用了mariadb的mysqldump造成的问题。毕竟不是dba,数据库层面还是需要向大佬们学习,如果给我自己排查,可能得按天计算。
本人一直在从事devops运维相关工作,欢迎大家关注我的个人公众[运维小白成长之路],会不定期更新运维相关经验分享,希望能和大家一起成长~~