陈老师:1415968548 郑老师:2735197625 乐老师:354331153
客服热线:
19941464235/19906632509(微信同号)

客服微信

【Oracle OCP】Oracle 19c Data Pump

作者:炎燚小寶
发布时间:2023-12-19 09:22
浏览量:341

本文为云贝教育 刘峰 原创,请尊重知识产权,转发请注明出处,不接受任何抄袭、演绎和未经注明出处的转载。


Oracle Data Pump 是以前 Oracle 版本中使用的“exp”和“imp”实用程序的更新、更快且更灵活的替代方案。除了基本的导入和导出功能之外,数据泵还提供 PL/SQL API 和对外部表的支持。


一、开始


为了使示例正常工作,我们必须首先解锁 SCOTT 帐户并创建一个它可以访问的目录对象。目录对象只是一个指向物理目录的指针,创建它并不会真正在数据库服务器的文件系统上创建物理目录。

CONN sys/oracle@pdb2 AS SYSDBA
ALTER USER scott IDENTIFIED BY tiger ACCOUNT UNLOCK;
CREATE OR REPLACE DIRECTORY test_dir AS '/home/oracle/scott_dir';
GRANT READ, WRITE ON DIRECTORY test_dir TO scott;
可以使用 ALL_DIRECTORIES 视图查询现有目录。


注意:数据泵是一种基于服务器的技术,因此它通常处理指向数据库服务器上物理目录的目录对象。它不会写入客户端 PC 上的本地文件系统。


如果没有scott用户,可以通过以下脚本创建

DROP USER SCOTT CASCADE;
    GRANT CONNECT,RESOURCE,UNLIMITED TABLESPACE TO SCOTT IDENTIFIED BY tiger;
    DROP PUBLIC SYNONYM PARTS;
CONNECT SCOTT/tiger@pdb2
CREATE TABLE DEPT
       (DEPTNO NUMBER(2) CONSTRAINT PK_DEPT PRIMARY KEY,
        DNAME VARCHAR2(14) ,
        LOC VARCHAR2(13) ) ;
CREATE TABLE EMP
       (EMPNO NUMBER(4) CONSTRAINT PK_EMP PRIMARY KEY,
        ENAME VARCHAR2(10),
        JOB VARCHAR2(9),
        MGR NUMBER(4),
        HIREDATE DATE,
        SAL NUMBER(7,2),
        COMM NUMBER(7,2),
        DEPTNO NUMBER(2) CONSTRAINT FK_DEPTNO REFERENCES DEPT);
INSERT INTO DEPT VALUES
        (10,'ACCOUNTING','NEW YORK');
INSERT INTO DEPT VALUES (20,'RESEARCH','DALLAS');
INSERT INTO DEPT VALUES
        (30,'SALES','CHICAGO');
INSERT INTO DEPT VALUES
        (40,'OPERATIONS','BOSTON');
INSERT INTO EMP VALUES
(7369,'SMITH','CLERK',7902,to_date('17-12-1980','dd-mm-yyyy'),800,NULL,20);
INSERT INTO EMP VALUES
(7499,'ALLEN','SALESMAN',7698,to_date('20-2-1981','dd-mm-yyyy'),1600,300,30);
INSERT INTO EMP VALUES
(7521,'WARD','SALESMAN',7698,to_date('22-2-1981','dd-mm-yyyy'),1250,500,30);
INSERT INTO EMP VALUES
(7566,'JONES','MANAGER',7839,to_date('2-4-1981','dd-mm-yyyy'),2975,NULL,20);
INSERT INTO EMP VALUES
(7654,'MARTIN','SALESMAN',7698,to_date('28-9-1981','dd-mm-yyyy'),1250,1400,30);
INSERT INTO EMP VALUES
(7698,'BLAKE','MANAGER',7839,to_date('1-5-1981','dd-mm-yyyy'),2850,NULL,30);
INSERT INTO EMP VALUES
(7782,'CLARK','MANAGER',7839,to_date('9-6-1981','dd-mm-yyyy'),2450,NULL,10);
INSERT INTO EMP VALUES
(7788,'SCOTT','ANALYST',7566,to_date('13-JUL-87','dd-mm-rr')-85,3000,NULL,20);
INSERT INTO EMP VALUES
(7839,'KING','PRESIDENT',NULL,to_date('17-11-1981','dd-mm-yyyy'),5000,NULL,10);
INSERT INTO EMP VALUES
(7844,'TURNER','SALESMAN',7698,to_date('8-9-1981','dd-mm-yyyy'),1500,0,30);
INSERT INTO EMP VALUES
(7876,'ADAMS','CLERK',7788,to_date('13-JUL-87', 'dd-mm-rr')-51,1100,NULL,20);
INSERT INTO EMP VALUES
(7900,'JAMES','CLERK',7698,to_date('3-12-1981','dd-mm-yyyy'),950,NULL,30);
INSERT INTO EMP VALUES
(7902,'FORD','ANALYST',7566,to_date('3-12-1981','dd-mm-yyyy'),3000,NULL,20);
INSERT INTO EMP VALUES
(7934,'MILLER','CLERK',7782,to_date('23-1-1982','dd-mm-yyyy'),1300,NULL,10);
CREATE TABLE BONUS
        (
        ENAME VARCHAR2(10)      ,
        JOB VARCHAR2(9)  ,
        SAL NUMBER,
        COMM NUMBER
        ) ;
