报错:[ERR] 1577 – Cannot proceed because system tables used by Event Scheduler were found damaged at server start
一步步来排除:
- 登录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,强硬替换还是不行的,还得再研究。
发表回复