如,预估导出 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
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
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.
对一个数据量在太字节(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 表示将所有分区合并到一个表