• 正文
  • 相关推荐
申请入驻 产业图谱

DBA | Oracle 数据备份迁移之数据泵 expdp/impdp 工具实战指南

10/30 11:24
208
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

大家好,我是?WeiyiGeek,一名深耕安全运维开发(SecOpsDev)领域的技术从业者,致力于探索DevOps与安全的融合(DevSecOps),自动化运维工具开发与实践,企业网络安全防护,欢迎各位道友一起学习交流、一起进步 ,若此文对你有帮助,一定记得点个关注?与小红星??和文中广告,收藏学习不迷路??。

01 使用更现代、更高效的数据泵 expdp/impdp 工具恢复性测试

描述:上一篇《DBA | Oracle 数据备份迁移之传统 exp/imp 工具实战指南》文章中,作者介绍、使用传统 exp/imp 工具演示了 Oracle 数据库备份和恢复的全过程。然而,随着 Oracle 版本的更新,官方是推荐使用数据泵(expdp/impdp)作为首选方案,因为它在性能、功能和管理性上都远超传统工具。

本文,在 Windows Server 2019 与 Oracle 12c 环境下进行了演示,首先将简单介绍传统工具 (exp/imp) 与 数据泵 (expdp/impdp) 间的区别,其次 expdp、impdp 命令参数的详细说明,然后以数据泵工具进行数据库备份和恢复的演示,以展示其相较于传统 exp/imp 工具的优势。

温馨提示:若文章代码块中存在乱码,请通过文末的阅读原文链接,在知识星球中阅读,或者直接访问原文链接:https://articles.zsxq.com/id_4wfq4wsqo5t5.html

Oracle 数据库备份容灾传统工具 (exp/imp) 与 数据泵 (expdp/impdp) 间的区别一览表:

特性 传统工具 (exp/imp) 数据泵 (expdp/impdp)
架构 客户端 服务器
速度 较慢 快得多,支持并行
功能 基础 丰富(如作业控制、网络模式、过滤等)
管理 简单,但功能有限 强大,可交互、监控、重启
版本 旧版,已过时 现代,Oracle官方推荐

expdp 命令参数

数据泵导出实用程序提供了一种用于在 Oracle 数据库之间传输数据对象的机制。

格式: expdp KEYWORD=value 或 KEYWORD=(value1,value2,...,valueN)
示例: expdp scott/tiger DUMPFILE=scott.dmp DIRECTORY=dmpdir SCHEMAS=scott 或 TABLES=(T1:P1,T1:P2), 如果 T1 是分区表

