Oracle系列之--数据泵

Oracle系列之–数据泵


​ 从Oracle10g开始官方推荐使用数据泵方式转移数据,首先涉及到的一个问题就是数据泵和exp/imp实用程序的区别,用了那么多年的普通导入导出简单方便,使用起来也轻车熟路为什么要用数据泵呢?

​ 以下是一个简单的对比:

​ 1、数据泵效率比普通导入导出要快很多,特别是对于大型数据库

​ 2、IMPDP/EXPDP是服务端实用程序,仅可以在服务端使用,但可以导出到远程地址;IMP/EXP是客户端实用程序,既可以在客户端使用也可以在服务端使用。

​ 3、数据泵在导入导出时可以更改方案、表空间、数据文件和存储位置,这是普通实用程序做不到的

​ 4、数据泵具有高级功能,如压缩和加密

​ 5、一个重要问题就是数据库版本的转换,这是普通导入导出做不到的

​ 由于数据泵导入导出的方式较为灵活因此对于一般开发人员来说看起来就比较复杂,毕竟越灵活的技术所要考虑和配置的参数就会越多,事实也确实是这样的,但只要了解数据泵的各项强大功能后使用起来也并不是一个困难的事儿。我会从基础讲起逐步深入了解数据泵,从数据泵结构原理、基础导入导出到进阶跨网络移动数据、监控数据泵运行作业等方面全方位了解数据泵。

一、数据泵结构

​ 主要结构就是EXPDP和IMPDP了,数据泵会使用Oracle内置软件包DBMS_DATAPUMP和DBMS_METADATA,前者作用在不同数据库环境之间的数据移动,后者主要作用在数据库元数据的导入导出。

数据泵作业过程

​ 1. 启动数据泵作业时服务器会初始化一个主进程,名称为ora_dmNN_<SID>,使用top命令能够看到在导入导出过程中该进程的信息,主进程还会启动多个工作进程,如果没有启用并行机制那么一般只会启动一个作业进程,工作进程名称为ora_dwNN_<SID>

​ 2、当作业开始时会在数据库中创建状态表,名称为SYS_EXPORT/IMPORT_<JOB_MODE>_NN,该表仅会在作业过程中创建,在作业完成时会自动销毁,这个表会记录导入导出对象、起始时间、已用时间、行数以及错误数之类的信息,记录还是比较详细的。其中JOB_MODE的类型有FULL、SCHEMA、TABLE、TABLESPACE、TRANSPORTTABLE,在后续会针对每种类型进行详细介绍。

​ 3、数据泵的导入导出时如果不使用directory参数则会在默认位置对象中搜索数据文件,该参数可以通过DATA_PUMP_DIR进行查看,同时会在当前位置生成导入导出日志。但是极不推荐使用默认位置,因为你不知道你将要导出的数据文件有多大,有磁盘空间爆满的危险;同时对于非DBA用户一般没有访问默认位置的权限,因此就没有在默认位置创建数据泵文件的权限。

二、基础导入导出操作

导出操作

​ 主要有三个步骤:

​ 1、创建指向OS目录的数据库目录对象即directory

​ 使用CREATE DIRECTORY...AS...可以创建目录对象,在数据库中想要查看已经创建的目录对象可以查看DBA_DIRECTORIES表查看所有已经创建的目录对象

​ 2、为执行导出操作的数据库用户赋予读写目录对象的权限

​ 使用GRANT READ,WRITE ON DIRECTORY ...TO ...为数据库用户赋予权限,很多人可能没有使用过该语句但是也能导入导出成功,这是因为在创建用户时直接给用户赋予了DBA权限因而不需要对该目录对象赋权。如果没有执行赋权操作则可能会出现下列错误:

ORA-39002: invalid operation
ORA-39070: Unable to open the log file.
ORA-39087: directory name EXPDUMP_DIR is invalid

​ 通常我们会使用OS中DBA用户进行导出操作,因此以上步骤也是非必须的。

