MySQL 数据库升级攻略:从 5.7.32 到 8.0.22,轻松解决字符集问题

跟你们聊聊我最近博客升级数据库遇到的事儿呗。虽然只是简单的升级,但还挺有意思滴,运气好得很~

一、准备出发:导出表结构和数据

systemctl stop httpd
tar cvzf /tmp/wordpress_bak.tar.gz wordpress/*
mysqldump -uroot -p --no-data --default-character-set=utf8mb4 --single-transaction --set-gtid-purged=OFF --databases wordpress > /tmp/wordpress.sql
mysqldump -uroot -p --no-create-info --master-data=2 --flush-logs --routines --events --triggers --default-character-set=utf8mb4 --single-transaction --set-gtid-purged=OFF --databases wordpress > /tmp/wordpress_data.sql
  • 1.
  • 2.
  • 3.
  • 4.

哦对了,我们得先搞定WordPress里面的所有数据,就像搬家前要摸清楚家里东西放在哪儿的感觉。于是乎,我整出来俩文件,一个叫wordpress.sql,一个叫数据文件。之后,我直接把wp.sql克隆了一份,改个编码让它能用utf8mb4字符,这下子新家就能容纳更多字符!

cp /tmp/wordpress.sql /tmp/wordpress_utf8mb4.sql
vim /tmp/wordpress_utf8mb4.sql
# :%s/utf8/utf8mb4/g 如果已有utf8mb4会被替换成utf8mb4mb4,注意别替换错了。
  • 1.
  • 2.
  • 3.

二、卸载旧版本,迎接新生活

老的MySQL5.7.32得先卸掉,跟搬家似的彻底清理。然后检查现在到底在用哪个版本的MySQL?全部去掉,连/var/lib/mysql目录也别留下,确保家里干净利索。接下来,更新一下库,安装好mysql80-community;最后,最新的MySQL8.0.22给装上,现在这地儿就像新装修一样崭新。

三、配置新家:修改my.cnf文件

yum list installed | grep mysql
......
mysql-community-client.x86_64         5.7.32-1.el7                   @mysql57-community
mysql-community-common.x86_64         5.7.32-1.el7                   @mysql57-community
mysql-community-libs.x86_64           5.7.32-1.el7                   @mysql57-community
mysql-community-libs-compat.x86_64    5.7.32-1.el7                   @mysql57-community
mysql-community-server.x86_64         5.7.32-1.el7                   @mysql57-community
mysql80-community-release.noarch      el7-3                          @/mysql80-community-release-el7-3.noarch
......
yum remove mysql-community-client.x86_64 mysql-community-common.x86_64 mysql-community-libs.x86_64 mysql-community-libs-compat.x86_64 mysql-community-server.x86_64 mysql80-community-release.noarch
rm /var/lib/mysql/ -rf
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

搞定搬家后,咱就来装修一下服务器!先备份好/etc/my.cnf,再开始捣鼓服务器。记住,binarylog别弄坏了,但utf8mb4字符集可得换成新的。一启动mysql数据库,原来的root密码自然出来了。接下来运行个安全设置的小脚本,弄个牛逼点的新root密码,把匿名用户删掉,不让root远程登录,别忘了还得删些没用的测试库。

四、避免装修陷阱:错误的配置

cd /etc/yum.repos.d/
mv mysql-community.repo.rpmsave mysql-community.repo
vim mysql-community.repo
# [mysql80-community]
# name=MySQL 8.0 Community Server
# baseurl=http://repo.mysql.com/yum/mysql-8.0-community/el/7/$basearch/
# enabled=1
# gpgcheck=1
# gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
yum clean all
yum makecache
yum install mysql-community-server
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.

啊那时的装修真是让我害怕得不行!差点听从那些人的瞎话。越说就越离谱,最后竟然把数据库也给搞坏了。好在我立马看清事实,才免于被坑骗。

五、搬进新家:导入数据及配置

房子装好了,快去买家具温馨提醒下,我在WP上都试过,目前WordPress只支持后台管理,比如新建账号啊、更改别人的设置之类的就不行了,所以还是规规矩矩按照要求操作。

六、新家的第一天:测试和优化

房子弄好了,我去看了看没啥问题。家里的东西用过后都挺好使的。还有,我给电脑动了点小手术,让速度快了点儿。

七、新生活的开始:总结和展望

搞定了!博客数据库升级到了最新版的MySQL8.0.22,还用utf8mb4新增了很多字符。虽然过程有点繁琐,但终究圆满成功。博客速度飞快得很,还能显示更多文字,就像是搬了个新家似的舒心。

cp /etc/my.cnf /etc/my.cnf.bak20201212
vim /etc/my.cnf
## mysql-8.0.x默认开启binary log,不需要log-bin参数,文件名binlog.
## mysql-8.0.x默认字符集utf8mb4,这里字符集设置统一utf8mb4
#连接建立时执行设置的语句,对super权限用户无效
init_connect='SET NAMES utf8mb4'
#设置服务端校验规则,如果字符串需要区分大小写,设置为utf8mb4_bin
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
#忽略应用连接自己设置的字符编码,保持与全局设置一致
skip-character-set-client-handshake
systemctl start mysqld.service
grep "temporary password" /var/log/mysqld.log
mysql_secure_installation
mysql -uroot -p
mysql> show variables like '%char%set%';
+--------------------------+--------------------------------+
| Variable_name            | Value                          |
+--------------------------+--------------------------------+
| character_set_client     | utf8mb4                        |
| character_set_connection | utf8mb4                        |
| character_set_database   | utf8mb4                        |
| character_set_filesystem | binary                         |
| character_set_results    | utf8mb4                        |
| character_set_server     | utf8mb4                        |
| character_set_system     | utf8                           |
| character_sets_dir       | /usr/share/mysql-8.0/charsets/ |
+--------------------------+--------------------------------+
8 rows in set (0.01 sec)
mysql> show variables like '%collation%';
+-------------------------------+--------------------+
| Variable_name                 | Value              |
+-------------------------------+--------------------+
| collation_connection          | utf8mb4_general_ci |
| collation_database            | utf8mb4_general_ci |
| collation_server              | utf8mb4_general_ci |
| default_collation_for_utf8mb4 | utf8mb4_0900_ai_ci |
+-------------------------------+--------------------+
4 rows in set (0.00 sec)
mysql> show variables like '%log_bin%';
+---------------------------------+-----------------------------+
| Variable_name                   | Value                       |
+---------------------------------+-----------------------------+
| log_bin                         | ON                          |
| log_bin_basename                | /var/lib/mysql/binlog       |
| log_bin_index                   | /var/lib/mysql/binlog.index |
| log_bin_trust_function_creators | OFF                         |
| log_bin_use_v1_row_events       | OFF                         |
| sql_log_bin                     | ON                          |
+---------------------------------+-----------------------------+
6 rows in set (0.00 sec)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.

很高兴看到你们还在。如果有类似经验的,来分享下别忘了为这次的更新贡献个赞,让大伙儿看看我们有多努力!

THE END