CREATE TABLE SALGRADE
      ( GRADE NUMBER,
        LOSAL NUMBER,
        HISAL NUMBER );
INSERT INTO SALGRADE VALUES (1,700,1200);
INSERT INTO SALGRADE VALUES (2,1201,1400);
INSERT INTO SALGRADE VALUES (3,1401,2000);
INSERT INTO SALGRADE VALUES (4,2001,3000);
INSERT INTO SALGRADE VALUES (5,3001,9999);
COMMIT;


二、表导入导出

TABLES 参数用于指定要导出的表。以下是表导出和导入语法的示例。

expdp scott/tiger@pdb2 tables=EMP,DEPT directory=TEST_DIR dumpfile=EMP_DEPT.dmp logfile=expdpEMP_DEPT.log
impdp scott/tiger@pdb2 tables=EMP,DEPT directory=TEST_DIR dumpfile=EMP_DEPT.dmp logfile=impdpEMP_DEPT.log
TABLE_EXISTS_ACTION=APPEND 参数允许将数据导入到现有表中。



三、模式导入导出

exp 的 OWNER 参数已替换为 SCHEMAS 参数,该参数用于指定要导出的模式。以下是架构导出和导入语法的示例。

expdp scott/tiger@pdb1 schemas=SCOTT directory=TEST_DIR dumpfile=SCOTT.dmp logfile=expdpSCOTT.log


impdp scott/tiger@pdb1 schemas=SCOTT directory=TEST_DIR dumpfile=SCOTT.dmp logfile=impdpSCOTT.log


四、数据库导入导出

FULL 参数表示需要完整的数据库导出。以下是完整数据库导出和导入语法的示例。

expdp system/oracle@pdb2 full=Y directory=TEST_DIR dumpfile=PDB1.dmp logfile=expdpPDB1.log
impdp system/oracle@pdb2 full=Y directory=TEST_DIR dumpfile=expdpPDB1.dmp logfile=expdpPDB1.log
执行导出的数据库用户将需要 DATAPUMP_EXP_FULL_DATABASE 角色,执行导入的用户将需要 DATAPUMP_IMP_FULL_DATABASE 角色。



五、INCLUDE 和EXCLUDE参数

INCLUDE 和 EXCLUDE 参数可用于限制导出/导入特定对象。当使用 INCLUDE 参数时,只有它指定的对象才会包含在导出/导入中。当使用 EXCLUDE 参数时,除该参数指定的对象之外的所有对象都将包含在导出/导入中。这两个参数是互斥的,因此请使用需要最少条目的参数来获得所需的结果。两个参数的基本语法是相同的。

INCLUDE=object_type[:name_clause] [, ...]
EXCLUDE=object_type[:name_clause] [, ...]


以下代码显示了如何将它们用作命令行参数。

