使用In-Place Upgrade将MySQL5.6.24升级

2021-06-21  本文已影响0人  Faye小峰

升级方法介绍

MySQL升级方式有两种,一种叫In-Place Upgrade,另一种叫Logical Upgrade (逻辑升级方式)。

Logical Upgrade:利用mysqldump来直接导出SQL文件,然后导入到新库中,适应于跨大版本的升级方案,做法相对安全,并能整理表中碎片。但如果有数据量较大的库需要mysqldump导出,时间上的消耗就会很大,升级效率就会受到影响。

In-Place Upgrade:它的工作方法简单快速,就是直接替换掉原来版本MySQL的安装目录和my.cnf配置文件,利用mysql_upgrade脚本来完成系统表的升级。

本文演示使用In-Place Upgrade升级MySQL。

升级步骤

操作之前,查看版本

# /usr/local/mysql/bin/mysql -V
/usr/local/mysql/bin/mysql  Ver 14.14 Distrib 5.6.24-72.2, for Linux (x86_64) using  6.0

设置参数innodb_fast_shutdown为0

需要将innodb_fast_shutdown参数设置为0

#mysql -u root -pp@ssw0rd --execute="SET GLOBAL innodb_fast_shutdown=0"

set global innodb_fast_shutdown=0;

注:innodb_fast_shutdown有 0、1、2 三个值。

参数值为0代表MySQL关闭,InnoDB需要完成所有的full purge和merge Insert buffer操作,这个过程需要一定的时间,有时可能会花上几个小时。

参数值为1是该参数的默认值,表示关闭MySQL时不完成full purge和Merge insert buffe操作,但是缓冲池中的脏页还是会写到磁盘中。

参数值为2时,表示既不完成full purge和Merge insert buffer操作,也不将缓冲池中的脏页刷新到磁盘,而是将日志写入日志文件中。

关闭MySQL服务

命令如下:

# myadm stop
Port 3306 Instance being shutdown
Port 3307 Instance being shutdown

# dbs
=========================================
 PORT   STATUS   BUFFER_POOL   DATABASE
 3306   [Down]       [2G]      dbmonitor zlz
 3307   [Down]       [2G]      dbmonitor zlz

[root@source bin]# /usr/local/mysql/bin/mysqladmin -uroot -poracle123 shutdown

替换MySQL软件

将MySQL5.7的安装包拷贝到目标机器:

#scp  tool_mysql57_ssd.tar.gz root@10.x.x.x:/data

替换MySQL软件包:

# tar -zxvf tool_mysql57_ssd.tar.gz

# tar -zxvf Percona-Server-5.7.26-29-Linux.x86_64.ssl101.tar.gz
mv /data/Percona-Server-5.7.26-29-Linux.x86_64.ssl101 /usr/local
cd /usr/local
mv mysql mysql56.bak
mv Percona-Server-5.7.26-29-Linux.x86_64.ssl101 mysql
# /data/Percona-Server-5.7.26-29-Linux.x86_64.ssl101/bin/mysql -V
/data/Percona-Server-5.7.26-29-Linux.x86_64.ssl101/bin/mysql  Ver 14.14 Distrib 5.7.26-29, for Linux (x86_64) using  6.0

修改参数文件 my.cnf

把MySQL5.6的配置文件替换成5.7版本的my.cnf。

vim /data/mysqldata/my3306/my.cnf

注释掉2个参数

#innodb_read_ahead=0
#key_buffer=64M

增加1个参数

log_timestamps=system

在MySQL 5.7.2 新增了 log_timestamps 这个参数,该参数主要是控制 error log、genera log,等等记录日志的显示时间参数

且默认安装后error_log,slow_log 日志时间戳默认为UTC,因此会造成与系统时间不一致,与北京时间相差8个小时

mysql> SHOW GLOBAL VARIABLES LIKE 'log_timestamps';
+----------------+-------+
| Variable_name  | Value |
+----------------+-------+
| log_timestamps | UTC   |
+----------------+-------+
1 row in set (0.00 sec)

因为log_timestamps 是一个GLOBAL的全局参数,所以直接在登录后去set全局参数,重启后就会直接失效

因此需要在mysql的配置文件中[mysqld]中增加一条log_timestamps的配置。

修改1个参数

cp /usr/local/mysql/lib/mysql/libjemalloc.so.1 /usr/lib64/libjemalloc.so.1
cd /usr/lib64/
ll -h | grep libjemalloc

修改[mysqld_safe]

修改前:

[mysqld_safe]
malloc-lib=/usr/local/mysql/lib/mysql/libjemalloc.so

修改后:

[mysqld_safe]
malloc-lib=/usr/lib64/libjemalloc.so.1

启动MySQL实例

注:在启动过程中,需要添加–skip-grant-tables和–skip-networking参数,来保证没有 任何的应用连接,让升级过程更加安全。

/usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf --skip-grant-tables --skip-networking &
/usr/local/mysql/bin/mysqld_safe --defaults-file=/data/mysqldata/my3306/my.cnf --socket=/data/mysqldata/my3306/run/mysql.sock --port=3306  &
/usr/local/mysql/bin/mysqld_safe --defaults-file=/data/mysqldata/my3307/my.cnf --socket=/data/mysqldata/my3307/run/mysql.sock --port=3307  &

升级系统表数据字典信息 mysql_upgrade

命令如下:

#/usr/local/mysql/bin/mysql_upgrade -u root -pp@ssw0rd  --socket=/usr/local/mysql/mysql.sock

输出结果:

