4. 迁移前基线采集:源库表结构、主键、唯一约束、外键、索引、触发器的基线信息采集方法

迁移前基线采集是数据完整性冒烟验证的起点。其核心目标是在源库生产环境或准生产环境中,以可重复、可审计的方式,捕获数据库对象的完整元数据快照。该基线将作为迁移后目标库比对的标准参照,确保所有结构对象在迁移前后保持完全一致。

4.1 基线采集的核心原则

  • 全量覆盖:必须包含表结构、主键、唯一约束、外键、索引、触发器六大类对象,缺一不可。
  • 时间一致性:所有对象的采集应在同一时间窗口内完成,避免因DDL变更导致基线不一致。
  • 可重复性:采集脚本应支持幂等执行,且输出格式标准化(如JSON、CSV或固定格式SQL),便于后续自动化比对。
  • 版本标记:每次基线采集应附带时间戳、数据库版本、采集工具版本等元信息,便于追溯。
实践建议: 建议将基线采集脚本纳入版本控制(Git),并在每次重大迁移前执行一次全量基线采集。对于超大规模数据库(表数量 > 10,000),建议采用并行采集策略,并记录每个对象的采集耗时。

4.2 六大类对象的采集方法与关键字段

以下表格列出了每类对象的核心采集方法、关键字段及注意事项。所有采集均基于标准SQL系统视图或信息模式(Information Schema)。

对象类型 核心采集源(标准SQL) 关键字段(必须采集) 常见陷阱
表结构 INFORMATION_SCHEMA.COLUMNS TABLE_NAME, COLUMN_NAME, ORDINAL_POSITION, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, IS_NULLABLE, COLUMN_DEFAULT, COLLATION_NAME 忽略默认值表达式差异(如函数默认值);忽略字符集/排序规则
主键 INFORMATION_SCHEMA.TABLE_CONSTRAINTS + KEY_COLUMN_USAGE CONSTRAINT_NAME, TABLE_NAME, COLUMN_NAME, ORDINAL_POSITION 复合主键的列顺序必须严格一致;忽略主键名称差异
唯一约束 INFORMATION_SCHEMA.TABLE_CONSTRAINTS (CONSTRAINT_TYPE = 'UNIQUE') CONSTRAINT_NAME, TABLE_NAME, COLUMN_NAME, ORDINAL_POSITION 唯一约束与唯一索引在部分数据库中实现不同,需区分采集
外键 INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS + KEY_COLUMN_USAGE CONSTRAINT_NAME, TABLE_NAME, COLUMN_NAME, REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME, UPDATE_RULE, DELETE_RULE 自引用外键;循环依赖;级联规则差异
索引 INFORMATION_SCHEMA.STATISTICS 或 pg_indexes / sys.indexes TABLE_NAME, INDEX_NAME, COLUMN_NAME, SEQ_IN_INDEX, NON_UNIQUE, INDEX_TYPE (BTREE/HASH等), 是否为主键索引 忽略过滤索引(Filtered Index);忽略包含列(INCLUDE);忽略索引选项(如填充因子)
触发器 INFORMATION_SCHEMA.TRIGGERS 或 pg_trigger / sys.triggers TRIGGER_NAME, EVENT_MANIPULATION (INSERT/UPDATE/DELETE), EVENT_OBJECT_TABLE, ACTION_TIMING (BEFORE/AFTER), ACTION_STATEMENT (触发器体) 触发器体可能包含数据库特定语法;禁用状态(DISABLED)需单独标记

4.3 基线采集流程与SVG架构图

下图展示了从源库到基线文件的完整采集流程,包含并行采集、校验与归档三个主要阶段。

迁移前基线采集流程架构图 迁移前基线采集流程架构图 源数据库 生产/准生产环境 并行采集引擎 多线程/多会话并行 表结构采集 主键采集 唯一约束采集 外键采集 索引采集 触发器采集 基线校验与归档 格式校验 + 版本标记 基线文件输出 JSON / CSV / SQL DDL 注意事项 • 采集时间窗口需一致 • 输出格式标准化 • 包含版本标记元信息

4.4 标准采集脚本示例(以MySQL为例)

以下脚本展示了如何通过标准SQL一次性采集六大类对象的基线信息。建议将输出重定向为CSV文件,每类对象一个文件。

-- 1. 表结构基线采集
SELECT 
    TABLE_NAME, 
    COLUMN_NAME, 
    ORDINAL_POSITION, 
    DATA_TYPE, 
    CHARACTER_MAXIMUM_LENGTH, 
    IS_NULLABLE, 
    COLUMN_DEFAULT, 
    COLLATION_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'your_source_db'
