题记:出来混,欠的总要还的,技术债也是债,拖的越久越难还。
2013年时给XX台项目做的部署,当时考虑不周,MySQL用的版本为5.1。
最近客户做安全扫描发现了高危漏洞-必须修补,MySQL升级到5.7.12漏洞才能补上。
而现在MySQL版本太低,跨大版本升级,风险非常高,花了两三天时间,边测试边写方案,分享给大家做参考。
- 目标
一:将mysql从5.1升级到mysql5.7.12
二:不停业务
三:回滚安全、快速 -
方案
方案一:新MySQL替换老MySQL
方案二:新老MySQL并行切换
从升级容易程度和维护程度来讲,方案一的MySQL替换方案 优。
从升级安全和回滚快速来讲,方案二 新老MySQL并行 优。 - 技术分析和难点验证
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)新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并行,基于对自己可控,易于回滚。
如果是他人操作,我建议选方案一,方案一在升级过程中不容易出错,对个人的要求没那么高,前期把准备工作做好,写好脚本,基本不会跳坑。