mcpField
S
sql-server-table-reconciliation

sql-server-table-reconciliation

github.com/github数据与数据库40.5k102 次安装1 天前更新
代码仓库

关于 sql-server-table-reconciliation

用于核对两个 SQL Server 实例中对应表的技能,使用 Python、`mssql-python` 和 Apache Arrow。它可发现行、列及架构差异并生成报告,也提供分块处理和哈希预检以应对大表。

主要功能

  1. 01比较不同 SQL Server 实例的表
  2. 02检测缺失、多余及不匹配的行
  3. 03识别架构差异
  4. 04通过 Apache Arrow 提取数据
  5. 05使用分块和哈希预检处理大表
  6. 06生成 console、CSV、Parquet 或 JSON 报告

适用场景

  1. 01检查生产与暂存表
  2. 02验证数据库迁移
  3. 03查找实例间的架构漂移
  4. 04分批核对大型表

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/github/awesome-copilot --skill sql-server-table-reconciliation

安装后在 Claude Code 中输入/sql-server-table-reconciliation确认已加载。

附带文件scripts/reconcile.py

详细介绍

SQL Server 表数据核对

使用 Python 配合 mssql-python 驱动和 Apache Arrow,比较两个 SQL Server 实例中结构相同的表。检测缺失行、列不匹配、架构漂移,并生成核对报告。

工作流

  1. 收集源端和目标端的连接信息
  2. 确定主键 / 复合键
  3. 检测架构差异
  4. 通过 Arrow 提取数据,实现高效的列式传输
  5. 比较行和列
  6. 生成核对报告

收集输入

参数必需描述
源服务器是源 SQL Server(例如 prod-server.database.windows.net)
源数据库是源数据库名称
目标服务器是目标 SQL Server(例如 staging-server.database.windows.net)
目标数据库是目标数据库名称
表是逗号分隔的 schema.table 名称,或 schema.* 通配符(例如 dbo.Orders,dbo.Items 或 dbo.*)
认证模式是sql(用户名/密码)或 entra(Azure AD/token)
主键自动检测构成行标识的列。如果未提供,则从元数据自动检测。
要比较的列全部列的子集,或所有非主键列
分块大小100000大表的每批行数
输出格式consoleconsole、csv、parquet 或 json

捆绑脚本

核对逻辑以独立脚本形式提供,位于 scripts/reconcile.py。根据用户输入使用相应参数调用它:

python scripts/reconcile.py \
    --source-server <source_server> \
    --source-database <source_database> \
    --target-server <target_server> \
    --target-database <target_database> \
    --tables "<table_spec>" \
    --auth <sql|entra> \
    --chunk-size <chunk_size> \
    --output <console|csv|json>
可选参数
参数描述
--primary-key逗号分隔的主键列。省略则自动检测。
--columns逗号分隔的要比较的列。省略则比较所有非主键列。
调用示例

使用 SQL 认证的单个表:

python scripts/reconcile.py \
    --source-server prod-server.database.windows.net \
    --source-database ProdDB \
    --target-server staging-server.database.windows.net \
    --target-database StagingDB \
    --tables "dbo.Orders" \
    --auth sql \
    --output console

使用 Entra 认证和 CSV 输出的通配符:

python scripts/reconcile.py \
    --source-server prod-server.database.windows.net \
    --source-database ProdDB \
    --target-server staging-server.database.windows.net \
    --target-database StagingDB \
    --tables "dbo.*" \
    --auth entra \
    --output csv
先决条件

运行前安装所需软件包:

pip install mssql-python pyarrow pandas

比较规则

  • 比较前规范化类型:将 decimal 转换为相同精度,去除字符串首尾空白,将 datetime 规范化为 UTC
  • NULL 处理:NULL == NULL 视为匹配(两侧都缺失 = 无差异)
  • 忽略行顺序:始终通过主键连接进行比较,绝不按位置比较
  • 大表:使用 OFFSET/FETCH 或 ROW_NUMBER() 分区进行分块提取

基于哈希的优化(适用于大表)

当表行数超过 100 万时,生成哈希预检查:

SELECT {pk_cols},
       HASHBYTES('SHA2_256', CONCAT_WS('|', col1, col2, ...)) AS row_hash
FROM {table}

先比较哈希;仅对哈希不匹配的行获取完整数据。这能显著减少数据传输量。

报告格式

Reconciling dbo.EMPLOYEES...
Reconciling dbo.DEPARTMENTS...
Reconciling dbo.JOBS...

--- dbo.EMPLOYEES ---
  Source: 107  Target: 107
  Missing: 0  Extra: 0  Mismatches: 0
  Result: ✓ IDENTICAL

--- dbo.DEPARTMENTS ---
  Source: 27  Target: 27
  Missing: 0  Extra: 0  Mismatches: 3
  Result: ✗ DIFFERENCES FOUND

--- dbo.JOBS ---
  Source: 19  Target: 19
  Missing: 0  Extra: 0  Mismatches: 0
  Result: ✓ IDENTICAL

=== Summary: 2 passed, 1 failed, 0 skipped / 3 tables ===

当提供单个表时,包含完整详细信息(架构漂移、样本行、不匹配项)。当提供多个表时,使用上述按表紧凑格式,仅对状态为 FAIL 的表提供完整详细信息。

性能注意事项

场景策略
< 100K 行单次 Arrow 获取,内存中 pandas 比较
100K–1M 行分块提取(100K 批次),流式比较
> 1M 行哈希预检查 → 仅获取不匹配的行
宽表(100+ 列)先比较主键 + 哈希,不匹配时深入特定列
网络受限使用 Arrow 列式格式(比逐行小 10-50 倍)

约束

  • 始终使用 mssql-python 驱动(不是 pyodbc、pymssql)
  • 始终通过游标使用 Apache Arrow(cursor.arrow())提取数据
  • 连接必须使用连接字符串格式,而不是关键字参数(像 encrypt=True 这样的 kwargs 会抛出错误)
  • 绝不在未先确定主键的情况下进行比较——如果自动检测失败,询问用户
  • 使用重试逻辑优雅地处理连接失败
  • 绝不在生成的脚本中硬编码凭据——使用 os.environ / getpass(环境变量:MSSQL_USER、MSSQL_PASSWORD)
  • 不要在输出或日志中打印凭据
  • 对元数据查询使用参数化查询(? 占位符)——绝不将用户输入通过 f-string 插值到 SQL 中

评论

支持 Markdown