[背景说明]

环境说明数据库版本数据量备注

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';

通过以上方式,业务停机时间仅为应用修改切换连接串时间,仅需几分钟即可,满足业务需求。