ORDER BY TABLE_NAME, ORDINAL_POSITION;

-- 2. 主键与唯一约束基线采集
SELECT 
    tc.TABLE_NAME,
    tc.CONSTRAINT_NAME,
    tc.CONSTRAINT_TYPE,
    kcu.COLUMN_NAME,
    kcu.ORDINAL_POSITION
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc
JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu
    ON tc.CONSTRAINT_NAME = kcu.CONSTRAINT_NAME
    AND tc.TABLE_SCHEMA = kcu.TABLE_SCHEMA
WHERE tc.TABLE_SCHEMA = 'your_source_db'
    AND tc.CONSTRAINT_TYPE IN ('PRIMARY KEY', 'UNIQUE')
ORDER BY tc.TABLE_NAME, tc.CONSTRAINT_NAME, kcu.ORDINAL_POSITION;

-- 3. 外键基线采集
SELECT 
    kcu.CONSTRAINT_NAME,
    kcu.TABLE_NAME,
    kcu.COLUMN_NAME,
    kcu.REFERENCED_TABLE_NAME,
    kcu.REFERENCED_COLUMN_NAME,
    rc.UPDATE_RULE,
    rc.DELETE_RULE
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu
JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc
    ON kcu.CONSTRAINT_NAME = rc.CONSTRAINT_NAME
    AND kcu.TABLE_SCHEMA = rc.CONSTRAINT_SCHEMA
WHERE kcu.TABLE_SCHEMA = 'your_source_db'
    AND kcu.REFERENCED_TABLE_NAME IS NOT NULL;

-- 4. 索引基线采集
SELECT 
    TABLE_NAME,
    INDEX_NAME,
    COLUMN_NAME,
    SEQ_IN_INDEX,
    NON_UNIQUE,
    INDEX_TYPE
FROM INFORMATION_SCHEMA.STATISTICS
WHERE TABLE_SCHEMA = 'your_source_db'
ORDER BY TABLE_NAME, INDEX_NAME, SEQ_IN_INDEX;

-- 5. 触发器基线采集
SELECT 
    TRIGGER_NAME,
    EVENT_MANIPULATION,
    EVENT_OBJECT_TABLE,
    ACTION_TIMING,
    ACTION_STATEMENT
FROM INFORMATION_SCHEMA.TRIGGERS
WHERE TRIGGER_SCHEMA = 'your_source_db'
ORDER BY EVENT_OBJECT_TABLE, TRIGGER_NAME;

4.5 基线采集的常见陷阱与规避策略

关键警告: 以下陷阱在大型迁移项目中频繁导致基线比对失败,必须提前规避。
  • 陷阱1:默认值表达式差异 —— 源库使用 CURRENT_TIMESTAMP,目标库可能解析为不同精度。规避:采集时同时捕获默认值的原始表达式字符串,而非仅显示值。
  • 陷阱2:字符集与排序规则隐式依赖 —— 表级别与列级别字符集可能不同,且影响索引排序。规避:在表结构采集中显式包含 TABLE_COLLATION 和 CHARACTER_SET_NAME。
  • 陷阱3:触发器体中的数据库特定语法 —— 如MySQL的 DELIMITER 或Oracle的 REFERENCING 子句。规避:采集触发器体原文,并在比对阶段使用语法归一化工具。
  • 陷阱4:过滤索引与包含列 —— 标准 INFORMATION_SCHEMA.STATISTICS 可能不包含过滤条件。规避:对于SQL Server等数据库,额外使用 sys.indexes 和 sys.index_columns 采集过滤谓词。
  • 陷阱5:外键循环依赖 —— 在迁移顺序规划中可能导致失败。规避:基线采集后额外生成外键依赖拓扑图,标记循环依赖。

4.6 基线文件组织规范

推荐按以下目录结构组织基线文件,便于自动化工具读取和比对:

baseline/
├── metadata.json                 # 采集元信息(时间戳、数据库版本、采集工具版本)
├── tables/
│   ├── table_structures.csv      # 表结构
│   ├── primary_keys.csv          # 主键
│   ├── unique_constraints.csv    # 唯一约束
│   ├── foreign_keys.csv          # 外键
│   ├── indexes.csv               # 索引
│   └── triggers.sql              # 触发器DDL(保留原始语法)
└── checksum/
    └── baseline_checksum.txt     # 所有文件的MD5校验和,用于完整性验证