🎁 Get the FREE AI Skills Starter Guide — Subscribe →
BytesAgainBytesAgain
🊀 ClawHub

sqlserver-tidb-replay

by @dongdong-bryant

Replay SQL Server slow query logs on TiDB to verify compatibility, compare performance, and generate syntax conversion reports during migration.

Versionv1.0.0
Downloads302
TERMINAL
clawhub install sqlserver-tidb-replay

📖 About This Skill

SQL Server → TiDB SQL 回攟工具

工具简介

参考 Bowen-Tang/sql-replayMySQL → TiDB 流量回攟工具实现 SQL Server → TiDB 的 SQL 回攟胜力。

栞心甚途

  • 数据库迁移前验证 SQL 兌容性
  • 迁移后对比性胜差匂 + 生成语法蜬换建议
  • 压测暡拟真实䞚务莟蜜
  • 参考来源GitHub - Bowen-Tang/sql-replay: mysql slow query replay


    工䜜流皋

    ┌─────────────────────────────────────────────────────────────┐
    │  ① 采集 (collect)                                          │
    │  SQL Server 慢查询日志 → CSV非标准 XE 栌匏             │
    │  ⚠ 需芁蜬换䞺标准 SQL 栌匏                                │
    │  目标sqlserver.sql_statement_completed 事件              │
    └─────────────────────────────────────────────────────────────┘
                                ↓ CSV 文件
    ┌─────────────────────────────────────────────────────────────┐
    │  ② CSV 蜬标准 SQL (csv_to_sql)                            │
    │  解析原始日志 → 标准 SQL 语句                              │
    │  功胜去陀 XE 前猀笊号、提取 SQL 文本、栌匏化             │
    └─────────────────────────────────────────────────────────────┘
                                ↓ 标准 SQL CSV
    ┌─────────────────────────────────────────────────────────────┐
    │  ③ 解析 (parse)                                            │
    │  CSV → Python 解析 → JSON 䞭闎栌匏                         │
    │  功胜去重、过滀无效SQL、生成可回攟JSON                    │
    └─────────────────────────────────────────────────────────────┘
                                ↓ JSON 文件
    ┌─────────────────────────────────────────────────────────────┐
    │  ④ 回攟 (replay)                                           │
    │  JSON → Python 回攟脚本 → TiDB 并行执行                    │
    │  功胜连接池、并发执行、按 conn_id 䞲行                   │
    │  蟓出results_{task_name}.json                            │
    └─────────────────────────────────────────────────────────────┘
                                ↓ 结果 JSON
    ┌─────────────────────────────────────────────────────────────┐
    │  â‘€ 分析 (analyze)                                          │
    │  结果 JSON → 分析脚本                                       │
    │  功胜                                                      │
    │  - 识别语法䞍兌容问题                                       │
    │  - 性胜对比分析TiDB vs SQL Server                       │
    │  - 自劚生成语法蜬换建议蜬换前/后/点                     │
    │  - HTML 报告含语法蜬换对照衚                            │
    └─────────────────────────────────────────────────────────────┘
    


    前眮准倇

    环境芁求

  • Python 3.8+
  • pymysql连接 TiDB
  • pandas解析 CSV
  • PowerShell 5.1+采集甚Windows 环境
  • TiDB 连接信息

    # 方匏䞀配眮环境变量
    export TIDB_HOST="your-tidb-host"
    export TIDB_PORT="4000"
    export TIDB_USER="root"
    export TIDB_PASSWORD="your-password"
    export TIDB_DATABASE="test_db"

    方匏二呜什行参数䌠入䌘先级曎高


    栞心功胜诎明

    CSV 蜬标准 SQL关键步骀

    SQL Server 慢查询日志富出的 CSV 䞍是标准的 XE 栌匏包含倧量 XE 前猀笊号和混合栌匏需芁先蜬换䞺标准 SQL 语句。

    原始 CSV 垞见问题

  • SQL 文本被截断或换行
  • 包含 XE 事件前猀劂 sql_statement_completed、sp_statement_completed
  • 变量参数化笊号@1, @2, N'' 等 Unicode 前猀
  • 倚行合并问题
  • 蜬换脚本csv_to_sql.py 自劚倄理

  • 去陀 XE 事件前猀
  • 合并被截断的 SQL检测分号断句
  • 替换 SQL Server 特有参数栌匏
  • 去陀䞍可见字笊

  • 䜿甚步骀

    ① 采集 SQL Server 慢日志

    圚 Windows 服务噚䞊运行 PowerShell 脚本

    # 方匏䞀Extended Events掚荐结构枅晰
    .\collect_xe.ps1 -SessionName "slow_query_capture" -ThresholdMs 1000 -OutputPath "C:\slow_logs\slow_20260412.csv"

    方匏二从 SQL Server Management Studio 富出慢查询日志

    右键 → 富出 → CSV含 statement、duration、cpu 等字段

    采集的字段 | 字段 | 诎明 | |------|------| | statement | SQL 文本 | | duration_us | 执行时闎埮秒 | | cpu_us | CPU 时闎埮秒 | | physical_reads | 物理读次数 | | logical_reads | 逻蟑读次数 | | row_count | 返回行数 | | start_time | 匀始执行时闎 | | database_name | 所属数据库 | | session_id | 连接 ID |

    > 泚意采集需芁 VIEW SERVER STATE 权限。建议圚测试环境运行。


    ② CSV 蜬标准 SQL 栌匏

    python3 scripts/csv_to_sql.py \
      --input /path/to/raw_slow_query.csv \
      --output /path/to/standard_sql.csv \
      --normalize \
      --remove-prefix
    

    参数诎明 | 参数 | 诎明 | |------|------| | --input | 原始 CSV 路埄 | | --output | 标准 SQL CSV 蟓出路埄 | | --normalize | 规范化 SQL 栌匏去陀倚䜙空癜 | | --remove-prefix | 去陀 XE 事件前猀笊号 |

    蜬换后字段 | 字段 | 诎明 | |------|------| | sql_text | 标准 SQL 文本 | | duration_ms | 执行时闎毫秒标准化 | | database_name | 数据库名 | | session_id | 连接 ID |


    ③ 解析 CSV 䞺回攟栌匏

    python3 scripts/parse_csv.py \
      --input /path/to/standard_sql.csv \
      --output /path/to/slow_20260412.format.json \
      --filter-type select,insert,update,delete \
      --filter-duration-ms 1000 \
      --remove-admin \
      --lang cn
    

    解析蟓出 JSON 栌匏

    [
      {
        "conn_id": "52",
        "start_time": "2026-04-12T10:00:01.123",
        "sql": "SELECT c FROM sbtest1 WHERE id=250438",
        "sql_type": "select",
        "duration_us": 380,
        "database": "test_db"
      }
    ]
    


    ④ 回攟至 TiDB

    python3 scripts/replay_tidb.py \
      --input /path/to/slow_20260412.format.json \
      --host $TIDB_HOST \
      --port $TIDB_PORT \
      --user $TIDB_USER \
      --password $TIDB_PASSWORD \
      --database $TIDB_DATABASE \
      --speed 1.0 \
      --workers 4 \
      --output-dir ./replay_results \
      --task-name "test_migration"
    

    回攟蟓出

    replay_results/
    ├── test_migration_conn_52.json   # 每䞪 conn_id 䞀䞪文件
    ├── test_migration_conn_88.json
    └── test_migration_summary.json   # 汇总信息
    

    汇总文件栌匏

    {
      "task_name": "test_migration",
      "total_sqls": 1523,
      "total_errors": 12,
      "avg_duration_us": 4523,
      "max_duration_us": 128500,
      "compatibility_rate": "99.21%"
    }
    


    â‘€ 生成分析报告含语法蜬换

    python3 scripts/analyze_results.py \
      --input-dir ./replay_results \
      --task-name "test_migration" \
      --output ./replay_report.html \
      --source-db "SQL Server 2022" \
      --target-db "TiDB v8.0"
    

    报告内容

  • ✅ SQL 兌容性统计错误类型分垃
  • ✅ 性胜对比分析TiDB vs SQL Server
  • ✅ 慢 SQL Top 10
  • ✅ 语法蜬换对照衚蜬换前 / 蜬换后 / 蜬换点
  • ✅ 迁移风险评䌰

  • 语法蜬换功胜

    自劚识别的䞍兌容暡匏

    | 类别 | SQL Server 写法 | TiDB 改写 | 蜬换诎明 | |------|----------------|-----------|---------| | OUTPUT clause | INSERT INTO t OUTPUT inserted.id VALUES(...) | INSERT INTO t VALUES(...); SELECT LAST_INSERT_ID(); | TiDB 䞍支持 OUTPUT clause甚 LAST_INSERT_ID() 替代 | | NVARCHAR | N'Unicode字笊䞲' | CAST('字笊䞲' AS CHAR) | TiDB 字笊集差匂需星匏 CAST | | OPENJSON | SELECT * FROM OPENJSON(@json) | JSON_EXTRACT(@json, '$') | TiDB 䞍支持 OPENJSON甚 JSON 凜数替代 | | Sequence | NEXT VALUE FOR seq_name | NEXTVAL('seq_name') | TiDB 序列语法䞍同 | | OFFSET | OFFSET 10 ROWS FETCH NEXT 5 ROWS | LIMIT 5 OFFSET 10 | TiDB LIMIT...OFFSET 顺序盞反 | | TOP | SELECT TOP 10 * FROM t | SELECT * FROM t LIMIT 10 | TiDB 甹 LIMIT 替代 TOP | | INTO | SELECT * INTO #temp FROM t | CREATE TEMPORARY TABLE t AS SELECT... | TiDB 䞍支持 SELECT INTO 䞎时衚 | | MERGE | MERGE INTO t USING... | INSERT...ON DUPLICATE KEY UPDATE | TiDB 䞍支持 MERGE甚 IODU 替代 |

    报告䞭的语法蜬换衚瀺䟋

    ┌──────────────────────────────────────────────────────────────────────────────┐
    │  语法蜬换记圕 #12                                                            │
    ├─────────────────────────────────────────────────────────────────────────────
    │  源 SQL Server                                                             │
    │  INSERT INTO orders (name, amount)                                          │
    │  OUTPUT inserted.order_id                                                  │
    │  VALUES ('商品A', 100)                                                      │
    ├─────────────────────────────────────────────────────────────────────────────
    │  蜬换后 TiDB                                                               │
    │  INSERT INTO orders (name, amount)                                          │
    │  VALUES ('商品A', 100);                                                     │
    │  SELECT LAST_INSERT_ID() AS order_id;                                       │
    ├─────────────────────────────────────────────────────────────────────────────
    │  蜬换点                                                                   │
    │  1. OUTPUT inserted.order_id → SELECT LAST_INSERT_ID()                     │
    │  2. 原因TiDB 䞍支持 OUTPUT clause                                        │
    │  3. 圱响需应甚层调敎获取自增 ID 的方匏                                     │
    └────────────────────────────────────────────────────────────────────────────┘
    


    完敎䜿甚案䟋

    场景某银行栞心系统 SQL Server → TiDB 迁移验证

    背景银行信获系统从 SQL Server 2019 迁移至 TiDB需芁验证 2000+ 条栞心 SQL 的兌容性。

    Step 1生产库慢日志采集

    圚 SQL Server 生产库䞊运行阈倌讟䞺 500ms

    .\collect_xe.ps1 -SessionName "credit_slow" -ThresholdMs 500 -OutputPath "C:\logs\credit_slow_20260412.csv"
    
    采集结果纊 3800 条慢查询芆盖 3 倩的䞚务高峰期。

    Step 2CSV 蜬标准 SQL

    python3 scripts/csv_to_sql.py \
      --input credit_slow_20260412.csv \
      --output credit_slow_standard.csv \
      --normalize \
      --remove-prefix
    

    Step 3解析并过滀

    python3 scripts/parse_csv.py \
      --input credit_slow_standard.csv \
      --output credit_slow.format.json \
      --filter-type select,insert,update,delete \
      --filter-duration-ms 500 \
      --remove-admin
    
    解析后2156 条有效 SQL。

    Step 4回攟至 TiDB 测试环境

    python3 scripts/replay_tidb.py \
      --input credit_slow.format.json \
      --host 192.168.1.100 \
      --port 4000 \
      --user root \
      --password "Xszyh@315315" \
      --database credit_db \
      --speed 2.0 \
      --workers 8 \
      --output-dir ./replay_results \
      --task-name "credit_migration"
    

    Step 5生成报告

    python3 scripts/analyze_results.py \
      --input-dir ./replay_results \
      --task-name "credit_migration" \
      --output credit_migration_report.html \
      --source-db "SQL Server 2019" \
      --target-db "TiDB v8.0"
    

    报告结果瀺䟋

    迁移兌容性评䌰报告
    ===============================
    源库SQL Server 2019
    目标库TiDB v8.0
    采集时闎2026-04-12
    总SQL数2156
    兌容性98.6%错误SQL 30条

    错误分垃 - 语法䞍兌容8条䞻芁是 OUTPUT clause - 凜数䞍存圚12条DB2兌容凜数 - 字笊集问题5条NCHAR/NVARCHAR vs CHAR/VARCHAR - 杂项错误5条

    语法蜬换记圕 - #1: OUTPUT clause → SELECT LAST_INSERT_ID()12条 - #2: N'' Unicode前猀 → CAST() 蜬换8条 - #3: OFFSET...FETCH → LIMIT...OFFSET15条 - #4: OPENJSON → JSON_EXTRACT5条

    高风险SQL需手劚改写 1. proc_audit_insert (行12) - OUTPUT clause 2. proc_statement_get (行89) - OPENJSON 凜数 ...

    性胜对比成功SQL - TiDB 平均响应12.3ms - SQL Server 平均响应45.2ms - TiDB 加速比3.7x


    垞见问题

    Q: CSV 是慢查询日志䞍是标准 XE 栌匏怎么办

    A这是正垞情况。SQL Server 慢查询日志富出时栌匏䞍统䞀需甚 csv_to_sql.py 进行标准化蜬换。该脚本䌚自劚倄理换行笊、XE 前猀、变量参数等问题。

    Q: Extended Events 䌚话对生产库性胜圱响倧吗

    AXE 讟计䞺䜎匀销建议阈倌讟高䞀些≥500ms避免量倪倧。劂果 CPU 玧匠可䜿甚 histogram 目标先看分垃。

    Q: 回攟时出现倧量连接错误

    A检查 TiDB 连接数限制max_connections同时调敎 --workers 参数。SQL Server 和 TiDB 的连接池暡型䞍同建议从 4 匀始逐步加压。

    Q: 语法蜬换是自劚的吗

    A分析报告䌚自劚识别垞见的语法䞍兌容暡匏并给出蜬换建议。䜆最终改写需人工确讀特别是涉及䞚务逻蟑的郚分。

    Q: 性胜对比怎么做的

    A回攟时䌚记圕 TiDB 执行时闎汇总文件䞭䌚䞎原 SQL Server 的 duration_us 进行对比。泚意盞同数据量䞋对比才有意义。

    Q: 胜回攟存傚过皋吗

    A可以䜆采集的是 sp_statement_completed 事件。需芁确保 TiDB 端有对应的存傚过皋存傚过皋䞍䌚被自劚翻译需手劚迁移。


    蟓出文件诎明

    | 文件 | 诎明 | |------|------| | *_raw.csv | 原始采集数据 | | *_standard.csv | 标准 SQL CSV已蜬换 | | *.format.json | 解析后的回攟䞭闎栌匏 | | replay_results/*.json | 回攟执行结果 | | replay_report.html | 最终兌容性报告含语法蜬换对照衚 |


    侎 MySQL→TiDB 回攟工具的区别

    | 绎床 | Bowen-Tang/sql-replay | 本工具 | |------|----------------------|--------| | 源数据库 | MySQL slow log | SQL Server 慢查询日志 | | 日志栌匏 | MySQL slow log text | Extended Events CSV非标准 | | CSV 标准化 | 䞍需芁 | 需芁csv_to_sql.py | | 语法蜬换 | 无 | 自劚识别并生成蜬换对照衚 | | 性胜对比 | 基础 | 完敎对比分析 | | 回攟目标 | TiDB | TiDB |


    *Skill 版本1.1.0 | 参考sql-replay v0.3.4 | 适甚SQL Server 2008+ → TiDB 5.0+*

    📋 Tips & Best Practices

    Q: CSV 是慢查询日志䞍是标准 XE 栌匏怎么办

    A这是正垞情况。SQL Server 慢查询日志富出时栌匏䞍统䞀需甚 csv_to_sql.py 进行标准化蜬换。该脚本䌚自劚倄理换行笊、XE 前猀、变量参数等问题。

    Q: Extended Events 䌚话对生产库性胜圱响倧吗

    AXE 讟计䞺䜎匀销建议阈倌讟高䞀些≥500ms避免量倪倧。劂果 CPU 玧匠可䜿甚 histogram 目标先看分垃。

    Q: 回攟时出现倧量连接错误

    A检查 TiDB 连接数限制max_connections同时调敎 --workers 参数。SQL Server 和 TiDB 的连接池暡型䞍同建议从 4 匀始逐步加压。

    Q: 语法蜬换是自劚的吗

    A分析报告䌚自劚识别垞见的语法䞍兌容暡匏并给出蜬换建议。䜆最终改写需人工确讀特别是涉及䞚务逻蟑的郚分。

    Q: 性胜对比怎么做的

    A回攟时䌚记圕 TiDB 执行时闎汇总文件䞭䌚䞎原 SQL Server 的 duration_us 进行对比。泚意盞同数据量䞋对比才有意义。

    Q: 胜回攟存傚过皋吗

    A可以䜆采集的是 sp_statement_completed 事件。需芁确保 TiDB 端有对应的存傚过皋存傚过皋䞍䌚被自劚翻译需手劚迁移。