学无止境
分类: Oracle
2013-10-11 14:27:00
使用数据泵的导出导入任务进行数据传输。
数据泵是一种基于数据库服务端的技术,所以需要使用到服务端的物理目录,不能将文件写到客户端上。
使用数据泵的用户,需要具有某个数据库目录的读写权限。
使用TABLES参数,表级别的导入导出:
expdp scott/tiger@db10g tables=EMP,DEPT directory=TEST_DIR dumpfile=EMP_DEPT.dmp logfile=expdpEMP_DEPT.log
impdp scott/tiger@db10g tables=EMP,DEPT directory=TEST_DIR dumpfile=EMP_DEPT.dmp logfile=impdpEMP_DEPT.log TABLE_EXISTS_ACTION=APPEND
TABLE_EXISTS_ACTION=APPEND表示允许数据导入到已存在的表中。imp工具使用的是IGNORE=y
使用SCHEMAS参数,schema级别的导入导出。exp工具使用的是OWNER
expdp scott/tiger@db10g schemas=SCOTT directory=TEST_DIR dumpfile=SCOTT.dmp logfile=expdpSCOTT.log
impdp scott/tiger@db10g schemas=SCOTT directory=TEST_DIR dumpfile=SCOTT.dmp logfile=impdpSCOTT.log
使用FULL参数,执行全库的导入导出
expdp system/password@db10g full=Y directory=TEST_DIR dumpfile=DB10G.dmp logfile=expdpDB10G.log
impdp system/password@db10g full=Y directory=TEST_DIR dumpfile=DB10G.dmp logfile=impdpDB10G.log
INCLUDE和EXCLUDE可以用于导出导入时指定对象。当使用INCLUDE参数时,只有指定的对象可以导出导入。当使用EXCLUDE参数时,除了这些对象的其他所有对象都可以导出导入。2个参数是相互排斥的,不能同时使用,2个参数的语法相同。
INCLUDE=object_type[:name_clause] [, ...]
EXCLUDE=object_type[:name_clause] [, ...]
例如:
expdp scott/tiger@db10g schemas=SCOTT include=TABLE:"IN ('EMP', 'DEPT')" directory=TEST_DIR dumpfile=SCOTT.dmp logfile=expdpSCOTT.log
expdp scott/tiger@db10g schemas=SCOTT exclude=TABLE:"= 'BONUS'" directory=TEST_DIR dumpfile=SCOTT.dmp logfile=expdpSCOTT.log
对于某些操作系统,需要使用转移字符
include=TABLE:\"IN (\'EMP\', \'DEPT\')\"
单个导出导入可以使用多个参数内容,例如:
INCLUDE=TABLE,VIEW,PACKAGE:"LIKE '%API'"
或
INCLUDE=TABLE
INCLUDE=VIEW
INCLUDE=PACKAGE:"LIKE '%API'"
所有可以包括或排除的对象类型,都显示在DATABASE_EXPORT_OBJECTS,SCHEMA_EXPORT_OBJECTS,TABLE_EXPORT_OBJECTS视图中。
通过查询dba_datapump_jobs视图,可以监控当前正在运行的数据泵任务,只有正在运行的才有显示。
SQL> select * from dba_datapump_jobs;
OWNER_NAME JOB_NAME OPERATION JOB_MODE STATE DEGREE ATTACHED_SESSIONS DATAPUMP_SESSIONS
-------------- ----------------------- ----------- ----------- ----------- ---------- ----------------- -----------------
TEST SYS_EXPORT_SCHEMA_01 EXPORT SCHEMA EXECUTING 1 1 3
数据泵提供了一个PL/SQL API,可以在数据库中执行数据泵的操作,不需要在操作系统上执行命令,也可以写成存储过程,放在数据库job中调度。
例如:
SET SERVEROUTPUT ON SIZE 1000000
DECLARE
l_dp_handle NUMBER;
l_last_job_state VARCHAR2(30) := 'UNDEFINED';
l_job_state VARCHAR2(30) := 'UNDEFINED';
l_sts KU$_STATUS;
BEGIN
l_dp_handle := DBMS_DATAPUMP.open(
operation => 'EXPORT',
job_mode => 'SCHEMA',
remote_link => NULL,
job_name => 'EMP_EXPORT',
version => 'LATEST');
DBMS_DATAPUMP.add_file(
handle => l_dp_handle,
filename => 'SCOTT.dmp',
directory => 'TEST_DIR');
DBMS_DATAPUMP.add_file(
handle => l_dp_handle,
filename => 'SCOTT.log',
directory => 'TEST_DIR',
filetype => DBMS_DATAPUMP.KU$_FILE_TYPE_LOG_FILE);
DBMS_DATAPUMP.metadata_filter(
handle => l_dp_handle,
name => 'SCHEMA_EXPR',
value => '= ''SCOTT''');
DBMS_DATAPUMP.start_job(l_dp_handle);
DBMS_DATAPUMP.detach(l_dp_handle);
END;
/
一旦job开始运行,就可以在dba_datapump_jobs视图中查看到。