暂无图片
暂无图片
8
暂无图片
暂无图片
2
暂无图片

10秒,轻松搞定MySQL数据库迁移!

原创 陈举超 2024-11-16
732

图片.png

需求说明:

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》
配置级联复制
图片.png
切换,关闭源库
图片.png
应用通过VIP自动连接到目标库
图片.png

2.物理迁移

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

3.逻辑迁移

物理迁移速度远快于逻辑迁移,但物理迁移只适用相同版本,逻辑迁移可以不同版本,也可以顺便做升级。
需求:保留原IP。
迁移步骤如下:

1.先申请1台新服务器;
2.主库mysqldump备份,上传到新服务器;
3.新服务器安装mysql数据库;
4.新库导入主库的备份;
5.停从库和服务器;
6.新库服务器修改IP,改为原从库IP;
7.配置主从;
复制

图片.png
8.主库按照相同的方式进行迁移。
图片.png
业务中断:替换主库期间,停主库时,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.也可以用于水平拆分数据库,应用连接新拆分出来的数据库。
图片.png
表空间迁移方式如下:
环境说明:
一台服务器两个实例,测试将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》
图片.png

最后修改时间:2024-11-18 10:53:39
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

筱悦星辰
暂无图片
1月前
评论
暂无图片 0
迷茫不定的时候,与其为还没有发生的事担忧,不如把精力放在眼下的事情上,踏实迈好每一步。在持续的前行中,你或许会逐渐发现,方向已然清晰,你也正稳步向目标靠近。
1月前
暂无图片 点赞
评论
星星之火
暂无图片
4月前
评论
暂无图片 0
人这一辈子:有能力时,就做点大事;没能力时,就做点小事。 有权力时,就做点好事;没权力时,就做点实事。有余钱时,就做点善事;没有钱时,就做点家务事。动得了,就多做点事;动不了,就回忆开心的事。 我们肯定会做错事,但要尽量避免做傻事,坚决不要做坏事。有事无事照顾好身体,健康才是大事。生活其实没啥事,一辈子也就这么回事。留个好身体、留个好口碑才是要做的事。 生活没有十全十美,感情没有百依百顺。不要去抱怨生活总是不尽人意,不要去纠结感情总是太过自私。 低下头问问自己,你是否用一颗执着心去坚持做好每一件事情。
4月前
暂无图片 点赞
评论