需求说明 :
1.MySQL 5.7 、 8.0 数据库迁移,从 redhat 系统迁移到麒麟系统,数据量 100GB+ ,要求业务停机时长 <=10 秒。
架构说明 :
MySQL 双主 ( 单写 )+Keepalived(VIP) ,应用通过 VIP 连接数据库。
迁移方案 :
方案1:级联复制迁移 方案2:物理迁移 方案3:逻辑迁移 方案4:表空间迁移
1. 级联复制迁移
1.申请两台新服务器,安装相同版本MySQL 数据库,搭建级联复制。 由:A<--->B 架构,配置为:A<--->B--->C<--->D架构,其中C的主库可以指定B或者A库;
注意: 在配置 MySQL 8.0.24 到 MySQL 8.0.33级联复制时,触发过一个 BUG,启动级联复制从库 start slave时, 源库 MySQL 8.0.24自动关闭实例,生产操作前建议用相同版本数据库做充分测试。
2.C,D服务器安装并配置keepalived,先不启动; 3.待级联复制无延时后,准备进行切换; 4.正式切换时,依次关闭A、B库,keepalived会自动关闭,会自动删除VIP,应用连接中断; 5.依次启动C、D服务器上的keepalived服务,C节点会自动添加原VIP,应用通过VIP自动连接新的数据库。 6.业务验证,如无问题,迁移结束。 7.回退:如验证有问题,VIP切换到原库即可,验证期间产生的新数据根据实际情况选择恢复。
详细步骤,参考我的另一篇文章《
10
秒,搞定
MySQL 5.7
升级到
8.0
》
配置级联复制
切换,关闭源库
应用通过
VIP
自动连接到目标库

2. 物理迁移
物理迁移速度远快于逻辑迁移,但只适用相同版本。
1.
先申请
1
台新服务器;
2.停止从库MySQL; 3.拷贝从库MySQL所有文件到新服务器;
4.新服务器配置mysql用户、文件权限、keepalived等; 5.关闭原从库所在主机; 6.将新服务器主机IP改为原从库IP; 7.启动新服务器MySQL; 8.检查MySQL运行状态、主从同步等;
9.按相同的方式迁移主库。 业务中断:替换主库期间,停主库时,VIP会自动漂移到新从库,漂移期间应用无法正常连接到数据库,通常不超过10秒。