​ 3、在OS命令界面运行导出命令

​ 使用expdp ... directory=...dumpfile=... logfile=...进行数据库导出,这是最近本的导出命令,没有添加任何其他的特殊参数,在实际操作中必须添加特定的导出参数。

导入操作

​ 导入操作也是三个步骤:

​ 1、创建指向OS目录的数据库目录对象,如果导出时已经创建及无需再创建,同时可以查询DBA_DIRECTORIES表去检索可以使用的目录对象,只要用户有对于目录对象指向OS目录的权限就可以用作directory

​ 2、为数据库用户赋权

​ 3、执行导入命令

​ 使用impdp ... directory=...dumpfile=... logfile=...进行数据库导入

便捷操作

​ 由于数据泵操作命令中有较多参数,仅基础命令中就包含用户名/密码、目录对象、数据文件、日志文件四个参数,实际操作中会有更多的定制参数,如果每次执行都进行手动编写比较麻烦是其次,命令可能出现手误的情况。数据泵操作支持参数文件形式执行,可以提前编写expdp.par/impdp.par文件在执行导入导出操作时只需要执行expdp parfile=expdp.par即可实现导入导出操作。par文件形式如下:

userid=<username>/<password>
directory=<dp_dir>
dumpfile=<exp.dmp>
logfile=<exp.log>
full=y

在自己本地保存一份这样的参数文件只需在使用的时候修改参数即可执行,避免手误情况出现。后面会有具体示例介绍使用参数文件的优势。

三、深入了解导入导出操作

​ 前面介绍到数据泵作业有不同的操作类型,这个在导入导出过程中是必然会使用到的,这里会逐个讲解每个类型的作用及注意事项。

1、全数据库级(FULL)

​ 全库导出会导出用户重建数据库的表空间、用户、表、索引、约束、触发器、序列、存储过程、函数等所有对象的DDL代码以及所有表中的数据(sys用户的表除外)

​ 执行全库导出操作的用户必须具有DBA权限或DATAPUMP_EXP_FULL_DATABASE角色,在参数中添加full=y即可,执行全库导入与导出相同。

​ 全库导出注意事项:

  • ​ sys方案中的对象不会导出,但有例外(如AUD$),可以自行查询以下该表是什么作用,为什么能导出;
  • ​ 不会导出索引数据,也就是说不会导出用于重建索引的DDL代码。

​ 全库导入注意事项:

  • ​ 导入会先创建所有表空间,如果表空间已经存在或表空间数据文件依存的OS目录不存在则报错但是会继续执行;这里需要注意全库导入操作也会创建系统默认永久表空间(USERS)、默认临时表空间(TEMP)以及回滚表空间(UNDOTBS1),因此一般是不建议使用全库导入参数的;
  • ​ 导入会更改sys用户和system用户密码,但是如果导出用户不具有DBA权限则会提示更改用户密码失败;
  • ​ 导入会创建所有用户,如果用户已存在则会提示报错然后继续执行导入操作;这里可能会有疑问在导入之前已经创建了数据库用户为什么还要创建用户,这里是因为执行导入操作的用户只需要具有DBA权限或DATAPUMP_IMP_FULL_DATABASE角色即可,并不一定是导出文件中包含的用户;
  • ​ 导入时表会被重建,如果表已经存在且含有数,那么就有额外的参数(TABLE_EXISTS_ACTION)限定导入表数据的操作,可以设置跳过、替换或截断或追加,后续会进行介绍。如果没有设置数据处理方式则会跳过数据的导入操作,即不导入数据。

2、方案级(SCHEMA)

​ 在实际操作中最常用的就是该种方式的导入导出操作,在不指定明确的导入导出方式时数据库也是以该方式导入导出的,方案级导出可以导出一个或多个用户,在参数中添加schemas=user1,user2即可导出多个用户

