expdp/impdp数据泵迁移实战——从11g到19c的社保数据迁移
社保系统从11g迁到19c,不是imp/exp这种古董工具能搞定的。数据泵(Data Pump)可以并行导出、按表过滤、跨版本迁移。这篇文章记录一次真实的数据泵迁移过程——从准备到验证全流程。
文章目录
- expdp/impdp数据泵迁移实战——从11g到19c的社保数据迁移
-
- 一、为什么不用 imp/exp
- 二、创建导出目录
- 三、导出命令
- 四、导入命令
- 五、监控导出进度
- 六、跨版本兼容性
- 七、常见坑
- 八、迁移检查清单
一、为什么不用 imp/exp
| 执行位置 | 客户端 | 服务端(更接近磁盘) |
| 并行度 | 不支持 | 支持多线程并行 |
| 网络传输 | 不支持 | 支持跨网络直接导入 |
| 大表处理 | 容易内存溢出 | 流式处理 |
| 粒度控制 | 表级别 | 支持排除对象、过滤条件 |
社保库 GRJF 表39MB、UNIT_PAYMENT 45MB、PENSION_DETAIL 94MB——用旧版 imp 导到一半就内存溢出,数据泵可以并行导出。
二、创建导出目录
— 在源库创建目录对象(需要物理路径已存在)
CREATE OR REPLACE DIRECTORY dpump_dir AS '/data/pump';
GRANT READ, WRITE ON DIRECTORY dpump_dir TO system;
mkdir -p /data/pump
chown oracle:oinstall /data/pump
三、导出命令
全库导出:
expdp system/密码@orcl \\
DIRECTORY=dpump_dir \\
DUMPFILE=full_%U.dmp \\
LOGFILE=exp_full.log \\
FULL=Y \\
PARALLEL=4 \\
COMPRESSION=ALL
- %U——自动编号,并行4线程生成 full_01.dmp 到 full_04.dmp
- COMPRESSION=ALL——压缩数据和元数据,社保库约能压到原来的60%
- PARALLEL=4——4线程并行,适合多核CPU
按 Schema 导出:
expdp system/密码@orcl \\
DIRECTORY=dpump_dir \\
DUMPFILE=schema_%U.dmp \\
SCHEMAS= \\
LOGFILE=exp_schema.log \\
PARALLEL=2
只导某些表:
expdp system/密码@orcl \\
DIRECTORY=dpump_dir \\
DUMPFILE=tables_%U.dmp \\
TABLES=PAYMENT_HISTORY,PERSON_INFO,UNIT_PAYMENT \\
LOGFILE=exp_tables.log
四、导入命令
全库导入:
# 先在目标库建表空间(路径要和源库一致或改造)
impdp system/密码@orcl_new \\
DIRECTORY=dpump_dir \\
DUMPFILE=full_%U.dmp \\
LOGFILE=imp_full.log \\
FULL=Y \\
PARALLEL=4
表空间路径不同时的改造:
impdp system/密码@orcl_new \\
DIRECTORY=dpump_dir \\
DUMPFILE=full_%U.dmp \\
REMAP_TABLESPACE=OLD_TBS:NEW_TBS \\
REMAP_SCHEMA=OLD_USER:NEW_USER \\
LOGFILE=imp_remap.log
REMAP_TABLESPACE 把源库表空间自动映射到目标库表空间,不用手动建表改DDL。
五、监控导出进度
— 查看正在运行的JOB
SELECT JOB_NAME, STATE, DEGREE, ATTACHED_SESSIONS
FROM DBA_DATAPUMP_JOBS;
— 查看详细进度(%)
SELECT OPNAME, TARGET, SOFAR, TOTALWORK,
ROUND(SOFAR/TOTALWORK*100, 2) AS PCT
FROM V$SESSION_LONGOPS
WHERE OPNAME LIKE 'Data Pump%';
六、跨版本兼容性
| 11g导出 → 19c导入 | 用11g的expdp导出,19c的impdp导入,完全兼容 |
| 19c导出 → 11c导入 | 用19c的expdp加 VERSION=11.2 参数 |
| 大版本跨度 | 超过2个大版本建议用 VERSION 明确指定 |
七、常见坑
1. 目录权限问题——ORA-39002
# 确认目录存在且oracle用户有权限
ls -la /data/pump
chmod 750 /data/pump
2. 表空间不一致——导入时表空间不存在
用 REMAP_TABLESPACE 自动重映射,或在目标库先建同名表空间。
3. 大表导入慢
加大 PARALLEL,但要确保CPU和IO扛得住。经验值:PARALLEL=CPU核数/2。
4. 字符集不一致
— 源库和目标库字符集必须一致,或目标库是源库的超集
SELECT * FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER='NLS_CHARACTERSET';
八、迁移检查清单
— 导入后验证
— 对象数
SELECT COUNT(*) FROM DBA_OBJECTS WHERE OWNER='';
— 行数抽查
SELECT COUNT(*) FROM PAYMENT_HISTORY;
SELECT COUNT(*) FROM PERSON_INFO;
— 失效对象
SELECT OBJECT_NAME, OBJECT_TYPE FROM DBA_OBJECTS
WHERE OWNER='' AND STATUS='INVALID';
— 重新编译失效对象
EXEC UTL_RECOMP.RECOMP_SERIAL('');
✅ 亮点:社保系统实际迁移场景——表空间路径不一致、跨版本兼容、并行度调优——都给出了可复现的命令。扩展方向:expdp/impdp网络直传模式(NETWORK_LINK)、RMAN可传输表空间迁移对比。