# 常用参数说明:
# USERID 必须是命令行中的第一个参数。
ABORT_STEP:在初始化作业后停止作业, 或者在指示的对象中停止作业。 有效值为 -1 或 N, 此处 N 为大于等于零的值。N 对应于对象在主表中的进程顺序号。
ACCESS_METHOD:指示导出操作使用特定方法来卸载数据。有效的关键字值为: [AUTOMATIC], DIRECT_PATH 和 EXTERNAL_TABLE。
ATTACH:连接到现有作业。例如, ATTACH=job_name。
CLUSTER:利用集群资源并将 worker 进程分布在 Oracle RAC 上 [YES]。
COMPRESSION:减少转储文件大小。有效的关键字值为: ALL, DATA_ONLY, [METADATA_ONLY] 和 NONE。
COMPRESSION_ALGORITHM:指定应使用的压缩算法。有效的关键字值为: [BASIC], LOW, MEDIUM 和 HIGH。
CONTENT: 指定要卸载的数据。有效的关键字值为: [ALL], DATA_ONLY 和 METADATA_ONLY。
DATA_OPTIONS: 数据层选项标记。有效的关键字值为: XML_CLOBS。
DIRECTORY:用于转储文件和日志文件的目录对象。
DUMPFILE:指定目标转储文件名的列表 [expdat.dmp]。例如, DUMPFILE=scott1.dmp, scott2.dmp, dmpdir:scott3.dmp。
ENCRYPTION:加密某个转储文件的一部分或全部。有效的关键字值为: ALL, DATA_ONLY, ENCRYPTED_COLUMNS_ONLY, METADATA_ONLY 和 NONE。
ENCRYPTION_ALGORITHM:指定加密的方式。有效的关键字值为: [AES128], AES192 和 AES256。
ENCRYPTION_MODE:生成加密密钥的方法。有效的关键字值为: DUAL, PASSWORD 和 [TRANSPARENT]。
ENCRYPTION_PASSWORD:用于在转储文件中创建加密数据的口令密钥。
ENCRYPTION_PWD_PROMPT:指定是否提示输入加密口令 [NO]。当标准输入为读取时, 将隐藏终端回送。
ESTIMATE:计算作业估计值。有效的关键字值为: [BLOCKS] 和 STATISTICS。
ESTIMATE_ONLY:计算作业估计值而不执行导出 [NO]。
EXCLUDE:排除特定对象类型。例如, EXCLUDE=SCHEMA:"='HR'"。
FILESIZE:以字节为单位指定每个转储文件的大小。
FLASHBACK_SCN:用于重置会话快照的 SCN。
FLASHBACK_TIME:用于查找最接近的相应 SCN 值的时间。
FULL:导出整个数据库 [NO]。
HELP:显示帮助消息 [NO]。
INCLUDE:包括特定对象类型。例如, INCLUDE=TABLE_DATA。
JOB_NAME:要创建的导出作业的名称。
KEEP_MASTER:在成功完成导出作业后保留主表 [NO]。
LOGFILE:指定日志文件名 [export.log]。
LOGTIME:指定要给在导出操作期间显示的消息加时间戳。有效的关键字值为: ALL, [NONE], LOGFILE 和 STATUS。
METRICS:将其他作业信息报告到导出日志文件 [NO]。
NETWORK_LINK:源系统的远程数据库链接的名称。
NOLOGFILE:不写入日志文件 [NO]。
PARALLEL:更改当前作业的活动 worker 的数量。
PARFILE:指定参数文件名。
QUERY:用于导出表的子集的谓词子句。例如, QUERY=employees:"WHERE department_id > 10"。
REMAP_DATA:指定数据转换函数。例如, REMAP_DATA=EMP.EMPNO:REMAPPKG.EMPNO。
REUSE_DUMPFILES:覆盖目标转储文件 (如果文件存在) [NO]。
SAMPLE:要导出的数据的百分比。
SCHEMAS:要导出的方案的列表 [登录方案]。
SERVICE_NAME:约束 Oracle RAC 资源的活动服务名和关联资源组。
SOURCE_EDITION:用于提取元数据的版本。
STATUS:监视作业状态的频率, 其中默认值 [0] 表示只要有新状态可用, 就立即显示新状态。
TABLES:标识要导出的表的列表。例如, TABLES=HR.EMPLOYEES,SH.SALES:SALES_1995。
TABLESPACES:标识要导出的表空间的列表。
TRANSPORTABLE:指定是否可以使用可传输方法。有效的关键字值为: ALWAYS 和 [NEVER]。
TRANSPORT_FULL_CHECK:验证所有表的存储段 [NO]。
TRANSPORT_TABLESPACES:要从中卸载元数据的表空间的列表。
VERSION:要导出的对象版本。有效的关键字值为: [COMPATIBLE], LATEST 或任何有效的数据库版本。
VIEWS_AS_TABLES:标识要作为表导出的一个或多个视图。例如, VIEWS_AS_TABLES=HR.EMP_DETAILS_VIEW。
------------------------------------------------------------------------------?
下列命令在交互模式下有效,注: 允许使用缩写。
ADD_FILE:将转储文件添加到转储文件集。
CONTINUE_CLIENT:返回到事件记录模式。如果处于空闲状态, 将重新启动作业。
EXIT_CLIENT:退出客户机会话并使作业保持运行状态。
FILESIZE:用于后续 ADD_FILE 命令的默认文件大小 (字节)。
HELP:汇总交互命令。
KILL_JOB:分离并删除作业。
PARALLEL:更改当前作业的活动 worker 的数量。
REUSE_DUMPFILES:覆盖目标转储文件 (如果文件存在) [NO]。
START_JOB:启动或恢复当前作业。有效的关键字值为: SKIP_CURRENT。
STATUS: 监视作业状态的频率, 其中默认值 [0] 表示只要有新状态可用, 就立即显示新状态。
STOP_JOB:按顺序关闭作业执行并退出客户机。有效的关键字值为: IMMEDIATE。
STOP_WORKER:停止挂起或粘滞的 worker。
TRACE:为当前作业设置跟踪/调试标记。

 

impdp 命令参数

数据泵导入实用程序提供了一种用于在 Oracle 数据库之间传输数据对象的机制。

格式: impdp KEYWORD=value 或 KEYWORD=(value1,value2,...,valueN)
示例: impdp scott/tiger DIRECTORY=dmpdir DUMPFILE=scott.dmp