​ 方案级导入操作注意事项:

  • ​ 方案级导出文件中不包含表空间,因此在进行方案级导入时需要提前创建表空间;
  • ​ 方案级导入会创建所有包含的用户,如果用户已经存在会报错并继续执行;
  • ​ 方案级导入会重建该用户所有表,如果表已经存在那么就有额外的参数(TABLE_EXISTS_ACTION)限定导入表数据的操作,可以设置跳过、替换或截断或追加,后续会进行介绍。如果没有设置数据处理方式则会跳过数据的导入操作,即不导入数据。
  • ​ 方案级导入可以使用全库导出的文件,在参数中添加schemas=user1,user2即可导入

3、表级(TABLE)、表空间级(TABLESPACE)

​ 表级和表空间级导入导出操作比较类似,添加tables/tablespaces参数即可指定对应的表或表空间,以逗号隔开可以操作多个表或表空间,该导入方式均可使用全表导出数据文件。

四、数据泵进阶操作

​ 以上数据泵导入导出操作已经能够满足大部分开发需求,数据泵的进阶就是要去了解数据泵的灵活性即数据泵操作时的各种定制化参数;除了上面了解到的几种常用类型的操作,数据泵还提供大量过滤数据和元数据的机制。主要包含以下几种参数:

  • ​ QUERY:导入或导出数据子集
  • ​ SAMPLE:导出表中一定百分比的行
  • ​ CONTENT:设置导出和导入内容中是否包含数据和元数据
  • ​ EXCLUDE:排除导出和导入内容之外的对象
  • ​ INCLUDE:包含导出和导入内容中的对象(与EXCLUDE互斥)

1、设置QUERY参数

​ 常用语法:QUERY = [schema.][table_name] query_clause

​ 这个查询子句必须是合法的SQL子句,而且必须放在双引号或单引号中并且所有符号都必须添加转义符(\),因此我建议使用双引号,因为可能使用单引号处理SQL子句中使用的VARCHAR2字段,这里就体现出使用参数文件的好处了。

​ 同时这个QUERY参数可以设置多个,使用多个QUERY参数或参数值中使用逗号隔开均可

--不添加转义符
$ expdp dev/dev directory=EXPDUMP_DIR dumpfile=queryexp.dmp logfile=query.log query=dev.demo1:"WHERE NDATE<>20181212" query=dev.demo2:"WHERE SDATE<>'2018/12/12'"

Export: Release 12.2.0.1.0 - Production on Fri Apr 24 11:17:01 2020
Copyright (c) 1982, 2017, Oracle and/or its affiliates.  All rights reserved.
Connected to: Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
ORA-39001: invalid argument value
ORA-39035: Data filter SUBQUERY has already been specified.
--添加转义符
$ expdp dev/dev directory=EXPDUMP_DIR dumpfile=queryexp.dmp logfile=query.log query=dev.demo1:\"WHERE NDATE\<\>20181212\" query=dev.demo2:\"WHERE SDATE\<\>\'2018/12/12\'\"

"Export: Release 12.2.0.1.0 - Production on Fri Apr 24 11:34:38 2020
Copyright (c) 1982, 2017, Oracle and/or its affiliates.  All rights reserved.
Connected to: Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
Starting "DEV"."SYS_EXPORT_SCHEMA_01":  "dev/******** directory=EXPDUMP_DIR dumpfile=queryexp.dmp logfile=query.log query=dev.demo1:"WHERE NDATE<>20181212" query=dev.demo2:"WHERE SDATE<>'2018/12/12'""
...
Master table "DEV"."SYS_EXPORT_SCHEMA_01" successfully loaded/unloaded
******************************************************************************
Dump file set for DEV.SYS_EXPORT_SCHEMA_01 is:
  /home/oracle/expdump_dir/queryexp.dmp
