数据泵是基于服务器的工具,用于数据和元数据的高速移动。可以跨数据库版本(Oracle版本)进行数据的导入导出。所以也常被用来当作数据迁移的方案之一。它有expdp、impdp两种程序进行导出和导入,下文也会进行详细介绍;但文章标题毕竟只是数据泵初探,也不会详细到让人拍手叫好的程度哈哈。
那么话不多说,❀周末时间宝贵❀,开始介绍,先看目录!
目录
expdp
例子
常用
参数
可用关键参数
交互模式命令
impdp
例子
常用
参数
expdp:数据泵导出程序
它提供了一种在Oracle数据库之间传输数据对象的机制。
如果您从来没有使用过数据泵expdp导出程序。那么可以参考下面的步骤。
您需要首先创建一个操作系统上目录,用于存储expdp导出的转储文件,即dump文件。
mkdir /home/oracle/dump
虽然已经在操作系统上创建了一个指定目录,但Oracle现在并不知道该把导出的dump文件存储到哪里。所以需要创建一个dump目录,告诉Oracle我要存这里。
create or replace directory dump as '/home/oracle/tc';
dump目录创建完成后, 可以查看有没有创建成功。
set lines 1000
set pages 100
col DIRECTORY_NAME for a25
col DIRECTORY_PATH for a80
select directory_name,directory_path from dba_directories;
用于进行导出的用户,如果没有dump目录的相关权限,那么是无法导出的。所以需要给予指定用户相应的权限。
grant write,read on directory dump to hr;
grant exp_full_database to hr;
此时已经可以开始进行expdp导出,下面是一个简单的导出指定的table的例子。(注意用户密码的大小写)
expdp HR/HR directory=DUMP dumpfile=employees.dump tables=employees logfile=expdp.log;
expdp工具的参数很多,但常用的组合确可以精简到以下几种,只要掌握了,是可以解决大部分的工作需求的。 且新人朋友们可以观察下我的习惯,在使用expdp工具时,我习惯将directory、dumpfile参数放在前面,logfile放在最后,中间放置满足此次需求的参数。个人感觉这样是比较标准规范的。
按用户导出,该组合的目的是将某个用户(schema)下的表、索引等所有对象全部导出。导出代码如下:
expdp HR/HR directory=dump dumpfile=HR.dmp schemas=HR logfile=expdp.log;
上文的例子中已经提及过,是针对某张表进行导出;新接触的朋友可能有疑问,一张表而已,为什么要用expdp导出这么麻烦,直接查询导出不就可以吗?其实有两个原因:一个是表的数据量太大,查询导出不现实;另一个原因是表中含有大字段,查询导出无法将大字段内容完整的导出,所以就用到了expdp。导出代码如下:
expdp HR/HR directory=DUMP dumpfile=emp.dump tables=employees logfile=expdp.log;
和刚刚提到的导出表原因一样,只不过在此基础上加了条件限制。导出代码如下:
expdp HR/HR directory=dump dumpfile=quer1.dump tables=employees QUERY=employees:'"WHERE department_id > 10"' logfile=expdp.log;
这里有个需要注意的地方: 在where条件中,不要只写一个
字面意思,导出代码如下:
expdp \'/ as sysdba \' directory=dump dumpfile=tablespace.dump tablespaces=SYSTEM logfile=expdp.log;
字面意思,整个实例全部导出;导出代码如下:
expdp HR/HR directory=dump dumpfile=all.dump full=Y logfile=expdp.log;
前文已经表述了expdp的使用方法样例、常用组合;现在对expdp的参数进行总结梳理下。可能有些参数在平时工作中用不到或者很少见,但我们需要有个印象,这样在某年某月某日某时遇到某个情况,我们可以想到有个参数,可以实现当下的需求。
在梳理参数之前,虽然上文已经有例子,我们还是先来总结以及明确一下格式。
expdp KEYWORD=value or KEYWORD=(value1,value2,...,valueN)
KEYWORD即关键字,这个和下面的表格有联动。
下面是可用的关键字及其描述。默认值列在方括号内。
参数 | 说明 |
ABORT_STEP |
在作业初始化后或在指定的对象处停止作业。 有效的值是-1或者N(N是0或者更大的数); N对应于对象在主表中的进程顺序号。 |
ACCESS_METHOD |
指示“导出”使用特定的方法卸载数据 有效的关键字值:[AUTOMATIC]、DIRECT_PATH和EXTERNAL_TABLE。 |
ATTACH |
添加一个已经存在的JOB 例子:ATTACH=job_name |
CLUSTER |
在RAC上利用集群资源分配工作。 有效关键字:[YES] |
COMPRESSION |
降低dump文件的大小 有效关键字:ALL, DATA_ONLY, [METADATA_ONLY] ,NONE |
COMPRESSION_ALGORITHM |
指定压缩算法: 有效关键字:[ALL], DATA_ONLY and METADATA_ONLY |
CONTENT |
指定卸载的数据类型 有效关键字:[ALL], DATA_ONLY and METADATA_ONLY. |
DATA_OPTIONS |
数据层选项: 有效关键字:GROUP_PARTITION_TABLE_DATA, VERIFY_STREAM_FORMAT ,XML_CLOBS |
DIRECTORY |
指定目录,上文有例子 |
DUMPFILE |
指定dump文件名,上文有例子 |
ENCRYPTION |
加密转储文件的全部或者部分: 有效关键字:ALL, DATA_ONLY, ENCRYPTED_COLUMNS_ONLY, METADATA_ONLY , NONE. |
ENCRYPTION_ALGORITHM |
加密算法。 有效关键字:[AES128], AES192 and AES256. |
ENCRYPTION_MODE |
加密密钥的生成方法。 有效关键字:DUAL, PASSWORD , [TRANSPARENT]. |
ENCRYPTION_PASSWORD |
在转储文件中创建加密数据的密码密钥 |
ENCRYPTION_PWD_PROMPT |
是否提示输入加密密码 有效关键字:[NO] |
ESTIMATE |
指定估算被导出表所占用磁盘空间分方法 有效关键字:[BLOCKS] and STATISTICS. |
ESTIMATE_ONLY |
指定是否只估算导出作业所占用的磁盘空间 有效关键字:[NO] |
EXCLUDE |
该选项用于指定执行操作时释放要排除对象类型或相关对象,EXCLUDE 和 INCLUDE 不能同时使用。 例子:EXCLUDE=SCHEMA:"='HR'" |
FILESIZE |
指定导出文件的最大尺寸,默认为 0,(表示文件尺寸没有限制) |
FLASHBACK_SCN |
指定导出特定 SCN 时刻的表数据 |
FLASHBACK_TIME |
指定导出特定时间点的表数据 |
FULL |
是否全库导出 有效关键字:[NO] |
HELP |
指定是否显示 expdp 命令行选项的帮助信息 有效关键字:[NO] |
INCLUDE |
指定导出时要包含的对象类型及相关对象 【 TABLE_DATA 表中的数据 TABLE 表的定义,就是 create table 的语句,include 后只写 table 参 数,将只创建表结构,exclude 后写 table 参数导入过程将不执行 create table 命令。 INDEX_STATISTICS 索引统计信息 TABLE_STATISTICS 表的统计信息 】
|
JOB_NAME |
指定要导出作用的名称 默认为 SYS_XXX JOB_NAME=jobname_string |
KEEP_MASTER |
导出任务成功完成后保留主表 有效关键字:[NO] |
LOGFILE |
指定日志文件名称,上文有例子。 |
LOGTIME |
指定在导出操作期间显示的消息带有时间戳。 有效关键字:ALL, [NONE], LOGFILE ,STATUS. |
METRICS |
向导出日志文件报告其他作业信息。 有效关键字:[NO] |
NETWORK_LINK |
指定数据库连接名,如果要将远程数据库对象导出到本地实例的转储文件中,必须设置该选项。 【 #expdp hr/hr directory=dumpxxx NETWORK_LINK=dblink tables=test #dumpfile =test.dmp logfile=test.log job_name=my_job 】 #dblink 是目的数据库与源数据的链接名 #dumpxxx 是目的数据库上的目录 |
NOLOGFILE |
该选项用于指定禁止生成导出日志文件 有效关键字:[NO] |
PARALLEL |
指定执行导出操作的并行进程个数,默认值为 1
【而对于导出的文件,如果 PARALLEL 设为 2,导出文件只有一个,导出速度提高不多,因为导出都是到同一个文件,会争抢资源;所以可以设置导出文件为两个,如下所示: |
PARFILE |
指定导出参数文件的名称 |
QUERY |
按照条件导出,上文有例子。 |
REMAP_DATA |
指定数据转换函数。 例子:REMAP_DATA=EMP.EMPNO:REMAPPKG.EMPNO |
REUSE_DUMPFILES |
如果目标转储文件存在,则覆盖 有效关键字:[NO] |
SAMPLE |
导出数据的百分比。 |
SCHEMAS |
指定导出的用户,默认为当前用户;上文有例子 |
SERVICE_NAME |
用于约束Oracle RAC资源的活动服务名称和关联的资源组名称。 |
SOURCE_EDITION |
用于提取元数据的版本。 |
STATUS |
指定显示导出作用进程的详细状态,默认值为 0 |
TABLES |
指定导出表,上文有例子 |
TABLESPACES |
指定导出表空间,上文有例子 |
TRANSPORTABLE |
指定是否可以使用可传输的方法。 有效关键字:ALWAYS ,[NEVER] |
TRANSPORT_FULL_CHECK |
验证所有表的存储段 有效关键字:[NO] |
TRANSPORT_TABLESPACES |
列表的表空间元数据将被卸载。 |
VERSION |
指定被导出对象的数据库版本 有效关键字:[COMPATIBLE], LATEST,任何有效的数据库版本 |
VIEWS_AS_TABLES |
识别一个或多个视图导出为表。 例子:VIEWS_AS_TABLES=HR.EMP_DETAILS_VIEW |
以下命令在交互模式下有效,允许使用缩写。
命令 | 说明 |
ADD_FILE |
将dump文件添加到dump文件集中 |
CONTINUE_CLIENT |
返回日志模式。如果作业空闲,将重新启动。 |
EXIT_CLIENT |
退出客户端会话并让作业继续运行。 |
FILESIZE |
随后的ADD_FILE命令的默认文件大小(字节)。 |
HELP |
帮助说明 |
KILL_JOB |
分离和删除作业 |
PARALLEL |
更改当前工作的活动线程数量。 |
REUSE_DUMPFILES |
如果目标转储文件存在,则覆盖。[NO] |
START_JOB |
开始或恢复当前的工作. 有效关键字:SKIP_CURRENT |
STATUS |
指定显示导出作用进程的详细状态,默认值为 0 |
STOP_JOB |
有序关闭作业执行并退出客户端。 有效关键字:IMMEDIATE |
STOP_WORKER |
停止挂起或卡住的线程或者进程。 |
TRACE |
为当前作业设置跟踪/调试标志。 |
impdp:数据泵导入程序
它提供了一种在Oracle数据库之间传输数据对象的机制。
如果您从来没使用过数据泵impdp导入程序,那么可以参考以下步骤。
虽然是废话文学,但还是得提一句;您想进行导入操作,那么您得确保您已经使用expdp导出了所需的dump文件。
创建完dump文件存储目录后,需要把expdp导出的dump文件挪到这里哦!
mkdir /home/oracle/dump
create or replace directory dump as '/home/oracle/dump';
查看创建的dump逻辑目录
select directory_name,directory_path from dba_directories;
在expdp章节里,已经给了hr用户对于dump目录的read和write权限 ;这里除了导出权限外,也需要给予hr导入数据库的权限。否则也会报错。
grant write,read on directory dump to hr;
grant exp_full_database to hr;
grant imp_full_database to hr;
大家按照下面的impdp导入代码进行导入
impdp HR/HR directory=dump dumpfile=hr.dmp remap_schema=hr:hrcopy logfile=impdp.log;
就会得到如下的报错
Import: Release 12.2.0.1.0 - Production on Sun Mar 31 19:50:26 2024
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-39002: invalid operation
ORA-39358: Export dump file version 19.0.0.0.0 not compatible with target version 12.2.0
这是我们非常有可能会遇到的一个情况,其实原因就是Oracle版本不同的问题。 在上文expdp的导出例子中,数据库环境是19C,这里的impdp导入数据库环境是12C。那么此时该咋整呢?
Follow me
expdp重新按版本导出
expdp HR/HR directory=dump dumpfile=hr.dmp schemas=HR version=12.2.0 logfile=expdp.log
[oracle@oracle19c tc]$ expdp HR/HR directory=dump dumpfile=hr.dmp schemas=HR version=12.2.0 logfile=expdp.log
Export: Release 19.0.0.0.0 - Production on Mon Apr 1 20:06:50 2024
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle and/or its affiliates. All rights reserved.
Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Starting "HR"."SYS_EXPORT_SCHEMA_01": HR/******** directory=dump dumpfile=hr.dmp schemas=HR version=12.2.0 logfile=expdp.log
Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
Processing object type SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
Processing object type SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
Processing object type SCHEMA_EXPORT/STATISTICS/MARKER
Processing object type SCHEMA_EXPORT/USER
Processing object type SCHEMA_EXPORT/SYSTEM_GRANT
Processing object type SCHEMA_EXPORT/ROLE_GRANT
Processing object type SCHEMA_EXPORT/DEFAULT_ROLE
Processing object type SCHEMA_EXPORT/TABLESPACE_QUOTA
Processing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
Processing object type SCHEMA_EXPORT/SEQUENCE/SEQUENCE
Processing object type SCHEMA_EXPORT/TABLE/TABLE
Processing object type SCHEMA_EXPORT/TABLE/COMMENT
Processing object type SCHEMA_EXPORT/PROCEDURE/PROCEDURE
Processing object type SCHEMA_EXPORT/PROCEDURE/ALTER_PROCEDURE
Processing object type SCHEMA_EXPORT/VIEW/VIEW
Processing object type SCHEMA_EXPORT/TABLE/INDEX/INDEX
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/REF_CONSTRAINT
Processing object type SCHEMA_EXPORT/TABLE/TRIGGER
. . exported "HR"."SYS_EXPORT_FULL_01" 574.9 KB 3198 rows
. . exported "HR"."EMPLOYEES" 17.08 KB 107 rows
. . exported "HR"."LOCATIONS" 8.437 KB 23 rows
. . exported "HR"."JOB_HISTORY" 7.195 KB 10 rows
. . exported "HR"."JOBS" 7.109 KB 19 rows
. . exported "HR"."DEPARTMENTS" 7.125 KB 27 rows
. . exported "HR"."RO" 6.820 KB 5 rows
. . exported "HR"."RI" 6.375 KB 5 rows
. . exported "HR"."ASI" 6.382 KB 5 rows
. . exported "HR"."COUNTRIES" 6.367 KB 25 rows
. . exported "HR"."REGIONS" 5.546 KB 4 rows
. . exported "HR"."WJZ" 0 KB 0 rows
Master table "HR"."SYS_EXPORT_SCHEMA_01" successfully loaded/unloaded
******************************************************************************
Dump file set for HR.SYS_EXPORT_SCHEMA_01 is:
/home/oracle/tc/hr.dump
Job "HR"."SYS_EXPORT_SCHEMA_01" successfully completed at Mon Apr 1 20:08:51 2024 elapsed 0 00:01:57
OK,现在已经重新导出成功了,大家可以看上面的输出,输出内容中有显示有HR.ASI这个表;但我的12C库中现在是没有这个表的。
OK,那么现在开始正式进行impdp导入,这次的例子是将HR用户导入到目标库12C。且给其换一个schema name,因为HR是Oracle安装默认用户已经有了,我这边偷个懒也不愿意新建用户,也不愿意覆盖掉它。
impdp SYSTEM/oracle directory=dump dumpfile=hr.dmp remap_schema=hr:hrcopy logfile=impdp.log;
写完命令回车,就会得到如下输出。
Import: Release 12.2.0.1.0 - Production on Sun Mar 31 20:19:12 2024
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
Master table "SYSTEM"."SYS_IMPORT_FULL_01" successfully loaded/unloaded
Starting "SYSTEM"."SYS_IMPORT_FULL_01": SYSTEM/******** directory=dump dumpfile=hr.dmp remap_schema=hr:hrcopy logfile=impdp.log
Processing object type SCHEMA_EXPORT/USER
Processing object type SCHEMA_EXPORT/SYSTEM_GRANT
Processing object type SCHEMA_EXPORT/ROLE_GRANT
Processing object type SCHEMA_EXPORT/DEFAULT_ROLE
Processing object type SCHEMA_EXPORT/TABLESPACE_QUOTA
Processing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
Processing object type SCHEMA_EXPORT/SEQUENCE/SEQUENCE
Processing object type SCHEMA_EXPORT/TABLE/TABLE
Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
. . imported "HRCOPY"."SYS_EXPORT_FULL_01" 574.9 KB 3198 rows
. . imported "HRCOPY"."EMPLOYEES" 17.08 KB 107 rows
. . imported "HRCOPY"."LOCATIONS" 8.437 KB 23 rows
. . imported "HRCOPY"."JOB_HISTORY" 7.195 KB 10 rows
. . imported "HRCOPY"."JOBS" 7.109 KB 19 rows
. . imported "HRCOPY"."DEPARTMENTS" 7.125 KB 27 rows
. . imported "HRCOPY"."RO" 6.820 KB 5 rows
. . imported "HRCOPY"."RI" 6.375 KB 5 rows
. . imported "HRCOPY"."ASI" 6.382 KB 5 rows
. . imported "HRCOPY"."COUNTRIES" 6.367 KB 25 rows
. . imported "HRCOPY"."REGIONS" 5.546 KB 4 rows
. . imported "HRCOPY"."WJZ" 0 KB 0 rows
Processing object type SCHEMA_EXPORT/TABLE/COMMENT
Processing object type SCHEMA_EXPORT/PROCEDURE/PROCEDURE
Processing object type SCHEMA_EXPORT/PROCEDURE/ALTER_PROCEDURE
Processing object type SCHEMA_EXPORT/VIEW/VIEW
Processing object type SCHEMA_EXPORT/TABLE/INDEX/INDEX
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
Processing object type SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/REF_CONSTRAINT
Processing object type SCHEMA_EXPORT/TABLE/TRIGGER
Processing object type SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
Processing object type SCHEMA_EXPORT/STATISTICS/MARKER
ORA-39367: Statistcis are being skipped. Cannot locate the time zone version 32 file.
Job "SYSTEM"."SYS_IMPORT_FULL_01" completed with 1 error(s) at Sun Mar 31 20:20:18 2024 elapsed 0 00:01:01
下面来验证下导入的数据,导入完成后,重新查询HRCOPY用户下的ASI表,可以发现已经导入成功了。
和expdp一样,impdp参数灰常多。但也可以精简出比较常用的几种。下面和朋友们分享下。
字面意思,代码如下。
asi.dmp 文件中的表,此文件是以 hr 用户按 schemas=hr 导出的。
impdp HR/HR directory=dump dumpfile=asi.dmp tables=asi logfile=impdp.log tables=p_street_area
从hr用户中把表RI和RO导入到system用户 ,如果表存在,就替换掉。
impdp system/oracle directory=dump dumpfile=expdp.dmp tables=hr.ro,hr.ri remap_schema=hr:system table_exists_action=replace logfile=impdp.log
字面意思,代码如下。
可以将用户信息直接导入,即如果用户信息不存在的情况下也可以直接导入。
impdp hr/hr directory=dump dumpfile=hr.dmp schemas=HR logfile=impdp.log
从源数据库中向目标数据库导入表 ro
DBLINKPRO是目的数据库与源数据的链接名,也就是DBlink。
数据迁移的时候就很有可能会用到此方案。
impdp HR/HR directory=dump NETWORK_LINK=DBLINKPRO tables=RO logfile=DBLINKPRO.log
(1)
朋友们可以看下,现在使用的用户换了。
如果是用 sys 用户导出的用户数据,包括用户创建、授权部分,用自身用户导出则不含这些内容。
OK,那么开始导出HR下的所有表
expdp system/oracle directory=dump dumpfile=hr.dmp SCHEMAS=HR logfile=expdp.log
(2)
以下是将 hr 用户下的数据全部导入到表空间 TEST(原来为 USERS表空间下)下
impdp system/oracle directory=dump dumpfile=hr.dmp remap_tablespace=USERS:TEST
字面意思,代码如下。
impdb system/oracle directory=dump dumpfile=full.dmp full=y logfile=impdp.log;
impdp导入程序的参数和expdp相比,大部分都一致;其中有些impdp独有的参数,在这里单独梳理出来。
参数 | 说明 |
REMAP_DATAFILE |
该选项用于将源数据文件名转变为目标数据文件名,在不同平台之间迁移表空间时可能需要该选项 例子:REMAP_DATAFIEL=source_datafie:target_datafile |
REMAP_SCHEMA |
该选项用于将源schema的所有对象装载到目标schema中 例子:REMAP_SCHEMA=source_schema:target_schema |
REMAP_TABLESPACE |
将源表空间的所有对象导入到目标表空间中 REMAP_TABLESPACE=source_tablespace:target:tablespace |
REUSE_DATAFILES |
该选项指定建立表空间时是否覆盖已存在的数据文件 有效关键字:[N]、Y |
SKIP_UNUSABLE_INDEXES |
指定导入是是否跳过不可使用的索引 有效关键字:[N]、Y |
SQLFILE |
指定将导入要指定的所有DDL 操作写入到 SQL 脚本中 例子: SQLFILE=[directory_object:]file_name |
STREAMS_CONFIGURATION |
指定是否导入流元数据(Stream Matadata) 有效关键字:[YES]、NO |
TABLE_EXISTS_ACTION |
该选项用于指定当表已经存在时,导入作业要执行的操作。 有效关键字:APPEND, REPLACE, [SKIP] ,TRUNCATE 【 当设置该选项为 SKIP 时,导入作业会跳过已存在表处理下一个对象; 当设置为 APPEND 时,会追加数据; 当设置为TRUNCATE 时,导入作业会截断表,然后为其追加新数据; 当设置为 REPLACE 时, 导入作业会删除已存在表,重建表并追加数据; 】 注意,TRUNCATE 选项不适用与簇表和 NETWORK_LINK 选项 |
TRANSFORM |
该选项用于指定是否修改建立对象的 DDL 语句 有效关键字:DISABLE_ARCHIVE_LOGGING, INMEMORY, INMEMORY_CLAUSE, LOB_STORAGE, OID, PCTSPACE, SEGMENT_ATTRIBUTES, SEGMENT_CREATION, STORAGE, TABLE_COMPRESSION_CLAUSE. 例子: Impdp hr/hr directory=dump dumpfile=tab.dmp transform=segment_attributes:n:table |
TRANSPORT_DATAFILES |
该选项用于指定迁移空间时要被导入到目标数据库的数据文件 例子: Impdp system/manager DIRECTORY=dump DUMPFILE=tts.dmp TRANSPORT_DATAFILES=’/user01/data/tbs1.dbf’ |
数据泵初探就先探到这里啦,感谢您的阅读。
❀❀❀❀❀❀❀❀❀❀❀❀
祝大家周末愉快哦!!!
❀❀❀❀❀❀❀❀❀❀❀❀