美文网首页
使用In-Place Upgrade将MySQL5.6.24升级

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

作者: Faye小峰 | 来源:发表于2021-06-21 17:12 被阅读0次

    升级方法介绍

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

    相关文章

      网友评论

          本文标题:使用In-Place Upgrade将MySQL5.6.24升级

          本文链接:https://www.haomeiwen.com/subject/hxnyyltx.html