Job "DEV"."SYS_EXPORT_SCHEMA_01" successfully completed at Fri Apr 24 11:35:20 2020 elapsed 0 00:00:31
--使用参数文件vi queryexp.par
/*
userid=dev/dev
directory=EXPDUMP_DIR
dumpfile=parfilequeryexp.dmp
logfile=parfilequeryexp.log
query=dev.demo1:"WHERE NDATE<>20181212"
query=dev.demo2:"WHERE SDATE<>'2018/12/12'"
*/
$ expdp parfile=queryexp.par

Export: Release 12.2.0.1.0 - Production on Fri Apr 24 11:43:05 2020
Copyright (c) 1982, 2017, Oracle and/or its affiliates.  All rights reserved.
Connected to: Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
Starting "DEV"."SYS_EXPORT_SCHEMA_01":  "dev/******** parfile=queryexp.par"
...
Master table "DEV"."SYS_EXPORT_SCHEMA_01" successfully loaded/unloaded
******************************************************************************
Dump file set for DEV.SYS_EXPORT_SCHEMA_01 is:
  /home/oracle/expdump_dir/parfilequeryexp.dmp
Job "DEV"."SYS_EXPORT_SCHEMA_01" successfully completed at Fri Apr 24 11:43:48 2020 elapsed 0 00:00:31

​ 通过以上对比就能很明显看出来使用参数文件的优势,在QUERY参数中不适用转义符数据泵是无法识别的,因此会产生报错,如果添加转义符会非常麻烦,使用参数文件就与正常语法无异。

​ 在导入时同样可以使用QUERY参数,导入的查询条件与SQL中WHERE语法也是一样的,数据泵能够在导入时检索数据文件中的数据进行过滤排除。在导出时我将demo1表中NDATE为20181212的数据排除在外,表中还存在2019及2020开头的数据,在导入时我可以使用类似query=dev.demo1:"WHERE SDATE='2019/12/12'"查询参数仅导入2019的数据。

2、按百分比导出数据(SAMPLE)

​ 使用SAMPLE参数可以导出一定百分比的数据,但是不会顾及有外键约束的关联表,因此对于有外键关联的表不能使用该方式导出;SAMPLE参数只适用导出,不能在导入中使用。

​ 常用语法:SAMPLE=[schema.][table_name]:sample_percent

​ 示例:expdp dev/dev directory=EXPDUMP_DIR dumpfile=sampleexp.dmp logfile=sample.log tables=demo1,demo2 sample=demo1:10,demo2:20我导出demo1和demo2两张表并且demo1我导出10%的数据demo2我导出20%的数据。

3、从导出文件中排除/包含对象(EXCLUDE/INCLUDE)

​ 使用EXCLUDE/INCLUDE能够在导出/导入时排除某些数据库对象

​ 常用语法:EXCLUDE=object_type[:name_clause][,...]

​ object_type指要排除的对象,最常用的有表(table)和索引(index),其实还有很多对象可以排除,可以查看DATABASE/SCHEMA/TABLE_EXPORT_OBJECTS查看不同级别的可导出对象信息

​ name_clause可以进行更精准的过滤,使用标准的SQL语法即可

​ 示例:expdp dev/dev directory=EXPDUMP_DIR dumpfile=excludeexp.dmp logfile=exclude.log tables=demo,demo1 exclude=index:\" LIKE \'DEMO_GIDX1%\'\",grant我导出demo和demo1两张表并且排除以DEMO_GIDX1开头的索引以及权限

​ 在实际使用过程中可以考虑使用排除统计数据的方式提高导入导出效率,参数为EXCLUDE=STATISTICS;需要说明的是排除统计数据给人的感觉应该是提高效率,但是测试发现这种提升效率的方式并不明显,测试使用表空间200M,数据文件约90M进行对比测试,导出时间提升约3秒,导入时提升约1分25秒,但是在导入后需要进行手动统计信息(使用EXEC DBMS_STATS.GATHER_SCHEMA_STATS(<schema_name>)进行方案级信息统计),这样也会耗掉1分中左右的统计时间,而且随着数据库数据量的增加统计时间会大量增长;是否在导出时排除统计数据还有待探究。

