小墨の博客

梦想需要付诸行动,否则只能是梦

服务器搬家记 001:MySQL数据库升级到8.0.17版本后部分字段长度丢失,数据库导入丢失部分表,特殊符号变为?

写这篇博客的日期是2020.12.31,新的一年又快到了,当别人都忙着庆祝2021年的到来的时候,突然想起来,我的服务器要到期了!于是赶紧登录后台各种备份,转移数据到我另外一台有效期到2023年8月份的服务器。由于续费太太太太贵了,相当于好几个月的生活费呢,续费是不可能续费了,于是抽空开始着手服务器搬家。因为我的另外一台服务器和当前正在用的服务器不在同一个厂商,所以没有办法直接制作镜像。害,没钱就拿操作来凑吧......


在搬家中遇到的一些问题,接下的几天我会陆续通过博客的形式记录下来,希望能够帮助到屏幕前有相同问题的你。同时也提醒我自己在之后的搬网站搬家过程中也注意一下相关问题。



好了,废话就不说了,咱们切入正题:


问题1:迁移后丢失少量数据表。

问题出现的背景:使用宝塔面板导入数据库。

解决方法:使用phpMyAdimin,或者其他数据库管理软件导入,而不要使用宝塔面板导入数据库


问题2:迁移后数据库内的特殊符号,小表情等变为?。

问题出现的背景:使用宝塔面板导出数据库。

解决方法:使用phpMyAdimin,或者其他数据库管理软件导出,而不要使用宝塔面板导出数据库


问题3:迁移后的数据库字段部分类型的长度丢失,部分未丢失。

问题出现的背景:迁移前数据库版本为MySQL 5.7.32(低于8.0.17),迁移后数据库版本为MySQL 8.0.20(高于8.0.17)。

解决方法:①使用低于8.0.17版本的MySQL数据库,②就保持现状,因为使用8.0.17之后的版本不支持。



知识点:

1.宝塔面板定时任务备份的数据库是.tar.gz压缩格式(即gzip压缩格式),手动备份数据库的压缩格式为.zip格式。

2.宝塔面板导出数据库可能会有字符集的问题,比如可能数据库中的特殊字符会变成?

3.宝塔面板导入数据库可能会出现个别数据表导入失败的问题,但是没有任何错误提示,提示还是成功。

4.为了数据不丢失,大家还是老老实实的登录phpMyAdmin,然后导出和数据库字符集相同的文件(比如utf-8)。

2.从MySQL 8.0.17版本开始,TINYINT, SMALLINT, MEDIUMINT, INT, and BIGINT类型的显示宽度将失效(是8.0.17版本之后,之前的不受影响)。




至此,本文干货结束,下面是详细记录的问题发现及解决步骤:


网站搬家的时候涉及到网站数据库的搬家,于是便直接下载了宝塔面板内的自动备份文件,然后传到目的数据库中,但是发现两个数据表变少了,打开网站一看,果不其然报错了,这还得了,赶紧找Bug!

迁移前:

image.png

迁移后:

image.png


首先,联想到可能是宝塔面板导出数据库的问题,于是我在宝塔面板后台又手动备份了一遍数据库,竟然发现手动备份的数据库格式为.zip(跟定时任务备份的数据库文件命名和压缩方式都不同),清空目的数据库后再次导入,发现问题依然没有解决。同时发现了一个严重的问题,就是数据库中的特殊字符竟然全部变成了?。

于是拿记事本打开导出的.sql文件,果然,所有的特殊字符全变成了?,这说明问题就出现在数据库的导出上。(所以以后还是别偷懒,用宝塔面板的一键导出有问题,老老实实的去数据库里面导)

(别问我为什么不用Notepad++,那玩意儿的作者说过啥咱们都知道,咱不稀罕用它!)

难道是宝塔面板导出数据库的时候出的问题?于是换了个思路,不从宝塔面板数据库备份那个窗口备份数据库然后再导出了,用phpMyAdmin打开相应数据库,直接导出,然后通过目标服务器的宝塔面板导入到目标数据库中。

再次检查导入的数据,发现特殊符号可以正常查看了,于是激动的跑去再次打开网站,发现网站还是报错,再仔细一看...数据表还是缺了几个没有倒入进来......

折腾了半天,最后还是决定直接用phpMyAdmin数据库管理后台导入.sql文件,然后emm...问题就解决了。

就解决了!

正当我高兴的时候,突然发现,数据表是没缺,数据表里面的数据行数也是对的,但是为啥大小都差一点点呢?

我拿两个数据库对比了半天,最后才发现...有些类型的长度丢失了(如下图)

迁移前image.png

迁移后

image.png

(扯个题外话,知道的同学可能一眼就看出来这个是Discuz Q!的数据库哈哈)


郁闷至极,打开百度一搜,啊哈,原来不是我一个人遇到了这样的问题。

参考了这篇博文:https://blog.csdn.net/shunshengli/article/details/106473613

看完之后才发现,这个其实不算是一个问题,只是说做了一些调整而已。如果说一定需要添加限制的话,可以将MySQL降级到8.0.17版本以下。

附上官网的说明&链接:https://dev.mysql.com/doc/relnotes/connector-j/8.0/en/news-8-0-19.html

MySQL Server 8.0.17 deprecated the display width for the TINYINTSMALLINTMEDIUMINTINT, and BIGINT data types when the ZEROFILLmodifier is not used, and MySQL Server 8.0.19 has removed the display width for those data types from results of SHOW CREATE TABLESHOW CREATE FUNCTION, and queries on INFORMATION_SCHEMA.COLUMNSINFORMATION_SCHEMA.ROUTINES, andINFORMATION_SCHEMA.PARAMETERS (except for the display width for signed TINYINT(1)). This patch adjusts Connector/J to those recent changes of MySQL Server and, as a result, DatabaseMetaDataParameterMetaData, and ResultSetMetaData now report identical results for all the above-mentioned integer types and also for the FLOAT and DOUBLE data types. (Bug #30477722)

image.png

根据官网资料可知:从8.0.17版本开始,TINYINT, SMALLINT, MEDIUMINT, INT, and BIGINT类型的显示宽度将失效。


好啦,这次遇到的问题都搞明白啦,我们下期再见啦,拜拜~

张小弟之家

本文链接:
文章标题:

本站文章除注明转载/出处外,均为原创,若要转载请务必注明出处。转载后请将转载链接通过邮件告知我站,谢谢合作。本站邮箱:admin@only4.work

尊重他人劳动成果,共创和谐网络环境。点击版权声明查看本站相关条款。

    发表评论:

    搜索
    本文二维码
    标签列表
    站点信息
    • 文章总数:507
    • 页面总数:20
    • 分类总数:92
    • 标签总数:207
    • 评论总数:60
    • 浏览总数:219202

    | | |
    | |  Z-Blog PHP