SQL Server - 导出没有主键的大表

no *_*one 9 sql-server

我需要在 SQL Server 和 MySQL 之间没有主键的情况下同步大约 5 亿行的大表。该表只有一个聚集复合非唯一索引。

我在服务器之间确实有一个 ODBC 连接,但是大约 800 万行的导入需要大约 45 分钟,所以我相信更大的单个导入是不合理的,因为在任何时候都可能发生中断。我不能改变现有的表结构,我可以添加其他表。进一步阅读后,offset / fetch 不是大表的选项。“选择 ... 其中 x 介于 ... 和 ... 之间”不是一个选项,因为我没有唯一的键。

如何批量导出保证包含所有行的表?我的问题是,由于聚集键不是唯一的,在它之后排序不能保证物理行在连续查询之间具有相同的顺序,并且在所有列之后排序会花费太长时间。您建议如何通过 ODBC 或 CSV 文件迁移批次?

a1e*_*x07 0

假设您没有对源表进行更新或删除,您可以尝试以下操作:
1. 使用 CTAS 语法创建现有表的副本(对于 SQLServer 来说是SELECT * into source_table_copy FROM source_table)。即使对于巨大的表,这样的操作也非常快。
2. 添加after insert触发器,source_table将新记录复制到source_table_copy
3.现在当所有新记录都source_table转到时source_table_copy,您可以将数据从复制的表批量移动到Mysql。例如,如果两台服务器之间有链接,则一切都可以在 TSQL 存储过程的主体内完成。
例如,一段将最多 20 条记录移动到新服务器的代码可能如下所示

 --declare table variable to keep deleted records until they delivered to target host 
  BEGIN TRANSACTION;
  DELETE TOP (20) FROM source_table_copy OUTPUT DELETED.* INTO @Table_Var;

  --insert data into linked server , or to csv file
  COMMIT; 
Run Code Online (Sandbox Code Playgroud)

也可以使用 CURSOR 读取数据,然后用 withwhere current of子句删除。

**理想情况下,您需要防止应用程序source_table在步骤 1 期间将数据插入。如果绝对不可能,我将使用一个after insert触发器,该触发器在步骤 1 之前添加,并在完成后立即删除,将数据复制到我可以的其他表中稍后与 合并source_table_copy