navicat转储SQL文件报1577错误详解

报错:[ERR] 1577 – Cannot proceed because system tables used by Event Scheduler were found damaged at server start

打开数据表,偶尔弹出。
转储SQL时出错

一步步来排除:

  • 登录phpmyadmin导出SQL数据正常;
  • 再通过navicat端运行SQL文件出现错误“ERR2006”如下图:
  • 修改my.ini文件,将max_allowed_packet = 1M改大一点,我的这个SQL文件刚好超过了1M,顺便测试了小于1M的可以正常导入,所以必定是修改这里,改后重启MySQL。
  • 再次运行SQL文件,如下图没有报错了。
  • 但是转储导出去仍然报错1755。再次转储一个线上数据库,可以正常导出,这说明与软件关系不大;
  • phpmyadmin可以正常导出也不能排除MySQL是否有问题?
  • 再次看一下上次针对1577错误学习提到的官方回复,大概意思就是要升级MySQL,真的是MySQL版本的问题吗?
  • 查看线上MySQL版本为5.7.27,本地版本为5.7.24,相差不大。
  • 可能除了更新试一下没有其它更好的办法了,但是这里一定要注意数据库的备份,这里不是某个数据库,是整个本地的数据都要做好备份
  • Windows环境下本地备份还是很简单的,停掉MySQL服务后找到安装路径下的data文件夹,打包一下即可。详见https://dev.mysql.com/doc/refman/5.7/en/backup-methods.html
  • 继续研究如何来升级,查看给出的官方链接https://dev.mysql.com/doc/refman/5.7/en/mysql-upgrade.html
  • 这个链接默认跳转到8.0,我修改了一下版本5.7可以正常访问到,原来页面右上角有修改版本的,包括5.6/5.7/8.0
  • 文档中主要也是介绍了一些参数的作用及使用方法,强调了备份的重要性。
  • 参数–upgrade-system-tables,感觉挺重要的,描述意思是“只更新系统表不更新用户模式”,这样操作可能会更安全,不知道能否解决我们的问题。
  • 开始吧。
  • 如上图,以管理员方式打开cmd,运行mysql_upgrade –upgrade-system-tables
  • 错误提示:Error occurred: Cannot setup server variables.
  • 权限不够,再次运行:mysql_upgrade –upgrade-system-tables -uroot -p
  • 输入密码回车,又出现了新的错误[ERROR] 1146: Table ‘mysql.gtid_executed’ doesn’t exist,如下图。
  • 错误意思就是表不存在,搜索并回想可能与以前本地升级测试环境wamp,直接复制数据库文件有关。目前5.6版本安装目录下data文件夹都不存在了。
  • 既然是表gtid_executed不存在,那就创建一个试一下,首先看了线上服务器的mysql数据库里面确实存在这个表,其实也是空表,转储一下,试一下导入,照样提示表不存在,无法导入。
  • 那么接着就手动创建这个表再导入试一试,结果建表也出现错误,如下图。
  • 这个错误是因为表里面什么都没填,随便填了一个就保存成功了。
  • 以为这样就可以导入这个表,结果还是报错,忘了截图,意思是表存在。
  • 再运行一次mysql_upgrade –upgrade-system-tables -uroot -p
  • 出现了新的错误,如下图,就是这个错误,exists
  • 避免进入无限循环,暂停MySQL,把之前的备份压缩包中的mysql文件夹拉出来替换一下当前的变动,重启MySQL,继续研究错误:mysql_upgrade: [ERROR] 1146: Table ‘mysql.gtid_executed’ doesn’t exist
  • 为了避免是navicat问题,这次使用phpmyadmin再试一下,打开后发现可以看到表gtid_executed,但是无法进入,就是1146的错误提示。
  • 直接导入SQL文件试一下,还是1813错误提示如下图
  • 点击蓝色小问号,可惜文档帮助返回的是没有发现页面。
  • 刷新phpmyadmin页面,gtid_executed表不见了。
  • 再次停止MySQL服务,恢复备份(可见备份的重要性)。
  • phpmyadmin可以看见表,再次进入navicat查看没有此表,软件之间还是有区别的。
  • 现在的问题就是此表损坏,看要如何能修复才能继续。
  • 用命令repair table尝试不行,如下图
  • 停止MySQL,只能用替代法了,幸好我有随时备份的习惯,拷贝数据data目录过来前,将原本有的data目录打包过,肯定是这里面的某个文件被老的数据替代了,因为mysql数据是自带的,安装MySQL就有的,从来没有动过。
  • 打开以前的数据备份包,除了自建的一个数据库,查看到3个文件夹+7个文件是安装时就自带的。如下图:
  • 因为不知道它们具体的作用,通过不断的替代,最后锁定了mysql文件夹和ibdata1文件,将两个替换掉现有的,在phpmyadmin和navicat中就可以正常查看gtid_executed表了。
  • 既然这个问题解决了,我们首先转储一下是否还报错1577,如果报同样的错误,再执行mysql_upgrade
  • 可喜的是,此时在navicat中转储SQL时已经成功完成,并且测试了多个数据库同样成功。

总结:

  • 1577错误的缘由弄清楚了,就是转移数据的时候替换掉了相关的系统文件,特别ibdata1文件可以深入再研究下,原有的七十几M,用现在12M的替换掉了,不知道是否会引入新的问题?(补充:有问题,不能强硬替代)
  • 还有个疑问,phpmyadmin为什么不报错,navicat就报错?看来navicat更严谨一些。
  • 还有mysql_upgrade也没有完成尝试,有机会再试。over

最后再次强调:涉及到数据的一定要多多备份。


补充:强迫症,mysql_upgrade必须得试一下啊。加了–upgrade-system-tables参数,反正影响不大,见下图没再报错,over。

补充:果然来问题了,其它数据库打不开提示1146,强硬替换还是不行的,还得再研究。


评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注