【问题标题】:How to upload large amounts of data from MsSQL datatable to MySQL datatable, daily fast?如何将大量数据从 SQL 数据表上传到 MySQL 数据表,每天都快?
【发布时间】:2021-07-23 16:27:24
【问题描述】:
我需要每天将 cca 770_000 数据行从一个 MsSQL 数据表上传到另一个 MySQL 数据表。
我写了一个小程序,第一步删除 MySQL 数据表,然后循环遍历 MsSQL 记录集,并将每一行逐步插入 MySQL 表中。
但是对于这么多的数据,需要很长的时间……
您有任何加快此任务的提示或任何其他解决方案吗?
【问题讨论】:
标签:
mysql
sql-server
database
etl
data-migration
【解决方案1】:
- 从 MSSql 转储到逗号或制表符分隔的文件。
- (在 MySQL 上)
CREATE TABLE t (...);
-
LOAD DATA INFILE INTO t ... -- 不影响“真实”表
-
RENAME TABLE real TO old, t TO real; -- 原子且快速
-
DUMP TABLE old; -- 清理
这种技术会
- 以最快的速度执行任务。
- 当表在 MySQL 上丢失时,没有时间。 (优于
TRUNCATE。)
【解决方案2】:
此任务通常称为提取-转换-加载。 etl。
你没有给我们很多细节。所以很难给出具体的答案。
清洁工作流的最佳选择是从源服务器(在您的情况下为 SQL Server)读取表并写出.csv file。如果您能找到一个完全调试的工具或库来编写最好的 .csv 文件:众所周知,编写正确的 .csv 文件比看起来要困难得多。您可以配置 SSIS 来为您完成这部分任务。
然后您可以使用 MySQL 的 LOAD DATA INFILE command 来读取该 csv 文件。该命令专为您的目的而构建,而且速度惊人。
顺便说一下,在加载表格之前不要删除并重新创建表格。 TRUNCATE 它。这告诉数据库服务器您希望对新数据使用相同的表定义。
如果您出于某种原因必须在程序中逐行处理数据,快速插入多行的诀窍是:在大约 100 行的事务批次中进行插入.两种方法:
-
像这样编写您的 INSERT 语句,每个语句大约 100 行。
INSERT INTO tbl (col1, col2, col3) VALUES
(1,2,3),
(4,5,6),
(7,8,9);
-
使用explicit transactions,在START TRANSACTION 和COMMIT 中包装每批大约100 个INSERT 语句。像这样的
START TRANSACTION;
INSERT INTO tbl (col1, col2, col3) VALUES (1,2,3);
INSERT INTO tbl (col1, col2, col3) VALUES (4,5,6);
INSERT INTO tbl (col1, col2, col3) VALUES (7,8,9);
COMMIT;
市场上有 ETL 软件包。但其中许多功能太多,难以使用。