4、导出数据库对象DDL(CONTENT)

​ 使用CONTENT参数可以只导出DDL,其中CONTENT参数有三个可选参数分别是ALL、DATA_ONLY和METADATA_ONLY,默认值是ALL,METADATA_ONLY即为数据库对象的DDL。

​ 在导出对象时还会导出对象的依存对象,如导出表结构时会同时导出与该表相关的索引、约束和触发器等。

5、导入时的覆盖操作(TABLE_EXISTS_ACTION)

​ 导入时如果表中已经存在数据则不能再创建已存在的对象,较为常见的对象就是表;这时候就需要使用TABLE_EXISTS_ACTION和CONTENT参数配置使用进行导入操作。其实单用TABLE_EXISTS_ACTION也是可以的,但是这样会有报错信息,使用CONTENT参数可以避免报错信息。TABLE_EXISTS_ACTION参数有以下几种选项:

  • SKIP(不使用CONTENT=DATA_ONLY时的默认值)
  • APPEND(使用CONTENT=DATA_ONLY时的默认值)
  • REPLACE
  • TRUNCATE

因此在使用TABLE_EXISTS_ACTION参数时尽可能配合CONTENT参数一起使用

6、克隆用户/表空间(REMAP_SCHEMA/REMAP_TABLESPACE)

​ 克隆用户也是一种较为常见的数据库转移策略,常用的参数即为REMAP_SCHEMA/REMAP_TABLESPACE,使用remap操作克隆的用户与原用户完全相同,并且克隆用户与原用户具有相同的密码。如果只想克隆元数据则可以配合CONTENT参数的MATADATA_ONLY选项使用。

​ 需要注意的是使用REMAP_SCHEMA时数据泵可以自动创建目标用户,但是使用REMAP_TABLESPACE时需要提前创建目标表空间否则数据泵就会报错。

​ 在执行导出操作时,如果数据文件已经存在则数据泵会报错并终止导出作业,这是为了避免覆盖重要的数据库备份,但是可以使用REUSE_DUMPFILES={N(默认)|Y}参数覆盖已存在的数据泵文件,但这种操作在生产环境是极不推荐的,一旦覆盖重要的数据泵文件可能会造成无法挽回的损失。

7、传输数据(NETWORK_LINK)

​ 使用数据泵的目的绝大部分是为了转移数据,数据泵的强大之处在于可以使用网络连接(DBLINK)在不创建数据泵文件的情况下进行数据转移,这是一种非常高效的数据移动方法。

impdp dev/dev directory=EXPDUMP_DIR network_link=procdk schemas=proc1,proc2 remap_schema=proc1:dev1,proc2:dev2

​ 使用NETWORK_LINK参数需要先创建远程数据库的DBLINK

五、数据泵高阶操作

​ 高阶操作主要是从宏观层面对数据泵的运行进行了解掌握,从数据泵的一些常见任务,数据泵联机转移,存储管理,到数据泵的命令行交互模式以及部分数据泵的监控作业等。

1、估算数据泵尺寸(ESTIMATE_ONLY)

​ 在导出大量数据之前估算以下导出数据泵文件所占空间尺寸是很有必要的,主要使用的参数有ESTIMATE_ONLY={Y|N(default)}与ESTIMATE={BLOCKS(default)|STATISTICS},ESTIMATE_ONLY指是否只输出尺寸信息,ESTIMATE指定统计方式,默认为BLOCKS方式该方式是以数据块为统计基础进行计算的,STATISTICS是以统计信息为基础进行计算的,因此BLOCKS相较于STATISTICS方式要更准确些,但是这种计算方式都仅作为一个参考。需要注意的是使用估算参数需要使用DBA用户进行估算,否则会有如下报错信息:

ORA-39002: invalid operation
ORA-39070: Unable to open the log file.
ORA-39145: directory object parameter must be specified and non-null

