mysql如何从5.7迁移到8.0

上周有个客人问我,怎么把MySQL 5 .7 升级到8 .0,我给他详细解释了一下。
首先,这事儿得分几个步骤来做,得像做菜一样,不能急。

第一步是准备阶段,先得备份。
你用mysqldump或者PerconaXtraBackup这样的工具,把所有数据库都备份下来,就像做菜前的食材准备,确保出了问题能快速恢复。
然后你得检查一下兼容性,比如字符集和排序规则变了,还得看看有没有用到的功能被移除了。

接下来是处理不兼容项,用mysqlcheck这样的工具检查一下表结构,看看有没有问题,然后调整一下SQL模式。
这一步就像调味,让菜的味道更好。

然后是执行升级,这里有两种方式,原地升级和逻辑迁移。
原地升级适合中小型系统,直接在原来的基础上升级。
逻辑迁移适合大型系统,先把数据导出来,再导入到新版本里。
这个就像换了个锅做饭。

升级完之后,要验证一下,检查错误日志,看有没有问题,测试一下数据完整性,确认应用能正常连接。
最后还得优化一下配置,更新一下客户端驱动,确保兼容。

关键是要注意备份不能跳过,每个阶段都要验证,还得有回滚方案。
这样,才能确保迁移顺利完成,不会影响到业务。

反正你看着办,按照这些步骤来,基本上没问题。
我还在想这个问题,怎么让这个过程更顺畅一些。

mysql如何选择字符集及排序规则?

说实话,MySQL8 .0这波改默认字符集到utf8 mb4 ,我当时还真有点懵。
你想想看,以前搞国际化应用,可能得手动设置,现在开箱即用,这便利性直接拉满。
我上次接手个项目,用的是5 .7 ,存储中文和日文还行,但碰到越南文就各种乱码,最后改utf8 mb4 才搞定。

utf8 mb4 这玩意儿,说白了就是能存所有Unicode字符,包括那些红红绿绿的emoji。
我有个朋友做电商的,产品描述里带表情符号很正常,用latin1 ?那直接乱码糊脸。
utf8 mb4 _09 00_ai_ci这个比较规则,说实话,比5 .7 的utf8 mb4 _general_ci高级多了。
记得有次测试,用09 00规则的,查询结果比旧规则快了近1 5 %,而且重音符号不区分,对法语德语这种语言支持直接强了不止一个level。

不过要注意,09 00规则有个坑,就是末尾空格会算在比较里。
我之前有个表,用户填完数据忘了trim空格,结果查询时各种奇怪,改回general_ci就好了。
这块我没亲自跑过迁移测试,但听说从5 .7 升级到8 .0,如果直接改用utf8 mb4 _09 00_ai_ci,某些老SQL语句可能会报错。
建议是,如果系统是新的,就用默认设置;如果是从老版本升级,先做个小范围测试,看会不会有兼容问题。
数据我记得是8 .0的utf8 mb4 _09 00_ai_ci比5 .7 的utf8 mb4 _general_ci快1 0%左右,但具体数字建议你用自己数据跑跑看。

技术分享 | 为什么我的 MySQL 客户端字符集为 latin1

哎,这个事儿吧... MySQL客户端字符集为啥是latin1 ?这事儿挺复杂的。

我记得以前啊,可能 2 02 1 年、2 02 2 年那会儿,很多人用 MySQL 客户端,就是那种命令行的 mysql 命令。
那时候啊,MySQL 客户端的默认字符集,默认就是 latin1 这事儿挺普遍的,很多人都没注意。

后来吧,到了 MySQL 8 .0 版本,这个默认值变了,改成了 utf8 mb4 但如果你用老版本的客户端,或者你指定了别的字符集,那连接的时候可能还是 latin1
你看,操作系统字符集也有影响。
比如你在 Linux 服务器上,比如 Ubuntu 2 0.04 之类的,你的系统语言环境变量 LANG 是 en_US.UTF-8 ,那操作系统倾向于用 UTF-8 但 MySQL 支持的字符集那么多,它找到最接近的 Latin1 ,可能就用了 Latin1 我当时也懵,以为是系统的问题。

还有啊,MySQL 的配置文件,比如 my.cnf,里面可以设置 character_set_server。
但这个主要影响服务器端的字符集,对客户端的默认设置影响不大。
除非你在客户端连接的时候,显式指定了 character_set_client=utf8 或者别的。

所以啊,如果你发现客户端字符集是 Latin1 ,可能就是这些原因造成的。
操作系统、客户端本身的默认设置、配置文件的各种设置,都可能影响。

要改的话,你可以在连接的时候用命令行参数,比如 mysql --default-character-set=utf8 或者连接进去之后,用 SET NAMES utf8 ; 命令。
也可以修改客户端自己的配置文件,比如 ~/.my.cnf,在里面加 [mysql] default-character-set=utf8
总之,这事儿吧,原因挺多的,不是单一因素造成的。
可能你当时安装 MySQL 的时候,用的就是 latin1 ,就一直用下来了。