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架构图
下图展示了从源库到基线文件的完整采集流程,包含并行采集、校验与归档三个主要阶段。
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校验和,用于完整性验证