# 常用参数说明:
# USERID 必须是命令行中的第一个参数。
ABORT_STEP:在初始化作业后停止作业, 或者在指示的对象中停止作业。:有效值为 -1 或 N, 此处 N 为大于等于零的值。N 对应于对象在主表中的进程顺序号。
ACCESS_METHOD:指示导入操作使用特定方法来加载数据。有效的关键字值为: [AUTOMATIC], CONVENTIONAL, DIRECT_PATH,EXTERNAL_TABLE, 和 INSERT_AS_SELECT。
ATTACH:连接到现有作业。例如, ATTACH=job_name。
CLUSTER:利用集群资源并将 worker 进程分布在 Oracle RAC 上 [YES]。
CONTENT:指定要加载的数据。有效的关键字为: [ALL], DATA_ONLY 和 METADATA_ONLY。
DATA_OPTIONS:数据层选项标记。有效的关键字为: DISABLE_APPEND_HINT, SKIP_CONSTRAINT_ERRORS, REJECT_ROWS_WITH_REPL_CHAR 和 VALIDATE_TABLE_DATA。
DIRECTORY:用于转储文件, 日志文件和 SQL 文件的目录对象。(常用)
DUMPFILE 要从中导入的转储文件的列表 [expdat.dmp]。例如, DUMPFILE=scott1.dmp, scott2.dmp, dmpdir:scott3.dmp。
ENCRYPTION_PASSWORD:用于访问转储文件中的加密数据的口令密钥。对于网络导入作业无效。
ENCRYPTION_PWD_PROMPT:指定是否提示输入加密口令 [NO]。当标准输入为读取时, 将隐藏终端回送。
ESTIMATE:计算网络作业估计值。有效的关键字为: [BLOCKS] 和 STATISTICS。
EXCLUDE:排除特定对象类型。例如, EXCLUDE=SCHEMA:"='HR'"。
FLASHBACK_SCN:用于重置会话快照的 SCN。
FLASHBACK_TIME:用于查找最接近的相应 SCN 值的时间。
FULL:导入源中的所有对象 [YES]。
HELP:显示帮助消息 [NO]。
INCLUDE:包括特定对象类型。例如, INCLUDE=TABLE_DATA。
JOB_NAME:要创建的导入作业的名称。
KEEP_MASTER:在成功完成导入作业后保留主表 [NO]。
LOGFILE:日志文件名 [import.log]。
LOGTIME:指定要给在导入操作期间显示的消息加时间戳。有效的关键字值为: ALL, [NONE], LOGFILE 和 STATUS。
MASTER_ONLY:只导入主表, 然后停止作业 [NO]。
METRICS:将其他作业信息报告到导入日志文件 [NO]。
NETWORK_LINK:源系统的远程数据库链接的名称。
NOLOGFILE:不写入日志文件 [NO]。
PARALLEL:更改当前作业的活动 worker 的数量。
PARFILE:指定参数文件。
PARTITION_OPTIONS:指定应如何转换分区。有效的关键字为: DEPARTITION, MERGE 和 [NONE]。
QUERY:用于导入表的子集的谓词子句。例如, QUERY=employees:"WHERE department_id > 10"。
REMAP_DATA:指定数据转换函数。例如, REMAP_DATA=EMP.EMPNO:REMAPPKG.EMPNO。
REMAP_DATAFILE:在所有 DDL 语句中重新定义数据文件引用。
REMAP_SCHEMA:将一个方案中的对象加载到另一个方案。
REMAP_TABLE:将表名重新映射到另一个表。例如, REMAP_TABLE=HR.EMPLOYEES:EMPS。
REMAP_TABLESPACE:将表空间对象重新映射到另一个表空间。
REUSE_DATAFILES:如果表空间已存在, 则将其初始化 [NO]。
SCHEMAS:要导入的方案的列表。
SERVICE_NAME:约束 Oracle RAC 资源的活动服务名和关联资源组。
SKIP_UNUSABLE_INDEXES:跳过设置为“索引不可用”状态的索引。
SOURCE_EDITION:用于提取元数据的版本。
SQLFILE:将所有的 SQL DDL 写入指定的文件。
STATUS:监视作业状态的频率, 其中默认值 [0] 表示只要有新状态可用, 就立即显示新状态。
STREAMS_CONFIGURATION:启用流元数据的加载 [YES]。
TABLE_EXISTS_ACTION:导入对象已存在时执行的操作。有效的关键字为: APPEND, REPLACE, [SKIP] 和 TRUNCATE。
TABLES:标识要导入的表的列表。例如, TABLES=HR.EMPLOYEES,SH.SALES:SALES_1995。
TABLESPACES:标识要导入的表空间的列表。
TARGET_EDITION:用于加载元数据的版本。
TRANSFORM: 要应用于适用对象的元数据转换。有效的关键字为: DISABLE_ARCHIVE_LOGGING, INMEMORY, INMEMORY_CLAUSE,LOB_STORAGE, OID, PCTSPACE, SEGMENT_ATTRIBUTES, SEGMENT_CREATION,STORAGE, 和 TABLE_COMPRESSION_CLAUSE。
TRANSPORTABLE:用于选择可传输数据移动的选项。有效的关键字为: ALWAYS 和 [NEVER]。仅在 NETWORK_LINK 模式导入操作中有效。
TRANSPORT_DATAFILES:按可传输模式导入的数据文件的列表。
TRANSPORT_FULL_CHECK:验证所有表的存储段 [NO]。仅在 NETWORK_LINK 模式导入操作中有效。
TRANSPORT_TABLESPACES:要从中加载元数据的表空间的列表。仅在 NETWORK_LINK 模式导入操作中有效。
VERSION:要导入的对象的版本。有效的关键字为: [COMPATIBLE], LATEST 或任何有效的数据库版本。仅对 NETWORK_LINK 和 SQLFILE 有效。
VIEWS_AS_TABLES:标识要作为表导入的一个或多个视图。例如, VIEWS_AS_TABLES=HR.EMP_DETAILS_VIEW.请注意, 在网络导入模式下, 可以将表名附加到视图名。