expdp scott/tiger@pdb2 schemas=SCOTT include=TABLE:"IN ('EMP', 'DEPT')" directory=TEST_DIR dumpfile=SCOTT.dmp logfile=expdpSCOTT.log
expdp scott/tiger@pdb2 schemas=SCOTT exclude=TABLE:"= 'BONUS'" directory=TEST_DIR dumpfile=SCOTT.dmp logfile=expdpSCOTT.log


如果从命令行使用该参数,则可能需要对子句中的特殊字符进行转义,具体取决于您的操作系统,如下所示。因此,使用参数文件更容易。

include=TABLE:\"IN \(\'EMP\', \'DEPT\'\)\"
exclude=TABLE:\"\= \'BONUS\'\"

单个导入/导出可以包含对参数的多个引用,因此要导出表、视图和一些包,我们可以使用以下方法之一。

INCLUDE=TABLE,VIEW,PACKAGE:"LIKE '%API'"
or
INCLUDE=TABLE
INCLUDE=VIEW
INCLUDE=PACKAGE:"LIKE '%API'"

使用 LIKE 和 IN 运算符可以在一次语句中定位多个对象。

EXCLUDE=SCHEMA:"LIKE 'SYS%'"
EXCLUDE=SCHEMA:"IN ('OUTLN','SYSTEM','SYSMAN','FLOWS_FILES','APEX_030200','APEX_PUBLIC_USER','ANONYMOUS')"

可以使用 DATABASE_EXPORT_OBJECTS、SCHEMA_EXPORT_OBJECTS 和 TABLE_EXPORT_OBJECTS 视图显示可以包含或排除的有效对象类型路径。



六、CONTENT and QUERY参数

CONTENT 参数允许您更改导出的内容。以下命令使用 METADATA_ONLY 参数值导出不含数据的架构内容。

expdp system/password@pdb2 schemas=SCOTT directory=TEST_DIR dumpfile=scott_meta.dmp logfile=expdp.log content=METADATA_ONLY


要捕获没有元数据的数据,请使用 DATA_ONLY 参数值。

expdp system/oracle@pdb2 schemas=SCOTT directory=TEST_DIR dumpfile=scott_data.dmp logfile=expdp.log content=DATA_ONLY


QUERY 参数允许您更改从一个或多个表导出的行。以下示例执行完整数据库导出,但不包括 EMP 和 DEPT 表的数据。

expdp system/password@pdb2 full=Y directory=TEST_DIR dumpfile=full.dmp logfile=expdp_full.log query='SCOTT.EMP:"WHERE deptno=0",SCOTT.DEPT:"WHERE deptno=0"'


在命令行上处理引号的方式将根据您想要实现的目标而有所不同。以下是直接从命令行适用于单个表和多个表的一些示例。

# Single Table. Multiple quoting methods possible.
expdp scott/tiger@pdb1 schemas=scott directory=TEST_DIR dumpfile=scott1.dmp logfile=scott1.log query=SCOTT.EMP:'"WHERE deptno=10"'
expdp scott/tiger@pdb1 schemas=scott directory=TEST_DIR dumpfile=scott2.dmp logfile=scott2.log query=SCOTT.EMP:\"WHERE deptno=10\"
expdp scott/tiger@pdb1 schemas=scott directory=TEST_DIR dumpfile=scott3.dmp logfile=scott3.log query='SCOTT.EMP:"WHERE deptno=10"'

# Multiple WHERE clause on each table.
expdp scott/tiger@pdb1 schemas=scott directory=TEST_DIR dumpfile=scott4.dmp logfile=scott4.log query='SCOTT.EMP:"WHERE deptno=10",SCOTT.DEPT:"WHERE deptno=20"'

七、网络导入导出 (NETWORK_LINK)

NETWORK_LINK 参数标识要用作网络导出/导入源的数据库链接。下面的数据库链接将用于演示其使用。

#在PDB3上创建DBLINK
sys/oracle@pdb3 as sysdba
create user test identified by oracle;
grant connect,resource to test;
GRANT CREATE DATABASE LINK TO test;
CONN test/oracle@pdb3
CREATE DATABASE LINK remote_scott CONNECT TO scott IDENTIFIED BY tiger USING 'pdb1';

