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

升级方法介绍

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(一)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 230,825评论 6 546
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 99,814评论 3 429
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 178,980评论 0 384
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 64,064评论 1 319
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 72,779评论 6 414
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 56,109评论 1 330
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 44,099评论 3 450
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 43,287评论 0 291
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 49,799评论 1 338
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 41,515评论 3 361
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 43,750评论 1 375
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 39,221评论 5 365
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 44,933评论 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 35,327评论 0 28
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 36,667评论 1 296
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 52,492评论 3 400
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 48,703评论 2 380

推荐阅读更多精彩内容