1.全备备份恢复实践

特别注意:执行数据泵操作的用户(system)需具备相应权限(如?EXP_FULL_DATABASEIMP_FULL_DATABASE),itgeek 用户导出自身数据通常没问题,但跨用户操作或使用高权限用户时需注意授权.

实践流程

步骤 01.创建目录对象,用于存放备份文件,使用具有适当权限的用户(如SYS)创建目录并授权。

-- 以 SYSDBA 身份登录 SQL*Plus
sqlplus / as sysdba

-- 在服务器中创建目录对象
CREATE?OR?REPLACE?DIRECTORY?backup_dir?AS?'/backup';
GRANT?READ, WRITE?ON?DIRECTORY?backup_dir?TO?system;

温馨提示:若在 Windows 环境下,/backup?路径为:C:backupLinux 环境下,/backup?路径为:/backup/,若需要其它路径请务必将?/backup?替换为服务器上的实际路径,并确保Oracle软件用户(通常是oracle)对该路径有读写权

 

步骤 02.同样在 sys 用户终端中,创建测试表以及插入模拟数据。

-- # 创建表空间
CREATETABLESPACE?itgeekdata?DATAFILE'C:apporacleoradatabkhistdbitgeekdata01.dbf'SIZE100M?autoextendoff;
ALTERTABLESPACE?itgeekdata?ADDDATAFILE'C:apporacleoradatabkhistdbitgeekdata02.dbf'SIZE100M?autoextendoff;
ALTERTABLESPACE?itgeekdata?ADDDATAFILE'C:apporacleoradatabkhistdbitgeekdata03.dbf'SIZE100M?autoextendoff;

-- # 创建临时表空间
CREATETEMPORARYTABLESPACE?itgeektemp TEMPFILE?'C:apporacleoradatabkhistdbitgeektemp01.dbf'size100m?autoextendoff;

-- # 创建用户 itgeek 密码为 Password123
CREATEUSER? itgeek?IDENTIFIEDBY?Password123?DEFAULTTABLESPACE?itgeekdata?TEMPORARYTABLESPACE?itgeektemp;

-- # 授予权限
grantconnect,resourceto?itgeek;
ALTERUSER?itgeek?QUOTAUNLIMITEDON?ITGEEKDATA;

-- # 新建命令行终端,使用 itgeek 用户登录。
sqlplus 'itgeek/Password123@127.0.0.1:1521/bkhistdb'

-- 在itgeek用户下执行以下命令
-- 创建测试表
CREATETABLE?emp (
idINT?primary?key,
nameVARCHAR(10)?NOTNULL,
? gender?CHAR(1)?NOTNULL,
? age?INTNOTNULL
);

