高级数据泵:功能与实战应用
在数据库管理领域,数据泵(Data Pump)是一项强大的工具,它不仅能用于常规的数据导出和导入,还具备许多高级功能。很多人仅将其用于数据迁移,却忽略了它在数据掩码、元数据管理、版本控制等方面的强大能力。下面将详细介绍数据泵的这些高级功能及其实际应用。
数据掩码
在许多组织中,出于安全和合规的考虑,数据库管理员(DBA)需要对离开生产环境的敏感信息进行掩码处理。例如,在刷新或创建QA/TEST或DEV环境时。实现这一需求有两种方法:一是使用企业管理器数据掩码包,但这需要额外付费;另一种是使用数据泵中的
REMAP_DATA
参数。
REMAP_DATA
参数是在Oracle 11g中引入的。下面以社会安全号码(SSN)为例,说明其工作原理:
1.
准备数据
:假设之前已创建了一个名为
EMPLOYEE
的表,包含三条记录。
SQL> SELECT * FROM test.employee;
EMP_ID EMP_NAME EMP_SSN EMP_DOB
---------- ------------------------------ --------- ---------
101 Francisco Munoz 123456789 30-JUN-73
102 Gonzalo Munoz 234567890 02-OCT-96
103 Evelyn Aghemio 659812831 02-OCT-79
- 创建重映射函数 :创建一个包和包体,定义一个用于掩码SSN的函数。
$ sqlplus fcomunoz/alvarez@pdborcl
SQL> CREATE OR REPLACE PACKAGE pkg_masking
2 AS
3 FUNCTION mask_ssn (p_in varchar2) RETURN varchar2;
4 END;
5 /
Package created.
SQL> CREATE OR REPLACE PACKAGE BODY pkg_masking
2 AS
3 FUNCTION mask_ssn (p_in varchar2)
4 RETURN varchar2
5 IS
6 BEGIN
7 IF p_in IS NOT NULL then
8 RETURN lpad (
9 round(dbms_random.value
(001000000,999999999)),9,0);
10 END IF;
11 END;
12 END;
13 /
Package body created.
这个函数接受一个
VARCHAR2
类型的参数,并返回一个随机的
VARCHAR2(9)
值,用于掩码
EMPLOYEE
表中的
EMP_SSN
列。
3.
导出数据并掩码
:使用
expdp
工具导出
EMPLOYEE
表,并在导出过程中使用
REMAP_DATA
参数调用之前创建的函数进行数据掩码。
$expdp fcomunoz/alvarez@pdborcl tables=test.employee
dumpfile=mask_ssn.dmp directory=datapump
remap_data=test.employee.emp_ssn:pkg_masking.mask_ssn
建议在导出操作中使用
REMAP_DATA
参数,以避免原始数据出现在转储文件中,提高安全性。如果重映射函数的模式所有者与执行导出的用户不同,需要在
expdp
指令中明确指定函数的所有者。
4.
导入数据
:将掩码后的转储文件导入到QA/TEST或DEV数据库中。这里将数据导回到同一个可插拔数据库,并在导入过程中截断表中的数据。
$ impdp fcomunoz/alvarez@pdborcl table_exists_action=truncate
directory=datapump dumpfile=mask_ssn.dmp
导入完成后,检查
EMPLOYEE
表中的数据是否已被掩码:
$ sqlplus fcomunoz/alvarez@pdborcl
SQL> SELECT * FROM test.employee;
EMP_ID EMP_NAME EMP_SSN EMP_DOB
---------- ------------------------------ --------- ---------
101 Francisco Munoz 356245915 30-JUN-73
102 Gonzalo Munoz 842801230 02-OCT-96
103 Evelyn Aghemio 072963035 02-OCT-79
使用数据掩码时,要考虑应用程序和数据完整性的要求。
元数据仓库和版本控制
作为DBA,为了应对灾难或紧急回滚,拥有元数据仓库和版本控制是非常有用的。可以通过以下步骤轻松创建:
1.
全量备份数据库元数据
:使用
expdp
工具进行数据库的全量元数据备份。
$ expdp fcomunoz/alvarez@pdborcl content=metadata_only full=y
directory=datapump dumpfile=metadata_06192013.dmp
如果只想为特定对象(如过程、包、触发器等)创建仓库,可在
expdp
命令中添加
INCLUDE
参数。
2.
生成SQL文件
:使用
impdp
工具生成用于在数据库中创建所有对象的SQL文件。
$ impdp fcomunoz/alvarez@pdborcl directory=datapump dumpfile=
metadata_06192013.dmp sqlfile=metadata_06192013.sql
这种方法不仅能轻松创建元数据仓库,还能保留数据库对象的版本信息。如果需要刷新对象定义,只需从源数据库导出新的表定义,然后导入到目标数据库(仓库)中。
$ expdp fcomunoz/alvarez@pdborcl content=metadata_only
tables=test.employee directory=datapump dumpfile=
refresh_of_table_employee_06192013.dmp
$ impdp fcomunoz/alvarez@pdborcl table_exists_action=replace
directory=datapump dumpfile= refresh_of_table_name_06192013.dmp
此外,当用户抱怨应用程序性能下降,而在检查过去24小时内的数据库更改后未发现问题时,可以通过生成全量数据库导出并使用
SQLFILE
参数生成新的SQL文件,与前一天的SQL文件进行比较(在Linux上可使用
DIFF
命令),以找出数据库中的更改。建议在备份策略中添加每日全量数据库导出,以便在需要时随时使用转储文件。
使用
SOURCE_EDITION
和
TARGET_EDITIONS
在Oracle 11gR2中引入了版本(基于版本的重新定义),允许在Oracle数据库中使用对象的不同版本。为了支持在不同版本之间工作,数据泵引入了两个新参数:
-
SOURCE_EDITION
:用于
expdp
命令。
-
TARGET_EDITIONS
:用于
impdp
命令。
例如,将开发数据库中
TEST
模式下
NEW_EDITION
版本的
TEST
视图迁移到生产数据库的
TEST
模式和
ORA$BASE
版本:
$ expdp fcomunoz/alvarez@pdbdevorcl schemas=test
dumpfile=exp_edition_09082013.dmp logfile=exp_edition_09082013.log
include=view:"= 'TEST'"
source_edition=NEW_EDITION directory=datapump
$ impdp fcomunoz/alvarez@pdborcl dumpfile= exp_edition_09082013.dmp
logfile= imp_edition_09082013.log TARGET_EDITION=ORA\$BASE
directory=datapump
用户克隆
过去,使用旧的
exp/imp
工具克隆用户是一项痛苦的任务,因为并非所有元数据都被包含,且处理大量数据时速度很慢。现在,使用数据泵可以轻松完成。例如,创建一个与现有用户
TEST
相同的新用户
TEST2
:
1.
导出
TEST
模式定义
:
$ expdp fcomunoz/alvarez@pdborcl schemas=test content=metadata_only
directory=datapump dumpfile= test_06192013.dmp
如果要克隆包含数据的模式,只需去掉
CONTENT
参数。
2.
导入并重映射模式
:
$ impdp fcomunoz/alvarez@pdborcl remap_schema=test:test2
directory=datapump dumpfile= test_06192013.dmp
这样,新用户
TEST2
就创建完成了,与现有用户
TEST
相同。
创建生产环境的小副本
DBA经常需要为开发或测试目的创建生产环境的小副本,但目标服务器可能没有足够的空间创建完整副本。使用数据泵可以轻松解决这个问题。根据副本是否仅包含元数据或同时包含数据,有不同的处理方法:
仅元数据
- 全量导出源数据库元数据 :
$ expdp fcomunoz/alvarez@pdborcl content=metadata_only full=y
directory=datapump dumpfile=metadata_06192013.dmp
-
导入元数据并缩小对象范围
:使用
impdp的TRANSFORM参数将所有对象的范围缩小到70%。
$ impdp fcomunoz/Alvarez@pdborcl3 transform=pctspace:70
directory=datapump dumpfile=metadata_06192013.dmp
-
测试验证
:导出测试数据库中某个表的元数据并生成SQL脚本,查看正常大小;然后再次生成脚本,但使用
transform参数将大小缩小到70%,对比结果。
$ expdp fcomunoz/alvarez@pdborcl content=metadata_
only tables=test.employee directory=datapump
dumpfile=example_206192013.dmp
$ impdp fcomunoz/alvarez@pdborcl content=metadata_
only directory=datapump dumpfile=example_206192013.dmp
sqlfile=employee_06192013.sql
$ impdp fcomunoz/alvarez@pdborcl transform=pctspace:70
content=metadata_only directory=datapump dumpfile=
example_206192013.dmp sqlfile=transform_06192013.sql
通过对比生成的SQL脚本,可以看到表的初始范围和下一个范围明显缩小了30%,说明该方法有效。更多使用
transform
参数的方法可参考Oracle文档。
元数据和数据
-
全量导出源数据库并采样数据
:使用
expdp的SAMPLE参数指定采样数据的百分比,这里使用70%。
$ expdp fcomunoz/alvarez@pdborcl sample=70 full=y
directory=datapump dumpfile=expdp_70_06192013.dmp
-
导入数据并缩小范围
:与仅元数据的情况类似,使用
impdp的transform参数将范围缩小到70%。
$ impdp fcomunoz/alvarez@pdborcl3 transform=pctspace:70
directory=datapump dumpfile=expdp_70_06192013.dmp
以不同文件结构创建数据库
使用数据泵可以轻松地以不同的文件结构复制数据库,只需在导入命令中使用
REMAP_DATAFILE
参数。例如:
$ impdp fcomunoz/alvarez@pdborcl directory=datapump
dumpfile=diff_structure_06192013.dmp
remap_datafile='/u01/app/oracle/oradata/pdborcl/datafile_01.dbf':'
/u01/app/oracle/oradata/pdborcl2/datafile_01.dbf'
将所有对象从一个表空间移动到另一个表空间
使用
impdp
的
REMAP_TABLESPACE
参数可以轻松将一个表空间中的所有对象移动到另一个表空间。例如:
$ impdp fcomunoz/alvarez@pdborcl directory=datapump
dumpfile=mv_tablespace_06192013.dmp remap_tablespace=test:test2
在执行此操作之前,请确保目标表空间存在。
将对象移动到不同的模式
要将一个模式中的对象移动到另一个模式,只需在导入时使用
REMAP_SCHEMA
参数。例如,将
TEST
模式下的
EMPLOYEE
表移动到
TEST2
模式:
$ expdp fcomunoz/alvarez@pdborcl tables=test.employee
directory=datapump dumpfile=employee_06192013.dmp
$ impdp fcomunoz/alvarez@pdborcl directory=datapump dumpfile=
employee_06192013.dmp remap_schema=test:test2
如果只想移动一个表或一组表,可以使用
TABLES
参数,还可以使用
INCLUDE
和
EXCLUDE
参数进一步过滤要移动的数据。
升级数据库时的数据迁移
使用数据泵的
expdp
和
impdp
工具可以轻松地将数据从一个数据库迁移到另一个数据库,例如在升级数据库时。以下是具体步骤:
1.
安装新版本的Oracle数据库
:在本例中,安装了Oracle数据库12.1.0并创建了一个新数据库。如果新数据库(目标)与源数据库同名且位于同一服务器上,在创建新数据库之前需要关闭源数据库。
2.
迁移密码文件
:使用
ORAPWD
创建或迁移源数据库的密码文件到目标数据库。
3.
迁移初始化参数文件
:创建或迁移初始化参数文件(SPFILE或PFILE),并调整Oracle 12c的初始化参数。例如,在目标数据库(12.1.0)中启用新的扩展数据类型功能,将
MAX_STRING_SIZE
参数设置为
EXTENDED
,并将
COMPATIBILITY
参数设置为12.0.0.0或更高版本。需要注意的是,新限制不是默认设置的,且将具有
EXTENDED
功能的Oracle 12c数据库降级到低于12.1.0的版本可能会导致数据截断。
4.
启动目标数据库实例
:通过SQL
Plus以
SYS AS SYSDBA
身份连接到新创建的数据库并启动实例。
5.
导出源数据库数据和元数据
*:使用以下命令导出11.2.0.3版本的源数据库的所有数据和元数据。为确保导出的一致性,在导出过程中和导出后,源数据库不应进行修改。如果导出完成后源数据库需要对用户修改完全可用,则需要制定一些程序,在导入操作完成后将源数据库中的所有更改复制到目标数据库。
$ expdp fcomunoz/alvarez dumpfile=full_11_06192013.dmp
logfile=full_11_06192013.log full=y
数据泵的这些高级功能为数据库管理提供了强大的支持,能够满足各种复杂的需求。合理利用这些功能,可以提高数据库管理的效率和安全性。
高级数据泵:功能与实战应用(续)
数据库降级
虽然在前面升级数据库的数据迁移中提到了一些版本兼容性问题,但当需要将 Oracle 数据库降级时,也可以借助数据泵来完成。不过这需要谨慎操作,因为可能会遇到数据类型不兼容等问题。以下是大致的操作步骤:
1.
评估兼容性
:在进行降级操作之前,需要仔细评估目标版本与当前版本的兼容性。例如,确认目标版本是否支持当前数据库中使用的所有数据类型、特性等。
2.
导出数据
:使用
expdp
工具导出当前数据库的数据和元数据。
$ expdp fcomunoz/alvarez@pdborcl dumpfile=downgrade_06192013.dmp
logfile=downgrade_06192013.log full=y
- 安装目标版本数据库 :安装要降级到的 Oracle 数据库版本,并创建相应的数据库实例。
- 调整参数 :根据目标版本的要求,调整初始化参数文件(SPFILE 或 PFILE),确保数据库能够正常运行。
-
导入数据
:使用
impdp工具将之前导出的数据和元数据导入到目标数据库中。
$ impdp fcomunoz/alvarez@pdborcl directory=datapump
dumpfile=downgrade_06192013.dmp
- 检查和修复 :导入完成后,检查数据库的完整性和数据的正确性。如果发现有不兼容的问题,需要进行相应的修复。
表空间传输
表空间传输是一种高效的数据迁移方式,特别是在需要将一个或多个表空间从一个数据库移动到另一个数据库时。使用数据泵进行表空间传输的步骤如下:
1.
准备源数据库
:确保源数据库中的表空间处于只读状态,以保证数据的一致性。可以使用以下命令将表空间设置为只读:
ALTER TABLESPACE tablespace_name READ ONLY;
-
导出表空间
:使用
expdp工具导出指定的表空间。
$ expdp fcomunoz/alvarez@pdborcl transport_tablespaces=tablespace_name
dumpfile=transport_tablespace_06192013.dmp directory=datapump
- 复制数据文件 :将源数据库中相关表空间的数据文件复制到目标数据库所在的服务器上。
- 准备目标数据库 :在目标数据库中创建相应的表空间,并确保数据文件的路径和权限正确。
-
导入表空间
:使用
impdp工具将导出的表空间导入到目标数据库中。
$ impdp fcomunoz/alvarez@pdborcl transport_tablespaces=tablespace_name
dumpfile=transport_tablespace_06192013.dmp directory=datapump
- 将表空间设置为读写状态 :导入完成后,将目标数据库中的表空间设置为读写状态。
ALTER TABLESPACE tablespace_name READ WRITE;
数据泵闪回
数据泵闪回功能允许在导出或导入操作中使用闪回技术,以获取特定时间点的数据。这在需要恢复到某个历史状态或进行数据比较时非常有用。以下是使用数据泵闪回的示例:
1.
导出特定时间点的数据
:使用
expdp
工具并结合
FLASHBACK_TIME
参数导出特定时间点的数据。
$ expdp fcomunoz/alvarez@pdborcl tables=test.employee
dumpfile=flashback_export_06192013.dmp directory=datapump
flashback_time="TO_TIMESTAMP('2023-06-19 12:00:00', 'YYYY-MM-DD HH24:MI:SS')"
-
导入特定时间点的数据
:在导入时也可以使用
FLASHBACK_TIME参数,确保导入的数据是特定时间点的状态。
$ impdp fcomunoz/alvarez@pdborcl directory=datapump
dumpfile=flashback_export_06192013.dmp
flashback_time="TO_TIMESTAMP('2023-06-19 12:00:00', 'YYYY-MM-DD HH24:MI:SS')"
数据泵作业监控和性能调优
为了确保数据泵作业的顺利进行和高效执行,需要对作业进行监控和性能调优。以下是一些常用的方法:
作业监控
-
查看作业状态
:可以使用
V$DATAPUMP_JOB视图查看数据泵作业的状态。
SELECT job_name, state, bytes_processed, bytes_estimate
FROM V$DATAPUMP_JOB;
- 查看作业日志 :数据泵作业会生成详细的日志文件,可以查看日志文件了解作业的执行情况和可能出现的错误。
性能调优
-
调整并行度
:通过设置
PARALLEL参数可以调整数据泵作业的并行度,提高作业的执行速度。
$ expdp fcomunoz/alvarez@pdborcl tables=test.employee
dumpfile=parallel_export_06192013.dmp directory=datapump
parallel=4
- 优化磁盘 I/O :确保数据泵作业使用的磁盘具有足够的 I/O 性能,可以将转储文件存储在高速磁盘上,以提高数据读写速度。
-
调整缓冲区大小
:可以通过设置
BUFFER_SIZE参数调整数据泵作业的缓冲区大小,优化数据传输性能。
$ expdp fcomunoz/alvarez@pdborcl tables=test.employee
dumpfile=buffer_export_06192013.dmp directory=datapump
buffer_size=1048576
总结
数据泵作为 Oracle 数据库中一个强大的工具,提供了丰富的高级功能,涵盖了数据掩码、元数据管理、版本控制、用户克隆、数据迁移等多个方面。通过合理运用这些功能,可以提高数据库管理的效率和灵活性,满足各种复杂的业务需求。
在实际应用中,需要根据具体的场景选择合适的功能和参数,并注意操作的细节和安全性。例如,在进行数据掩码时要考虑数据的完整性和应用程序的需求;在升级或降级数据库时要确保版本兼容性和数据的正确性。
同时,对数据泵作业的监控和性能调优也是非常重要的,它可以帮助我们及时发现和解决问题,提高作业的执行效率。希望本文介绍的内容能够帮助读者更好地掌握数据泵的高级功能,提升数据库管理的能力。
流程图示例
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px;
A([开始]):::startend --> B{选择操作类型}:::decision
B -->|数据掩码| C(准备数据):::process
B -->|元数据仓库| D(全量备份元数据):::process
B -->|用户克隆| E(导出模式定义):::process
B -->|创建小副本| F{仅元数据?}:::decision
F -->|是| G(全量导出元数据):::process
F -->|否| H(全量导出并采样数据):::process
C --> I(创建重映射函数):::process
I --> J(导出数据并掩码):::process
J --> K(导入数据):::process
D --> L(生成SQL文件):::process
E --> M(导入并重映射模式):::process
G --> N(导入元数据并缩小范围):::process
H --> O(导入数据并缩小范围):::process
K --> P([结束]):::startend
L --> P
M --> P
N --> P
O --> P
功能总结表格
| 功能 | 主要参数 | 操作步骤 |
|---|---|---|
| 数据掩码 |
REMAP_DATA
| 准备数据、创建重映射函数、导出数据并掩码、导入数据 |
| 元数据仓库和版本控制 |
content=metadata_only
、
SQLFILE
| 全量备份元数据、生成 SQL 文件、刷新对象定义 |
使用
SOURCE_EDITION
和
TARGET_EDITIONS
|
SOURCE_EDITION
、
TARGET_EDITIONS
| 导出指定版本对象、导入到目标版本 |
| 用户克隆 |
REMAP_SCHEMA
| 导出模式定义、导入并重映射模式 |
| 创建生产环境小副本 |
SAMPLE
、
TRANSFORM
| 仅元数据:全量导出元数据、导入并缩小范围;元数据和数据:全量导出并采样数据、导入并缩小范围 |
| 以不同文件结构创建数据库 |
REMAP_DATAFILE
| 在导入命令中指定数据文件映射 |
| 将所有对象从一个表空间移动到另一个表空间 |
REMAP_TABLESPACE
| 在导入命令中指定表空间映射 |
| 将对象移动到不同的模式 |
REMAP_SCHEMA
| 导出对象、导入并重映射模式 |
| 升级数据库时的数据迁移 | - | 安装新版本数据库、迁移密码文件和参数文件、导出源数据库数据、导入到目标数据库 |
| 数据库降级 | - | 评估兼容性、导出数据、安装目标版本数据库、调整参数、导入数据、检查修复 |
| 表空间传输 |
transport_tablespaces
| 准备源数据库、导出表空间、复制数据文件、准备目标数据库、导入表空间、设置读写状态 |
| 数据泵闪回 |
FLASHBACK_TIME
| 导出或导入特定时间点的数据 |
| 数据泵作业监控和性能调优 |
PARALLEL
、
BUFFER_SIZE
| 查看作业状态和日志、调整并行度、优化磁盘 I/O、调整缓冲区大小 |
超级会员免费看
1949

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



