在 SQL 服务器之间传输大量数据时,可以采用几种策略,包括 bulk insert、ETL 过程(提取-转换-加载)、复制以及备份/恢复机制、db-link 和内置的导入导出工具。
最优先使用批量传输机制。SQL Server 的一个示例是使用 BULK INSERT 来加载大文件,或者使用 SSIS/集成服务来处理复杂的 ETL 场景。在更具可移植性的情况下,可以使用带有 LIMIT/OFFSET 逻辑的脚本和记录传输位置。为了提高可靠性,通常采用:
-- 在数据库之间分批传输数据(PostgreSQL) INSERT INTO target_db.public.data_table (col1, col2) SELECT col1, col2 FROM source_db.public.data_table WHERE transferred = FALSE LIMIT 10000;
复制和导入导出之间有什么区别,为什么复制不总是适合迁移大型历史档案?
答案:复制支持实时变更的同步,对“实时”数据有效。对于迁移历史档案,复制可能不够快速和灵活,因为它不支持自定义转换,也不解决一次性大规模传输问题——此时通常使用 ETL。
事件
某公司将多个地区的数据库整合到一个统一的存储中。在没有批处理的情况下进行大量导入,系统因为内存不足而“挂起”,导致部分提交和半手动恢复状态。通过采用带有进度记录的批量导出解决了这一问题。
事件
由于在通过 BULK INSERT 传输大文件时未能正确控制校验和,部分信息被损坏,但这一事实几周后才被发现。解决方案是在每个批次之前和之后重新计算校验和,并在不匹配时自动重试。
事件
在尝试通过标准导入导出迁移超过 1 亿行数据时,一位开发者未考虑锁管理:目标服务器上的表锁导致业务操作停滞数小时。结论——对于此类任务,只有在夜间窗口和阶段性复制时使用临时重新索引。