在导出的情况下,NETWORK_LINK 参数标识指向源服务器的数据库链接。这些对象以正常方式从源服务器导出,但写入本地服务器上的目录对象,而不是源服务器上的目录对象。本地和远程用户都需要授予他们 EXP_FULL_DATABASE 角色。

expdp test/oracle@pdb3 tables=SCOTT.EMP network_link=REMOTE_SCOTT directory=TEST_DIR dumpfile=EMP.dmp logfile=expdpEMP.log

#需要创建本地目录
create directory TEST_DIR as '/home/oracle/test_dir';

! mkdir -p /home/oracle/test_dir

grant read,write on directory TEST_DIR to test;

对于导入,NETWORK_LINK 参数还标识指向源服务器的数据库链接。此处的区别在于对象直接从源导入到本地服务器,而不写入转储文件。尽管不需要 DUMPFILE 参数,但与操作关联的日志仍然需要目录对象。本地和远程用户都需要授予他们 IMP_FULL_DATABASE 角色。

 impdp test/oracle@pdb3 tables=SCOTT.EMP network_link=REMOTE_SCOTT directory=TEST_DIR logfile=impdpSCOTT.log remap_schema=SCOTT:TEST


八、闪回导出

默认情况下,expdp 实用程序导出仅在每个表的基础上保持一致。如果希望导出中的所有表都一致到同一时间点,则需要使用FLASHBACK_SCN或FLASHBACK_TIME参数。

expdp ..... flashback_time=systimestamp
# In parameter file.
flashback_time="to_timestamp('09-05-2023 09:00:00', 'DD-MM-YYYY HH24:MI:SS')"
# Escaped on command line.
expdp ..... flashback_time=\"to_timestamp\(\'09-05-2023 09:00:00\', \'DD-MM-YYYY HH24:MI:SS\'\)\"

毫不奇怪,您可以通过指定较早的时间或 SCN 使导出与较早的时间点保持一致,前提是您有足够的 UNDO 空间来在导出操作期间保持数据的读取一致视图。

SELECT current_scn FROM v$database;
SELECT DBMS_FLASHBACK.get_system_change_number FROM dual;
SELECT TIMESTAMP_TO_SCN(SYSTIMESTAMP) FROM dual;

然后将该 SCN 与 FLASHBACK_SCN 参数一起使用。

expdp ..... flashback_scn=5474280


以下查询对于时间戳和 SCN 之间的转换可能很有用。

SELECT TIMESTAMP_TO_SCN(SYSTIMESTAMP) FROM dual;
SELECT SCN_TO_TIMESTAMP(5474751) FROM dual;


九、日志

与原始的 exp 和 imp 实用程序不同,所有数据泵“.dmp”和“.log”文件都是在 Oracle 服务器上创建的,而不是在客户端计算机上创建的。


十、并行

使用 PARALLEL 参数可以提高数据泵性能。这应该与 DUMPFILE 参数中的“%U”通配符结合使用,以允许创建或读取多个转储文件。导入期间可以使用相同的通配符,以允许您引用多个文件。

expdp scott/tiger@pdb1 schemas=SCOTT directory=TEST_DIR parallel=4 dumpfile=SCOTT_%U.dmp logfile=expdpSCOTT.log
impdp scott/tiger@pdb1 schemas=SCOTT directory=TEST_DIR parallel=4 dumpfile=SCOTT_%U.dmp logfile=impdpSCOTT.log



十一、压缩

COMPRESSION 参数允许您决定在导出时要压缩的内容(如果有)。语法如下所示。

COMPRESSION={ALL | DATA_ONLY | METADATA_ONLY | NONE}

The available options are:


以下是使用 COMPRESSION 参数的示例。

expdp test/test@pdb3 schemas=TEST directory=TEST_DIR dumpfile=TEST.dmp logfile=expdpTEST.log   compression=all


十二、TRANSPORTABLE

TRANSPORTABLE 参数与之前可用的 TRANSPORT_TABLESPACES 参数类似,它仅导出和导入有关表的元数据,依赖于您手动传输相关表空间数据文件。导出操作列出了必须传输的表空间。语法如下所示。

TRANSPORTABLE = {ALWAYS | NEVER}

值 ALWAYS 打开可传输模式,而默认值 NEVER 表示这是常规导出/导入。
使用 TRANSPORTABLE 参数导出期间存在以下限制:


