编程后端开发工程师,数据工程师,DBA

讲述如何在 SQL 服务器之间组织大数据量的处理和传输。有哪些机制可以用于批量数据传输,如何避免数据丢失/损坏?请举一个软件解决方案的例子。

用 Hintsage AI 助手通过面试

答案

在 SQL 服务器之间传输大量数据时,可以采用几种策略,包括 bulk insertETL 过程(提取-转换-加载)复制以及备份/恢复机制、db-link 和内置的导入导出工具。

最优先使用批量传输机制。SQL Server 的一个示例是使用 BULK INSERT 来加载大文件,或者使用 SSIS/集成服务来处理复杂的 ETL 场景。在更具可移植性的情况下,可以使用带有 LIMIT/OFFSET 逻辑的脚本和记录传输位置。为了提高可靠性,通常采用:

  • 使用校验和进行分批数据传输,
  • 使用临时 staging 表并进行后续完整性检查(检查约束、哈希),
  • 记录传输阶段。

示例

-- 在数据库之间分批传输数据(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 亿行数据时,一位开发者未考虑锁管理:目标服务器上的表锁导致业务操作停滞数小时。结论——对于此类任务,只有在夜间窗口和阶段性复制时使用临时重新索引。