2、导出数据泵文件中的SQL(SQLFILE)

​ 前面已经介绍过从数据库中导出数据库对象的DDL语句,使用CONTENT参数;数据泵的强大在于数据泵文件可能够被识别为一个数据库,因此数据泵能够在数据泵文件中检索出重建对象的DDL代码。使用SQLFILE参数可以实现该功能,示例SQL如下:

impdp dev/dev DIRECTORY=EXPDUMP_DIR1 DUMPFILE=expfull.dmp SQLFILE=EXPDUMP_DIR2:expfull.sql

​ 当前操作使用SQLFILE选项不会导入任何数据,仅会创建一个包含导入进程运行的SQL文件;需要注意使用这种方式必须使用拥有DBA权限的用户,否则生成的SQL文件是一个空白文件。

3、重命名表(REMAP_TABLE)

​ 从11g开始,Oracle支持在导入时重命名表,使用REMAP_TABLE参数可以实现。

​ 常用语法:REMAP_TABLE=[schema.]old_tablename[.partition]:new_tablename

​ 需要注意该语法只能在同一用户下进行重命名,因此语法中schema其实是没有必要的;也就是说,如果使用REMAP_TABLE=dev.demo:prod.demo1,那么最后就会把dev用户下的demo表重命名为prod。

4、重新映射数据(REMAP_DATA)

​ 从11g开始,Oracle支持在导入或导出时更改列值,使用REMAP_DATA参数可以实现。

​ 通常我们使用这种方式可以实现简易的数据脱敏,例如将数据库中客户手机号进行简单脱敏:

​ 4.1、创建简单的模糊数据包:

CREATE OR REPLACE PACKAGE PKG_REMAP IS 
   FUNCTION REMAP_VARCHAR(clear_string varchar2) RETURN VARCHAR2;
END PKG_REMAP;
/
CREATE OR REPLACE PACKAGE BODY PKG_REMAP IS 
   FROMSTR VARCHAR2(9) := '023456789';
   TOSTR VARCHAR2(9) := '987654320';
FUNCTION REMAP_VARCHAR(clear_string varchar2) RETURN VARCHAR2 IS 
  BEGIN 
    RETURN TRANSLATE(clear_string,FROMSTR,TOSTR);
  END REMAP_VARCHAR;
END PKG_REMAP;
/

​ 4.2、在导出时使用REMAP_DATE=[schema.]tablename.column:PKG_REMAP.REMAP_VARCHAR

expdp dev/dev directory=EXPDUMP_DIR dumpfile=customer.dmp tables=customers remap_data=customers.mobile:okg_remap.remap_varchar

5、启用并行机制(PARALLEL)

​ 使用PARALLEL参数可以设置导入导出时数据泵作业的并行度,建议并行度不要大于CPU数量的两倍;

​ 要最大程度的利用并行效率,可以在导出时设置多个数据泵文件,还可以使用替换变量%U使数据泵自动创建符合并行度的数据泵文件,%U会从01开始创建;同样可以使用并行导入多个数据文件。

--导出指定数据文件
expdp dev/dev directory=EXPDUMP_DIR parallel=4 dumpfile=demo1.dmp,demo2.dmp,demo3.dmp,demo4.dmp
--使用替换变量%U导出
expdp dev/dev directory=EXPDUMP_DIR parallel=4 dumpfile=demo%U.dmp

6、压缩导出文件(COMPERSSION)

​ 使用COMPERSSION参数可以将数据库压缩后导出,从11g开始Oracle支持的压缩属性有ALL、DATA_ONLY、METADATA_ONLY和NONE,而10g仅支持METADATA_ONLY和NONE;同时在12c中还引入了新的参数COMPRESSION_ALGORITHM来配合COMPRESSION指定压缩程度,COMPRESSION_ALGORITHM参数的可选值有BASIC、LOW、MEDIUM和HIGH。

