Oracle Data Pump:导出/导入、迁移、schema 刷新与 transportable
Oracle难度: 中级耗时: 30–90 分钟(取决于数据量)使用 expdp/impdp 按表、schema、表空间或全库范围导出、导入,在两个数据库之间迁移(dump 文件 + scp + checksum,或 NETWORK_LINK),以及从 dump 中提取 DDL(SQLFILE)。包括 directory、用户和 parfile 的准备、一致性、并行、remap、监控以及中断作业的清理。RAC 上通过 SCAN + 服务连接,共享 directory 时用 CLUSTER=YES,本地磁盘时用 CLUSTER=NO;可选用基于 wallet 的脚本和 /etc/cron.d 定时执行导出。场景:从生产到测试的 schema 刷新(DROP USER … CASCADE 或 TABLE_EXISTS_ACTION=REPLACE,保留密码/profile 和权限)、transportable tablespace(相同/不同平台和 endian,RMAN CONVERT)、full transportable(11g/12c → 19c PDB)、dump 加密与压缩、大规模迁移的性能,以及用 ATTACH/START_JOB/KILL_JOB 管理中断的作业。
架构: 1 个数据库(单实例、Oracle Restart 或 RAC);迁移时为源库 + 目标库
场景
- 导出:从数据库生成 dump 文件 — 将表、schema、表空间或整个数据库写入 dump 文件(expdp)。数据库保持打开,应用继续运行。这是逻辑副本,不能替代 RMAN 备份(时间点恢复和完全恢复需要 RMAN)。
- 导入:将 dump 文件加载到数据库 — 使用 impdp 加载之前生成的 dump 文件;可以重映射 schema、表空间和表名。目标库保持打开;使用被加载对象的应用必须停止。
- 迁移:将数据从源库迁移到目标库 — 导出 → 复制文件 → 导入,或使用 NETWORK_LINK 直接迁移而不生成 dump 文件。如果目标库上还没有该 schema(首次加载),选择此卡片;如果目标库上已有同一 schema 且要用生产副本替换,选择“schema 刷新”卡片。源库保持打开。
- 从 dump 文件中仅提取 DDL(SQLFILE) — 不加载任何数据;对象的 CREATE 语句写入 .sql 文件。数据库不做任何更改。
- 从生产到测试的 schema 刷新(refresh) — 用生产环境的当前版本替换测试/UAT 中已存在的 schema:备份目标 schema、断开会话、DROP USER … CASCADE 或 TABLE_EXISTS_ACTION=REPLACE、保留密码/profile 和权限。源库保持打开;作业期间目标 schema 不可用。
- 通过复制数据文件迁移表空间(transportable tablespace) — 大表空间(数百 GB 及以上)通过复制数据文件而不是逐行迁移;支持相同或不同平台/endian(RMAN CONVERT)。两端字符集必须相同。作业期间源库上的表空间为 READ ONLY(写入中断)。
- 迁移整个数据库:full transportable(11g/12c → 19c,non-CDB → PDB) — 使用 FULL=Y TRANSPORTABLE=ALWAYS,用户表空间以数据文件形式、其余内容(用户、PL/SQL、权限)以元数据形式迁移到新 PDB;11.2.0.3+ 源库上使用 VERSION=12。作业期间源库上所有用户表空间为 READ ONLY。
- 中断/挂起的 Data Pump 作业:监控、恢复、终止 — 某个 expdp/impdp 作业挂起(resumable wait)、已停止或中断;需要用 ATTACH 连接并恢复,用 KILL_JOB 终止,或清理孤立的 master 表。数据库保持打开。
开始之前
- 命令在数据库服务器上以 oracle 用户运行;该用户的登录 profile 定义了 ORACLE_HOME、ORACLE_SID 和 PATH 变量,expdp/impdp 在路径中。expdp、impdp、sqlplus 位于 $ORACLE_HOME/bin;不在 PATH 中时会报 bash: expdp: command not found(使用 . oraenv 或完整路径:$ORACLE_HOME/bin/expdp)。…RAC 上每个节点的 ORACLE_SID 是该节点的实例名(例如节点 1 上为 ……………)。…
- 数据库为 12.2 或更高版本(19c、21c、23ai)。本指南中的 LOGTIME、ENCRYPTION_PWD_PROMPT、DISABLE_ARCHIVE_LOGGING 参数是 12c 引入的。10g/11g 的参数列表不同;Oracle 9i 及更早版本的 .dmp 文件只能用旧的 imp 打开。…Full transportable:导出从 11.2.0.3 开始支持(11g 上使用 VERSION=12),导入从 12.1 开始支持;11g 没有 LOGTIME/METRICS,此时本指南不使用它们。…
- 监听程序正在运行,… 服务已注册…;目标库上 … 服务已注册…。
- 目标服务器上监听程序正在运行,… 服务已注册。
- ……(源库)和 …(目标库)…有足够的可用空间:导出时为估算大小(使用 COMPRESSION=ALL 通常小 3–5 倍);导入时 dump 文件必须已在此目录中。该目录不应与数据文件和 FRA 位于同一磁盘。
- 为避免长时间一致性(FLASHBACK_TIME/SCN)导出时出现 ORA-01555,UNDO_RETENTION 应长于导出时长(例如 3 小时的导出至少 10800 秒),undo 表空间要足够容纳这段时间(autoextend)。
- 导入会产生大量 redo:数据库处于 ARCHIVELOG 模式时,FRA(或归档目标)中必须有空间。启用 FORCE LOGGING(Data Guard)时 DISABLE_ARCHIVE_LOGGING 无效。
- 目标库有最新的 RMAN 备份,且回退方法已明确(导入无法撤销:导入到错误的 schema 或使用 TRUNCATE/REPLACE 的导入只能从备份或用 Flashback 恢复)。关键环境中可在导入前创建 guaranteed restore point(需要 ARCHIVELOG + FRA)。
- 已规划维护窗口:…源库上被迁移的表空间在导出和数据文件复制期间为 READ ONLY(写入的应用会报错,ORA-00372);目标库上 plug-in 期间不得使用新对象…导入期间必须停止使用目标对象的应用,或确认其不受影响…由于未选择一致性选项,导出期间必须停止应用写入…。
- 源库上的 oracle 用户可以免密码(基于密钥)SSH/SCP 到目标库,或者文件将通过其他方式(共享存储、对象存储)传输。
- 目标服务器可以访问源库的监听端口(…:…)(防火墙已放行)。
- 许可检查:…COMPRESSION=ALL(以及 DATA_ONLY)需要 Advanced Compression Option 许可。……Dump 加密(ENCRYPTION、ENCRYPTION_PASSWORD/ENCRYPTION_PWD_PROMPT)在 Enterprise Edition 上需要 Advanced Security Option 许可。…如无许可,请关闭这些选项。
指南阶段
- 准备:环境、用户和 directory — 验证环境和监听服务 · 验证环境和监听服务(源库) · 验证环境和监听服务(目标库) · 验证 SCAN 和服务所在的实例 · 检查版本、字符集和日志模式 · 检查版本、字符集和日志模式(源库) …
- 1. 诊断:目标是否正确?(schema 刷新) — 记录目标 schema 的状态(目标库) · 记录源 schema 的状态(源库)
- 2. 安全网:目标 schema 的备份和用户定义 — 保存测试用户的定义和权限(目标库) · 备份目标 schema(目标库)
- 1. 诊断:transportable 前提条件 — 在源库上检查平台、字符集和表空间集合(源库) · 在目标库上检查平台、字符集和名称冲突(目标库)
- 2. 安全网与准备 — 记录数据文件列表和当前 READ ONLY 状态(源库) · 在目标库上准备数据文件目录(目标库)
- 3. 执行:在源库上 READ ONLY、元数据导出和复制 — 将表空间设为 READ ONLY(源库) · 编写 transportable 导出 parfile(源库) · 执行元数据导出(源库) · 将数据文件和 dump 复制到目标库(源库)
- 4. 执行:在目标库上 plug-in — 验证复制的文件(目标库) · 将数据文件转换为本平台格式:RMAN CONVERT(目标库) · 创建对象所有者 schema(目标库) · 创建 plug-in 导入 parfile(目标库) · 执行 plug-in 导入(目标库) · 将表空间设为可写(目标库)
- 5. 验证与后续工作 — 导出表空间以外的对象(源库) · 加载表空间以外的对象(目标库) · 编译并验证失效对象(目标库) · 将源库上的表空间改回 READ WRITE(源库)
- Export — 检查大对象、LOB 和分区 · 估算大小(ESTIMATE_ONLY) · 估算大小(ESTIMATE_ONLY)(源库) · 编写导出 parfile · 编写导出 parfile(源库) · 执行导出 …
- 将 dump 文件迁移到目标库 — 创建 checksum 文件 · 将 dump 文件复制到目标库 · 在目标库上验证 checksum
- Database link (NETWORK_LINK) — 在目标库上创建 database link
- 3. 执行:清空目标 schema — 锁定用户并断开会话(目标库) · 删除 schema 并重建测试用户(目标库) · 列出 REPLACE 模式下不会更新的对象(目标库)
- Import — 检查 dump 文件 · 检查 dump 文件(目标库) · 在目标库上检查空间和现有 schema · 在目标库上检查空间和现有 schema(目标库) · 编写导入 parfile · 编写导入 parfile(目标库) …
- 导入后:编译和统计信息 — 编译失效对象 · 编译失效对象(目标库) · 收集统计信息 · 收集统计信息(目标库)
- 4. 验证与后续工作(schema 刷新) — 禁用来自生产的调度作业(目标库) · 重新应用该 schema 授予他人的权限(目标库) · 检查对象、同义词和 link(目标库) · 解锁用户(目标库)
- SQLFILE:从 dump 中提取 DDL — 检查 dump 文件 · 编写 SQLFILE parfile · 生成 DDL 文件 · 审阅 DDL 文件
- 定时任务:定期运行导出(cron) — 准备脚本、日志和 TNS 目录…(…)… · 创建 wallet 并添加凭据 · 将 wallet 复制到其他节点 · 编写 sqlnet.ora(仅供此作业)…(…)… · 编写 tnsnames.ora(仅供此作业)…(…)… · 编写导出脚本…(…)… …
- 1. 诊断:作业处于什么状态? — 显示作业的状态、会话和等待原因 · 解读结果并选择操作
- 2. 执行:恢复作业 — 排除停止或挂起的原因 · 连接作业并恢复(ATTACH、START_JOB) · 验证作业正在运行
- 2. 执行:终止作业(KILL_JOB) — 连接作业并用 KILL_JOB 终止 · 验证作业已消失
- 2. 执行:清理孤立的 master 表 — 删除孤立作业的 master 表
- 监控 — 监控正在运行的作业 · 监控正在运行的作业(源库) · 监控正在运行的作业(目标库) · 连接作业:ATTACH 和交互式命令 · 连接作业:ATTACH 和交互式命令(源库) · 连接作业:ATTACH 和交互式命令(目标库)
- 清理与安全 — 列出中断的作业和 master 表 · 列出中断的作业和 master 表(源库) · 列出中断的作业和 master 表(目标库) · 用 KILL_JOB 终止作业 · 用 KILL_JOB 终止作业(源库) · 用 KILL_JOB 终止作业(目标库) …