RMAN 故障排除与调优及 Data Pump 实用指南
1. RMAN 故障排除与性能影响因素
在处理 RMAN 相关问题时,并没有固定的解决方法。一些基础操作可能会影响 RMAN 的性能,例如同时执行多个备份任务,或者在数据库负载高峰期安排备份作业,这些都可能导致 RMAN 运行缓慢。此外,还有一些更关键的问题,如硬件速度慢或存在严重的软件 bug,也会对性能产生影响。
当你尝试提升 RMAN 性能或解决备份作业失败的问题时,可以参考以下在线资源:
-
Oracle 支持门户知识库
:可以搜索 Oracle 支持门户 My Oracle Support(https://support.oracle.com)的知识库,但需要有效的支持许可证才能登录该门户。
-
Oracle 技术网络 RMAN 论坛
:如果没有支持许可证,可以搜索 Oracle 技术网络(OTN)RMAN 论坛,全球的成员会在这个论坛上交流并尽力解决彼此的问题。
-
Oracle 数据库在线文档和 Google
:这两者也能在解决问题时提供帮助。
2. Data Pump 简介
Data Pump 是 Oracle 数据库中备受 DBA 青睐的实用工具。它于 Oracle 10g 版本引入,取代了原有的导出和导入实用程序。与旧工具相比,Data Pump 功能更强大、更灵活,具有高速、快速对象恢复、并行读写、数据转换(如清理敏感数据)和压缩等特性。它还支持批量数据和元数据的移动,能够在不同版本的 Oracle 数据库和操作系统平台之间高效地移动数据和元数据。
在早期的 Oracle 版本中,使用的是类似的 exp 和 imp 实用程序。自 Oracle 11g 起,exp 实用程序已被弃用,但 imp 实用程序仍被 Oracle 支持用于迁移目的,它可以恢复由旧的 exp 程序生成的备份。需要注意的是,Oracle 不再支持使用 exp,使用它可能会给后续环境带来问题。
Data Pump 的重要特性如下:
| 特性 | 描述 |
| ---- | ---- |
| 支持多种模式 | 包括全数据库模式、模式模式、表模式、表空间模式和可传输表空间模式 |
| 高速处理 | 由于使用了数据访问方法、直接路径和外部表,比传统 SQL 更快。所有处理都在服务器端进行,通过 PARALLEL 参数可显著提高速度 |
| 点时间逻辑备份 | 可以对整个数据库或其子集进行点时间逻辑备份 |
| 分区表处理 | 允许指定在导入操作中如何处理分区表,支持多进程并行加载和卸载表 |
| 作业可重启 | 无论作业停止是自愿还是非自愿,都可以无数据损失地重启,还可以手动修改、停止或重启作业 |
| 灵活的元数据更改 | 可以轻松对数据库元数据进行即时更改,包括数据转换,且无需额外费用 |
| 全数据类型支持 | 支持 Oracle 数据库中的所有数据类型 |
| 细粒度对象选择 | 几乎可以在 Data Pump 作业中包含或排除任何类型的对象 |
| 网络导入和导出 | 支持直接从一个数据库加载数据(网络导入)而无需生成转储文件,也支持卸载远程数据库(网络导出) |
| 审计功能 | 扩展了新的审计框架,提供 Data Pump 所有调用的全面审计跟踪 |
| 禁用日志生成 | 在导入操作中可以禁用日志生成,加快导入速度,尤其适用于大型数据加载,如数据库迁移(Oracle 12c 新增功能) |
| 视图导出为表 | 可以将视图导出为表,在导入时创建具有相同列和数据的表,相关对象和权限也会相应处理(Oracle 12c 新增功能) |
3. Data Pump 架构
Data Pump 的机制相对简单,可与多种接口交互,如 Oracle Enterprise Manager 和自定义接口。它主要由以下三个独特部分组成:
-
命令行接口
:expdp 和 impdp
-
DBMS_DATAPUMP 包
:也称为 Data Pump API
-
DBMS_METADATA 包
:也称为元数据 API
命令行接口 expdp 和 impdp 使用 DBMS_DATAPUMP 包执行导出和导入操作,根据用户在命令行中传递的参数进行处理。当需要操作元数据时,会使用 DBMS_METADATA 包来提取、操作和重新创建字典元数据。这些 Data Pump 包存储在 Oracle 数据库中,外部应用程序可以通过 PL/SQL、Oracle Enterprise Manager Cloud Control Transportable Tablespaces 或 SQL*Plus 直接访问。
此外,还有两个重要的部分:
-
外部表 API
:负责让 Oracle 读取和写入外部表(位于数据库外部的操作系统级文件)。
-
直接路径 API
:负责将加载的数据直接传递到服务器的加载引擎,使用直接路径操作,如直接路径 INSERT 语句,而不是传统的插入语句。
需要注意的是,Data Pump 创建的转储文件的读写等所有处理都将在通过指定数据库连接字符串选择的系统(服务器)上进行。
下面是 Data Pump 架构的 mermaid 流程图:
graph LR
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
EXPDP(EXPDP):::process --> DBMS_DATAPUMP(DBMS_DATAPUMP):::process
IMPDP(IMPDP):::process --> DBMS_DATAPUMP
DBMS_DATAPUMP --> External_Table_API(External Table API):::process
DBMS_DATAPUMP --> Direct_Path_API(Direct Path API):::process
DBMS_DATAPUMP --> Metadata_API(Metadata API - DBMS_METADATA):::process
External_Table_API --> External_Table(External Table):::process
Direct_Path_API --> Server_Load_Engine(Server Load Engine):::process
Metadata_API --> Dictionary_Metadata(Dictionary Metadata):::process
OTHER_CLIENTS(OTHER CLIENTS):::process --> DBMS_DATAPUMP
SQL*Loader(SQL*Loader):::process --> DBMS_DATAPUMP
4. Data Pump 新特性
与原始的导出和导入实用程序相比,Data Pump 引入了以下新特性:
-
目录对象
:DBA 必须创建一个目录对象,用于定义在导入或导出操作期间创建或定位转储、日志或 SQL 文件的位置,并向用户授予该目录对象的权限(如 READ 和 WRITE)。如果未指定目录对象,将提供一个名为 DATA_PUMP_DIR 的默认目录对象,但该默认目录对象仅对特权用户可用,除非 DBA 授予访问权限。
-
交互式命令行模式
:允许用户完全控制数据库中运行的所有 Data Pump 作业。可以轻松监控和管理正在运行的作业,执行停止、重新启动或终止作业等操作,还可以在必要时从正在运行的作业中分离并稍后重新连接。
5. 数据移动方法
Data Pump 使用多种方法在数据库中移动数据,具体如下:
-
数据文件复制
:这是将整个表空间传输到目标系统的最快方法,只需将表空间的底层文件传输到目标环境。使用此方法时,Data Pump 导出仅将结构信息(元数据)卸载到转储文件中。在使用此选项时,需要确保源数据库和目标数据库的字符集相同,并且时区版本也一致。此外,要传输的表空间必须是自包含的,可以使用 DBMS_TTS 包中的 TRANSPORT_SET_CHECK 过程来检查表空间是否自包含,执行该过程需要具有 EXECUTE_CATALOG_ROLE 角色。示例代码如下:
-- 检查单个表空间是否自包含
SQL> EXECUTE DBMS_TTS.TRANSPORT_SET_CHECK('test_1', TRUE);
-- 检查多个表空间是否自包含
SQL> EXECUTE DBMS_TTS.TRANSPORT_SET_CHECK('test_1,test_2', TRUE);
-- 查询是否存在违规
SQL> SELECT * FROM TRANSPORT_SET_VIOLATIONS;
如果源和目标平台使用不同的字节序格式,则需要使用 RMAN CONVERT 转换传输的数据,使其与目标平台格式一致。
-
直接路径
:直接路径操作可以绕过撤销(从而减少重做),使数据的加载和卸载过程更快。当表的结构允许时,Data Pump 默认使用直接路径方法。需要注意的是,Data Pump 不会加载具有禁用唯一索引的表,在这种情况下,应删除或重命名索引。
-
外部表
:当不使用数据文件复制(可传输表空间)且无法使用直接路径移动数据时,会使用外部表方法。该方法创建一个与数据库表的转储文件数据映射的外部表,然后使用 SQL 引擎移动数据。Data Pump 在以下情况下会使用外部表:
- 加载和卸载非常大的表和分区,且使用并行 SQL 功能有利时
- 加载定义了全局或域索引的表,包括分区对象表
- 加载具有活动触发器或聚簇表的表
- 加载和卸载具有加密列的表
- 加载对插入启用了细粒度访问控制的表
- 加载在加载和卸载时分区方式不同的表
- 加载不是由导入操作创建的表(表在导入开始前已存在)
需要注意的是,Data Pump 使用外部表创建的文件与使用 SQL 语句手动创建外部表时创建的文件不兼容。
-
传统路径
:当 Data Pump 无法使用直接路径或外部表方法时,将使用传统路径。此方法可能会影响 Data Pump 操作的性能。
-
网络链接
:在 Data Pump 导入中指定 NETWORK_LINK 参数时,将使用 INSERT SELECT 语句通过网络移动数据,无需生成转储文件。在 Data Pump 导出中指定 NETWORK_LINK 参数时,源数据库的数据将直接写入目标数据库的转储文件。从只读数据库导出时,需要指定 NETWORK_LINK 参数。
6. Data Pump 文件类型
Data Pump 作业管理以下几种类型的文件:
-
转储文件
:包含正在移动的所有数据和元数据,根据 DUMPFILE 参数输入生成。
-
日志文件
:记录与导入或导出操作相关的所有输出,使用 LOGFILE 参数指定。
-
SQL 文件
:包含 SQLFILE 操作的结果,即包含导入操作将执行的所有 SQL DDL 语句的转储,但不会实际执行导入操作,使用 SQLFILE 参数指定。
-
数据文件副本
:在可传输导入操作期间使用,通过 DATA_FILE 参数指定。
7. Data Pump 导出和导入所需角色
如果需要使用 Data Pump 执行导出和导入操作,需要为使用 expdp 和 impdp 实用程序的用户账户分配以下角色:
-
DATAPUMP_EXP_FULL_DATABASE
:授予执行导出操作的权限。
-
DATAPUMP_IMP_FULL_DATABASE
:授予执行导入操作的权限(包括使用 SQLFILE 参数的导入操作)。
例如,将上述角色授予用户 fcomunoz 的语句如下:
SQL> GRANT DATAPUMP_EXP_FULL_DATABASE, DATAPUMP_IMP_FULL_DATABASE TO fcomunoz;
需要注意的是,这些角色权限较大,DBA 在授予用户这些角色时应谨慎操作。
8. 目录对象的创建与管理
Data Pump 与原始的导出和导入实用程序不同,其作业主要在服务器端使用服务器进程运行。这些服务器进程使用目录对象来访问 Data Pump 作业的文件,目录对象用于标识 Data Pump 读写文件的位置。
以下是创建目录对象并授予用户权限的示例:
-- 创建目录对象
SQL> CREATE OR REPLACE DIRECTORY datapump AS '/u01/db_backups';
-- 授予用户对目录对象的读写权限
SQL> GRANT READ, WRITE ON DIRECTORY datapump to fcomunoz;
需要注意的是,授予 fcomunoz READ 和 WRITE 权限仅在 Oracle 数据库层面有效,并非在操作系统层面。可以通过以下查询验证目录对象是否成功创建:
SQL> SELECT * FROM DBA_DIRECTORIES WHERE DIRECTORY_NAME = 'DATAPUMP';
查询结果示例如下:
| OWNER | DIRECTORY_NAME | DIRECTORY_PATH | ORIGIN_CON_ID |
| ---- | ---- | ---- | ---- |
| SYS | DATAPUMP | /u01/db_backups | 3 |
9. Data Pump 场景实践
通过实践场景可以更好地了解 Data Pump 的使用方法,以下是一些常见的场景示例:
-
模式导出和导入
-
创建模式和表
:
-- 创建用户
SQL> CREATE USER test IDENTIFIED BY test DEFAULT TABLESPACE users QUOTA UNLIMITED ON users;
-- 授予用户权限
SQL> GRANT CREATE SESSION, RESOURCE TO test;
-- 创建表
SQL> CREATE TABLE TEST.EMPLOYEE
( EMP_ID NUMBER(10) NOT NULL,
EMP_NAME VARCHAR2(30),
EMP_SSN VARCHAR2(9),
EMP_DOB DATE
)
/
-- 插入数据
SQL> INSERT INTO test.employee VALUES (101,'Francisco Munoz',123456789,TO_DATE('30-JUN-73','DD-MON-YY'));
SQL> INSERT INTO test.employee VALUES (102,'Gonzalo Munoz',234567890,TO_DATE('02-OCT-96','DD-MON-YY'));
SQL> INSERT INTO test.employee VALUES (103,'Evelyn Aghemio',659812831,TO_DATE('02-OCT-79','DD-MON-YY'));
SQL> COMMIT;
- 导出模式 :
$ expdp fcomunoz/alvarez@pdborcl directory=datapump dumpfile=test.dmp logfile=test.log schemas=test reuse_dumpfiles=y
在上述命令中,需要指定执行导出的用户的用户名和密码,以及用于连接数据库的数据库服务名(这里是 @pdborcl)。使用 DIRECTORY 参数指定 Data Pump 用于生成导出文件的目录对象,DUMPFILE 参数指定要创建的转储文件的名称,LOGFILE 参数定义此操作的日志文件名称,SCHEMAS 参数指定仅导出 test 模式,REUSE_DUMPFILES 参数用于在转储文件存在时覆盖它。如果要执行全数据库导出,只需将 SCHEMAS 参数替换为 FULL=y。
- 检查文件创建情况 :
$ ls -lrt /u01/db_backups
如果所有文件(一个转储文件和一个日志文件)成功创建,可以继续下一步。
- 删除模式并导入恢复 :
-- 删除用户
SQL> DROP USER test CASCADE;
-- 导入模式
$ impdp fcomunoz/alvarez@pdborcl directory=datapump dumpfile=test.dmp logfile=imp_test.log
通过以上步骤,你可以完成一个简单的 Data Pump 模式导出和导入操作,深入了解 Data Pump 的使用方法和功能。在实际应用中,可以根据具体需求选择不同的场景和参数,充分发挥 Data Pump 的优势。
RMAN 故障排除与调优及 Data Pump 实用指南
10. 表导出和导入
表导出和导入是 Data Pump 常见的操作场景,以下是详细步骤:
-
创建测试表并插入数据
-- 创建表
SQL> CREATE TABLE TEST.TEST_TABLE
( ID NUMBER(10) NOT NULL,
NAME VARCHAR2(30),
AGE NUMBER(3)
)
/
-- 插入数据
SQL> INSERT INTO test.test_table VALUES (1,'John',25);
SQL> INSERT INTO test.test_table VALUES (2,'Jane',30);
SQL> INSERT INTO test.test_table VALUES (3,'Bob',35);
SQL> COMMIT;
- 导出表
$ expdp fcomunoz/alvarez@pdborcl directory=datapump dumpfile=test_table.dmp logfile=test_table.log tables=TEST.TEST_TABLE reuse_dumpfiles=y
在这个命令中,通过
tables
参数指定要导出的表为
TEST.TEST_TABLE
,其他参数的含义与模式导出时类似。
-
检查文件创建情况
$ ls -lrt /u01/db_backups
确认转储文件和日志文件是否成功创建。
-
删除表并导入恢复
-- 删除表
SQL> DROP TABLE TEST.TEST_TABLE CASCADE CONSTRAINTS;
-- 导入表
$ impdp fcomunoz/alvarez@pdborcl directory=datapump dumpfile=test_table.dmp logfile=imp_test_table.log
11. 全数据库/可插拔数据库导出和导入
全数据库或可插拔数据库的导出和导入操作步骤如下:
-
全数据库导出
$ expdp fcomunoz/alvarez@pdborcl directory=datapump dumpfile=full_db.dmp logfile=full_db.log full=y reuse_dumpfiles=y
这里使用
full=y
参数表示进行全数据库导出。
-
全数据库导入
$ impdp fcomunoz/alvarez@pdborcl directory=datapump dumpfile=full_db.dmp logfile=imp_full_db.log full=y
12. 使用导出估算空间
在进行大规模数据操作之前,估算所需空间是很有必要的。可以使用 Data Pump 的导出功能来估算空间,操作如下:
$ expdp fcomunoz/alvarez@pdborcl directory=datapump dumpfile=estimate.dmp logfile=estimate.log schemas=test estimate_only=y
estimate_only=y
参数表示只进行估算,不会实际生成转储文件。估算结果会显示在日志文件中。
13. 并行全数据库导出和交互式命令模式
并行全数据库导出可以显著提高导出速度,同时交互式命令模式可以方便地控制作业。
-
并行全数据库导出
$ expdp fcomunoz/alvarez@pdborcl directory=datapump dumpfile=parallel_full_db.dmp logfile=parallel_full_db.log full=y parallel=4 reuse_dumpfiles=y
parallel=4
表示使用 4 个并行进程进行导出。
-
交互式命令模式
在执行 Data Pump 作业时,可以进入交互式命令模式。例如,在导出过程中,输入以下命令进入交互式模式:
$ expdp fcomunoz/alvarez@pdborcl directory=datapump dumpfile=interactive.dmp logfile=interactive.log full=y
进入交互式模式后,可以使用以下命令进行操作:
| 命令 | 描述 |
| ---- | ---- |
|
status
| 查看作业状态 |
|
stop_job
| 停止作业 |
|
start_job
| 启动作业 |
|
detach
| 从作业中分离 |
|
attach
| 重新连接到作业 |
14. 仅导入表的元数据
有时候只需要导入表的元数据,而不需要导入数据。可以通过以下命令实现:
$ impdp fcomunoz/alvarez@pdborcl directory=datapump dumpfile=test.dmp logfile=imp_metadata.log tables=TEST.TEST_TABLE exclude=table_data
exclude=table_data
参数表示排除表数据,只导入元数据。
15. 视图导出为表
在 Oracle 12c 及以后版本中,可以将视图导出为表,步骤如下:
-
创建视图
-- 创建视图
SQL> CREATE OR REPLACE VIEW TEST.TEST_VIEW AS
SELECT * FROM TEST.EMPLOYEE;
- 导出视图为表
$ expdp fcomunoz/alvarez@pdborcl directory=datapump dumpfile=view_as_table.dmp logfile=view_as_table.log views=TEST.TEST_VIEW export_view_as_table=TEST.TEST_VIEW_TABLE reuse_dumpfiles=y
export_view_as_table
参数指定将视图导出为表的名称。
-
导入视图导出的表
$ impdp fcomunoz/alvarez@pdborcl directory=datapump dumpfile=view_as_table.dmp logfile=imp_view_as_table.log
16. 通过网络链接导入数据
使用网络链接导入数据可以避免生成转储文件,提高数据迁移效率。
-
创建数据库链接
-- 创建数据库链接
SQL> CREATE DATABASE LINK remote_db_link
CONNECT TO remote_user IDENTIFIED BY remote_password
USING 'remote_db_service';
- 通过网络链接导入数据
$ impdp fcomunoz/alvarez@pdborcl directory=datapump logfile=network_import.log network_link=remote_db_link tables=REMOTE_SCHEMA.REMOTE_TABLE
这里通过
network_link
参数指定数据库链接,
tables
参数指定要导入的远程表。
总结
Data Pump 作为 Oracle 数据库中强大而灵活的实用工具,提供了多种数据移动和管理的方法。通过不同的数据移动方法、文件管理、角色分配以及丰富的场景实践,能够满足各种复杂的数据库操作需求。在实际使用过程中,需要根据具体情况选择合适的方法和参数,同时注意权限管理和环境配置,以确保数据操作的顺利进行。以下是 Data Pump 常见操作的总结表格:
| 操作场景 | 关键参数 | 说明 |
| ---- | ---- | ---- |
| 模式导出 |
schemas
| 指定要导出的模式 |
| 表导出 |
tables
| 指定要导出的表 |
| 全数据库导出 |
full=y
| 进行全数据库导出 |
| 视图导出为表 |
export_view_as_table
| 将视图导出为表 |
| 网络链接导入 |
network_link
| 通过网络链接导入数据 |
通过对 Data Pump 的深入学习和实践,能够更好地应对数据库的备份、恢复、迁移等任务,提高数据库管理的效率和可靠性。
以下是一个简单的 Data Pump 操作流程 mermaid 流程图:
graph LR
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
A(选择操作场景):::process --> B{确定参数}:::process
B -->|模式导出| C(指定 schemas):::process
B -->|表导出| D(指定 tables):::process
B -->|全数据库导出| E(设置 full=y):::process
B -->|视图导出为表| F(设置 export_view_as_table):::process
B -->|网络链接导入| G(指定 network_link):::process
C --> H(执行 expdp 命令):::process
D --> H
E --> H
F --> H
G --> I(执行 impdp 命令):::process
H --> J(检查文件创建):::process
J -->|成功| K(进行后续操作):::process
J -->|失败| L(排查问题):::process
I --> M(验证导入结果):::process
这个流程图展示了 Data Pump 操作的基本流程,从选择操作场景开始,确定相应的参数,然后执行导出或导入命令,最后进行结果检查和后续处理。
超级会员免费看
71

被折叠的 条评论
为什么被折叠?



