MySQL从5.1升级到5.7.12

题记:出来混,欠的总要还的,技术债也是债,拖的越久越难还。
2013年时给XX台项目做的部署,当时考虑不周,MySQL用的版本为5.1。
最近客户做安全扫描发现了高危漏洞-必须修补,MySQL升级到5.7.12漏洞才能补上。
而现在MySQL版本太低,跨大版本升级,风险非常高,花了两三天时间,边测试边写方案,分享给大家做参考。

  1. 目标
    一:将mysql从5.1升级到mysql5.7.12
    二:不停业务
    三:回滚安全、快速
  2. 方案
    方案一:新MySQL替换老MySQL
    方案二:新老MySQL并行切换


    MySQL从5.1升级到5.7.12_第1张图片
    MySQL升级方案比较.jpg

    从升级容易程度和维护程度来讲,方案一的MySQL替换方案 优。
    从升级安全和回滚快速来讲,方案二 新老MySQL并行 优。

  3. 技术分析和难点验证
    3.1 新MySQL安装
    主要确认rpm安装和源码安装各自所需步骤和消耗时间。
    RPM安装
    安装包:
mysql-community-devel-5.7.12-1.el6.x86_64.rpm        
mysql-community-libs-5.7.12-1.el6.x86_64.rpm 
mysql-community-test-5.7.12-1.el6.x86_64.rpm
mysql-community-client-5.7.12-1.el6.x86_64.rpm  
mysql-community-embedded-5.7.12-1.el6.x86_64.rpm 
mysql-community-libs-compat-5.7.12-1.el6.x86_64.rpm
mysql-community-common-5.7.12-1.el6.x86_64.rpm
mysql-community-embedded-devel-5.7.12-1.el6.x86_64.rpm  
mysql-community-server-5.7.12-1.el6.x86_64.rpm

前期准备:预估5分钟
1)备份老mysql数据(备份可提前做-不计算时间)
2)停止老mysql
3)卸载老mysql(yum remove mysql mysql-*)
4)删除/var/lib/mysql目录
安装方式:预估5分钟

#rpm -ivh mysql-community-*.rpm
#mysqld --initialize   (初始化表)
#mysqladmin -hlocalhost -uroot password "123456" -p's#:aA_AhJ19(' 
#mysql -uroot -p123456
可看到版本5.7.12

B. 源码安装
安装包: mysql-5.7.12.tar.gz
依赖包:cmake-3.5.2.tar.gz 和boost_1_59_0.tar.gz
前期准备:预估时间15分钟

# cd /opt/mysql/
# tar zxvf cmake-3.5.2.tar.gz  
# cd cmake-3.5.2/  
# ./bootstrap  
CMake has bootstrapped.  Now run gmake.  
# make && make install  
# cmake --version  
cmake version 3.5.2  
#tar -zxvf /opt/mysql/boost_1_59_0.tar.gz -C /usr/local  
#cd  /usr/local  
#mv boost_1_59_0 boost  
#cd boost/  
#./bootstrap.sh  
 #./b2 install 

安装步骤:预估时间3小时

mkdir -p /opt/mysql/data  
mkdir -p /opt/mysql/logs
mkdir -p /opt/mysql/temp
#cmake -DCMAKE_INSTALL_PREFIX=/opt/mysql -DMYSQL_UNIX_ADDR=/opt/mysql/mysql.sock  -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_ARCHIVE_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1  -DWITH_MEMORY_STORAGE_ENGINE=1 -DWITH_READLINE=1 -DENABLED_LOCAL_INFILE=1 -DMYSQL_DATADIR=/opt/mysql/data -DMYSQL_USER=mysql -DMYSQL_TCP_PORT=3307 -DENABLE_DOWNLOADS=1 -DDOWNLOAD_BOOST=1 -DWITH_BOOST=/usr/local/boost
#make && make install (耗时长)
#chown -R mysql:mysql /opt/mysql
#bin/mysqld --initialize --basedir=/opt/mysql --datadir=/opt/mysql/data --user=mysql --explicit_defaults_for_timestamp=true --old_passwords=0  
备注:会使用默认的my.cnf,可以先重命名该文件,等初始化成功后再换回来,不影响之前的mysql使用
#bin/mysqld --defaults-file=/opt/mysql/my.cnf --user=root
#cp support-files/mysql.server /etc/init.d/mysql3307  
#chkconfig mysql3307 on  
#service mysql3307 start
#bin/mysqladmin -hlocalhost -uroot password "123456" -p's#:aA_AhJ19(' --socket=/opt/mysql/mysql.sock
#mysql -uroot -p123456

3.2 将数据从老MySQL迁移到新MySQL
当前选出三种备份方式,需评估各方式使用场景和消耗时间
A. mysqldump
适合不同版本间的mysql数据导入和导出。
mysqldump导出数据较快,导入数据慢。
相关配置

#innodb_flush_log_at_trx_commit=0
#innodb_buffer_pool_size=2G
#innodb_buffer_pool_instances=8
#innodb_log_file_size=512M
#innodb_log_buffer_size=16M
#innodb_log_files_in_group=2
#max_allowed_packet = 32M

B. 数据文件拷贝
适合同版本间的mysql数据备份和还原。
时间快。
C. 单表导入和导出
脚本分表导出和导入,避免数据库引擎改变而引起的问题。
时间和mysqldump差别不大。
3.3 新MySQL主从同步
主要验证MySQL5.7.12版本的主从同步配置和老MySQL配置是否有不同。
3.4 Xtrabackup
适合同版本间的mysql数据备份和还原。
可做增量备份-适合m/s结构的数据迁移。
主要验证导入和导出的操作方式和操作使用时间。

  1. 风险及应对措施
    1)新MySQL无法安装成功
    2)老MySQL数据导入到新MySQL数据库时间不可控
    3)老MySQL数据到新MySQL数据库出错
    4)应用连新MySQL数据库出错
    5)新MySQL-M/S配置
    6)Dcms往新MySQL下发数据出错
    7)换新MySQL后部分互动数据丢失
    8)回滚时原数据丢失
    1-7 模拟相同环境,提前演练和测试,给出具体的操作步骤和时间估算。
    8-做两个备份mysqldump一份、xtrabackup一份。

如果是我操作,我选方案二,新老MySQL并行,基于对自己可控,易于回滚。
如果是他人操作,我建议选方案一,方案一在升级过程中不容易出错,对个人的要求没那么高,前期把准备工作做好,写好脚本,基本不会跳坑。

你可能感兴趣的:(MySQL从5.1升级到5.7.12)