-- 添加字段注释
COMMENTONCOLUMN?emp.id?IS'员工ID';
COMMENTONCOLUMN?emp.name?IS'员工姓名';
COMMENTONCOLUMN?emp.gender ?IS'员工性别';
COMMENTONCOLUMN?emp.age?IS'员工年龄';

-- 通过数据字典查看注释
SELECT?*?FROM?user_col_comments?WHERE?table_name =?'emp';

-- 清空表(如果已有数据)
-- TRUNCATE TABLE emp;

-- 批量插入测试数据
INSERTALL
INTO?emp?VALUES?(1,?'张三',?'M',?28)
INTO?emp?VALUES?(2,?'李四',?'F',?32)
INTO?emp?VALUES?(3,?'王五',?'M',?25)
INTO?emp?VALUES?(4,?'赵六',?'F',?29)
INTO?emp?VALUES?(5,?'钱七',?'M',?35)
INTO?emp?VALUES?(6,?'孙八',?'F',?27)
INTO?emp?VALUES?(7,?'周九',?'M',?31)
INTO?emp?VALUES?(8,?'吴十',?'F',?26)
SELECT1FROM?DUAL;

-- 提交事务
COMMIT;

weiyigeek.top-测试表与数据模拟图

步骤 03.使用 sys 用户并查看 itgeek 用户(模式)emp 表的测试数据。

SQL>?select?*?from?itgeek.emp;
? ? ? ? ID NAME ? ? ? G ? ? ? ?AGE
---------- ---------- - ----------
? ? ? ? ?1 张三 ? ? ? M ? ? ? ? 28
? ? ? ? ?2 李四 ? ? ? F ? ? ? ? 32
? ? ? ? ?3 王五 ? ? ? M ? ? ? ? 25
? ? ? ? ?4 赵六 ? ? ? F ? ? ? ? 29
? ? ? ? ?5 钱七 ? ? ? M ? ? ? ? 35
? ? ? ? ?6 孙八 ? ? ? F ? ? ? ? 27
? ? ? ? ?7 周九 ? ? ? M ? ? ? ? 31
? ? ? ? ?8 吴十 ? ? ? F ? ? ? ? 26

已选择 8 行。

 

步骤 04.使用数据泵导出工具 expdp 执行全备导出。

# Windows(cmd)
expdp USERID="sys/WeiyiGeektop2025@127.0.0.1:1521/bkhistdb AS SYSDBA" FULL=Y DIRECTORY=backup_dir DUMPFILE=expdp_full_%date:~0,4%%date:~5,2%%date:~8,2%.dmp LOGFILE=expdp_full.log PARALLEL=4

# linux
expdp USERID="sys/WeiyiGeektop2025@127.0.0.1:1521/bkhistdb AS SYSDBA" FULL=Y DIRECTORY=backup_dir DUMPFILE=expdp_full_$(date +%Y%m%d%H%M%S).dmp LOGFILE=expdp_full.log PARALLEL=4

# 参数解释
DIRECTORY:指定之前创建的数据库目录对象。
DUMPFILE:指定导出的文件名。
PARALLEL:指定并行度,可以显著提高导出速度。
LOGFILE:指定日志文件,它也会被写入到DIRECTORY指定的操作系统目录中。

# 示例输出, 表示成功完成
SYS.SYS_EXPORT_FULL_01 的转储文件集为:
? C:BACKUPEXPDP_FULL_20251029.DMP
作业?"SYS"."SYS_EXPORT_FULL_01"?已于 星期三 10月 29 12:58:25 2025 elapsed 0 00:00:58 成功完成

weiyigeek.top-执行expdp导出命令图

步骤 05.删除 itgeek 用户,模拟数据丢失。

SQL> drop user itgeek cascade;
用户已删除。

 

步骤 06.使用数据泵导入工具 impdp 执行全备恢复。

impdp USERID="sys/WeiyiGeektop2025@127.0.0.1:1521/bkhistdb AS SYSDBA" FULL=Y DIRECTORY=backup_dir DUMPFILE=EXPDP_FULL_20251029.dmp LOGFILE=impdp_full.log PARALLEL=4

# 示例输出, 表示成功完成
作业?"SYS"."SYS_IMPORT_FULL_01"?已经完成, 但是有 29 个错误 (于 星期三 10月 29 14:50:23 2025 elapsed 0 00:16:23 完成)

weiyigeek.top-执行impdp导出命令图