7、加密数据(ENCRYPTION)

​ 使用ENCRYPTION可以对导出数据进行加密,要使用这个属性数据库必须拥有加密包并处于打开状态(一般企业版Oracle是默认打开的);该参数的可选值有:ALL、DATA_ONLY、ENCRYPTED_COLUMNS_ONLY、METADATA_ONLY、NONE。

​ 如果有人打开过dmp文件会发现其中也是乱码的,认为我们导出的dmp已经加密了,其实不然。在一些非常规操作中(如修改dmp文件的数据库版本、用户名等),我们是能够通过直接打开dmp文件进行修改而生效的,这就能够说明导出的dmp文件并没有加密只是普通的文本格式,只是文件查看器不匹配导致的部分数据解析不正确而出现乱码。想要查找dmp中的字符串可以使用strings <dmp_file> | grep -i <query_string>进行检索对应的字符串。

8、导入时更改存储和压缩属性(TRANSFORM)

​ 常用语法:TRANSFORM=transform_name:value[:object_type]

​ 使用TRANSFORM=SEGMENT_ATTRIBUTES:N时可以在导入时删除物理属性、存储属性、表空间及日志;他的使用场景如:生产环境中存在多套表空间、索引表空间、临时表空间而开发环境仅有一套,这样的转换结果就是不会在开发环境再创建与生产环境一样的表空间而只使用一套表空间即可。

​ 从12c开始导入表时还可以使用该参数更改表的压缩属性,使用TRANSFORM=TABLE_COMPRESSION_CLAUSE:"ROW STORE COMPRESS ADVANCED"在导入时更改表的压缩属性为高级行压缩。

9、命令行交互模式

​ 进入命令行交互模式的方法有两种:在使用impdp/expdp命令进行作业时使用Ctrl+C;对正在进行的作业使用ATTACH参数。注意区别两种进入交互模式的方式,在impdp/expdp中应用ATTACH参数是无效的。同时注意使用Ctrl+C组合键必须是在进入数据泵作业之后,在启动数据泵作业之前使用属于OS组合键命令,会直接杀死当前数据泵进程。示例如下:

--未启动数据泵任务前使用Ctrl+C组合键会出现UDE-00001错误
$ expdp dev/dev directory=EXPDUMP_DIR dumpfile=a1.dmp schemas=dev reuse_dumpfiles=Y
Export: Release 12.2.0.1.0 - Production on Tue Apr 28 16:08:12 2020
Copyright (c) 1982, 2017, Oracle and/or its affiliates.  All rights reserved.
Connected to: Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
^CUDE-00001: user requested cancel of current operation
--出现String...后使用Ctrl+C组合键才会进入命令行交互模式
[oracle@amarsoft expdump_dir]$ expdp dev/dev directory=EXPDUMP_DIR dumpfile=a1.dmp schemas=dev reuse_dumpfiles=Y
Export: Release 12.2.0.1.0 - Production on Tue Apr 28 16:08:28 2020
Copyright (c) 1982, 2017, Oracle and/or its affiliates.  All rights reserved.
Connected to: Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
Starting "DEV"."SYS_EXPORT_SCHEMA_02":  "dev/********" directory=EXPDUMP_DIR dumpfile=a1.dmp schemas=dev reuse_dumpfiles=Y 
^C
Export>

​ 对于命令行交互模式的用法有以下命令可以参考:

命令描述
ADD_FILE(只导出适用)向导出数据泵文件合集中添加文件如:ADD_FILE=dev%U.dmp
CONTINUE_CLIENT返回事件记录模式(进入交互模式前的显示模式)
EXIT_CLIENT退出客户端会话返回OS命令行界面,保持作业运行
FILESIZE(只导出适用)定义数据泵文件尺寸
HELP显示帮助
KILL_JOB终止当前作业
PARALLEL提高或降低并行度
REUSE_DUMPFILES(只导出适用)覆盖已存在的数据泵文件
START_JOB重启当前作业
STATUS显示作业状态
STOP_JOB[=IMMEDIATE]停止正在运行的作业,使用IMMEDIATE可以快速停止作业,但是作业中可能有未完成的任务

