语言:C# (主要技术:SqlBulkCopy)
场景:MySQL => SQL Server
需求:将MySQL中的一个 1186264 行( 纯数据大小 2.8 GB )的表所有记录传输到 SQL Server 的表中。
2. 发现大约执行 10 分钟后产生了异常,于是在 MySQL 中执行: " set global wait_timeout=99999; " , 异常依旧;
3. 设置 BulkSize = 1000 ,再执行程序发现SQL Server表中查到记录数在增长,但大约传输 38 万行数据后不再有数据增加, 近一个小时还没动静,手动停止了;
4. MySQL中增加一个新表 dc_init_temp
5. 将表中主键插入到新表中;
7. 到此终于解决, 同步完成 634 秒(当然,因为是测试环境的虚拟机,IO差一点,正式服务器会更快)。
场景:MySQL => SQL Server
需求:将MySQL中的一个 1186264 行( 纯数据大小 2.8 GB )的表所有记录传输到 SQL Server 的表中。
发现异常后处理过程:
1. 先将sql语句前面加上:"set net_write_timeout=99999; set net_read_timeout=99999;" , 异常依旧;2. 发现大约执行 10 分钟后产生了异常,于是在 MySQL 中执行: " set global wait_timeout=99999; " , 异常依旧;
3. 设置 BulkSize = 1000 ,再执行程序发现SQL Server表中查到记录数在增长,但大约传输 38 万行数据后不再有数据增加, 近一个小时还没动静,手动停止了;
4. MySQL中增加一个新表 dc_init_temp
drop table if exists dc_init_temp;
create table dc_init_temp(
pkId varchar(100) not null,
autoId INT(10) AUTO_INCREMENT,
PRIMARY KEY (`pkId`),
KEY `ix_dc_init_temp_autoId` (`autoId`)
);
5. 将表中主键插入到新表中;
6. 采用分页方式循环将记录传输到SQL Server:
set net_write_timeout=99999; set net_read_timeout=99999;
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
select * from dbName.tableName as a
WHERE a.id in
(
SELECT b.`pkId`
FROM `dc_init_temp` as b
where b.autoId>? and b.autoId<=? #(pageIndex-1)*pageSize , pageIndex*pageSize
);
COMMIT;
7. 到此终于解决, 同步完成 634 秒(当然,因为是测试环境的虚拟机,IO差一点,正式服务器会更快)。