步骤 07.使用 sys 用户并查看 itgeek 用户(模式)emp 表的测试数据,或者使用 itgeek 用户登录查看 emp 表中的数据是否恢复成功,如下图所示:用户以及其相关数据均已恢复。

sqlplus 'itgeek/Password123@127.0.0.1:1521/bkhistdb'
SELECT?*?FROM?emp;

weiyigeek.top-全库备份恢复图

2.指定用户数据备份恢复实践

描述:通常情况下,我们只需要备份和恢复特定的用户数据(如表空间、模式或表),而不是整个数据库。以下是使用expdp/impdp工具进行特定用户(模式)数据备份与恢复的详细步骤:

操作步骤

步骤 01.创备份目录,并将目录的读写权限授予给执行备份恢复的用户,上一节中已授权给 sys,此处将授权给非DBA权限的 itgeek 用户。

-- 使用 sys dba 用户登录
sqlplus 'sys/WeiyiGeektop2025@127.0.0.1:1521/bkhistdb AS SYSDBA'

-- 在服务器中创建目录对象
CREATE?OR?REPLACE?DIRECTORY?backup_dir?AS?'/backup';
GRANT?READ, WRITE?ON?DIRECTORY?backup_dir?TO?itgeek;

 

步骤 02.使用 sys 或 itgeek 用户登录,使用 expdp 命令导出 itgeek 用户(模式)下的所有数据。

# Windows(cmd)
# 方式1
expdp USERID="itgeek/Password123@127.0.0.1:1521/bkhistdb" SCHEMAS=itgeek DIRECTORY=backup_dir DUMPFILE=expdp_itgeek_%date:~0,4%%date:~5,2%%date:~8,2%.dmp LOGFILE=expdp_itgeek.log PARALLEL=4

# 方式2
expdp USERID="SYS/WeiyiGeektop2025@127.0.0.1:1521/bkhistdb" SCHEMAS=itgeek DIRECTORY=backup_dir DUMPFILE=expdp_itgeek_%date:~0,4%%date:~5,2%%date:~8,2%.dmp LOGFILE=expdp_itgeek.log PARALLEL=4

# 参数说明
SCHEMAS=itgeek:指定要导出的模式(用户)
DIRECTORY=dp_dir:指定之前创建的目录对象
DUMPFILE=itgeek_backup.dmp:指定导出的数据文件名,对于大数据量使用%U通配符让数据泵自动分割文件
LOGFILE=expdp_itgeek.log:指定日志文件名
PARALLEL=4:指定并行度,可以显著提高导出速度
TABLES=emp,table1,table2:如果要导出特定表,可以使用此参数
CONTENT=METADATA_ONLY:仅导出元数据(表结构等)而不导数据,仅导出数据则用 DATA_ONLY 。

# 备份输出结果:
******************************************************************************
ITGEEK.SYS_EXPORT_SCHEMA_01 的转储文件集为:
? C:BACKUPEXPDP_ITGEEK_20251029.DMP
作业?"ITGEEK"."SYS_EXPORT_SCHEMA_01"?已于 星期三 10月 29 15:01:00 2025 elapsed 0 00:00:17 成功完成

weiyigeek.top-使用expdb备份指定用户数据图

温馨提示:对于大数据量导出,在 DUMPFILE 参数中使用%U通配符让数据泵自动分割文件,并使用 PARALLEL 参数可以提高导出速度。例如:

expdp USERID="sys/WeiyiGeektop2025@127.0.0.1:1521/bkhistdb AS SYSDBA" SCHEMAS=itgeek DIRECTORY=backup_dir DUMPFILE=expdp_itgeek_%u.dmp LOGFILE=expdp_itgeek.log PARALLEL=4
*****************************************************************************
ITGEEK.SYS_EXPORT_SCHEMA_01 的转储文件集为:
? C:BACKUPEXPDP_ITGEEK_01.DMP
? C:BACKUPEXPDP_ITGEEK_02.DMP
? C:BACKUPEXPDP_ITGEEK_03.DMP
作业?"ITGEEK"."SYS_EXPORT_SCHEMA_01"?已于 星期三 10月 29 15:08:57 2025 elapsed 0 00:00:15 成功完成

weiyigeek.top-查看导出的dmp文件图

步骤 03.删除或者修改 itgeek 用户下的 emp 表数据,模拟数据丢失。

-- 修改员工姓名,模拟数据丢失
update?emp?setname='经天纬地'whereid=8;
-- 已更新 1 行

-- 删除 ID 为 7 的员工,模拟数据删除
deletefrom?emp?whereid=7;
-- 已删除 1 行

