| # Oracle 10G → PostgreSQL 16.6 迁移后数据校验清单 本清单用于验证迁移后数据的**完整性**和**一致性**,避免出现数据丢失、类型转换错误、字段值异常等问题,按「基础校验→深度校验→特殊场景校验」三步执行。 ## 一、 基础校验(必做) ### 1. 表结构一致性校验 | 校验项 | Oracle 操作命令 | PostgreSQL 操作命令 | 校验标准 | |--------|----------------|--------------------|----------| | 表数量比对 | `SELECT COUNT(*) FROM USER_TABLES;` | `SELECT COUNT(*) FROM pg_tables WHERE schemaname = 'public';` | 两者数量一致(排除系统表) | | 字段数量比对 | `SELECT COUNT(*) FROM USER_TAB_COLUMNS WHERE TABLE_NAME = '表名';` | `SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '表名';` | 同一张表的字段数完全一致 | | 字段类型比对 | `SELECT COLUMN_NAME, DATA_TYPE FROM USER_TAB_COLUMNS WHERE TABLE_NAME = '表名';` | `SELECT COLUMN_NAME, DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '表名';` | 字段类型符合「映射表」规则,无乱码/错误类型 | | 主键/约束比对 | `SELECT CONSTRAINT_NAME FROM USER_CONSTRAINTS WHERE TABLE_NAME = '表名' AND CONSTRAINT_TYPE = 'P';` | `SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE TABLE_NAME = '表名' AND CONSTRAINT_TYPE = 'PRIMARY KEY';` | 主键名称、字段一致 | ### 2. 数据行数完整性校验 核心目标:确保迁移后 PG 表的行数 = Oracle 源表行数 ```sql -- Oracle 统计单表行数 SELECT COUNT(*) FROM 表名; -- PostgreSQL 统计单表行数 SELECT COUNT(*) FROM 表名; -- 批量统计所有表行数(Oracle) SELECT TABLE_NAME, NUM_ROWS FROM USER_TABLES ORDER BY TABLE_NAME; -- 批量统计所有表行数(PostgreSQL) SELECT relname AS TABLE_NAME, reltuples AS NUM_ROWS FROM pg_class WHERE relkind = 'r' AND relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = 'public') ORDER BY relname; ``` **校验标准**:所有表的行数完全一致,允许超大表(>1亿行)存在±100以内的误差(统计命令估算偏差)。 ## 二、 深度校验(抽样必做) 针对核心业务表(如订单表、用户表),抽样校验字段值的准确性,避免类型转换导致的数据失真。 ### 1. 数值类型校验 重点验证 `NUMBER` 类型转换为 `NUMERIC/INT/BIGINT` 后的值是否准确 ```sql -- 随机抽取 10 条数据对比(以订单金额字段为例) -- Oracle SELECT ID, ORDER_AMOUNT FROM 表名 WHERE ROWNUM <= 10; -- PostgreSQL SELECT ID, ORDER_AMOUNT FROM 表名 LIMIT 10; ``` **校验标准**:ID 对应的金额值完全一致,无小数点截断、数值溢出。 ### 2. 日期类型校验 重点验证 `DATE` 转换为 `TIMESTAMP` 后是否丢失时分秒 ```sql -- Oracle(DATE 包含时分秒) SELECT ID, TO_CHAR(CREATE_TIME, 'YYYY-MM-DD HH24:MI:SS') FROM 表名 WHERE ROWNUM <= 10; -- PostgreSQL SELECT ID, TO_CHAR(CREATE_TIME, 'YYYY-MM-DD HH24:MI:SS') FROM 表名 LIMIT 10; ``` **校验标准**:时间戳的年月日时分秒完全一致。 ### 3. 大字段校验(CLOB/BLOB) 验证大文本、二进制数据是否完整迁移 ```sql -- CLOB 字段校验(Oracle) SELECT ID, DBMS_LOB.GETLENGTH(CONTENT) FROM 表名 WHERE ROWNUM <= 5; -- TEXT 字段校验(PostgreSQL) SELECT ID, LENGTH(CONTENT) FROM 表名 LIMIT 5; ``` **校验标准**:同 ID 对应的字段长度一致;随机抽取1条数据,直接对比内容是否相同。 ## 三、 特殊场景校验(按需执行) ### 1. 索引/外键有效性校验 ```sql -- PostgreSQL 检查索引是否生效 SELECT INDEXNAME, TABLENAME, STATUS FROM PG_INDEXES WHERE TABLENAME = '表名'; -- PostgreSQL 检查外键是否可正常关联 SELECT * FROM 子表 t1 JOIN 主表 t2 ON t1.外键字段 = t2.主键字段 LIMIT 10; ``` ### 2. 空值一致性校验 验证 Oracle 的 `NULL` 是否正确迁移为 PG 的 `NULL` ```sql -- Oracle SELECT COUNT(*) FROM 表名 WHERE 字段名 IS NULL; -- PostgreSQL SELECT COUNT(*) FROM 表名 WHERE 字段名 IS NULL; ``` ### 3. 业务 SQL 兼容性校验 将 Oracle 核心业务 SQL 改写为 PG 语法后执行,验证查询结果是否一致(如 `(+)` 外连接改写为 `LEFT JOIN`)。 ## 四、 校验结果处理 1. **表行数不一致**:优先排查是否分批次迁移遗漏、过滤条件错误,重新迁移对应批次数据。 2. **字段值异常**:检查字段类型映射是否错误(如 Oracle `DATE` 映射为 PG `DATE`),修正后重新迁移表结构+数据。 3. **大字段丢失**:调整 DBeaver 大字段读取参数(增大 `fetchSize`),重新迁移对应表。 --- 如果需要,我还可以帮你生成一份**校验结果对比表模板**,你可以直接填写 Oracle 和 PG 的校验数据,方便归档和问题追溯。需要吗? |
|手机版|小黑屋|梦想之都-俊月星空
( 粤ICP备18056059号 )|网站地图
GMT+8, 2026-1-28 20:52 , Processed in 0.053163 second(s), 17 queries .
Powered by Mxzdjyxk! X3.5
© 2001-2025 Discuz! Team.