在 Centos7.9上升级二进制方式安装的MySQL 。升级方式有就地升级和逻辑升级2种方法,本实验演示In-Place Upgrade就地升级的方式将mysql-5.7.17升级至5.7.44
升级方式介绍
In-Place Upgrade就地升级
In-Place Upgrade 就地升级介绍
就地升级包括关闭旧的MySQL服务器,用新的MySQL二进制文件或包替换旧的MySQL二进制文件或包,在现有数据目录上重新启动MySQL,以及升级现有安装中需要升级的任何剩余部分。
In-Place Upgrade 就地升级步骤
mysql-5.7.17升级至5.7.44
XA事务检查
如果将 XA 事务与 一起使用 InnoDB ,请在升级前运行 XA RECOVER 以检查未提交的 XA 事务。如果返回结果,则通过发出 XA COMMIT or XA ROLLBACK 语句来提交或回滚 XA 事务。
--1.检查未提交的 XA 事务
XA RECOVER;
--2.1.如果有提交的 XA 事务,提交XA 事务
XA COMMIT
--2.2.如果没提交的 XA 事务,回滚 XA 事务
XA ROLLBACK
执行完全清除和更改缓冲区合并
mysql -u root -p --execute="SET GLOBAL innodb_fast_shutdown=0"
在缓慢关机的情况下,在关机前执行完全清除和更改缓冲区合并, InnoDB 这可确保数据文件在版本之间文件格式存在差异的情况下已完全准备好。
关闭旧的 MySQL 服务器
mysqladmin -u root -p shutdown
升级 MySQL 二进制安装或软件包
升级 MySQL 二进制安装或软件包。如果升级二进制安装,请解压缩新的MySQL二进制分发包。请参阅获取并解压缩发行版。对于基于包的安装,请安装新包。
tar -xvf mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz -C /data
mv mysql-5.7.44-linux-glibc2.12-x86_64/ mysql574
启动 MySQL 5.7 服务器
mysqld --defaults-file=/etc/my.cnf
或
mysqld_safe --user=mysql --datadir=/path/to/existing-datadir &
运行mysql_upgrade
mysql_upgrade -u root -p
mysql_upgrade检查所有数据库中的所有表是否与当前版本的 MySQL 不兼容。mysql_upgrade还会升级 mysql 系统数据库,以便您可以利用新的特权或功能。
重新启动MySQL服务器
关闭并重新启动MySQL服务器,以确保对系统表所做的任何更改生效。
mysqladmin -u root -p shutdown
mysqld --defaults-file=/etc/my.cnf
或
mysqld_safe --user=mysql --datadir=/path/to/existing-datadir &
问题处理
1.升级失败[Warning] TIMESTAMP with implicit DEFAULT value is deprecated.
--问题描述
用升级后的mysql5.7.44启动失败,现场原环境版本mysql-5.7.17,配置文件默认生成,/etc/my.cnf中无sql_mode参数
[root@icpsp mysql5744]# cd bin/
[root@icpsp bin]# ./mysqld --defaults-file=/etc/my.cnf
2023-11-04T06:50:07.972038Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
--解决办法
/etc/my.cnf中增加
explicit_defaults_for_timestamp=on
补充
explicit_defaults_for_timestamp参数解释
简介:
explicit_defaults_for_timestamp 系统变量决定MySQL服务端对timestamp列中的默认值和NULL值的不同处理方法。
此变量自MySQL 5.6.6 版本引入,分为全局级别和会话级别,可动态更新,默认值为OFF。本文主要介绍该参数打开和关闭情况下对timestamp的影响 。
5.6、5.7默认禁用,8.0默认启用,未来参数会废弃,官方建议要开启。
explicit_defaults_for_timestamp
参数动态的,但实测5.6.43还是非动态的,5.7是动态的了。
正常情况下开启explicit_defaults_for_timestamp=on,将timestamp限制标准化操作。如果
explicit_defaults_for_timestamp = OFF,TIMESTAMP没有显示声明NULL属性,列将自动声明为 NOT NULL。对这个列插入NULL值的话,会自动分配为当前时间戳的值。查看了下参数,5.6端果然是OFF,5.7设置后再次运行
- explicit_defaults_for_timestamp = OFF
当该参数默认设置为OFF时,其行为如下:
在默认情况下,如果timestamp列没有显式的指明null属性,那么该列会被自动加上not null属性(而其他类型的列如果没有被显式的指定not null,那么是允许null值的),如果往这个列中插入null值,会自动的设置该列的值为current timestamp值。
表中的第一个timestamp列,如果没有指定null属性或者没有指定默认值,也没有指定ON UPDATE语句。那么该列会自动被加上DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP属性。
对于其它TIMESTAMP列,如果没有显示指定NULL和DEFAULT属性的话,会自动设置为NOT NULL DEFAULT '0000-00-00 00:00:00'。
(当然,这个与SQL_MODE有关,如果SQL_MODE中包含'NO_ZERO_DATE',实际上是不允许将其默认值设置为'0000-00-00 00:00:00'的。)
下面我们来测试下:(本文操作基于MySQL5.7.23 版本 SQL_MODE不包含'NO_ZERO_DATE')
现场原环境版本mysql-5.7.17,配置文件默认,无sql_mode参数。
--查看参数 默认为off
show variables like 'explicit_defaults_for_timestamp';
# 5.6和5.7分别创建表
CREATE TABLE `up_test` (
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间'
)
# 5.6环境
[SQL]insert into up_test(create_time) values(null);
受影响的行: 1
时间: 0.129s
# 5.7环境(其实哪个环境不重要,5.6同样可能出现这个问题)
[SQL]insert into up_test(create_time) values(null);
[Err] 1048 - Column 'create_time' cannot be null
----------------------------------------------------------------------
## 5.7环境 设置explicit_defaults_for_timestamp为OFF
set session explicit_defaults_for_timestamp = off
# 成功写入了
[SQL]insert into up_test(create_time) values(null);
受影响的行: 1
时间: 0.129s
create table test (
col1 timestamp,
col2 timestamp,
col3 timestamp default '2010-01-01 00:00:00'
);
show create table test;
2.--secure-file-priv is set to NULL
--问题描述
5.7.44启动报错
[root@icpsp bin]# ./mysqld --defaults-file=/etc/my.cnf
2023-11-04T06:50:07.972146Z 0 [Note] --secure-file-priv is set to NULL. Operations related to importing and exporting data are disabled
--解决办法
/etc/my.cnf中增加secure_file_priv=/var/lib/mysql-files
3.Can't find error-message file '/usr/local/mysql/share/errmsg.sys
--问题描述
[root@icpsp bin]# ./mysqld --defaults-file=/etc/my.cnf
2023-11-04T06:50:07.972211Z 0 [ERROR] Can't find error-message file '/usr/local/mysql/share/errmsg.sys'. Check error-message file location and 'lc-messages-dir' configuration directive.
--解决办法
由于/etc/my.cnf中无basedir导致,增加=basedir=/usr/local/mysql5744
4.[ERROR] Fatal error: Please read "Security" section
--问题描述
[root@icpsp bin]# ./mysqld --defaults-file=/etc/my.cnf
[ERROR] Fatal error: Please read "Security" section of the manual to find out how to run mysqld as root!
--解决办法
./mysqld_safe --user=mysql --datadir=/var/lib/mysql
5.unknown variable 'defaults-file=/etc/my.cnf'
--问题描述
升级报错
[root@icpsp bin]# ./mysqld_safe --user=mysql --defaults-file=/etc/my.cnf
2023-11-04T07:17:35.477102Z mysqld_safe Logging to '/var/log/mysqld.log'.
2023-11-04T07:17:35.541449Z mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
2023-11-04T07:17:37.563218Z mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended
2023-11-04T07:17:35.848345Z 0 [ERROR] unknown variable 'defaults-file=/etc/my.cnf'
2023-11-04T07:17:35.848357Z 0 [ERROR] Aborting
--解决办法
去掉--defaults-file 使用datadir参数
[root@icpsp bin]# ./mysqld_safe --user=mysql --datadir=/var/lib/mysql
6.Can't connect to local MySQL server through socket '/tmp/mysql.sock'
--问题描述
[root@icpsp bin]# ./mysql_upgrade -uroot -p
Enter password:
mysql_upgrade: Got error: 2002: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) while connecting to the MySQL server
Upgrade process encountered error and will not continue.
--解决办法
[root@icpsp bin]# find / -name mysql.sock
find: '/proc/223135': 没有那个文件或目录
/var/lib/mysql/mysql.sock
[root@icpsp bin]# ./mysql_upgrade -uroot -p -S /var/lib/mysql/mysql.sock
注意事项
1.升级 MySQL 二进制安装或软件包
如果升级最初通过安装多个 RPM 软件包生成的安装,请升级所有软件包,而不仅仅是部分软件包。例如,如果您以前安装了服务器和客户端 RPM,请不要只升级服务器 RPM。
对于某些 Linux 平台,从 RPM 或 Debian 软件包安装 MySQL 包括对管理 MySQL 服务器启动和关闭的 systemd 支持。在这些平台上,未安装 mysqld_safe。在这种情况下,请使用 systemd 进行服务器启动和关闭,而不是以下说明中使用的方法。参见第 2.5.10 节"使用 systemd 管理 MySQL 服务器"。
2.升级时区表或帮助表
mysql_upgrade不会升级时区表或帮助表的内容。有关升级说明,请参见第 5.1.13 节"MySQL 服务器时区支持"和第 5.1.14 节"服务器端帮助支持"。
https://dev.mysql.com/doc/refman/5.7/en/upgrade-binary-package.html#upgrade-procedure-inplace
补充
5.7.17初始化报错
[root@localhost opt]# /data/mysql517/mysql517/bin/mysqld --initialize --user=mysql --basedir=/data/mysql517/mysql517 --datadir=/data/mysql517/data517 --console
2023-11-01T10:33:22.256835+08:00 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2023-11-01T10:33:22.256880+08:00 0 [Warning] 'NO_AUTO_CREATE_USER' sql mode was not set.
2023-11-01T10:33:22.259127+08:00 0 [ERROR] Fatal error: Can't change to run as user 'mysql' ; Please check that the user exists!
--问题处理:[Warning] 'NO_AUTO_CREATE_USER' sql mode was not set.
#sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION,NO_AUTO_CREATE_USER
sql_mode=NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER
5.7和8.0的配置文件sql_mode不通用
--问题处理:[ERROR] Fatal error: Can't change to run as user 'mysql'
groupadd mysql
useradd -r -g mysql -s /bin/false mysql
--问题处理:[Warning] 'NO_ZERO_DATE', 'NO_ZERO_IN_DATE'sql modes should be used with strict mode
2023-11-01T02:49:46.611330Z 0 [Warning] 'NO_ZERO_DATE', 'NO_ZERO_IN_DATE' and 'ERROR_FOR_DIVISION_BY_ZERO' sql modes should be used with strict mode. They will be merged with strict mode in a future release.
--问题处理:
2023-11-01T02:55:20.918005Z 0 [Note] Plugin 'FEDERATED' is disabled.
mysqld: Table 'mysql.plugin' doesn't exist
2023-11-01T02:55:20.918095Z 0 [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it.
2023-11-01T02:55:20.918176Z 0 [ERROR] unknown variable 'binlog_expire_logs_seconds=1296000'
2023-11-01T02:55:20.918179Z 0 [ERROR] Aborting
去掉该参数
--问题处理
2023-11-01T11:07:23.923351+08:00 0 [Note] Plugin 'FEDERATED' is disabled.
mysqld: Table 'mysql.plugin' doesn't exist
2023-11-01T11:07:23.923777+08:00 0 [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it.
2023-11-01T11:07:23.925299+08:00 0 [Note] InnoDB: Loading buffer pool(s) from /data/mysql517/data517/ib_buffer_pool
2023-11-01T11:07:23.925679+08:00 0 [Note] InnoDB: Buffer pool(s) load completed at 231101 11:07:23
2023-11-01T11:07:23.928439+08:00 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
2023-11-01T11:07:23.928865+08:00 0 [Warning] Failed to set up SSL because of the following SSL library error: SSL context is not usable without certificate and private key
2023-11-01T11:07:23.928879+08:00 0 [Note] Server hostname (bind-address): '*'; port: 2213
2023-11-01T11:07:23.929572+08:00 0 [Note] IPv6 is available.
2023-11-01T11:07:23.929584+08:00 0 [Note] - '::' resolves to '::';
2023-11-01T11:07:23.929605+08:00 0 [Note] Server socket created on IP: '::'.
2023-11-01T11:07:23.931293+08:00 0 [Warning] Failed to open optimizer cost constant tables
2023-11-01T11:07:23.931363+08:00 0 [ERROR] Fatal error: Can't open and lock privilege tables: Table 'mysql.user' doesn't exist
2023-11-01T11:07:23.931399+08:00 0 [ERROR] Aborting
问题分析:mysql库中正是缺少了user表数据 配置文件不对导致初始化的有问题
问题处理:
vi /etc/my.cnf中去掉plugin有关的参数,重新初始化
/data/mysql517/mysql517/bin/mysqld --defaults-file=/etc/my.cnf --initialize-insecure --user=mysql
配置系统服务
--配置mysqld启动服务文件
cd /usr/local/mysql517/support-files
cp mysql.service /etc/init.d/mysqld
vi /etc/init.d/mysqld 更改 basedir 和datadir参数
--配置开启自启
chkconfig --list
chkconfig --level 2345 mysqld on
--启动服务
service mysqld start
service mysqld status