[背景说明]
环境说明数据库版本数据量备注
DatabaseA5.71TB需迁移数据200GB
DatabaseB5.67TB需迁移数据600GB
DatabaseC5.7--数据迁入800GB
迁移需求
新建DatabaseC,将DatabaseA和DatabaseB的数据迁移到DatabaseC,其中DatabaseA/B仅部分表需保留数据,其余表保留结构即可
业务停机时间
业务允许停机时间最长为2小时
[迁移方案]a.第一次迁移测试
本次迁移为了搭建测试环境供业务测试使用,对数据准确性无要求,受硬件条件以及时间需求限制,无法采用物理备份/复制等手段,采用mysqldump进行拆分导出导入
导出数据
mysqldump -uxxx -p'xxxx' -S xxxx--set-gtid-purged=OFF --single-transaction db `cat tab_list.txt` >table.sql
恢复数据
Set names utf8mb4;
Sourcetable.sql
尽管通过人为拆分为并行导出导入,但导入时会创建大量索引,索引创建过程无法并行,总体耗时约40h,无法满足业务需求.
b.第二次迁移测试
本次迁移测试采用传输表空间,过程大致如下主要步骤操作耗时
备份表结构备份DatabaseA/B的数据结构1min
传输ibd文件传输备份文件到ServerC150min
恢复表结构在serverc恢复DatabaseA/B的数据结构2min
替换表空间分离idb文件并导入传输过来的bd文件200min
备份结构
mysqldump -uxx -p'xx' -S xx --set-gtid-purged=OFF -d dbname > table_Structure.sql
mysqldump -uxx -p'xx' -S xx -n -t-d -R --triggers=false --set-gtid-purged=OFF dbname >procedure.sql
恢复表结构
Set names utf8mb4;
Source table_Structure.sql
Sourceprocedure.sql
替换表空间
分离ibd文件
Alter table xxx discard tablespace;传输idb文件
scp `cat table_list.txt` 10.25.225.243:/mysqldata/mysql/data/material导入idb文件
Alter table xxx importtablespace;
测试耗时约6h,让仍然无法满足业务要求,分析瓶颈在以下两方面:
传输文件通过千兆网络,耗费大量时间
import tablespace过程中,mysql需要更新ibd文件每个page的lsn,产生大量IO操作,耗时较多;
c.第三次测试
步骤操作耗时
物理备份使用innodbbackupex备份DatabaseA/B在线
传输备份到传输备份文件到ServerC在线
恢复DatabaseB使用备份文件在ServerC恢复databaseB (后续将恢复出来的数据库称为DatabaseC)在线
升级databaseC将databaseC升级到5.7在线
清理数据清理不需要数据的表,仅保留数据结构在线
创建databaseA在DatabaseC创建databaseA相关对象结构信息在线
恢复DatabaseA使用传输表空间的方式恢复databaseA到databaseC在线
配置多源复制配置DatabaseC从databaseA/B同步数据在线
正式割接断开复制,修改databaseC参数5min
物理备份
对A/B数据库进行物理备份
innobackupex --user=xx -pxx --socket=xx --no-timestamp ./full
innobackupex --user=xx -pxx --socket=xx --no-timestamp --incremental ./inc/inc1/--incremental-basedir=./full
innobackupex --user=xx -pxx --socket=xx --no-timestamp --incremental ./inc/inc2/--incremental-basedir=./inc/inc1
恢复备份
使用备份恢复databaseB
innobackupex--defaults-file=/etc/my.cnf --parallel=16 --apply-log --redo-onlyfull/ &
innobackupex--defaults-file=/etc/my.cnf --parallel=16 --apply-log --redo-only--incremental-dir=rec0/ full/ &
innobackupex--defaults-file=/etc/my.cnf --parallel=16 --apply-log --redo-only--incremental-dir=rec1/ full/
升级databasec
mysql_upgrade --upgrade-system-tables -uroot -p'xxx'
恢复databaseA到database C
恢复过程同第二次迁移测试,此处使用物理备份的ibd文件进行导入.
清理多余的数据
Truncatetable xxx;
配置复制
通过物理备份获取gtid相关信息,并配置两个复制通道,分别为databaseA和databaseB复制数据
reset master;
SET@@GLOBAL.GTID_PURGED='xxxxxx,xxxxxxx';
change master to
master_host='xxx',
MASTER_PORT=xx,
master_user='repl',
master_password='xx',
master_auto_position=1
FOR CHANNEL 'chnl1';
通过以上方式,业务停机时间仅为应用修改切换连接串时间,仅需几分钟即可,满足业务需求。