3. 逻辑迁移
物理迁移速度远快于逻辑迁移,但物理迁移只适用相同版本,逻辑迁移可以不同版本,也可以顺便做升级。 需求 : 保留原 IP 。 迁移步骤如下 :
1.先申请1台新服务器; 2.主库mysqldump备份,上传到新服务器; 3.新服务器安装mysql数据库; 4.新库导入主库的备份; 5.停从库和服务器; 6.新库服务器修改IP,改为原从库IP; 7.配置主从;
8.
主库按照相同的方式进行迁移。
业务中断
:
替换主库期间,停主库时,
VIP
会自动漂移到新从库,漂移期间应用无法正常连接到数据库,通常不超过
10
秒。
注意
:
mysql恢复逻辑备份速度很慢,建议在目标库恢复前先进行如下调整: 1.关闭binlog; 2.临时调大innodb_buffer_pool_size; 3.innodb_flush_log_at_trx_commit临时调整为2。 4.源库mysqldump备份时参数优化: (1)--extended-insert=TRUE :默认是TRUE,千万不要使用FALSE,否则导入速度慢的绝对超乎想象! (2)--net-buffer-length 调大; (3)--max-allowed-packet 调大;
4. 表空间迁移
表空间迁移,适用于 :
1.迁移部分表到新服务器,或数据库表数量很少,单表数据量较大; 2.也可以用于水平拆分数据库,应用连接新拆分出来的数据库。
表空间迁移方式如下
:
环境说明
:
一台服务器两个实例,测试将
3308
库某张表迁移到
3307
库。
源库: MySQL5.7.44
端口
3308
目标库:MySQL5.7.44
端口
3307
源库:
创建测试表
cjc.t1;
use cjc; create table cjc.t1(id int,name varchar(100),time datetime);
创建存储过程
delimiter //
CREATE PROCEDURE p_insert()
BEGIN
DECLARE i INT;
SET i = 1;
WHILE i <= 1000000 DO
INSERT INTO `t1`(`id`, `name`, `time`)
VALUES(i, CONCAT('cjc', i),now());
SET i = i + 1;
END WHILE;
END //
delimiter ;
执行存储过程
CALL p_insert();
插入 巨慢无比, 执行了 30 多分钟,只插入了 26 万 条数据,之前和 Oracle 、达梦数据库做过性能对比,远远慢于 Oracle 、达梦数据库。 继续插入测试数据。
insert into cjc.t1 select * from cjc.t1; insert into cjc.t1 select * from cjc.t1; mysql> select count(*) from cjc.t1; +----------+ | count(*) | +----------+ | 1053000 | +----------+ 1 row in set (0.48 sec)
查看数据 :
mysql> select * from cjc.t1 limit 5; +------+------+---------------------+ | id | name | time | +------+------+---------------------+ | 1 | cjc1 | 2024-11-16 10:29:47 | | 2 | cjc2 | 2024-11-16 10:29:48 | | 3 | cjc3 | 2024-11-16 10:29:48 | | 4 | cjc4 | 2024-11-16 10:29:48 | | 5 | cjc5 | 2024-11-16 10:29:48 | +------+------+---------------------+ 5 rows in set (0.00 sec)
查看文件
[mysql@cjc-db-01 cjc]$ ls -lrth t1.* -rw-r----- 1 mysql mysql 8.5K Nov 16 10:26 t1.frm -rw-r----- 1 mysql mysql 56M Nov 16 11:13 t1.ibd
目标库: 创建相同的表结构
mysql -uroot -p --socket=/mysqldata/3307/socket/mysql.sock use cjc; create table cjc.t1(id int,name varchar(100),time datetime);
2. 源库执行 FLUSH 操作
mysql> FLUSH TABLES cjc.t1 FOR EXPORT; [mysql@cjc-db-01 cjc]$ ls -lrth t1.* -rw-r----- 1 mysql mysql 8.5K Nov 16 10:26 t1.frm -rw-r----- 1 mysql mysql 56M Nov 16 11:13 t1.ibd -rw-r----- 1 mysql mysql 467 Nov 16 11:18 t1.cfg
3. 目标库执行 DISCARD 操作
mysql> ALTER TABLE cjc.t1 DISCARD TABLESPACE; mysql> select * from cjc.t1; ERROR 1814 (HY000): Tablespace has been discarded for table 't1' [mysql@cjc-db-01 cjc]$ ls -lrth t1.* -rw-r----- 1 mysql mysql 8.5K Nov 16 11:17 t1.frm
4. 复制表空间文件到目标库 .ibd 和 .cfg 文件
[mysql@cjc-db-01 cjc]$ cp /mysqldata/3308/data/cjc/t1.ibd /mysqldata/3307/data/cjc/ [mysql@cjc-db-01 cjc]$ cp /mysqldata/3308/data/cjc/t1.cfg /mysqldata/3307/data/cjc/
5. 目标库 ,执行 IMPORT TABLESPACE 操作
mysql> SET foreign_key_checks = 0; Query OK, 0 rows affected (0.00 sec) mysql> ALTER TABLE cjc.t1 IMPORT TABLESPACE; Query OK, 0 rows affected (2.07 sec) mysql> SET foreign_key_checks = 1; Query OK, 0 rows affected (0.00 sec)
检查数据
mysql> select count(*) from cjc.t1; +----------+ | count(*) | +----------+ | 1053000 | +----------+ 1 row in set (1.21 sec)
对应error.log 日志如下
2024-11-16T11:24:36.965996+08:00 4 [Note] InnoDB: Importing tablespace for table 'cjc/t1' that was exported from host 'cjc-db-01' 2024-11-16T11:24:36.966147+08:00 4 [Note] InnoDB: Phase I - Update all pages 2024-11-16T11:24:37.101221+08:00 4 [Note] InnoDB: Sync to disk 2024-11-16T11:24:38.232109+08:00 4 [Note] InnoDB: Sync to disk - done! 2024-11-16T11:24:38.293120+08:00 4 [Note] InnoDB: Phase III - Flush changes to disk 2024-11-16T11:24:38.329123+08:00 4 [Note] InnoDB: Phase IV - Flush complete 2024-11-16T11:24:38.329576+08:00 4 [Note] InnoDB: `cjc`.`t1` autoinc value set to 0
###chenjuchao 20241116###
欢迎关注我的公众号《
IT
小
Chen
》

