标签: mysql_upgrade

  • 续:mysql_upgrade解决navicat转储1577错误

    续:mysql_upgrade解决navicat转储1577错误

    上一篇navicat转储SQL文件报1577错误详解,找到了问题所在,但是强硬替代法显然不行,影响了其它数据库的正常运行。

    • 马上将备份替换回去,回到报错1577的时候,这个时候只有mysql一个数据库的一个表有问题,不能因为这一个导致其它数据库都有问题,那就得不偿失了。

    现在大概有两条路:

    • 将现在数据备份,重新安装MySQL,再次导入备份的数据,这样略显麻烦,也不能保证所有的数据库都能完美成功导入。
    • 再一个就是继续研究mysql文件夹中的文件及ibdata1这个文件,修复他们两个。

    第一种方法显然没什么挑战性,还麻烦,最烦遇到问题动不动就重装的。目前来看,至少不算什么大问题,好歹phpmyadmin可以正常导入导出啊,起码其它数据库没有什么明显问题啊,所以走第二条路了。继续挑战看是否能完美解决。可能还是要跟mysql_upgrade打交道,毕竟navicat官方就是这么提示的。

    替换文件后,检查了数据库情况,照样mysql数据库gtid_executed表提示1146错误,但是运行mysql_upgrade –upgrade-system-tables -uroot -p出现了变数,没再报错,而是其它的提示,如下图。为什么没有报错可能与替换文件后运行过upgrade,见上文最后的补充内容

    The --upgrade-system-tables option was used, databases won't be touched.
    Checking if update is needed.
    This installation of MySQL is already upgraded to 5.7.24, use --force if you still need to run mysql_upgrade

    继续了解mysql_upgrade命令及相关参数。

    https://dev.mysql.com/doc/refman/5.7/en/mysql-upgrade.html

    通过加入–force强制执行一下更新,虽然升级过程完成了,但有不少错误,包括之前的1146表不存在错误,结果如图。

    查看了一下phpmyadmin中的mysql数据库中的gtid_executed表还是1146错误,可惜没有去navicat验证是否可以转储了。

    (补充:到这里就已经可以转储了,下面已验证)


    • 继续执行了不带–upgradesystem-tables的命令:mysql_upgrade -uroot -p
    • 提示必须带参数–force:mysql_upgrade –force -uroot -p
    • 更新过程还是有不少错误,见下图。

    继续检查其它数据库,就不再截图了,偶尔也有一些错误,可能是以前的老数据兼容问题吧,具体的升级记录复制保存了一份,到时有需要再查看。

    目前为止,navicat可以正常转储SQL文件了,1577错误没有了,可是mysql中表不存在还是不存在,上面提过,可惜第一步升级的时候没有验证是否可以转储了,要不然就不需要第二步了,步骤越少当然越安全了。要不然再还原回去,再来一遍?


    说干就干吧

    • 停止MySQL服务,因为数据库升级整个数据都已经动了,要还原回去必须整个欢迎,所以这里必须再次将现有情况的备份一下。
    • 再把上一个完整备份替换掉现有的数据,因为我的备份只涉及到data数据目录,所以之前的升级操作可能已经无法回头了,这也是为什么之前升级报错,后面没有再报错的原因。
    • 替换掉所有的文件后,重新启动MySQL服务
    • 通过phpmyadmin及navicat查看是否有什么变化。
    • phpmyadmin部分表提示1146,navicat转储报错1577,符合之前的情况。
    • 执行命令mysql_upgrade –upgrade-system-tables -uroot -p
    • 加入–force再次执行,与上面画红线的图提示一样。
    • 现在重启一下MySQL服务,验证一下navicat转储情况。
    • 果然可以了。

    over.

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

    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,强硬替换还是不行的,还得再研究。