​ 命令行交互模式对于运行时间较长的数据泵操作最为有用,可以根据系统资源的使用情况适当增加并行度或导出文件,同时可以在磁盘空间用尽之前及时停止数据泵作业,对磁盘扩展后再重新启动。同时使用STATUS可以查看当前数据泵作业的完成情况,STATUS显示的PERCENT DONE信息以百分比方式记录了当前数据泵作业的完成度。

​ 在返回OS命令行后需要使用ATTACH参数重新进入当前作业,但这需要先确定作业的名称;之前已经介绍过在数据泵启动后数据泵会创建一个作业记录,在DBA_DATAPUMP_JOBS中查看当前数据泵作业名称,使用expdp dev/dev attach=SYS_EXPORT_SCHEMA_01进入当前作业。

10、监控数据泵作业

​ 总结以上数据泵操作可以通过多种方式来监控数据泵作业:

  • ​ 屏幕输出

  • ​ 日志文件

  • ​ 数据字典

  • ​ 数据泵作业状态表

  • ​ 命令行交互模式

  • ​ 数据库警告日志

  • ​ OS命令

    前五种方式在本文中均有介绍,对于数据库警告日志的查看只在数据泵运行时间过长的情况下作为一种错误排查机制存在的,一般临时表空间不足的情况下可能出现数据泵作业挂起的情况,这在日志中是无法察觉的,需要查看数据库警告日志,在确定需要增加临时表空间并增加临时表空间容量后数据泵作业会自动恢复,一般这种挂起能够等待两到三个小时。

    对于使用OS命令查看可以使用ps -ef | egrep 'pra_dm|ora_dw' | grep -v egrep进行数据泵进程信息的查看,多吃执行即可查看当前数据泵作业的执行时间。

11、创建一致的导出文件

​ 该导出方式适用于数据库中存在外键关联的表或有DBLINK的数据库,目的是为保证导出文件中所有数据都具有一致的时间或SCN。这意味着在指定SCN后提交的事务都不会被导出。

​ 该导出方式使用的参数有FLASHBACK_SCN或FLASHBACK_TIME,使用SCN方式需要先查询当前数据库SCN,使用TIME需要创建时间点的timestamp。

​ 查询SCN使用SELECT CURRENT_SCN FROM V$DATABASE,使用TIME需要利用TO_TIMESTAMP进行时间转换TO_TIMESTAMP(‘2020-04-28 11:00:08’,‘YYYY-MM-DD HH24:MI:SS’),使用FLASHBACK_TIME方式时建议使用参数文件方式,因为TO_TIMESTAMP函数中包含有较多特殊字符。

​ 在11gR2及更高版本中可以使用参数CONSISTENT=Y(普通导入导出参数)获取一致性的导出文件。

有DBLINK的数据库,目的是为保证导出文件中所有数据都具有一致的时间或SCN。这意味着在指定SCN后提交的事务都不会被导出。

​ 该导出方式使用的参数有FLASHBACK_SCN或FLASHBACK_TIME,使用SCN方式需要先查询当前数据库SCN,使用TIME需要创建时间点的timestamp。

​ 查询SCN使用SELECT CURRENT_SCN FROM V$DATABASE,使用TIME需要利用TO_TIMESTAMP进行时间转换TO_TIMESTAMP(‘2020-04-28 11:00:08’,‘YYYY-MM-DD HH24:MI:SS’),使用FLASHBACK_TIME方式时建议使用参数文件方式,因为TO_TIMESTAMP函数中包含有较多特殊字符。

​ 在11gR2及更高版本中可以使用参数CONSISTENT=Y(普通导入导出参数)获取一致性的导出文件。

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值