SQL>?select?*?from?emp;
? ? ? ? ID NAME ? ? ? G ? ? ? ?AGE
---------- ---------- - ----------
? ? ? ? ?1 张三 ? ? ? M ? ? ? ? 28
? ? ? ? ?2 李四 ? ? ? F ? ? ? ? 32
? ? ? ? ?3 王五 ? ? ? M ? ? ? ? 25
? ? ? ? ?4 赵六 ? ? ? F ? ? ? ? 29
? ? ? ? ?5 钱七 ? ? ? M ? ? ? ? 35
? ? ? ? ?6 孙八 ? ? ? F ? ? ? ? 27
? ? ? ? ?8 经天纬地 ? F ? ? ? ? 26
已选择 7 行。

 

步骤 04.使用 impdp 命令恢复 itgeek 用户(模式)下的所有数据,这里将提到?TABLE_EXISTS_ACTION?参数该参数用于处理目标表已存在的情况, 该参数有以下选项:

    SKIP:忽略现有表,不导入数据(缺省)。TRUNCATE:清空现有表数据,然后插入新数据。REPLACE:直接删除已存在的表,然后重新创建并插入数据。APPEND:保留现有数据,直接追加新数据。
# 方式1.覆盖导入
impdp USERID="itgeek/Password123@127.0.0.1:1521/bkhistdb" SCHEMAS=itgeek DIRECTORY=backup_dir DUMPFILE=expdp_itgeek_20251029.dmp LOGFILE=impdp_itgeek.log PARALLEL=4 TABLE_EXISTS_ACTION=REPLACE

# 方式2.清空导入
impdp USERID="itgeek/Password123@127.0.0.1:1521/bkhistdb" SCHEMAS=itgeek DIRECTORY=backup_dir DUMPFILE=expdp_itgeek_20251029.dmp LOGFILE=impdp_itgeek.log PARALLEL=4 TABLE_EXISTS_ACTION=TRUNCATE

weiyigeek.top-清空导入备份数据图

温馨提示:在恢复数据时需要关闭外部客户端连接,否则可能会报?资源正忙, 但指定以 NOWAIT 方式获取资源, 或者超时失效

温馨提示:追加导入,会受到约束条件限制,比如主键约束等,导致导入失败,通常不会使用。

impdp USERID="itgeek/Password123@127.0.0.1:1521/bkhistdb" SCHEMAS=itgeek DIRECTORY=backup_dir DUMPFILE=expdp_itgeek_20251029.dmp LOGFILE=impdp_itgeek.log PARALLEL=4 TABLE_EXISTS_ACTION=APPEND

至此,完成了 Oracle 数据库使用数据泵(expdp/impdp)进行特定用户数据的备份恢复的实践。

3.其它使用技巧

例1.使用数据泵备份指定表,例如: 只导出?itgeel.emp?表:

expdp USERID="sys/WeiyiGeektop2025@127.0.0.1:1521/bkhistdb AS SYSDBA" TABLES=itgeek.emp DIRECTORY=backup_dir DUMPFILE=expdp_itgeek_emp_%date:~0,4%%date:~5,2%%date:~8,2%.dmp LOGFILE=expdp_itgeek_emp.log PARALLEL=4

# ******************************************************************************
# SYS.SYS_EXPORT_TABLE_01 的转储文件集为:
# ? C:BACKUPEXPDP_ITGEEK_EMP_20251029.DMP
# 作业 "SYS"."SYS_EXPORT_TABLE_01" 已于 星期三 10月 29 16:53:13 2025 elapsed 0 00:00:11 成功完成

 

例2.使用数据泵备份指定表及条件,将满足条件的数据导出,例如:只导出?itgeek.emp?表中 id 大于5 的数据。

# 备份
expdp USERID="sys/WeiyiGeektop2025@127.0.0.1:1521/bkhistdb AS SYSDBA" TABLES=itgeek.emp QUERY=emp:"WHERE id>5" DIRECTORY=backup_dir DUMPFILE=expdp_itgeek_emp_query_%date:~0,4%%date:~5,2%%date:~8,2%.dmp LOGFILE=expdp_itgeek_emp_query.log PARALLEL=4

# 恢复:将备份数据恢复到 itgeek 用户下 emp 表中,并清空原有数据。
impdp USERID="itgeek/Password123@127.0.0.1:1521/bkhistdb" TABLES=emp DIRECTORY=backup_dir DUMPFILE=EXPDP_ITGEEK_EMP_QUERY_20251029.DMP LOGFILE=impdp_itgeek_emp.log PARALLEL=4 TABLE_EXISTS_ACTION=TRUNCATE

