需求说明:
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》
评论