导入操作期间适用一些额外限制:


导出和导入操作的示例如下所示。

expdp system tables=TEST1.TAB1 directory=TEST_DIR dumpfile=TEST.dmp logfile=expdpTEST.log  transportable=ALWAYS
impdp system tables=TEST1.TAB1 directory=TEST_DIR dumpfile=TEST.dmp logfile=impdpTEST.log  transportable=ALWAYS network_link=linkpdb1 transport_datafiles='/u01/oradata/PDB1/test01.dbf'


十三、PARTITION_OPTIONS分区选项

PARTITION_OPTIONS 参数确定在导出和导入操作期间如何处理分区。语法如下所示。

PARTITION_OPTIONS={none | departition | merge}

允许的值为:

如果使用带有分区或子分区过滤器的 TRANSPORTABLE 参数完成导出,则无法使用 NONE 和 MERGE 选项。如果对正在分离的对象有任何授权,则会生成错误消息并且不会加载对象。

expdp test/test directory=TEST_DIR dumpfile=TEST.dmp logfile=expdpTEST.log tables=test.tab1   partition_options=merge



十四、REUSE_DUMPFILES


REUSE_DUMPFILES 参数可用于防止在导出尝试写入已存在的转储文件时发出错误。

REUSE_DUMPFILES={Y | N}

当设置为“Y”时,任何现有的转储文件都将被覆盖。当使用默认值“N”时,如果转储文件已存在,则会发出错误。

expdp test/oracle@pdb3 schemas=TEST directory=TEST_DIR dumpfile=TEST.dmp logfile=expdpTEST.log   compression=all   reuse_dumpfiles=y


十五、REMAP_TABLE

此参数允许在使用 TRANSPORTABLE 方法执行导入操作期间重命名表。它还可用于更改 PARTITION_OPTIONS 导入期间使用的基表名称。语法如下所示。

REMAP_TABLE=[schema.]old_tablename[.partition]:new_tablename

一个例子如下所示。

impdp test/test tables=TAB1 directory=TEST_DIR dumpfile=TEST.dmp logfile=impdpTEST.log   remap_table=TEST.TAB1:TAB2

现有表不会被重命名,只会重命名通过导入创建的表。

此外还有REMAP_DATAFILE,REMAP_SCHEMA,REMAP_TABLESPACE可以使用


十六、REMAP_DATA

在导出和导入操作期间,REMAP_DATA 参数允许您关联重映射打包函数,该函数将接受列值作为参数并返回数据的修改版本。语法如下所示。

REMAP_DATA=[schema.]tablename.column_name:[schema.]pkg.function

通过用随机替代数据替换原始数据,这可用于在导出和导入操作期间屏蔽敏感数据。映射是逐列完成的,如下所示。

expdp test/oracle@pdb3 tables=EMP directory=TEST_DIR dumpfile=EMP11111.dmp logfile=expdpTEST.log  REMAP_DATA=test:emp.EMPNO:remap_pkg.remap_EMPNO

重新映射函数必须返回与源列相同的数据类型,并且不得执行提交或回滚。


示例如下

connect sys/oracle@pdb3 as sysdba
create user datapump_test identified by test default tablespace users temporary tablespace temp quota 10m on users;
grant create session, create table to datapump_test;

之后,在运行 EXPDP 的用户模式中创建一个重映射函数(也在 SQL*Plus 中),该函数将从 REMAP_DATA 命令行选项调用:

conn system/oracle@pdb3
    
create or replace package datapump_remap_test
as
  function toggle_case(p_value varchar2) return varchar2;
end;
/
create or replace package body datapump_remap_test
as
  function toggle_case(p_value varchar2) return varchar2 is
  begin
    return translate(p_value,
        'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',
        'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ');
end;
end;
/
exit

函数 TOGGLE_CASE 将大写字母替换为其等效的小写字母,反之亦然。

现在,将使用以下 SQL*Plus 命令在 DATAPUMP_TEST 模式中创建测试数据:

connect datapump_test/test@pdb3
create table test
(
   col_01 varchar2(6) primary key,
   col_02 varchar2(6),
   col_03 varchar2(6),
   col_04 varchar2(6)
);
insert into test values ('AAAAAA', 'AAAAAA', 'AAAAAA', 'AAAAAA');
insert into test values ('BBBBBB', 'BBBBBB', 'BBBBBB', 'BBBBBB' );
insert into test values ('CCCCCC', 'CCCCCC', 'CCCCCC', 'CCCCCC');
commit;
exit

现在可以使用 REMAP_DATA 命令行选项开始导出:

expdp  system/oracle@pdb3 dumpfile=remap.dmp schemas=datapump_test parfile=par1


参数文件 par1 包含:

INCLUDE=table:"= 'TEST'"
REMAP_DATA=datapump_test.test.col_01:datapump_remap_test.toggle_case
REMAP_DATA=datapump_test.test.col_02:datapump_remap_test.toggle_case

现在将数据导入名为 TEST_NEW_1 的新表中:

impdp system/oracle@pdb3 dumpfile=remap.dmp schemas=datapump_test remap_table=datapump_test.test:test_new_1 exclude=constraint


最后,检查DATAPUMP_TEST模式中新创建的表TEST_NEW_1:

connect datapump_test/test@pdb3
select * from test_new_1;
COL_01 COL_02 COL_03 COL_04
------ ------ ------ ------
aaaaaa aaaaaa AAAAAA AAAAAA
bbbbbb bbbbbb BBBBBB BBBBBB
cccccc cccccc CCCCCC CCCCCC

在本例中,仅 COL_01 和 COL_02 从大写更改为小写。


十七、Dump任务

DBA_DATAPUMP_JOBS 视图可用于监视当前作业。

 
select * from dba_datapump_jobs;

OWNER_NAME                     JOB_NAME                       OPERATION
------------------------------ ------------------------------ ------------------------------
JOB_MODE                       STATE                              DEGREE ATTACHED_SESSIONS
------------------------------ ------------------------------ ---------- -----------------
SYSTEM                         SYS_EXPORT_FULL_01             EXPORT
FULL                           EXECUTING                               1                 1

通过以下方式,可以管理JOB,比如stop,kill任务

expdp user/password@service attach=SYS_EXPORT_FULL_01


可以使用 kill_job 或 stop_job结束或停止Job


十八、Data Pump API

除了数据泵实用程序之外,Oracle 还提供了 PL/SQL API。以下是如何使用此 API 执行架构导出的示例。

DECLARE
  l_dp_handle       NUMBER;
BEGIN
  -- Open an schema export job.
  l_dp_handle := DBMS_DATAPUMP.open(
    operation   => 'EXPORT',
    job_mode    => 'SCHEMA',
    remote_link => NULL,
    job_name    => 'SCOTT_EXPORT',
    version     => 'LATEST');
  -- Specify the dump file name and directory object name.
  DBMS_DATAPUMP.add_file(
    handle    => l_dp_handle,
    filename  => 'SCOTT.dmp',
    directory => 'TEST_DIR');
  -- Specify the log file name and directory object name.
  DBMS_DATAPUMP.add_file(
    handle    => l_dp_handle,
    filename  => 'expdpSCOTT.log',
    directory => 'TEST_DIR',
    filetype  => DBMS_DATAPUMP.KU$_FILE_TYPE_LOG_FILE);
  -- Specify the schema to be exported.
  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;
/

作业开始后,可以使用检查状态。

select * from dba_datapump_jobs;


以下示例说明了如何使用此 API 通过架构重映射操作执行架构导入。

DECLARE
  l_dp_handle       NUMBER;
