我们通常会遇到这样的一个场景,就是需要将一个数据库的数据迁移到一个性能更加强悍的数据库服务器上。这个时候需要我们做的就是快速迁移数据库的数据。
那么,如何才能快速地迁移数据库中的数据呢?今天我们就来聊一聊这个话题。
数据库的数据迁移无外乎有两种方式,一种是物理迁移,另一种则是逻辑迁移。
首先,我们生成 5 万条测试数据。具体如下:
-- 1. 准备表
create table s1(
id int,
name varchar(20),
gender char(6),
email varchar(50)
);
-- 2. 创建存储过程,实现批量插入记录
delimiter $$
create procedure auto_insert1()
BEGIN
declare i int default 1;
while(i<50000)do
insert into s1 values(i,'shanhe','male',concat('shanhe',i,'@helloworld'));
set i=i+1;
select concat('shanhe',i,'_ok');
end while;
END$$
delimiter ;
-- 3. 查看存储过程
show create procedure auto_insert1\G
-- 4. 调用存储过程
call auto_insert1()
逻辑迁移
逻辑迁移的原理是根据 MySQL 数据库中的数据和表结构转换成 SQL 文件。采用这一原理常用的迁移工具有 mysqldump。
下面我们就来测试一下:
[root@dxd ~]# mysqldump -h172.17.16.2 -uroot -pTest123! s1 s1 --result-file=/opt/s1.sql
[root@dxd ~]# ll /opt/
-rw-r--r-- 1 root root 2684599 5月 10 00:24 s1.sql
我们可以看到的是,生成了相应的 SQL 。现在我们通过生成的 SQL 迁移到另一个数据库中。
mysql> use s2;
Database changed
mysql> source /opt/s1.sql
通过简单的时间累加计算,大约消耗了 1 秒钟的时间,但是随着数据库递增,迁移的时长也会相应地增加。此时,如果需要迁移的数据表中的数据足够大(假设上千万条),mysqldump 很有可能会将内存撑爆进而导致迁移失败。所以,在迁移这样的数据表的时候,我们可以简单优化一下 mysqldump ,具体如下。
--add-locks=0:这个参数表示在迁移数据的时候不加 LOCK TABLES s1.s1 WRITE;,也就是说在导入数据时不锁定数据表。
--single-transaction:表示的是在导出数据时,不锁定数据表。
--set-gtid-purged=OFF:表示在导入数据时,不输出 GTID 相关的信息。
加上这三个参数主要是为了减少所有的操作导致不必要的 IO ,具体如下:
[root@dxd ~]