一直以来,MySQL版本升级依赖额外的工具 mysql_upgrade ,但是从 MySQL 8.0.16 开始,mysql_upgrade 工具将被废弃,取而代之的是MySQL 8.0 新的版本升级方式,升级功能集成到MySQL Server的进程mysqld中,不再依赖额外的外部工具。

1 升级流程

  1. 设置innodb_fast_shutodwn参数并备份数据库。
  2. 备份mysql数据
    mysqldump -uroot -p --add-drop-table --routines --events --all-databases --force >/home/4atb/data-for-upgrade.sql
  3. 关闭MySQL Server,
  4. 安装新版本二进制软件包
  5. 将新的HOME下support-files/mysql.server拷贝到 /etc/init.d/mysqld
  6. service mysqld status
  7. 使用新版本软件包启动MySQL Server,此时Server会自动升级 数据字典表。运行mysql_upgrade 工具,升级系统表和用户表。
  8. 重启MySQL Server,接受业务流量。

1 查看启动方式

首先确定mysql 是如何启动的.

我们发现 ps -ef|grep mysqld一般都是有两个进程的

1 MYSQL_HOME/bin/mysqld --defaults --basedir=................

2 MYSQL_HOME/bin/mysql_safe --defaults --basedir -- datadir...............................

1)、查看进程信息

[greatsql@greatsql-1 ~]$ ps axj |head -1;ps axj |grep 4306 |grep -v grep
PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND 1 15195 15195 15195 ? -1 Ss 986 0:00 /bin/sh /greatsql/svr/greatsql/bin/mysqld_safe --defaults-file=/greatsql/conf/greatsql4306.cnf
15195 16613 15195 15195 ? -1 Sl 986 0:06 /greatsql/svr/greatsql/bin/mysqld --defaults-file=/greatsql/conf/greatsql4306.cnf --basedir=/greatsql/svr/greatsql --datadir=/greatsql/dbdata/data4306/data --plugin-dir=/greatsql/svr/greatsql/lib/plugin --log-error=/greatsql/logs/error4306.log --open-files-limit=65535 --pid-file=/greatsql/dbdata/data4306/data/mysql.pid --socket=/greatsql/dbdata/data4306/data/mysql.sock --port=4306


mysqld_safe 是 mysqld 的父进程

  • mysqld_safe 进程和 mysqld 进程是父子进程关系
  • systemd 服务启动,kill 父进程 (会话首进程),会导致子进程也退出
  • mysqld_safe 命令启动,kill 父进程 (非会话首进程),不会导致子进程退出;重新启动父进程,报错子进程已存在
  • 可以使用 mysqld_safe 命令启动 + 改造 mysqld_safe 脚本,实现【启、停 mysqld_safe 进程,不会影响 mysqld 进程】。此时不要混合使用 systemd 启动数据库,需要维护这个特殊的 mysqld_safe
1 systemctl status mysqld
2 service mysqld restart
3 /bin/mysqld_safe --defaults-file=/conf/greatsql4306.cnf & mysql_safe启动
实际  
3  /etc/init.d/mysqld start 
2)#/usr/local/mysql/bin/mysqld_safe --user=mysql --basedir=/usr/local/mysql --datadir=/data & 启动mysql服务
#netstat -anpt | grep mysqld
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 1180/mysqld
ps -ef | grep mysqld
root 906 19026 0 21:32 pts/0 00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --user=mysql --basedir=/usr/local/mysql --datadir=/data
mysql 1180 906 0 21:32 pts/0 00:00:00 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/data/vm1.test.com.err --pid-file=/data/vm1.test.com.pid --socket=/tmp/mysql.sock --port=3306

2设置参数

登录到数据库设置innodb_fast_shutdown到0。可以使用SET GLOBAL进行动态更改,

设置为0:会做清除脏页和插入缓冲区的合并操作,也会将脏页全部刷新到磁盘上面去,但是这个时候关闭的速度也是最慢的,此时数据完整性能得到最大保障

设置为1:关闭MySQL的时候不会做清除脏页和插入缓冲区的合并操作,也不会将脏页刷新到磁盘

设置为2:不会做清除脏页和插入缓冲区的合并操作,也不会将脏页刷新到磁盘,但是会刷新到redo log里面,再下次启动mysql的时候恢复

mysql -uroot -p    # 登录数据库
 SET GLOBAL innodb_fast_shutdown=0;    # 设置innodb_fast_shutdown
 SHOW GLOBAL VARIABLES LIKE '%innodb_fast_shutdown%';    # 查看innodb_fast_shutdown

3 对于小数据库 进行备份

2 升级总结

