作为用于高速数据和元数据移动的基于服务器的工具,Oracle Data Pump 具有:
可通过DBMS_DATAPUMP调用
提供以下工具:
expdp
impdp
Oracle Data Pump是Oracle数据库提供的一种数据导入导出工具,它可以快速地将数据从一个Oracle数据库实例复制到另一个实例。以下是Oracle Data Pump的一些主要优点:
高效性:通过多线程并行导出、压缩和导入数据,可以显著提高数据迁移的速度和效率。
灵活性:可以选择要导入或导出的数据和表,以满足不同的需求。同时支持对细粒度数据进行导入,提供了重映射等能力。
安全性:数据在传输和存储过程中进行了加密,以保证数据的安全性。
重启能力:如果在迁移过程中发生中断,Oracle Data Pump具有重新启动作业的能力,可以从上次中断的地方继续执行。
并行执行:支持并行处理,这可以进一步提高大数据量迁移的效率。
估算空间需求:该工具具有估算空间需求的能力,有助于提前规划和分配足够的资源。
网格方式操作:Oracle Data Pump支持网格计算,这使得它能够在分布式环境中更有效地利用资源。
关联运行作业:允许用户关联多个作业,以便按顺序或并行执行它们,从而提高了操作的便利性。
Oracle数据库导入导出的基本概念
exp/imp EXPDP/IMPDP的基本概念
EXPDP和IMPDP叫做数据泵(Oracle Data Pump),是ORACLE10G开始出现的导入导出工具,相对于数据泵EXP和IMP叫做传统导入导出工具(the original Export and Import utilities),一般来说,ORACLE建议使用数据泵,因为他支持ORACLE10G之后的所有新特性,而传统导入导出工具不支持。这两种类型的导入导出工具都支持跨操作系统平台和跨ORACLE版本。
1)EXPDP/IMPDP数据泵是服务端的工具,它只能在服务端使用而不能在客户端使用,也不能在DG库上使用
2)exp/imp可以在服务端和客户端使用,也可以在只读的DG库上使用
1、命令行客户端(expdp和impdp)
2、 DBMS_DATAPUMP包 (也就是Data Pump API)
3、 DBMS_METADATA包 (也就是Metadata API)
命令行客户端与传统的exp和imp非常相似,但它是通过使用DBMS_DATAPUMP包提供的过程执行导入导出命名。所有的数据泵执行过程都是在服务器端进行的,这意味着所有的非授权用户,需要让DBA创建一个DIRECTORY来读写数据泵文件。对于授权用户,有一个默认的DIRECTORY可以用。DBMS_DATAPUMP 和DBMS_METADATA包可以独立于expdp、impdp而独立使用,就像ORACLE的其他包一样。
1、字符集检查,检查源库、目标库的字符集字符集是否一致
select userenv('language') from dual;
AMERICAN_AMERICA.AL32UTF8
echo $NLS_LANG
AMERICAN_AMERICA.AL32UTF8
需要保证源库上的字符集和目标库上的字符集一样,否则expdp/impdp (exp/imp) 容易报告错误,并且丟数据。
另外,需要保证环境变量NLS_LANG和数据库字符集一样,如不一致,需在导入之前先设置字符集
如:如果数据库字符集是AL32UTF8
export nls_lang=AMERICAN_AMERICA.AL32UTF8,而且需要重新登录后生效,可以使用env|grep NLS检查确认
2、数据库版本检查,检查源库和目标库的数据库版本是否都是同一版本,不同版本需要考虑的情况不同。默认从低版本到高版本可以兼容,从高版本到低版本需要注意。
select * from v$version;
3、存储容量检查,主要检查目标库存储大小是否满足
asm
lsdg
Linux
df -h
4、表空间检查
select df.tablespace_name tbs,
totalspace total_mb,
decode(maxbytes,
0,
freespace,
freespace + df.auto_totalspace - df.totalspace) free_mb,
decode(maxbytes,
0,
round((1 - freespace / totalspace) * 100, 2),
round((1 - (freespace + df.auto_totalspace - df.totalspace) /
auto_totalspace) * 100,
2)) used_rate
from (select tablespace_name,
round(sum(bytes) / 1024 / 1024) totalspace,
round(sum(decode(AUTOEXTENSIBLE, 'YES', maxbytes, bytes)) / 1024 / 1024) auto_totalspace,
max(maxbytes) maxbytes
from dba_data_files
group by tablespace_name) df,
(select tablespace_name, round(sum(bytes) / 1024 / 1024) freespace
from dba_free_space
group by tablespace_name) fs
where df.tablespace_name = fs.tablespace_name
order by 4;
检查表空间对应的数据文件大小
select tablespace_name, file_name, bytes / 1024 / 1024
from dba_data_files
where tablespace_name in ('USERS');
4、 用户检查
检查用户所对应表空间
select username, account_status, default_tablespace
from dba_users
where username in ('APPS')
order by 2;```
检查所属owner
select distinct owner, segment_type, tablespace_name
from dba_extents
where owner in ('APPS');
5、 数据检查
检查表的行数
select table_name, num_rows
from all_tables
where owner = 'FAXDBSERVER'
group by table_name, num_rows
having num_rows > 500
order by table_name;
检查对象的数量
Select owner, object_type, count(*)
from dba_objects
where owner = 'APPS'
group by owner, object_type
order by owner, object_type;
6、 数据库大小检查
select sum(SumMB) / 1024,
sum(usedMB) / 1024,
sum(freeMB) / 1024,
(sum(usedMB) / 1024 + sum(freeMB) / 1024)
from (select a.tablespace_name,
a.bytes / 1024 / 1024 SumMB,
(a.bytes - b.bytes) / 1024 / 1024 usedMB,
b.bytes / 1024 / 1024 freeMB,
round(((a.bytes - b.bytes) / a.bytes) * 100, 2) "percent_used"
from (select tablespace_name, sum(bytes) bytes
from dba_data_files
group by tablespace_name) a,
(select tablespace_name, sum(bytes) bytes, max(bytes) largest
from dba_free_space
group by tablespace_name) b
where a.tablespace_name = b.tablespace_name);
1.ATTACH=[schema_name.]job_name
Schema_name 用于指定方案名,job_name 用于指定导出作业名.注意,如果使用 ATTACH
选项,在命令行除了连接字符串和 ATTACH 选项外,不能指定任何其他选项,示例如下:
expdp hr/hr ATTACH=hr.export_job
该选项用于指定要导出的内容.默认值为 ALL CONTENT={ALL | DATA_ONLY | METADATA_ONLY}
当设置 CONTENT
为 ALL 时,将导出对象定义及其所有数据.
为 DATA_ONLY 时,只导出对象数据,
为 METADATA_ONLY 时,只导出对象定义
expdp hr/hr DIRECTORY=dump DUMPFILE=a.dump CONTENT=METADATA_ONLY
指定转储文件和日志文件所在的目录 DIRECTORY=directory_object
Directory_object 用于指定目录对象名称.需要注意,目录对象是使用 CREATE DIRECTORY
语句建立的对象,而不是 OS 目录
sys用户下建立
mkdir -p /home/oracle/dump --必须在ORACLE用户下使用(操作系统)
create or replace directory dump as ‘/home/oracle/dump’;
普通用户给他相应的权限
grant read, write on directory dump to hr;
grant exp_full_database to hr;
检查目录
desc dba_directories;
set lines 1000
set pages 100
col owner for a5
col DIRECTORY_NAME for a25
col DIRECTORY_PATH for a80
select * from dba_directories;
其他用户需要有exp_full_database to hr权限;
expdp hr/hr DIRECTORY=dump DUMPFILE=hr.dump
用于指定转储文件的名称,默认名称为 expdat.dmp DUMPFILE=[directory_object:]file_name [,….]
Directory_object 用于指定目录对象名,file_name 用于指定转储文件名.需要注意,如果不指
定 directory_object,导出工具会自动使用 DIRECTORY 选项指定的目录对象
expdp hr/hr DIRECTORY=dump1 DUMPFILE=dump2:a.dmp
指定估算被导出表所占用磁盘空间分方法.默认值是 BLOCKS ESTIMATE={BLOCKS | STATISTICS}
设置为 BLOCKS 时,oracle 会按照目标对象所占用的数据块个数乘以数据块尺寸估算对象占用
的空间,设置为 STATISTICS 时,根据最近统计值估算对象占用空间
expdp hr/hr TABLES=emp ESTIMATE=STATISTICS DIRECTORY=dump DUMPFILE=a.dump
指定是否只估算导出作业所占用的磁盘空间,默认值为 N EXTIMATE_ONLY={Y | N}
设置为 Y 时,导出作用只估算对象所占用的磁盘空间,而不会执行导出作业,为 N 时,不仅估算对
象所占用的磁盘空间,还会执行导出操作.
expdp hr/hr ESTIMATE_ONLY=y NOLOGFILE=y
该选项用于指定执行操作时释放要排除对象类型或相关对象 EXCLUDE=object_type[:name_clause] [,….]
Object_type 用于指定要排除的对象类型,name_clause 用于指定要排除的具体对象
EXCLUDE 和 INCLUDE 不能同时使用
expdp hr/hr DIRECTORY=dump DUMPFILE=a.dup EXCLUDE=VIEW
常用排除命令:
EXCLUDE=SEQUENCE,VIEW --过滤所有的SEQUENCE,VIEW
EXCLUDE=INDEX --过滤所有的INDEX
EXCLUDE=TABLE:“IN (‘EMP’,‘DEPT’)” --过滤表对象EMP,DEPT
EXCLUDE=SEQUENCE,VIEW,TABLE:“IN (‘EMP’,‘DEPT’)” --过滤所有的SEQUENCE,VIEW以及表对象EMP,DEPT
EXCLUDE=INDEX:“= ‘INDX_NAME’” --过滤指定的索引对象INDX_NAME
INCLUDE=PROCEDURE:“LIKE ‘PROC_U%’” --包含以PROC_U开头的所有存储过程(_ 符号代表任意单个字符)
INCLUDE=TABLE:"> ‘E’ " --包含大于字符E的所有表对象
指定导出文件的最大尺寸,默认为 0,(表示文件尺寸没有限制)
指定导出特定 SCN 时刻的表数据
FLASHBACK_SCN=scn_value
Scn_value 用于标识 SCN 值.FLASHBACK_SCN 和 FLASHBACK_TIME 不能同时使用
expdp hr/hr DIRECTORY=dump DUMPFILE=a.dmp FLASHBACK_SCN=358523
FLASHBACK_TIME
指定导出特定时间点的表数据 FLASHBACK_TIME=”TO_TIMESTAMP(time_value)”
expdp hr/hr DIRECTORY=dump DUMPFILE=a.dmp FLASHBACK_TIME=“TO_TIMESTAMP(’25-08-2004 14:35:00’,’DD-MM-YYYY HH24:MI:SS’)”
指定数据库模式导出,默认为 N FULL={Y | N}
为 Y 时,标识执行数据库导出.
指定是否显示 expdp 命令行选项的帮助信息,默认为 N
当设置为 Y 时,会显示导出选项的帮助信息. expdp help=y
指定导出时要包含的对象类型及相关对象
INCLUDE = object_type[:name_clause] [,… ] 在导数据过程中有如下参数比较好用: TABLE_DATA 表中的数据
TABLE 表的定义,就是 create table 的语句,include 后只写 table 参 数,将只创建表结构,exclude 后写 table 参数导入过程将不执行 create table 命令。
OBJECT_GRANT 对象赋权操作
INDEX 索引定义,情况跟 table 一致
CONSTRAINT 约束 INDEX_STATISTICS 索引统计信息 TABLE_STATISTICS 表的统计信息
在未使用 parfile 文件的情形下,所有的符号都需要进行转义,包括括号,双引号,单引号等
# expdp system/manager DIRECTORY=my_dir DUMPFILE=exp_tab.dmp
LOGFILE=exp_tab.log SCHEMAS=hr
INCLUDE=TABLE:\"IN \(\'EMPOLYEES\', \'DEPARTMENTS\'\)\"
指定要导出作用的名称,默认为 SYS_XXX JOB_NAME=jobname_string
SELECT * FROM DBA_DATAPUMP_JOBS;–查看存在的 job
指定导出日志文件文件的名称,默认名称为 export.log LOGFILE=[directory_object:]file_name
Directory_object 用于指定目录对象名称,file_name 用于指定导出日志文件名.如果不指定
directory_object.导出作用会自动使用 DIRECTORY 的相应选项值.
expdp hr/hr DIRECTORY=dump DUMPFILE=a.dmp logfile=a.log
指定数据库连接名,如果要将远程数据库对象导出到本地实例的转储文件中,必须设置该选项.
如:expdp hr/hr directory=dir_dp NETWORK_LINK=igisdb tables=p_street_area dumpfile =p_street_area.dmp
logfile=p_street_area.log job_name=my_job igisdb 是目的数据库与源数据的链接名,
dir_dp 是目的数据库上的目录
而如果直接用使用连接字符串(@orcl),expdp 属于服务端工具,expdp 生成的文件默认是 存放在服务端的
该选项用于指定禁止生成导出日志文件,默认值为 N.
指定执行导出操作的并行进程个数,默认值为 1
注:并行度设置不应该超过 CPU 数的 2 倍,如果 cpu 为 2 个,可将 PARALLEL 设为 2,在导入时速度比 PARALLEL 为 1 要快
而对于导出的文件,如果 PARALLEL 设为 2,导出文件只有一个,导出速度提高不多,因为导出都是到同一个文件,会争抢资源。所以可以设置导出文件为两个,如下所示:
expdp hr/hr directory=d_test dumpfile=hrfile1.dmp,hrfile2.dp parallel=2
指定导出参数文件的名称 PARFILE=[directory_path] file_name
用于指定过滤导出数据的 where 条件 QUERY=[schema.] [table_name:] query_clause
Schema 用于指定方案名,table_name 用于指定表名,query_clause 用于指定条件限制子句.
QUERY 选项不能与 CONNECT=METADATA_ONLY,EXTIMATE_ONLY,TRANSPORT_TABLESPACES 等选项 同时使用.
expdp hr/hr directory=dump dumpfile=a.dmp Tables=emp query=’WHERE deptno=20’
该方案用于指定执行方案模式导出,默认为当前用户方案.
指定显示导出作用进程的详细状态,默认值为 0
指定表模式导出 TABLES=[schema_name.]table_name[:partition_name][,…]
Schema_name 用于指定方案名,table_name 用于指定导出的表名,partition_name 用于指
定要导出的分区名.
指定要导出表空间列表
该选项用于指定被迁移表空间和未迁移表空间关联关系的检查方式,默认为 N.
当设置为 Y 时,导出作用会检查表空间直接的完整关联关系,如果表空间所在表空间或其索引所在的表空间只有一个表空间被迁移,将显示错误信息.当设置为 N 时,导出作用只检查单端依赖,
如果迁移索引所在表空间,但未迁移表所在表空间,将显示出错信息,如果迁移表所在表空间,未迁移索引所在表空间,则不会显示错误信息.
指定执行表空间模式导出
指定被导出对象的数据库版本,默认值为 COMPATIBLE. VERSION={COMPATIBLE | LATEST | version_string}
为 COMPATIBLE 时,会根据初始化参数 COMPATIBLE 生成对象元数据;为 LATEST 时,会根据
数据库的实际版本生成对象元数据.version_string 用于指定数据库版本字符串.调用 expdp
导出的相关命令使用:
1)Ctrl+C 组合键:在执行过程中,可以按 Ctrl+C 组合键退出当前交互模式,退出之后, 导出操作不会停止
2)Export> status --查看当前 JOB 的状态及相关信息
3)Export> stop_job --暂停 JOB(暂停 job 后会退出 expor 模式)
4)重新进入 export 模式下:C:\Documents and Settings\Administrator>expdp lttfm/lttfm attach=lttfm.my_job1 --语句后面不带分号
5)Export> start_job --打开暂停的 JOB(并未开始重新执行)
6)Export> continue_client --通过此命令重新启动 “LTTFM”.“MY_JOB”:
7)Export> kill_job --取消当前的 JOB 并释放相关客户会话(将 job 删除同时 删除 dmp 文件)
8)Export> exit_client --通过此命令退出 export 模式(通过 4)可再进入
export 模式下)
注:导出完成后 job 自动卸载
数据泵导出的各种模式:
1)导出用户及其对象
expdp hr/hr schemas=hr dumpfile=expdp.dmp directory=dump logfile=expdp.log;
2)导出指定表
expdp hr/hr tables=employees,departments dumpfile=expdp.dmp directory=dump_dir logfile=expdp.log;
3)按查询条件导
expdp hr/hr directory=dump dumpfile=expdp.dmp tables=empquery='where deptno=20' logfile=expdp.log;
4)按表空间导
expdp system/oracle directory=dump dumpfile=tablespace.dmp tablespaces=temp,example logfile=expdp.log;
5)导整个数据库
expdp system/oracle directory=dump dumpfile=ly.dmp full=y logfile=expdp.log;
IMPDP 命令行选项与 expdp 有很多相同的,不同的有:
1、REMAP_DATAFILE
该选项用于将源数据文件名转变为目标数据文件名,在不同平台之间迁移表空间时可能需要该选项.
REMAP_DATAFIEL=source_datafie:target_datafile
2、REMAP_SCHEMA
该选项用于将源方案的所有对象装载到目标方案中. REMAP_SCHEMA=source_schema:target_schema
3、REMAP_TABLESPACE
将源表空间的所有对象导入到目标表空间中
REMAP_TABLESPACE=source_tablespace:target:tablespace
4、REUSE_DATAFILES
该选项指定建立表空间时是否覆盖已存在的数据文件.默认为 N REUSE_DATAFIELS={Y | N}
5、SKIP_UNUSABLE_INDEXES
指定导入是是否跳过不可使用的索引,默认为 N
6、SQLFILE
指定将导入要指定的索引 DDL 操作写入到 SQL 脚本中
SQLFILE=[directory_object:]file_name
Impdp hr/hr DIRECTORY=dump DUMPFILE=tab.dmp SQLFILE=a.sql
7、STREAMS_CONFIGURATION
指定是否导入流元数据(Stream Matadata),默认值为 Y.
8、TABLE_EXISTS_ACTION
该选项用于指定当表已经存在时导入作业要执行的操作,默认为 SKIP
TABBLE_EXISTS_ACTION={SKIP | APPEND | TRUNCATE | FRPLACE }
当设置该选项为 SKIP 时,导入作业会跳过已存在表处理下一个对象;当设置为 APPEND 时,会 追加数据,为 TRUNCATE 时,导入作业会截断表,然后为其追加新数据;当设置为 REPLACE 时, 导入作业会删除已存在表,重建表病追加数据,注意,TRUNCATE 选项不适用与簇表和 NETWORK_LINK 选项
9、TRANSFORM
该选项用于指定是否修改建立对象的 DDL 语句
TRANSFORM=transform_name:value[:object_type]
Transform_name 用于指定转换名,其中 SEGMENT_ATTRIBUTES 用于标识段属性(物理属 性,存储属性,表空间,日志等信息),STORAGE 用于标识段存储属性,VALUE 用于指定是否包含 段属性或段存储属性,object_type 用于指定对象类型.
Impdp hr/hr directory=dump dumpfile=tab.dmp Transform=segment_attributes:n:table
10、TRANSPORT_DATAFILES
该选项用于指定迁移空间时要被导入到目标数据库的数据文件
TRANSPORT_DATAFILE=datafile_name
Datafile_name 用于指定被复制到目标数据库的数据文件
Impdp system/manager DIRECTORY=dump DUMPFILE=tts.dmp TRANSPORT_DATAFILES=’/user01/data/tbs1.f’调用 IMPDP
impdp 导入模式:
1、按表导入
p_street_area.dmp 文件中的表,此文件是以 hr 用户按 schemas=hr 导出的:
impdp hr/hr dumpfile=p_street_area.dmp logfile=imp_p_street_area.log directory=dir_dp tables=p_street_area
2、按用户导入(可以将用户信息直接导入,即如果用户信息不存在的情况下也可以直接导入)
impdp hr/hr schemas=hr dumpfile=expdp_test.dmp logfile=expdp_test.log directory=dump
3、不通过 expdp 的步骤生成 dmp 文件而直接导入的方法:
–从源数据库中向目标数据库导入表 p_street_area
impdp hr/hr directory=dump NETWORK_LINK=igisdb tables=p_street_area logfile=p_street_area.log
igisdb 是目的数据库与源数据的链接名,dir_dp 是目的数据库上的目录
4、更换表空间
采用 remap_tablespace 参数
–导出 hr 用户下的所有数据
expdp system/oracle directory=dump dumpfile=hr.dmp SCHEMAS=hr
注:如果是用 sys 用户导出的用户数据,包括用户创建、授权部分,用自身用户导出则不含这 些内容
–以下是将 hr 用户下的数据全部导入到表空间 gcomm(原来为 gmapdata 表空间下)下
impdp system/oracle directory=dump dumpfile=hr.dmp remap_tablespace=gmapdata:gcomm
简化用法
1)导入用户(从用户hr导入到用户hr)
impdp hr/hr directory=dump dumpfile=expdp.dmp schemas=hr logfile=impdp.log;
导入用户(从hr导入到用户hr1)
impdp hr/hr directory=dump dumpfile=expdp.dmp remap_schema=hr:hr1 logfile=impdp.log;
2)导入表(从hr用户中把表dept和emp导入到system用户中)
impdp system/oracle directory=dump dumpfile=expdp.dmp tables=hr.dept,hr.emp remap_schema=hr:system logfile=impdp.log table_exists_action=replace (表空间已存在则替换);
3)导入表空间
impdp system/oracle directory=dump dumpfile=tablespace.dmp tablespaces=example logfile=impdp.log;
4)导入整个数据库
impdb system/oracle directory=dump dumpfile=full.dmp full=y logfile=impdp.log;
案例1
使用sys用户导出hr用户及其对象
1.创建目录
创建OS目录
mkdir -p /home/oracle/dump --必须在ORACLE用户下使用(操作系统)
2.创建转储文件和日志文件所在的目录
指定转储文件和日志文件所在的目录 DIRECTORY=directory_object
Directory_object 用于指定目录对象名称.需要注意,目录对象是使用 CREATE DIRECTORY
create or replace directory dump as ‘/home/oracle/dump’;
3.给目录授权
Grant read,write on directory dump to public;
4.检查目录是否创建成功
SET lines 160 pages 50000
COL directory_name FORMAT a40
COL directory_path FORMAT a80
COL grantee FORMAT a20
COL privilege FORMAT a10
SELECT directory_name, directory_path, grantee, privilege
FROM user_tab_privs t, all_directories d
WHERE t.table_name(+)=d.directory_name
ORDER BY 1,2,3;
5.导出数据
进入存储目录执行,方便查看日志
建议后台执行导出,避免数据量过大,异常终止。
nohup expdp ‘/ as sysdba’ schemas=hr dumpfile=expdphr.dmp directory=dump logfile=expdphr.log &
查看导出日志
可以查看nohup日志也可以查看expdphr.log日志
查看nohup日志,导出成功。
使用hr用户导出hr对象的所有资源
注意:由于上面存储目录和操作系统目录已经创建,直接使用即可
1.给hr用户导出数据库权限
grant exp_full_database to hr;
执行导出命令,后台导出
nohup expdp hr/hr schemas=hr dumpfile=expdphr01.dmp directory=dump logfile=expdphr01.log &
在操作系统目录/home/oracle/dump 可以看到新增的两个文件expdphr01.dmp expdphr01.log
查看导出日志expdphr01.log,导出成功
使用sys用户 导出hr指定表
查看hr用户下的表
SELECT table_name FROM all_tables WHERE owner = ‘HR’;
选择导出JOBS表
由于存储目录和权限不用重新授权,可直接执行导出命令
nohup expdp ‘/ as sysdba’ tables=hr.JOBS dumpfile=JOBS.dmp directory=dump logfile=JOBS.log &
查看日志,导出成功。
dmp文件和日志也对应的生成了
导入表
将上面导出的表(从hr用户中把表JOBS导入到system用户中)
nohup impdp ‘/ as sysdba’ directory=dump dumpfile=JOBS.dmp tables=hr.JOBS remap_schema=hr:system logfile=impdpJOBS.log &;
验证system下是否有JOBS表