[root@zlz-test:/usr/local/mysql]
# /usr/local/mysql/bin/mysql_upgrade -u root  -s --socket=/data/mysqldata/my3306/run/mysql.sock --port=3306
Enter password:
The --upgrade-system-tables option was used, databases won't be touched.
Checking if update is needed.
Checking server version.
Running queries to upgrade MySQL server.
Upgrading the sys schema.
Upgrade process completed successfully.
Checking if update is needed.

[root@zlz-test:/usr/local/mysql]
# /usr/local/mysql/bin/mysql_upgrade -u root  -s --socket=/data/mysqldata/my3307/run/mysql.sock --port=3307
Enter password:
The --upgrade-system-tables option was used, databases won't be touched.
Checking if update is needed.
Checking server version.
Running queries to upgrade MySQL server.
Upgrading the sys schema.
Upgrade process completed successfully.
Checking if update is needed.

没有报错,表示系统表数据字典信息升级成功。

重启MySQL服务

首先停掉MySQL服务,命令如下:

# myadm stop
Port 3307 Instance being shutdown
Port 3306 Instance being shutdown

/usr/local/mysql/bin/mysqladmin -uroot -poracle123 shutdown

然后正常启动 MySQL 服务,命令如下:

# myadm start
Port 3306 Instance being startup
Port 3307 Instance being startup

/usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf &

说明:正常启动MySQL数据库,不要使用–skip-grant-tables和-skip-networking参数。

验证MySQL版本

目前己经是MySQL5.7版本,证明升级成功:

# /usr/local/mysql/bin/mysql -V
/usr/local/mysql/bin/mysql Ver 14.14 Distrib 5.7.20, for linux-glibc2.12 (x86_64) using EditLine wrapper
mysql> select version();
+---------------+
| version()     |
+---------------+
| 5.7.26-29-log |
+---------------+
1 row in set (0.00 sec)

其他

启动报错

启动报错,就看alert.log ,一般是哪个参数文件报错改哪个就好了。

启动报错:'/usr/lib64/libjemalloc.so.1' to LD_PRELOAD for mysqld

由于libjemalloc.so.1 在 basedir 中存在,可是MySQL又限制了只能在/usr/lib64、/usr/lib等等标准库中加载这些动态文件所以启动的时候会报错。
报错如下:

[root@zlz-test:/usr/lib64]
# /usr/local/mysql/bin/mysqld_safe --defaults-file=/data/mysqldata/my3307/my.cnf --socket=/data/mysqldata/my3307/run/mysql.sock --port=3307  &
[1] 26006

[root@zlz-test:/usr/lib64]
#  mysqld_safe Adding '/usr/lib64/libjemalloc.so.1' to LD_PRELOAD for mysqld
2021-04-20T09:30:41.480555Z mysqld_safe Logging to '/data/mysqldata/my3307/log/alert.log'.
2021-04-20T09:30:41.510366Z mysqld_safe Starting mysqld daemon with databases from /data/mysqldata/my3307/data
^C
mysqld_safe --malloc-lib must be located in one of the directories: /usr/lib /usr/lib64 /usr/lib/i386-linux-gnu /usr/lib/x86_64-linux-gnu

其实查看报错的提示就很明显,就是对于加载这些库只能在/usr/lib /usr/lib64 /usr/lib/i386-linux-gnu /usr/lib/x86_64-linux-gnu这个库中

解决

1、将libjemalloc.so.1文件拷贝到 /usr/lib /usr/lib64 /usr/lib/i386-linux-gnu /usr/lib/x86_64-linux-gnu 这几个目录中

cp /usr/local/mysql/lib/mysql/libjemalloc.so.1 /usr/lib64/libjemalloc.so.1

2、修改[mysqld_safe]
修改前:

[mysqld_safe]malloc-lib          = /usr/local/mysql/lib/mysql/libjemalloc.so.1

修改后:

[mysqld_safe]malloc-lib          = /usr/lib64/libjemalloc.so.1

3、重启MySQL

[root@centos7 mysql]# numactl --interleave=all /bin/bash /usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my_3306.cnf  mysqld_safe Adding '/usr/lib64/libjemalloc.so.1' to LD_PRELOAD for mysqldmysqld_safe Adding '/usr/local/mysql/lib/libHotBackup.so' to LD_PRELOAD for mysqld2016-12-28T09:03:30.653874Z mysqld_safe Logging to '/u01/mysql/mysql_3306/logs/trace/mysql.err'.2016-12-28T09:03:30.675215Z mysqld_safe Transparent huge pages are already set to: never.2016-12-28T09:03:30.692654Z mysqld_safe Starting mysqld daemon with databases from /u01/mysql/mysql_3306/data

可见已经启动成功了
当然可以去修改mysqld_safe文件代码,但是对于要脚本部署就比较麻烦了,需要使用sed对代码进行替换,因为每个版本MySQL的mysqld_safe都会有所不同。所以这边就使用拷贝的方法暂时解决。

注意

MySQL 的basedir是一个软连接,那libHotBackup.so也需要修改
具体最终操作如下:
1、拷贝相关动态链接库

cp /usr/local/mysql/lib/mysql/libjemalloc.so.1 /usr/lib64/libjemalloc.so.1
cp /usr/local/mysql/lib/libHotBackup.so /usr/lib64/libHotBackup.so
mv /usr/local/mysql/lib/libHotBackup.so /usr/local/mysql/lib/libHotBackup.so.bak

2、修改my.cnf

[mysqld_safe]malloc-lib          = /usr/lib64/libjemalloc.so.1

参考文档

Percona-5.7.15 二进制版安装以及启动

MySQL 5.6.47升级到5.7.20(一)

上一篇下一篇

猜你喜欢

热点阅读