1 对于大部分的socket文件 pid文件,以及日志文件默认datadir目录中,于是方便basedir的更换升级。

2 把对应的basedir完全孤立,是非常明智的选择,对于数据库版本升级有很大的帮助,以前的版本可以更简化的进行删除。

3 在mysql数据库部署中前期规划时 mysql的 basedir与datadir最好进行分离,方便之后进程版本升级

默认条件下  pid文件,binglog文件,errlog文件 sock文件 slow log文件都默认在data的目录中  datadir

--pid-file
--log-error
--pid-file
--plugin-dir=MYSQL_HOME/lib/plugin/

4 记得将新软件的support-files/mysql.server 拷贝到/etc/init.d/mysqld文件 

service mysqld status
systemctl status mysqld.servic
#basedir/bin/mysqld_safe --user=root & 
[eoms@CaaS-node3 data]$ ps -ef|grep mysql
 eoms      7002     1  0 16:03 pts/3    00:00:00 /bin/sh /data/cbg/mysql-8.0.30/bin/mysqld_safe --datadir=/data/cbg/mysql-8.0.28/data --pid-file=/data/cbg/mysql-8.0.28/data/mysqltest.pid
 eoms      8515  7002 29 16:03 pts/3    00:00:49 /data/cbg/mysql-8.0.30/bin/mysqld --basedir=/data/cbg/mysql-8.0.30 --datadir=/data/cbg/mysql-8.0.28/data --plugin-dir=/data/cbg/mysql-8.0.30/lib/plugin --log-error=/data/cbg/mysql-
 8.0.28/data/error.log --open-files-limit=65535 --pid-file=/data/cbg/mysql-8.0.28/data/mysqltest.pid --socket=/data/cbg/mysql-8.0.28/data/mysql.sock --port=22306
 eoms      8996 23754  0 16:06 pts/3    00:00:00 grep --color=auto mysql
 [eoms@CaaS-node3 data]$


1 用eoms用户安装的mysql,
2 用root用户 使用systemctl start mysqld 报错,使用service mysqld start可以启动
3 启动的mysql停止了服务,看错误日志显示有
2022-09-20T16:01:13.951030+08:00 0 [ERROR] [MY-000067] [Server] unknown variable 'myisam_repair_threads=1'.
2022-09-20T16:01:13.951122+08:00 0 [ERROR] [MY-010119] [Server] Aborting

将参数从配置文件删除以后就好了。

3 8.0升级的便利

这样的升级方式变更带来了哪些好处?

mysql 小版本升级流程 mysql大版本升级_数据库

升级速度更快升级过程更简单升级过程更安全显著减少升级步骤,更容易自动化不需要重新启动MySQL Server即插即用8.0.16之前老的版本升级过程。

8.0.16 版本新的升级过程:

关闭MySQL Server,安装新版本二进制软件包使用新版本软件包启动MySQL Server,此时Server会自动检查并执行第一步升级操作,升级数据字典表。在第一步升级完成之后,Server分析系统表和用户表是否需要升级,如果指定了升级选项 upgrade (后面会详细介绍)为AUTO或者FORCE,Server将会执行第二步升级操作,对系统表和用户表进行升级,如果第二步不需要升级,Server将会跳过第二步。相比于之前的升级方式,整个过程由2步变成了1步,不需要额外的升级工具,降低了升级耗时。

mysql 小版本升级流程 mysql大版本升级_服务器_02

新的Server选项, --upgrade

可能的取值为: NONE, AUTO, MINIMAL, FORCE,默认值为AUTO

NONE Server启动时不会执行任何的升级动作,如果发现版本不对,Server将会异常退出。这个选项只能在明确知道Server的版本与之前的版本一致时,才可以使用。AUTO 是默认选项,Server启动时会尝试升级数据字典表和用户表。如果发现不需要升级,会自动忽略升级过程。MINIMAL Server启动时仅仅尝试执行数据字典的升级,其他的系统表、用户表等,不会进行升级。这个选项和之前老的升级方式相同,必须再次使用mysql_upgrade 工具执行剩下的升级过程。然后需要再次重启Server。FORCE Server启动时强制执行升级过程,不管是否已经升级过。这个行为与之前 mysql_upgrade --force 相似。最后,如果用户对老的升级方式念念不忘,想要与之前的升级方式保持一致,只要在启动Server时,加选项 --upgrade=MINIMAL 就可以了。
-----------------------------------
©著作权归作者所有:来自51CTO博客作者wx5caecf2ed0645的原创作品,请联系作者获取转载授权,否则将追究法律责任
MySQL 8.0 新的版本升级方式
https://blog.51cto.com/u_14286115/3323742