weiyigeek.top-导出指定条件的表数据会恢复图

例3.导入备份到另一个用户模式下,即使用 REMAP_SCHEMA 参数将数据映射到已存在的用户,例如:

-- 创建新用户 itgeek_bak 并授予相应权限
CREATE?USER?itgeek_bak?IDENTIFIED?BY?new_password;
GRANT?CONNECT,?RESOURCE?TO?itgeek_bak;
-- 根据需要授予更多权限,例如 UNLIMITED TABLESPACE
GRANT?UNLIMITED?TABLESPACE?TO?itgeek_bak;

-- 使用数据泵导入,将 itgeek 用户的数据映射到新创建的 itgeek_bak 用户中
impdp USERID="sys/WeiyiGeektop2025@127.0.0.1:1521/bkhistdb AS SYSDBA" DIRECTORY=backup_dir DUMPFILE=expdp_itgeek_20251029.dmp LOGFILE=impdp_itgeek.log PARALLEL=4 REMAP_SCHEMA=itgeek:itgeek_bak

weiyigeek.top-导入到其它用户模式图

例4.将导入备份指定表导入另外一个用户模式特定表中,即使用 REMAP_TABLE 参数将数据映射到已存在的表中,例如:

-- 示例1.以 sys dba 用户登录, 将 itgeek 用户下的 emp 表数据导入到 itgeek_bak 用户的 emp_bak 表中。
impdp USERID="sys/WeiyiGeektop2025@127.0.0.1:1521/bkhistdb AS SYSDBA" DIRECTORY=backup_dir DUMPFILE=expdp_itgeek_20251029.dmp LOGFILE=impdp_itgeek.log PARALLEL=4 REMAP_SCHEMA=itgeek:itgeek_bak REMAP_TABLE=itgeek.emp:emp_bak ??-- 特别注意:目标表前不需要加模式名

-- 作业 "SYS"."SYS_IMPORT_FULL_01" 已于 星期三 10月 29 16:26:30 2025 elapsed 0 00:00:05 成功完成

-- 实例2.以 itgeek 用户登录, 将 itgeek 用户下的 emp 表数据复制一份到 emp_bak 表中。
impdp USERID="itgeek/Password123@127.0.0.1:1521/bkhistdb" ?DIRECTORY=backup_dir DUMPFILE=expdp_itgeek_20251029.dmp LOGFILE=impdp_itgeek.log PARALLEL=4 REMAP_TABLE=emp:emp_bak

weiyigeek.top-将备份到指定模式下的指定表中图

温馨提示:如果需要同时重命名多个表,同样使用 REMAP_TABLE 参数,例如:REMAP_TABLE=itgeek.emp:emp_bak,itgeek.dept:dept_bak

至此,相信跟随作者一起实践的看友们,已经掌握了使用数据泵进行 Oracle 数据库备份恢复的技巧了吧,是不是其功能与性能上秒杀传统的 exp/imp 备份恢复工具。

4.总结与建议

描述:本章主要讲解了 Oracle 数据备份迁移的推荐工具—数据泵(expdp/impdp),并通过一系列实践步骤展示了如何使用它进行全库备份和特定用户数据的备份恢复,最后通过四个小例子演示了数据泵的高级使用技巧,如备份特定表、条件查询导出,以及恢复到其它模式(用户)下的指定表中等。

最终建议

除非您有非常特殊的兼容性要求,否则请务必使用数据泵(expdpimpdp)进行全库备份和恢复。它才是符合现代Oracle数据库运维标准的工具。

另外,完整的备份策略还应包括:

    1.归档日志模式:将数据库置于归档模式,并定期备份归档日志。2.RMAN:对于生产环境的物理备份,RMAN (Recovery Manager) 是Oracle官方首选的、最完整的备份和恢复解决方案。它可以实现块级增量备份、压缩、加密等高级功能。3.测试:定期测试您的备份文件,通过恢复演练确保备份是有效的,这是备份策略中最关键的一环。

希望这份详细的指南能帮助您完成 Oracle 数据库相关备份工作,下一篇,我们将一起探索 RMAN(Recovery Manager)的高级备份与恢复功能,这将进一步提升您的Oracle数据库管理技能。

 

加入:作者【全栈工程师修炼指南】知识星球

相关推荐