使用数据泵的注意事项

一、在日常工作中,数据泵的使用需要注意以下几点

1.要想预估导出文件的大小,可以使用“ESTIMATE_ONLY=Y”选项运行EXPDP

如,预估导出 SCOTT 用户所需空间的大小,命令如下

expdp \'/ as sysdba\' schemas=scott estimate_only=y

Export: Release 11.2.0.4.0 - Production on Tue Nov 14 14:10:50 2023

Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.

Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
Starting "SYS"."SYS_EXPORT_SCHEMA_01":  "/******** AS SYSDBA" schemas=scott estimate_only=y 
Estimate in progress using BLOCKS method...
Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
.  estimated "SCOTT"."DEPT"                                 64 KB
.  estimated "SCOTT"."EMP"                                  64 KB
.  estimated "SCOTT"."SALGRADE"                             64 KB
.  estimated "SCOTT"."BONUS"                                 0 KB
Total estimation using BLOCKS method: 192 KB
Job "SYS"."SYS_EXPORT_SCHEMA_01" successfully completed at Tue Nov 14 14:11:40 2023 elapsed 0 00:00:43

2.确定expdp/impdp 两个数据库之间的字符集是否兼容。

Zhs16gbk导入UTF-8
UTF-8是 Zhs16gbk 的超集,后者的 varchar2 和 char类型字段的存储长度是前者的 1.5倍。因此我们只需要先导入表结构,修改字段的长度再导入数据即可。具体实现步骤如下。
1)导入目标端表结构,命令如下:

impdp \'/ as sysdba\' DIRECTORY=expdir CONTENT=METADATA_ONLY DUMPFILE=scott_metadata.dmp logfile=scott_metadata.log

2)修改表格中varchar2和char类型的字符长度,命令如下:

select 'alter table ' || owner || ',' || table_name || ' modify (' || 
       COLUMN_NAME || ' ' || DATA_TYPE || '(' || (case 
       when DATA_LENGTH >= 2660 then 
         4000 
        else 
           ceil(DATA_LENGTH * 1.5) 
        end) || '));'
from dba_tab_columns 
where table_name = 'DEPT' 
      and DATA_TYPE in ('VARCHAR2','CHAR');

在目标端中执行上述生成的语句,以修改字段长度
3)最后导入表格数据,命令如下:

impdp \'/ as sysdba \' DIRECTORY=expdir CONTENT=DATA_ONLY DUMPFILE=scott_data.dmp logfile= scott_data.log

3.数据字典统计信息应确保准确。数据泵的性能依赖于数据库字典统计信息的准性,若长时间未收集统计信息,则会严重影响数据泵的性能,建议使用以下语句收集统信息。

统计数据字典基表(物理存在的基表)的命令如下:

SQL> exec dbms_stats.gather_dictionary_stats();

PL/SQL procedure successfully completed.

统计基表动态表格的命令如下:

SQL> exec dbms_stats.gather_fixed_objects_stats();

PL/SQL procedure successfully completed.

4.低版本向上兼容,而高版本导入低版本需要注意是否正常。

5.导入Oracle 12c及以上版本时,建议搭配“TRANSFORM= DISABLE_ARCHIVE_LOGGING:Y”参数,在归档模式下不生成归档日志

6.导出部分数据

对一个数据量在太字节(TB)级别的生产库做全库迁移费时又费力。但创建测试环境时,我们往往并不需要用到所有的数据,只需要使用部分数据进行功能性测试即可。对此,数据泵提供了两种方式用于导出部分数据,一种方式是QUERY,即按条件导出,类似于查询语句中的 where。例如,导出业务用户下每张表格的前 5000行数据,命令如下:

shell> expdp \'/ as sysdba\' parfile=expdp.par
shell> cat expdp.par
directory=EXPDIR
parallel=4
CLUSTER=N
dumpfile=his_%U.dmp
logfile=his.log
schemas=
(
'HIS',
'MEDIA'
'APP',
'INPAUTO'
)
query="where rownum<=5000"

另一种方式是 SAMPLE,即数据抽样百分比。针对全库、用户和表三种模式,我们可以在导出时使用此参数来进行设置,使用方法示例如下:
导出SCOTT用户下每张表格 20%的数据,命令如下:

expdp \"/ as sysdba\" directory=EXPDIR dumpfile=scott_data.dmp logfile=scott_data.log schemas=scott sample=20

导出SCOTT用户下的所有表格,但只对大表emp 抽取 20%的数据,命令如下:

expdp \"/ as sysdba\" directory=EXPDIR dumpfile=scott_data.dmp logfile=scott_data.log schemas=scott sample=scott.emp:20

二、数据泵常用参数

Oracle 的功能非常强大,其提供的命令成千上万,我们不可能全部记住。在使用 Oracle 时,只需要知道如何查询这些命令即可,对于数据泵,建议大家记住“expdp/impdp -help”命令。其中几个关键的参数用法如下。
CLUSTER:RAC中默认为Y,利用集群资源并行工作,建议关闭(CLUSTER=N)
CONTENT:导出内容,默认为ALL,可以选择元数据[METADATA_ONLY]或仅数据[DATA_ONLY]
INCLUDE:导出/导入时指定的对象
EXCLUDE:与INCLUDE 互斥,导出/导入时排除的对象
NETWORK_LINK:远端数据库DBLINK 连接
PARFILE:参数文件,避免在不同的操作系统下,因转义字符的不同而带来影响
QUERY:特定对象筛选条件,类似于 select 中的 where条件
SAMPLE:数据抽样比,一般用于搭建测试环境
SQLFILE:对导入内容生成SQL文本语句
REMAP_SCHEMA/REMAP_TABLE/REMAP_TABLESPACE:用于重定向目标端导
入对象
COMPRESSION:导出文件压缩,空间紧张时可以使用此参数,可以选择所有内容[ALL]、元数据[METADATA_ONLY]或仅数据[DATA_ONLY]
PARTITION_OPTIONS:用于迁移分区表,NONE表示与源端保持一致,DEPARTITION表示将每个分区表和子分区表作为一个独立的表创建,并使用表和分区(子分区)名字的组合作为自己的名字,MERGE 表示将所有分区合并到一个表

你可能感兴趣的:(oracle,数据库)