在 Centos7.9上升级二进制方式安装的MySQL 。升级方式有就地升级和逻辑升级2种方法,本实验演示In-Place Upgrade就地升级的方式将mysql-5.7.17升级至5.7.44
就地升级包括关闭旧的MySQL服务器,用新的MySQL二进制文件或包替换旧的MySQL二进制文件或包,在现有数据目录上重新启动MySQL,以及升级现有安装中需要升级的任何剩余部分。
mysql-5.7.17升级至5.7.44
如果将 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 这可确保数据文件在版本之间文件格式存在差异的情况下已完全准备好。
mysqladmin -u root -p shutdown
升级 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
mysqld --defaults-file=/etc/my.cnf
或
mysqld_safe --user=mysql --datadir=/path/to/existing-datadir &
mysql_upgrade -u root -p
mysql_upgrade检查所有数据库中的所有表是否与当前版本的 MySQL 不兼容。mysql_upgrade还会升级 mysql 系统数据库,以便您可以利用新的特权或功能。
关闭并重新启动MySQL服务器,以确保对系统表所做的任何更改生效。
mysqladmin -u root -p shutdown
mysqld --defaults-file=/etc/my.cnf
或
mysqld_safe --user=mysql --datadir=/path/to/existing-datadir &
--问题描述
用升级后的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 系统变量决定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设置后再次运行
当该参数默认设置为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;
--问题描述
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
--问题描述
[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
--问题描述
[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
--问题描述
升级报错
[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
--问题描述
[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
如果升级最初通过安装多个 RPM 软件包生成的安装,请升级所有软件包,而不仅仅是部分软件包。例如,如果您以前安装了服务器和客户端 RPM,请不要只升级服务器 RPM。
对于某些 Linux 平台,从 RPM 或 Debian 软件包安装 MySQL 包括对管理 MySQL 服务器启动和关闭的 systemd 支持。在这些平台上,未安装 mysqld_safe。在这种情况下,请使用 systemd 进行服务器启动和关闭,而不是以下说明中使用的方法。参见第 2.5.10 节“使用 systemd 管理 MySQL 服务器”。
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
[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