BEGIN
  -- Open an schema import job.
  l_dp_handle := DBMS_DATAPUMP.open(
    operation   => 'IMPORT',
    job_mode    => 'SCHEMA',
    remote_link => NULL,
    job_name    => 'SCOTT_IMPORT',
    version     => 'LATEST');
  -- Specify the dump file name and directory object name.
  DBMS_DATAPUMP.add_file(
    handle    => l_dp_handle,
    filename  => 'SCOTT.dmp',
    directory => 'TEST_DIR');
  -- Specify the log file name and directory object name.
  DBMS_DATAPUMP.add_file(
    handle    => l_dp_handle,
    filename  => 'impdpSCOTT.log',
    directory => 'TEST_DIR',
    filetype  => DBMS_DATAPUMP.KU$_FILE_TYPE_LOG_FILE);
  -- Perform a REMAP_SCHEMA from SCOTT to SCOTT2.
  DBMS_DATAPUMP.metadata_remap(
    handle     => l_dp_handle,
    name       => 'REMAP_SCHEMA',
    old_value  => 'SCOTT',
    value      => 'SCOTT2');
  DBMS_DATAPUMP.start_job(l_dp_handle);
  DBMS_DATAPUMP.detach(l_dp_handle);
END;
/


十九、外部表使用DUMP


Oracle 已将对数据泵技术的支持纳入外部表中。 ORACLE_DATAPUMP 访问驱动程序可用于将数据卸载到数据泵导出文件,然后重新加载。当使用“AS”子句创建外部表时,会发生数据卸载。

conn scott/tiger@pdb1
CREATE TABLE emp_xt
  ORGANIZATION EXTERNAL
   (
     TYPE ORACLE_DATAPUMP
     DEFAULT DIRECTORY test_dir
     LOCATION ('emp_xt.dmp')
   )
   AS SELECT * FROM emp;

然后可以使用以下命令查询数据。

创建指向现有文件的外部表的语法类似,但没有“AS”子句。在这种情况下,我们将使用相同的模式,但这可能在同一实例中的不同模式中,或者在完全不同的实例中。

DROP TABLE emp_xt;
CREATE TABLE emp_xt (
  EMPNO     NUMBER(4),
  ENAME     VARCHAR2(10),
  JOB       VARCHAR2(9),
  MGR       NUMBER(4),
  HIREDATE  DATE,
  SAL       NUMBER(7,2),
  COMM      NUMBER(7,2),
  DEPTNO    NUMBER(2))
  ORGANIZATION EXTERNAL (
     TYPE ORACLE_DATAPUMP
     DEFAULT DIRECTORY test_dir
     LOCATION ('emp_xt.dmp')
  );
SELECT * FROM emp_xt;

使用 ORACLE_DATAPUMP 访问驱动程序创建外部表仅限于由外部表卸载创建的转储文件。


二十、角色


执行导出和导入操作的数据库用户将需要适当级别的权限才能完成操作。例如,如果用户无法在架构中创建表,则无法将表导入架构中。
某些操作(包括数据库级别的操作)将需要 DATAPUMP_EXP_FULL_DATABASE 和/或 DATAPUMP_IMP_FULL_DATABASE 角色。这些非常强大,所以不要在没有仔细考虑的情况下授予它们。


二十一、DUMP交互模式

所有数据泵操作均由多个作业(DBMS_SCHEDULER 而非 DBMS_JOB 作业)执行。这些作业由使用高级队列的主控制进程控制。在运行时,主控制进程创建并使用以作业名称命名的高级队列表。数据泵作业完成后,该表将被删除。作业和高级队列可以使用 JOB_NAME 参数命名。取消客户端进程不会停止关联的数据泵作业。

expdp  attach=SYS_EXPORT_FULL_01
    
Export> status
Job: SYS_EXPORT_FULL_01
  Operation: EXPORT
  Mode: FULL
  State: EXECUTING
  Bytes Processed: 0
  Current Parallelism: 1
  Job Error Count: 0
  Dump File: D:\TEMP\DB10G.DMP
    bytes written: 4,096
Worker 1 Status:
  State: EXECUTING
  Object Schema: SYSMAN
  Object Name: MGMT_CONTAINER_CRED_ARRAY
  Object Type: DATABASE_EXPORT/SCHEMA/TYPE/TYPE_SPEC
  Completed Objects: 261
  Total Objects: 261


二十二、PAR文件

通常情况下,我们更愿意将导出导入的参数放到par文件中,同时放到后台运行

directory=d1
dumpfile=test_%U.dmp
logfile=exp_test.log
schemas=test
exclude=table:"in('CCTEST')"
exclude=audit,statistics
compression=ALL
parallel=4
cluster=no


导出方式如下

nohup expdp \'\/ as sysdba\' parfile=test.par 2>&1 &