zoukankan      html  css  js  c++  java
  • ORACLE 数据泵 expdp/impdp

    ORACLE 数据泵 expdp/impdp

    一、概念

    Oracle Database 10g 引入了最新的数据泵(Data Dump)技术,数据泵导出导入
    (EXPDP 和 IMPDP)的作用:
    1)实现逻辑备份和逻辑恢复. 
    2)在数据库用户之间移动对象. 
    3)在数据库之间移动对象
    4)实现表空间搬移.
    
    
    

    1. 数据泵导出导入与传统导出导入的区别

    在 10g 之前,传统的导出和导入分别使用 exp 工具和 imp 工具,从 10g 开始,不仅保留了原有的exp和imp工具,还提供了数据泵导出导入工具expdp和impdp.使用expdp和 impdp 时应该注意的事项:
    
    1)exp 和 imp 是客户端工具程序,它们既可以在可以客户端使用,也可以在服务端使用。
    
    2)expdp 和 impdp 是服务端的工具程序,他们只能在 oracle 服务端使用,不能在客户端使用。
    
    3)imp 只适用于 exp 导出文件,不适用于 expdp 导出文件;impdp 只适用于 expdp导出文件,而不适用于 exp 导出文件。
    
    数据泵导出包括导出表,导出方案,导出表空间,导出数据库 4 种方式.
    
    oracle 数据泵的工作流程如下:
    1、在命令行执行命令
    
    2、expdp/impdp 命令调用 dbms_datapump pl/sql 包。 这个 api 提供高速的导出导入功能。
    
    3、当 data 移动的时候, data pump 会自动选择 direct path 或者 external table mechanism 或者 两种结合的方式。当 metadata(对象定义) 移动的时候,data pump 会使用 dbms_metadata pl/sql包。 metadata api 将 metadata(对象定义)存储在 xml 里。 
       所有的进程都能 load 和 unload 这些 metadata. 因为 data pump 调用的是服务端的 api, 所以当一个任务被调度或执行,客户端就可以退出连接,任务 job 会在 server端继续执行,随后通过客户端实用程序从任何地方检查任务的状态和进行修改
    

    二、expdp/impdp 命令参数详解

    参考链接:https://www.linuxidc.com/Linux/2017-09/146764.htm
            https://www.cnblogs.com/jyzhao/p/4522868.html
    

    1. expdp 关键字与命令

    (1)关键字           说明 (默认)
    
    ATTACH          连接到现有作业, 例如 ATTACH [=作业名]。
    
    COMPRESSION        减小转储文件内容的大小, 其中有效关键字  值为: ALL, (METADATA_ONLY), DATA_ONLY和NONE。
    
    CONTENT          指定要卸载的数据, 其中有效关键字  值为: (ALL), DATA_ONLY 和 METADATA_ONLY。
    
    DATA_OPTIONS       数据层标记, 其中唯一有效的值为: 使用CLOB格式的 XML_CLOBS-write XML 数据类型。
    
    DIRECTORY         供转储文件和日志文件使用的目录对象,即逻辑目录。
    
    DUMPFILE         目标转储文件 (expdp.dmp) 的列表,例如 DUMPFILE=expdp1.dmp, expdp2.dmp。
    
    ENCRYPTION        加密部分或全部转储文件, 其中有效关键字值为: ALL, DATA_ONLY, METADATA_ONLY,ENCRYPTED_COLUMNS_ONLY 或 NONE。
    
    ENCRYPTION_ALGORITHM  指定应如何完成加密, 其中有效关键字值为: (AES128), AES192 和 AES256。
    
    ENCRYPTION_MODE      生成加密密钥的方法, 其中有效关键字值为: DUAL, PASSWORD 和 (TRANSPARENT)。
    
    ENCRYPTION_PASSWORD   用于创建加密列数据的口令关键字。
    
    ESTIMATE          计算作业估计值, 其中有效关键字值为: (BLOCKS) 和 STATISTICS。
    
    ESTIMATE_ONLY       在不执行导出的情况下计算作业估计值。
    
    EXCLUDE           排除特定的对象类型, 例如 EXCLUDE=TABLE:EMP。例:EXCLUDE=[object_type]:[name_clause],[object_type]:[name_clause] 。
    
    FILESIZE           以字节为单位指定每个转储文件的大小。
    
    FLASHBACK_SCN        用于将会话快照设置回以前状态的 SCN。 -- 指定导出特定SCN时刻的表数据。
    
    FLASHBACK_TIME       用于获取最接近指定时间的 SCN 的时间。-- 定导出特定时间点的表数据,注意FLASHBACK_SCN和FLASHBACK_TIME不能同时使用。
    
    FULL              导出整个数据库 (N)。  
    
    HELP             显示帮助消息 (N)。
    
    INCLUDE           包括特定的对象类型, 例如 INCLUDE=TABLE_DATA。
    
    JOB_NAME          要创建的导出作业的名称。
    
    LOGFILE                日志文件名 (export.log)。
    
    NETWORK_LINK            链接到源系统的远程数据库的名称。
    
    NOLOGFILE             不写入日志文件 (N)。
    
    PARALLEL               更改当前作业的活动 worker 的数目。
    
    PARFILE                指定参数文件。
    
    QUERY                用于导出表的子集的谓词子句。--QUERY = [schema.][table_name:] query_clause。
    
    REMAP_DATA              指定数据转换函数,例如 REMAP_DATA=EMP.EMPNO:REMAPPKG.EMPNO。
    
    REUSE_DUMPFILES         覆盖目标转储文件 (如果文件存在) (N)。
    
    SAMPLE                要导出的数据的百分比。
    
    SCHEMAS               要导出的方案的列表 (登录方案)。  
    
    STATUS                在默认值 (0) 将显示可用时的新状态的情况下,要监视的频率 (以秒计) 作业状态。  
    
    TABLES                标识要导出的表的列表 - 只有一个方案。-[schema_name.]table_name[:partition_name][,…]
    
    TABLESPACES            标识要导出的表空间的列表。
    
    TRANSPORTABLE           指定是否可以使用可传输方法, 其中有效关键字值为: ALWAYS, (NEVER)。
    
    TRANSPORT_FULL_CHECK      验证所有表的存储段 (N)。 
    
    TRANSPORT_TABLESPACES      要从中卸载元数据的表空间的列表。
    
    VERSION              要导出的对象的版本, 其中有效关键字为:(COMPATIBLE), LATEST 或任何有效的数据库版本。
    
    ADD_FILE             向转储文件集中添加转储文件。
    
    CONTINUE_CLIENT         返回到记录模式。如果处于空闲状态, 将重新启动作业。
    
    EXIT_CLIENT            退出客户机会话并使作业处于运行状态。
    
    FILESIZE              后续 ADD_FILE 命令的默认文件大小 (字节)。
    
    HELP               总结交互命令。
    
    KILL_JOB             分离和删除作业。
    
    PARALLEL               更改当前作业的活动 worker 的数目。PARALLEL=<worker 的数目>。
    
    _DUMPFILES             覆盖目标转储文件 (如果文件存在) (N)。
    
    START_JOB             启动/恢复当前作业。
    
    STATUS                在默认值 (0) 将显示可用时的新状态的情况下,要监视的频率 (以秒计) 作业状态。STATUS[=interval]。
    
    STOP_JOB              顺序关闭执行的作业并退出客户机。STOP_JOB=IMMEDIATE 将立即关闭数据泵作业。
    

    1.1 FG-EXPDP 命令参数及说明

    (1). ATTACH
    该选项用于在客户会话与已存在导出作用之间建立关联.语法如下
    ATTACH=[schema_name.]job_name
    Schema_name 用于指定方案名,job_name 用于指定导出作业名.注意,如果使用 ATTACH 选项,在命令行除了连接字符串和 ATTACH 选项外,不能指定任何其他选项,示例如下:
    Expdp scott/tiger ATTACH=scott.export_job
    
    (2). CONTENT
    该选项用于指定要导出的内容.默认值为 ALL
    CONTENT={ALL | DATA_ONLY | METADATA_ONLY}当设置 CONTENT 为 ALL 时,将导出对象定义及其所有数据.为 DATA_ONLY 时,只导出对象数据,为METADATA_ONLY 时,只导出对象定义。
    Expdp scott/tiger DIRECTORY=dump DUMPFILE=a.dump CONTENT=METADATA_ONLY
    
    (3) DIRECTORY
    指定转储文件和日志文件所在的目录,DIRECTORY=directory_object
    Directory_object 用于指定目录对象名称.需要注意,目录对象是使用 CREATE DIRECTORY 语句建立的 对象,而不是 OS 目录。
    Expdp scott/tiger DIRECTORY=dump DUMPFILE=a.dump
    先在对应的位置创建物理文件夹,如 D:/backup
    建立目录:
    create or replace directory backup as '/opt/oracle/utl_file'
    SQL>CREATE DIRECTORY backup as ‘d:/backup’;
    SQL>grant read,write on directory backup to SYSTEM;
    查询创建了那些子目录:
    SELECT * FROM dba_directories;
    
    (4). DUMPFILE
    用于指定转储文件的名称,默认名称为 expdat.dmp
    DUMPFILE=[directory_object:]file_name [,….]
    Directory_object 用于指定目录对象名,file_name 用于指定转储文件名.需要注意,如果不指定
    directory_object,导出工具会自动使用 DIRECTORY 选项指定的目录对象:
    Expdp scott/tiger DIRECTORY=dump1 DUMPFILE=dump2:a.dmp
    
    (5). ESTIMATE
    指定估算被导出表所占用磁盘空间分方法.默认值是 BLOCKS。
    EXTIMATE={BLOCKS | STATISTICS}
    设置为 BLOCKS 时,oracle 会按照目标对象所占用的数据块个数乘以数据块尺寸估算对象占用的空间,
    设置为 STATISTICS 时,根据最近统计值估算对象占用空间 : 
    Expdp scott/tiger TABLES=emp ESTIMATE=STATISTICS DIRECTORY=dump DUMPFILE=a.dump
    
    
    (6). EXTIMATE_ONLY
    指定是否只估算导出作业所占用的磁盘空间,默认值为 N
    EXTIMATE_ONLY={Y | N}
    设置为 Y 时,导出作用只估算对象所占用的磁盘空间,而不会执行导出作业,为 N 时,不仅估算对象所占用的磁盘空间,还会执行导出操作.
    Expdp scott/tiger ESTIMATE_ONLY=y NOLOGFILE=y
    
    (7). EXCLUDE
    该选项用于指定执行操作时释放要排除对象类型或相关对象
    EXCLUDE=object_type[:name_clause] [,….]
    Object_type 用于指定要排除的对象类型,name_clause 用于指定要排除的具体对象.EXCLUDE 和INCLUDE 不能同时使用。
    Expdp scott/tiger DIRECTORY=dump DUMPFILE=a.dup EXCLUDE=VIEW
    
    (8). FILESIZE
    指定导出文件的最大尺寸,默认为0,(表示文件尺寸没有限制)
    
    (9). FLASHBACK_SCN
    指定导出特定 SCN 时刻的表数据。FLASHBACK_SCN=scn_value
    Scn_value 用于标识 SCN 值.FLASHBACK_SCN 和 FLASHBACK_TIME 不能同时使用:
    Expdp scott/tiger DIRECTORY=dump DUMPFILE=a.dmp FLASHBACK_SCN=358523
    
    (10). FLASHBACK_TIME
    指定导出特定时间点的表数据 FLASHBACK_TIME=”TO_TIMESTAMP(time_value)”
    Expdp scott/tiger DIRECTORY=dump DUMPFILE=a.dmp FLASHBACK_TIME=“TO_TIMESTAMP(’25-08-2004 14:35:00’,’DD-MM-YYYY HH24:MI:SS’)”
    
    (11). FULL
    指定数据库模式导出,默认为 N。 FULL={Y | N} 。为 Y 时,标识执行数据库导出. 
    
    (12). HELP
    指定是否显示 EXPDP 命令行选项的帮助信息,默认为 N。当设置为 Y 时,会显示导出选项的帮助信息.
    Expdp help=y
    
    (13). INCLUDE
    指定导出时要包含的对象类型及相关对象。INCLUDE = object_type[:name_clause] [,… ] 
    
    (14). JOB_NAME
    指定要导出作用的名称,默认为 SYS_XXX 。JOB_NAME=jobname_string
    
    (15). LOGFILE
    指定导出日志文件文件的名称,默认名称为 export.log
    LOGFILE=[directory_object:]file_name
    Directory_object 用于指定目录对象名称,file_name 用于指定导出日志文件名.如果不指定
    directory_object.导出作用会自动使用 DIRECTORY 的相应选项值.
    Expdp scott/tiger DIRECTORY=dump DUMPFILE=a.dmp logfile=a.log
    
    (16). NETWORK_LINK
    指定数据库链接名,如果要将远程数据库对象导出到本地例程的转储文件中,必须设置该选项. 
    
    (17). NOLOGFILE
    该选项用于指定禁止生成导出日志文件,默认值为 N.
    
    (18). PARALLEL
    指定执行导出操作的并行进程个数,默认值为1 
    
    (19). PARFILE
    指定导出参数文件的名称。PARFILE=[directory_path] file_name
    
    (20). QUERY
    用于指定过滤导出数据的 where 条件QUERY=[schema.] [table_name:] query_clause Schema 用于指定方案名,table_name 用于指定表名,query_clause 用于指定条件限制子句.QUERY 选项 不能与 CONNECT=METADATA_ONLY,EXTIMATE_ONLY,TRANSPORT_TABLESPACES 等选项同时使用.
    Expdp scott/tiger directory=dump dumpfiel=a.dmp Tables=emp query=’WHERE deptno=20’
    
    (21). SCHEMAS
    该方案用于指定执行方案模式导出,默认为当前用户方案. 
    
    (22). STATUS
    指定显示导出作用进程的详细状态,默认值为0 
    
    (23). TABLES
    指定表模式导出
    TABLES=[schema_name.]table_name[:partition_name][,…]
    Schema_name 用于指定方案名,table_name 用于指定导出的表名,partition_name 用于指定要导出的 分区名. 
    
    (24). TABLESPACES
    指定要导出表空间列表
    
    (25). TRANSPORT_FULL_CHECK
    该选项用于指定被搬移表空间和未搬移表空间关联关系的检查方式,默认为 N. 当设置为 Y 时,导出作用会检查表空间直接的完整关联关系,如果表空间所在表空间或其索引所在的表空间只有一个表空间 被搬移,将显示错误信息.当设置为 N 时,导出作用只检查单端依赖,如果搬移索引所在表空间,但未搬移表所在表空间,将显示出错信息,如果搬移表所在表空间,未搬移索引所在表空间,则不会显示错误信息.
    
    (26). TRANSPORT_TABLESPACES
    指定执行表空间模式导出 
    
    (27). VERSION
    指定被导出对象的数据库版本,默认值为 COMPATIBLE.
    VERSION={COMPATIBLE | LATEST | version_string}
    为 COMPATIBLE 时,会根据初始化参数 COMPATIBLE 生成对象元数据;为 LATEST 时,会根据数据库的实际 版本生成对象元数据.version_string 用于指定数据库版本字符串.
    

    1.2 EXPDP **使用方法介绍

       使用 EXPDP 工具时,其转储文件只能被存放在 DIRECTORY 对象对应的 OS 目录中,而不能直接指定转储文件所在的 OS 目录.因此,使用 EXPDP 工具时,必须首先建立 DIRECTORY 对象.并且需要为数据库用户授予使用 DIRECTORY 对象权限.
    首先创建相应的 directory:
    CREATE DIRECTORY dump_dir AS ‘D:/DUMP’;
    GRANT READ, WIRTE ON DIRECTORY dump_dir TO scott;
    
    (1)导出表
    Expdp scott/tiger DIRECTORY=dump_dir DUMPFILE=tab.dmp TABLES=dept,emp logfile=exp.log;
    
    (2)导出方案 (schema,与用户对应)
    Expdp scott/tiger DIRECTORY=dump_dir DUMPFILE=schema.dmp SCHEMAS=system,scott
    logfile=/exp.log;
    
    (3)导出表空间
    Expdp system/manager DIRECTORY=dump_dir DUMPFILE=tablespace.dmp TABLESPACES=user01,user02
    logfile=/exp.log;
    
    (4)导出数据库
    Expdp system/manager DIRECTORY=dump_dir DUMPFILE=full.dmp FULL=Y logfile=/exp.log;
    

    2. impdp 关键字与命令

    ATTACH               连接到现有作业, 例如 ATTACH [=作业名]。
    
    CONTENT                指定要卸载的数据, 其中有效关键字  值为: (ALL), DATA_ONLY 和 METADATA_ONLY。
    
    DATA_OPTIONS              数据层标记,其中唯一有效的值为:SKIP_CONSTRAINT_ERRORS-约束条件错误不严重。
    
    DIRECTORY             供转储文件,日志文件和sql文件使用的目录对象,即逻辑目录。
    
    DUMPFILE              要从(expdp.dmp)中导入的转储文件的列表,例如 DUMPFILE=expdp1.dmp, expdp2.dmp。
    
     ENCRYPTION_PASSWORD      用于访问加密列数据的口令关键字。此参数对网络导入作业无效。
    
     ESTIMATE              计算作业估计值, 其中有效关键字为:(BLOCKS)和STATISTICS。
    
     EXCLUDE              排除特定的对象类型, 例如 EXCLUDE=TABLE:EMP。
    
     FLASHBACK_SCN          用于将会话快照设置回以前状态的 SCN。
    
     FLASHBACK_TIME          用于获取最接近指定时间的 SCN 的时间。
    
     FULL                 从源导入全部对象(Y)。
    
     HELP                 显示帮助消息(N)。
    
     INCLUDE               包括特定的对象类型, 例如 INCLUDE=TABLE_DATA。
    
     JOB_NAME              要创建的导入作业的名称。
    
     LOGFILE                日志文件名(import.log)。
    
     NETWORK_LINK           链接到源系统的远程数据库的名称。
    
     NOLOGFILE             不写入日志文件。  
    
     PARALLEL               更改当前作业的活动worker的数目。
    
     PARFILE                指定参数文件。
    
     PARTITION_OPTIONS         指定应如何转换分区,其中有效关键字为:DEPARTITION,MERGE和(NONE)。
    
     QUERY               用于导入表的子集的谓词子句。
    
     REMAP_DATA            指定数据转换函数,例如REMAP_DATA=EMP.EMPNO:REMAPPKG.EMPNO。
    
     REMAP_DATAFILE          在所有DDL语句中重新定义数据文件引用。
    
     REMAP_SCHEMA           将一个方案中的对象加载到另一个方案。
    
     REMAP_TABLE             表名重新映射到另一个表,例如 REMAP_TABLE=EMP.EMPNO:REMAPPKG.EMPNO。
    
     REMAP_TABLESPACE        将表空间对象重新映射到另一个表空间。
    
     REUSE_DATAFILES          如果表空间已存在, 则将其初始化 (N)。
    
     SCHEMAS               要导入的方案的列表。
    
     SKIP_UNUSABLE_INDEXES       跳过设置为无用索引状态的索引。
    
     SQLFILE                将所有的 SQL DDL 写入指定的文件。
    
     STATUS                在默认值(0)将显示可用时的新状态的情况下,要监视的频率(以秒计)作业状态。  
    
     STREAMS_CONFIGURATION      启用流元数据的加载。
    
     TABLE_EXISTS_ACTION       导入对象已存在时执行的操作。有效关键字:(SKIP),APPEND,REPLACE和TRUNCATE。
    
     TABLES                标识要导入的表的列表。
    
     TABLESPACES            标识要导入的表空间的列表。 
    
     TRANSFORM            要应用于适用对象的元数据转换。有效转换关键字为:SEGMENT_ATTRIBUTES,STORAGE,OID和PCTSPACE。
    
     TRANSPORTABLE           用于选择可传输数据移动的选项。有效关键字为: ALWAYS 和 (NEVER)。仅在 NETWORK_LINK 模式导入操作中有效。
    
     TRANSPORT_DATAFILES       按可传输模式导入的数据文件的列表。
    
     TRANSPORT_FULL_CHECK     验证所有表的存储段 (N)。
    
     TRANSPORT_TABLESPACES     要从中加载元数据的表空间的列表。仅在 NETWORK_LINK 模式导入操作中有效。
    
      VERSION               要导出的对象的版本, 其中有效关键字为:(COMPATIBLE), LATEST 或任何有效的数据库版本。仅对 NETWORK_LINK 和 SQLFILE 有效。
    
    (2)命令            说明
    
     CONTINUE_CLIENT         返回到记录模式。如果处于空闲状态, 将重新启动作业。
    
     EXIT_CLIENT            退出客户机会话并使作业处于运行状态。
    
     HELP                 总结交互命令。
    
     KILL_JOB               分离和删除作业。
    
     PARALLEL              更改当前作业的活动 worker 的数目。PARALLEL=<worker 的数目>。
    
     START_JOB              启动/恢复当前作业。START_JOB=SKIP_CURRENT 在开始作业之前将跳过作业停止时执行的任意操作。
    
     STATUS               在默认值 (0) 将显示可用时的新状态的情况下,要监视的频率 (以秒计) 作业状态。STATUS[=interval]。
    
     STOP_JOB             顺序关闭执行的作业并退出客户机。STOP_JOB=IMMEDIATE 将立即关闭数据泵作业。 
    

    2.1 FG-IMPDP 命令参数及说明

    其实 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 scott/tiger 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 scott/tiger 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’
    

    2.2 IMPDP 使用方法介绍

    使用 impdp 工具时,如果数据库中不存在相应的 DIRECTORY,必须首先建立 DIRECTORY 对象.并且需要
    为数据库用户授予使用 DIRECTORY 对象权限.
    
    首先创建相应的 directory:
    CREATE DIRECTORY dump_dir AS ‘D:/DUMP’;
    GRANT READ, WIRTE ON DIRECTORY dump_dir TO scott;
    
    (1)导入表 
    Impdp scott/tiger DIRECTORY=dump_dir DUMPFILE=tab.dmp TABLES=dept,emp logfile=/exp.log;
    --将 DEPT 和 EMP 表导入到 SCOTT 方案中
    
    Impdp system/manage DIRECTORY=dump_dir DUMPFILE=tab.dmp TABLES=scott.dept,scott.emp REMAP_SCHEMA=SCOTT:SYSTEM logfile=/exp.log;
    -- 将 DEPT 和 EMP 表导入的 SYSTEM 方案中. 	
    
    (2)导入方案
    Impdp scott/tiger DIRECTORY=dump_dir DUMPFILE=schema.dmp SCHEMAS=scott logfile=/exp.log;
    Impdp system/manager DIRECTORY=dump_dir DUMPFILE=schema.dmp
    SCHEMAS=scott REMAP_SCHEMA=scott:system logfile=/exp.log;
    
    (3)导入表空间
    Impdp system/manager DIRECTORY=dump_dir DUMPFILE=tablespace.dmp TABLESPACES=user01
    logfile=/exp.log;
    
    (4)导入数据库
    Impdp system/manager DIRECTORY=dump_dir DUMPFILE=full.dmp FULL=y logfile=/exp.log;
    

    三、expdp/impdp 使用方法详解

    1. oracle expdp 使用方法介绍

    使用 expdp 工具时,其转储文件只能被存放在 directory 对象对应的 os 目录中,而不能直接指定转储文件所在的 os 目录.因此,使用 expdp 工具时,必须首先建立 directory对象.并且需要为数据库用户授予使用 directory 对象权限.
    
    ## 创建 directory
    select * from dba_directories;
    create directory data  as '/data/dpdata';
    --drop directory data
    --create or replace directory dpdata as '/data/dpdata/';  (更改路径)
    grant read,write on directory data to system;
    grant read,write on directory itpuxbak_dir to itpux01;
    
    
    --01)导出整个数据库
    expdp system/oracle directory=datadumpfile=expdp_full_db01.dmp logfile=expdp_full_db01.log full=y
    expdp system/oracle directory=itpuxbak_dir dumpfile=expdp_full_db01_%U.dmp logfile=expdp_full_db01.log full=y  parallel=4   (如果使用并行参数,需要修改一下dumpfile 格式,parallel 使用cpu 的倍数)
    
    --02)导出方案-schema 用户
    expdp system/oracle directory=data dumpfile=expdp_u_itpux01.dmp logfile=expdp_u_itpux01.log schemas=itpux01,itpux02
    
    --03)导出表空间
    expdp system/oracle directory=data dumpfile=expdp_ts_itpux01.dmp logfile=expdp_ts_itpux01.log 
    tablespaces=itpux01,itpux02
    
    --04)导出表
    expdp system/oracle directory=data dumpfile=expdp_tb_itpux01.dmp logfile=expdp_tb_itpux01.log 
    tables=itpux01,itpux02
    
    expdp itpux01/itpux01 directory=data  dumpfile=expdp_tb_itpux01.dmp logfile=expdp_tb_itpux01.log tables=itpux01
    
    --05)按表查询条件导出
    expdp system/oracle directory=data dumpfile=expdp_q_itpux01.dmp logfile=expdp_q_itpux01.log tables=itpux01 query='where id=5'
    
    expdp system/oracle directory=data dumpfile=expdp_q_itpux01.dmp logfile=expdp_q_itpux01.log 
    QUERY=employees:"WHERE department_id > 10"   --employees  这里表示的是一张表
    
    
    
    

    2. oracle impdp 使用方法介绍

    使用 impdp 工具时,如果数据库中不存在相应的 directory,必须首先建立 directory
    对象.并且需要为数据库用户授予使用 directory 对象权限
    
    ## 创建 directory
    select * from dba_directories;
    create directory data  as '/data/dpdata';
    --drop directory data
    --create or replace directory dpdata as '/data/dpdata/';  (更改路径)
    grant read,write on directory data to system;
    grant read,write on directory itpuxbak_dir to itpux01;
    
    
    --01)导入整个数据库
    impdp system/oracle directory=data dumpfile=expdp_full_db01.dmp logfile=impdp_full_db01.log full=y
    
    impdp system/oracle directory=data dumpfile=expdp_full_db01_%U.dmp logfile=impdp_full_db01.log full=y parallel=4
    
    
    --02)导入方案-schema-用户
    impdp system/oracle directory=data dumpfile=expdp_u_itpux01.dmp logfile=impdp_u_itpux01.log 
    schemas=itpux01,itpux02
    
    impdp system/oracle directory=data dumpfile=expdp_u_itpux01.dmp logfile=impdp_u_itpux01.log 
    schemas=itpux01,itpux02 remap_schema=itpux02:itpux002
    
    --03)导入表空间
    impdp system/oracle directory=data dumpfile=expdp_ts_itpux01.dmp logfile=impdp_ts_itpux01.log 
    tablespaces=itpux01,itpux02
    
    --04)导入表
    impdp system/oracle directory=data dumpfile=expdp_tb_itpux01.dmp logfile=impdp_tb_itpux01.log 
    tables=itpux01,itpux02
    
    impdp system/oracle directory=data dumpfile=expdp_tb_itpux01.dmp logfile=impdp_tb_itpux01.log 
    tables=itpux01,itpux02 remap_schema=system:itpux
    
    impdp itpux01/itpux01 directory=data dumpfile=expdp_tb_itpux01.dmp logfile=impdp_tb_itpux01.log 
    tables=itpux01
    
    impdp system/oracle directory=data dumpfile=expdp_tb_itpux01.dmp logfile=impdp_tb_itpux01.log 
    TABLES=HR.EMPLOYEES,SH.SALES:SALES_1995
    
    --05)按表查询条件导入
    impdp system/oracle directory=datadumpfile=expdp_tb_itpux01.dmp logfile=impdp_tb_itpux01.log 
    tables=itpux01,itpux02 query='where id=5'
    
    impdp system/oracle directory=data dumpfile=expdp_tb_itpux01.dmp logfile=impdp_tb_itpux01.log 
    tables=itpux01,itpux02 remap_schema=system:itpux query='where id=5'
    
    impdp itpux01/itpux01 directory=data dumpfile=expdp_tb_itpux01.dmp logfile=impdp_tb_itpux01.log 
    tables=itpux01 query='where id=5'
    
    impdp system/oracle directory=data dumpfile=expdp_tb_itpux01.dmp logfile=impdp_tb_itpux01.log 
    TABLES=HR.EMPLOYEES,SH.SALES:SALES_1995 QUERY=HR.EMPLOYEES:"WHERE department_id > 10"
    

    3. oracle expdp/impdp 补充

    --01)directory
    create directory data as '/backup';
    --drop directory itpuxbak_dir
    select * from dba_directories
    grant read,write on directory data to system; --system:itpux01:other users
    grant create any directory to system;
    select * from dba_sys_privs where grantee='SYSTEM';
    
    --02) sysdba full=y  (sysdbad的意思是以操作系统为认证进行的导出)
    expdp "'/ as sysdba'" directory=data dumpfile=expdp_full_db01.dmp logfile=expdp_full_db01.log full=y --sys  ( expdp "/ as sysdba" )
    
    --3)查询 datapump jobs
    select * from dba_datapump_jobs; (select * from  DBA_DATAPUMP_SESSIONS;)
    expdp "'/as sysdba'" directory=data dumpfile=expdp_full_db01.dmp logfile=expdp_full_db01.log full=y job_name=itpuxexpjob;
    

    四、配置生产环境的逻辑自动备份策略

    ## 创建备份路径
    su - oracle 
    sqlplus / as sysdba
    create directory data as '/data/dpdata';
    grant read,write on directory data to system;
    grant create any directory to system;
    
    ## 编写备份脚本(在Oracle 用户下操作)
    vim expdpfull.sh
    export BAKDATE=`date +%Y%m%d`
    nohup expdp system/oracle directory=data dumpfile=expdp_full_db01.$BAKDATE.%U.dmp logfile=expdp_full_db01.$BAKDATE.log full=y parallel=4 & 
    find /data/dpdata -name expdp_full_db01.*.dmp -atime +2 -exec rm -rf {} ;
    --如果这个导出是 asm 的或者是 rac 的(两个节点的实例),那么在导出的时候需要加上参数: cluster=N,单机就不用加了
    
    chmod 755 expdpfull.sh  
    
    ## 自动进行备份
    crontab -e 
    0 20 * * * sh /data/script/expdpfull.sh
    
    
    --报错的处理:
    ORA-39181: Only partial table data may be exported due to fine grain access control on "OE"."PURCHASEORDER"
    select count(*) from "OE"."PURCHASEORDER"
    grant EXEMPT ACCESS POLICY to system;
    expdp system/oracle directory=itpuxbak_dir dumpfile=test-b.dmp logfile=test-b.log tables=OE.PURCHASEORDER
    

    五、expdp/impdp 生产环境数据迁移流程

    1. 概述

    5.1、做数据迁移流程的目的
    使用 expdp/impdp 进行数据迁移的前置条件、操作步骤,降低对对应用造成的影响及避免故障
    5.2、数据迁移的适用范围
    所有线上库>10.2
    
    
    5.3、 数据迁移的风险评估
    01.有些 os 对文件大小有限制,expdp 数据时需要使用 filesize 参数来分割导出文件
    02.expdp 导出数据时没有正确估计 dmp 文件所需空间,导致主机磁盘满。
    03.跨字符集的数据迁移,由于字符集不兼容导致数据迁移失败。
    04.导入表空间不存在或者空间不足,导致表创建失败或者数据导入失败,导致其他应用报错
    
    5.4、数据迁移的准备工作
    01.检查源数据库和目标库的版本、字符集,如果目标库版本低于源库,使用目标库的软件做导出。如果字符集不一致,不建议使用 expdp/impdp 迁移数据。
    02.user_segments 里查出导出表所占的空间大小,检查 os 对文件大小的限制。
    03.表比较多的情况下,建议用 parfile。各个参数在 parfile 里写好
    

    2. parfile

    参数:指定导出参数文件的名称。PARFILE=[directory_path] file_name
    04.提前准备备份脚本(parfile 参数):
    cat expdp_itpux.par
    userid=system/oracle
    directory=data
    dumpfile=expdp_full_db01.$BAKDATE.%U.dmp
    logfile=expdp_full_db01.$BAKDATE.log
    tables=user.tab1,user.tab2,user.tab3
    parallel=4
    
    vi expdp.sh
    export BAKDATE=`date +%Y%m%d`
    expdp parfile=expdp_itpux.par
    nohup ./expdp.sh &
    

    六、expdp/impdp 生产环境数据迁移案例

    1.迁移目的和迁移流程

    6.1 迁移目的
    将 linux 系统 oracle 服务器上 schema(itpux01,itpux02)全部通过 ExpDP 全库迁移到另一台 oracle 服务器,并能正常查询到相关数据。
    IMPDP 虽然加上 parallel 参数,在做 table 数据导入时确实速度提高了不少,但是在create index 和 statistics 时,依旧采用单线程的方式,故此一般在迁移过程中这两步操作选择生产 DDL 脚本增加 parallel 参数后手工执行,以最大化缩减迁移时间。
    
    6.2 迁移流程: 
     ---->>linux 系统 oracle 服务器上创建测试数据。
     ---->>linux 本地用 Expdp 做导出; 
     ---->>远程主机创建相关对象;
     ---->>远程主机用 expdp 做导入(导入);
     ---->>验证远程本地数据合法性;
    

    2.进行演示

    2.1 创建表空间

    create tablespace itpux01 datafile '/data/app/oracle/oradata/orcl/itpux01.dbf' size 50m;
    create tablespace itpux02 datafile '/data/app/oracle/oradata/orcl/itpux02.dbf' size 50m;
    create user itpux01 identified by itpux01 default tablespace itpux01;
    create user itpux02 identified by itpux02 default tablespace itpux02;
    grant dba to itpux01;
    grant dba to itpux02;
    
    
    conn itpux01/itpux01
    create table itpux01 (id number(10),name varchar2(10));
    create index i_itpux01_id on itpux01(id);
    insert into itpux01 values(1,'itpux01');
    insert into itpux01 values(2,'itpux02');
    insert into itpux01 values(3,'itpux03');
    insert into itpux01 values(4,'itpux04');
    insert into itpux01 values(5,'itpux05');
    commit;
    select * from itpux01;
    
    conn itpux02/itpux02
    create table itpux02 (id number(10),name varchar2(10));
    create index i_itpux01_id on itpux02(id);
    insert into itpux02 values(1,'itpux01');
    insert into itpux02 values(2,'itpux02');
    insert into itpux02 values(3,'itpux03');
    insert into itpux02 values(4,'itpux04');
    insert into itpux02 values(5,'itpux05');
    commit;
    select * from itpux02;
    
    conn /as sysdba;
    alter system switch logfile;
    alter system checkpoint;
    
    dbms_metadata.get_ddl 使用的参考文档:https://www.jb51.net/article/39715.htm
    ## 在源主机获取ddl  (到另一台主机上创建表空间)(不过我之前用下面的2.2 步骤创建了表空间)
    conn / as sysdba
    SYS@orcl > spool itpux_tbs_create_ddl.sql
    SYS@orcl > set long 200000 pagesize 0 head off verify off feedback off linesize 200
    SYS@orcl > select dbms_metadata.get_ddl ('TABLESPACE','ITPUX01') from dual;
    
      CREATE BIGFILE TABLESPACE "ITPUX01" DATAFILE
      '/data/app/oracle/oradata/orcl/itpux01.dbf' SIZE 50
      LOGGING ONLINE PERMANENT BLOCKSIZE 8192
      EXTENT MANAGEMENT LOCAL AUTOALLOCATE DEFAULT
     NOCOMPRESS  SEGMENT SPACE MANAGEMENT AUTO
    
    
    SYS@orcl > select dbms_metadata.get_ddl ('TABLESPACE','ITPUX02') from dual;
    
      CREATE BIGFILE TABLESPACE "ITPUX02" DATAFILE
      '/data/app/oracle/oradata/orcl/itpux02.dbf' SIZE 50m
      LOGGING ONLINE PERMANENT BLOCKSIZE 8192
      EXTENT MANAGEMENT LOCAL AUTOALLOCATE DEFAULT
     NOCOMPRESS  SEGMENT SPACE MANAGEMENT AUTO
    
    
    SYS@orcl > spool off;
    SYS@orcl > 
    

    2.2 目标库创建表空间

    create tablespace itpux01 datafile '/data/app/oracle/oradata/orcl/itpux01.dbf' size 50m;
    create tablespace itpux02 datafile '/data/app/oracle/oradata/orcl/itpux02.dbf' size 50m;
    create user itpux01 identified by itpux01 default tablespace itpux01;
    create user itpux02 identified by itpux02 default tablespace itpux02;
    grant dba to itpux01;
    grant dba to itpux02;
    

    3. 导出数据

    [oracle@ogg12c script]$ more expdpfull.sh 
    export BAKDATE=`date +%Y%m%d`
    nohup expdp system/oracle directory=data dumpfile=expdp_full_db01.$BAKDATE.%U.dmp logfile=expdp_full_db01.$BAKDATE.log full=y parallel=2 &
    find /data/dpdata/ -name expdp_full_db01.*.dmp -atime +2 -exec rm -rf {} ;
    
    ## 执行脚本
    [oracle@ogg12c script]$ sh expdpfull.sh
    可以用次命令查看job 
    select * from dba_datapump_jobs;
    
    把导出的数据传到另一台服务器上
    [oracle@ogg12c dpdata]$ ls
    expdp_full_db01.20200825.01.dmp  expdp_full_db01.20200825.02.dmp  expdp_full_db01.20200825.log
    [oracle@ogg12c dpdata]$ pwd
    /data/dpdata
    
    expdp_full_db01.20200825.01.dmp  expdp_full_db01.20200825.02.dmp  expdp_full_db01.20200825.log
    [oracle@ogg12c dpdata]$ scp expdp_full_db01.20200825.* oracle@192.168.43.116:/data/dpdata
    
    

    4. 导入数据

    禁止自动维护任务
    建立目标数据目录
    导入数据库(先到数据,在建索引)
    ## 关闭自动维护任务
    SYS@orcl > execute dbms_auto_task_admin.disable;
    
    ## 创建数据目录
    SYS@orcl > create or replace directory data  as '/data/dpdata';
    SYS@orcl > grant read,write on directory data to system;
    select * from dba_directories;
    
    ## 进行导入  (先导入数据在导入索引,这样比较速度快)
    
    impdp system/oracle directory=data schemas=itpux01,itpux02 dumpfile=expdp_full_db01.20200825.01.dmp,expdp_full_db01.20200825.02.dmp logfile=impdp_full_db01_ddl.log  parallel=2 include=index,constraint sqlfile=indexddl.sql
    
    进行查看: 我把没有用的信息都删除了
    more indexddl.sql
    略。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
    CREATE INDEX "ITPUX01"."I_ITPUX01_ID" ON "ITPUX01"."ITPUX01" ("ID")
      PCTFREE 10 INITRANS 2 MAXTRANS 255
      STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
      PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
      BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
      TABLESPACE "ITPUX01" PARALLEL 1 ;
    
      ALTER INDEX "ITPUX01"."I_ITPUX01_ID" NOPARALLEL;
    -- CONNECT ITPUX02
    CREATE INDEX "ITPUX02"."I_ITPUX01_ID" ON "ITPUX02"."ITPUX02" ("ID")
      PCTFREE 10 INITRANS 2 MAXTRANS 255
      STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
      PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
      BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
      TABLESPACE "ITPUX02" PARALLEL 1 ;
    
      ALTER INDEX "ITPUX02"."I_ITPUX01_ID" NOPARALLEL;
      
      略。。。。。。。。。。。。。。。。。。。。。。。。。。。。
    
    
    ## 导入数据
     nohup impdp system/oracle directory=data dumpfile=expdp_full_db01.20200825.01.dmp,expdp_full_db01.20200825.02.dmp logfile=impdp_full_db01.log full=y parallel=2 exclude=index,constraint,statistics &
    
    
    ##把索引导入进去
    [oracle@ogg12c dpdata]$ sqlplus / as sysdba
    SYS@orcl > @indexddl.sql
    
    ##收集统计信息
    stats.sql 编写为sql 文件
    
    begin
    		dbms_stats.gather_database_stats;
    end;
     /	
     
    nohup sqlplus "/ as sysdba"@stats.sql & 
    
    ## 无效对象的编译
    检查并编译
    @?/rdbms/admin/utlrp.sql
    
    
    ##验证数据(两边都进行查看)
    select count(*) from itpux01.itpux01;
    
    查看对象是否一致
    select owner,object_type,count(*) from dba_objects where owner in ('ITPUX01','ITPUX02') group by owner,object_type order by object_type;
    
    select owner,object_type,count(*) from dba_objects where owner in ('ITPUX01','ITPUX02') group by owner,object_type order by owner;s
    
    select * from dba_objects where status <> 'VALID' and owner in ('ITPUX01','ITPUX02');
    
    ## 启动自动维护任务
    execute dbms_auto_task_admin.enable;
    
    检查并更正 job 运行时间
    SELECT JOB,LOG_USER,SCHEMA_USER,what,LAST_DATE,LAST_SEC,NEXT_DATE,NEXT_SEC, FAILURES, BROKEN FROM DBA_JOBS;
    

    七、expdp/impdp 迁移过程字符集的处理

    进行数据的导入导出时,我们要注意关于字符集的问题。在 EXPDP/IMPDP 过程中我们需要注意四个字符集的参数:
    
    01.导出端的客户端字符集。
    02.导出端数据库字符集。
    03.导入端的客户端字符集。
    05.导入端数据库字符集。
    

    1. 查看数据库的字符集的信息

    select * from nls_database_parameters; 
    //SQL> select * from props$;
    PARAMETER      		 		VALUE
    NLS_LANGUAGE				AMERICAN    
    NLS_TERRITORY				AMERICA
    NLS_CURRENCY				$
    NLS_ISO_CURRENCY			AMERICA
    NLS_NUMERIC_CHARACTERS		.,
    NLS_CHARACTERSET			ZHS16GBK  --客户端应用程序使用的字符集
    NLS_CALENDAR				GREGORIAN
    NLS_DATE_FORMAT				DD-MON-RR
    NLS_DATE_LANGUAGE			AMERICAN
    NLS_SORT					BINARY
    NLS_TIME_FORMAT				HH.MI.SSXFF AM
    NLS_TIMESTAMP_FORMAT		DD-MON-RR HH.MI.SSXFF AM
    NLS_TIME_TZ_FORMAT			HH.MI.SSXFF AM TZR
    NLS_TIMESTAMP_TZ_FORMAT		DD-MON-RR HH.MI.SSXFF AM TZR
    NLS_DUAL_CURRENCY			$
    NLS_COMP	BINARY
    NLS_LENGTH_SEMANTICS		BYTE
    NLS_NCHAR_CONV_EXCP			FALSE
    NLS_NCHAR_CHARACTERSET		AL16UTF16  --国家字符集
    NLS_RDBMS_VERSION			11.2.0.4.0
    
    
    ##设置字符集(我们再来查看客户端的字符集信息:)
    
    客户端字符集的参数 NLS_LANG=_< territory >.
    language:指定 oracle 消息使用的语言,日期中日和月的显示。
    Territory:指定货币和数字的格式,地区和计算星期及日期的习惯。
    Characterset:控制客户端应用程序使用的字符集。通常设置或等于客户端的代码页。
    ZHS16GBK、UTF8。
    
    NLS_LANG=NLS_LANGUAGE_NLS_TERRITORY.NLS_CHARACTERSET  默认的格式
    
    --win
    set NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
    
    --unix
    export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK  --只是当前生效
    
    在 unix 中:
    $ env|grep NLS_LANG
    NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
    当前修改可用:
    $ export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
    
    永久修改可用:(需要修改环境变量参数文件 .bash_profile、.profile)
    vi bash_profile
    
    
    
    
    通常在导出时最好把客户端字符集设置得和数据库端相同。当进行数据导入时,主要有以下两种情况:
    (1) 源数据库和目标数据库具有相同的字符集设置。这时,只需设置导出和导入端的客户端 NLS_LANG 等于数据库字符集即可。
    
    (2) 源数据库和目标数据库字符集不同。
    先将导出端客户端的 NLS_LANG 设置成和导出端的数据库字符集一致,导出数据,然后将导入端客户端的 NLS_LANG 设置成和导出端一致,导入数据,这样转换只发生在数据库端,而且只发生一次。
    
    这种情况下,只有当导入端数据库字符集为导出端数据库字符集的严格超集时,数据才能完全导成功,否则,可能会有数据不一致或乱码出现。
    

    八、expdp 与 impdp 版本兼容性与各版本的区别

    参考文档:http://www.fgedu.net.cn/bbs/thread-288-1-1.html
    
    COMPATIBLE     9.2.0.x.0    10.1.0.x.0    10.2.0.x.0    11.1.0.x.0    11.2.0.x.0
    ---------- ------------- ------------- ------------- ------------- -------------
    10.1.0.x.0   VERSION=9.2             -             -             -             -
    ---------- ------------- ------------- ------------- ------------- -------------
    10.2.0.x.0   VERSION=9.2  VERSION=10.1             -             -             -
    ---------- ------------- ------------- ------------- ------------- -------------
    11.1.0.x.0   VERSION=9.2  VERSION=10.1  VERSION=10.2             -             -
    ---------- ------------- ------------- ------------- ------------- -------------
    11.2.0.x.0   VERSION=9.2  VERSION=10.1  VERSION=10.2  VERSION=11.1       
    
    

    九、如何停止 expdp 与 impdp 备份任务的后台进程

    
    
    参考文档:http://www.itpux.com/thread-286-1-1.html
    
    关于数据泵datapump EXPDP/IMPDP交互模式常用命令
    CONTINUE_CLIENT返回到记录模式。假如处于空闲状态, 将重新启动作业。
    START_JOB 启动恢复当前作业。
    STATUS在默认值 (0) 将显示可用时的新状态的情况下,要监视的频率 (以秒计) 作业状态。
    STATUS=[interval]
    STOP_JOB顺序关闭执行的作业并退出客户机。
    STOP_JOB=IMMEDIATE 将立即关闭数据泵作业。
    ADD_FILE向转储文件集中添加转储文件。
    ADD_FILE=dirobjdumpfile-name
    CONTINUE_CLIENT 返回到记录模式。假如处于空闲状态, 将重新启动作业。
    EXIT_CLIENT 退出客户机会话并使作业处于运行状态。
    HELP总结交互命令。
    KILL_JOB分离和删除作业。
    PARALLEL更改当前作业的活动 worker 的数目。
    PARALLEL=worker 的数目。
    START_JOB 启动恢复当前作业。
    STATUS在默认值 (0) 将显示可用时的新状态的情况下,
    要监视的频率 (以秒计) 作业状态。
    STATUS=[interval]
    STOP_JOB顺序关闭执行的作业并退出客户机。
    STOP_JOB=IMMEDIATE 将立即关闭
    
    

    1.进行演练

    ## 导出数据
    export BAKDATE=`date +%Y%m%d`
    expdp system/oracle directory=data dumpfile=expdp_full_db01.$BAKDATE.%U.dmp logfile=expdp_full_db01.$BAKDATE.log full=y parallel=2 
    略。。。
    ^C
    Export>
    
    ctrl + c 后 ,继续查看job,还在进行导出
    
    ##可以用次命令查看job 
    SYS@orcl > select JOB_NAME,STATE from dba_datapump_jobs;
    
    JOB_NAME		       STATE
    ------------------------------ ------------------------------
    SYS_EXPORT_FULL_01	       EXECUTING
    
    
    
    [oracle@ogg12c dpdata]$ expdp system/oracle attach=SYS_EXPORT_FULL_01
    
    Export: Release 11.2.0.4.0 - Production on Wed Aug 26 11:45:59 2020
    
    Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.
    
    Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
    With the Partitioning, OLAP, Data Mining and Real Application Testing options
    
    Job: SYS_EXPORT_FULL_01
      Owner: SYSTEM                         
      Operation: EXPORT                         
      Creator Privs: TRUE                           
      GUID: ADC0A34D03580C14E053072BA8C0FFB1
      Start Time: Wednesday, 26 August, 2020 11:44:34
      Mode: FULL                           
      Instance: orcl
      Max Parallelism: 2
      EXPORT Job Parameters:
      Parameter Name      Parameter Value:
         CLIENT_COMMAND        system/******** directory=data dumpfile=expdp_full_db01.20200826.%U.dmp logfile=expdp_full_db01.20200826.log full=y parallel=2 
      State: EXECUTING                      
      Bytes Processed: 32,108,568
      Percent Done: 99
      Current Parallelism: 2
      Job Error Count: 0
      Dump File: /data/dpdata/expdp_full_db01.20200826.%u.dmp
      Dump File: /data/dpdata/expdp_full_db01.20200826.01.dmp
        bytes written: 32,763,904
      Dump File: /data/dpdata/expdp_full_db01.20200826.02.dmp
        bytes written: 4,096
      
    Worker 1 Status:
      Process Name: DW00
      State: EXECUTING                      
      Object Schema: SYSMAN
      Object Name: EMD_LOADER
      Object Type: DATABASE_EXPORT/SCHEMA/PACKAGE_BODIES/PACKAGE/PACKAGE_BODY
      Completed Objects: 25
      Worker Parallelism: 1
      
    Worker 2 Status:
      Process Name: DW01
      State: WORK WAITING                   
    
    Export> 
    Export> stop_job=immediate; 或者另一种方式干掉进程
    Export> kill_job  
    Are you sure you wish to stop this job ([yes]/no): yes
    
    再次查看job
     select JOB_NAME,STATE from dba_datapump_jobs;
    
    
    kill_job  和 stop_job 的区别就是 直接杀掉不能再用了,如果是stop 停止,那还可以进行启动,还能继续在用
    

    2.清理不需要的数据泵 job

    参考资料:
    http://www.itpux.com/thread-287-1-1.html
    
    进行模拟(思路):
    进行导出数据
    查看job 
    停止stop_job 
    
    操作过程和步骤一(1.进行演练)的操作一样,这里就不在进行操作了
    
    
    SYS_EXPORT_FULL_01 是一个完整的数据库导出作业,状态是NOT RUNNING,意味着作业是暂时的停止,实际上作业失败了也是NOT RUNNING状态。
    
    CONNECT / as sysdba 
    SET lines 200  
    COL owner_name FORMAT a10;  
    COL job_name FORMAT a20  
    COL state FORMAT a12  
    COL operation LIKE state  
    COL job_mode LIKE state  
    
    SELECT owner_name, job_name, operation, job_mode,  
    state, attached_sessions  
    FROM dba_datapump_jobs  
    WHERE job_name NOT LIKE 'BIN$%'  
    ORDER BY 1,2;  
    
    OWNER_NAME JOB_NAME		OPERATION    JOB_MODE	  STATE        ATTACHED_SESSIONS
    ---------- -------------------- ------------ ------------ ------------ -----------------
    SYSTEM	   SYS_EXPORT_FULL_01	EXPORT	     FULL	  NOT RUNNING		       0
    
    
    ## 定位数据泵主表(来判断是暂停了还是意外不用了)(查看是否有效)
    SELECT o.status, o.object_id, o.object_type, 
           o.owner||'.'||object_name "OWNER.OBJECT" 
      FROM dba_objects o, dba_datapump_jobs j 
    WHERE o.owner=j.owner_name AND o.object_name=j.job_name 
       AND j.job_name NOT LIKE 'BIN$%' ORDER BY 4,2; 
       
       STATUS	 OBJECT_ID OBJECT_TYPE	       OWNER.OBJECT
    ------- ---------- ------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------
    VALID	     87646 TABLE	       SYSTEM.SYS_EXPORT_FULL_01
    
    ## 删除掉(对于过去停止且不再重新启动的作业,删除主表。)
    SYS@orcl > drop table SYSTEM.SYS_EXPORT_FULL_01;
    
    SYS@orcl > purge dba_recyclebin;  --情空回收站 (然后在查看是否被删除掉)
    

    十、对 expdp/impdp 进行 trace 跟踪分析问题

    1. 使用 Trace 480300

    Data Pump 工作原理有两个特点:作业调度,多进程配合协作。对 Data Pump 的诊断本质上就是对各种 Process 行为的跟踪。Oracle 提供了一个 Trace 的隐含参数,来帮助我们实现这个目标。
    
    Trace并不像其他跟踪过程相同,使用y/n的参数,开启或者关闭。Data Pump的Trace参数是一个 7 位十六进制组成的数字串。不同的数字串表示不同的跟踪对象方法。7位十六进制数字分为两个部分,前三个数字表示特定的数据泵组件,后四位使用 0300就可以。
    
    各个组件分别使用不同的三位十六进制数字代表。如下片段所示:
    -- Summary of Data Pump trace levels:
    -- ==================================
     Trace DM DW ORA Lines
     level trc trc trc in
     (hex) file file file trace				Purpose
      10300 x x x SHDW: To trace the Shadow process (API) (expdp/impdp)
     20300 x x x KUPV: To trace Fixed table
     40300 x x x 'div' To trace Process services
     80300 x KUPM: To trace Master Control Process (MCP) (DM)
     100300 x x KUPF: To trace File Manager
     200300 x x x KUPC: To trace Queue services
     400300 x KUPW: To trace Worker process(es) (DW)  --工作进程,平行度
     800300 x KUPD: To trace Data Package
     1000300 x META. To trace Metadata Package
    --- + 
     1FF0300 x x x 'all' To trace all components (full tracing)
    
    一般用 80300 和 400300 就可以,
    如果需要同时跟踪多个组件,需要将目标组件的 hex 值进行累加,后面四位的 300 相同。
    400300+80300=480300
    
    对于跟踪的 Trace 取值,Oracle 建议使用 480300 就可以应对大部分的情况。480300会跟踪 Oracle Dump 作业的 Master Control Process(MCP)和 Work Process。
    作为初始化跟踪的过程,480300 基本就够用了。
    
    
    我们先从数据导出 Expdp 看 Trace,导出一个案例。首先清理一下 Trace File 目录。
    ## 导出数据
    expdp itpux01/itpux01 directory=data schemas=itpux01 dumpfile=itpux01_trace.dmp logfile=itpux01_trace.log  trace=480300
    
    ##查看trace 路径
    show parameter dump;
    
    [oracle@ogg12c trace]$ pwd
    /data/app/oracle/diag/rdbms/orcl/orcl/trace
    [oracle@ogg12c trace]$ ll -rst
    
     4 -rw-r----- 1 oracle oinstall   1280 Aug 26 16:15 orcl_dw00_4701.trm
     44 -rw-r----- 1 oracle oinstall  44344 Aug 26 16:15 orcl_dw00_4701.trc
     4 -rw-r----- 1 oracle oinstall   1043 Aug 26 16:15 orcl_dm00_4699.trm
     24 -rw-r----- 1 oracle oinstall  22323 Aug 26 16:15 orcl_dm00_4699.trc
    
    然后检查 trc 目录,Dm 和 dw 标注的就是 MCP 和 Work Process 生成的 Trace 文件。
    同时 Parallel 设置使得 dw 有 00 和 01 两个。
    ## 查看trace 文件
    [oracle@ogg12c trace]$ more orcl_dm00_4699.trc
    [oracle@ogg12c trace]$ more orcl_dw00_4701.trc
     2个 trace 文件在 BACKGROUND_DUMP_DEST 目录下:
    Master Process trace file: <SID>_dm<number>_<process_id>.trc 
    Worker Process trace file: <SID>_dw<number>_<process_id>.trc
    
    在导出过程中,我们可以看到两个 worker 的会话信息。
    SQL> select * from dba_datapump_sessions;
    

    2. 使用 Trace 480301

    其实就是在后面 + 1 (400300+80300=480300+1=480301)实验过程和 480300 一样
    在 Trace 过程中,我们也可以如 10046 跟踪过程一样,添加 SQL 跟踪。Data Pump本质上工作还是一系列的 SQL 语句,很多时候的性能问题根源都是从 SQL 着手的。
    切换到 SQL 跟踪模式也比较简单,一般是在 Trace 数值后面添加 1。
    把之前导出的删除掉,在进行导出
    expdp itpux01/itpux01 directory=data schemas=itpux01 dumpfile=itpux01_trace.dmp logfile=itpux01_trace.log  trace=480301 
    [oracle@ogg12c trace]$ more orcl_ora_4768.trc
    
    impdp "/ as sysdba" directory=dumpdir dumpfile=itpux_dump.dmp remap_schema=itpux:test trace=480301 parallel=2
    
    我们使用导入过程进行实验。
    目录生成的 Trace 文件,都是 10046 格式的 Raw 文件。截取片段如下:
    10046 生成的 trace 文件可读性并不好,所有我们可以使用 tkprof 工具进行格式化,方便阅读。
    
    如:格式后输出一个文件(orcl_ora_4768.out)
    [oracle@ogg12c trace]$ tkprof orcl_ora_4768.trc orcl_ora_4768.out waits=y sort=exeela
    [oracle@ogg12c trace]$ more orcl_ora_4768.out
    [oracle@ogg12c trace]$ tail -100f  orcl_ora_4768.out
    

    3. 使用 10046 事件

    10046 事件有如下级别:
    event 10046, level 1 = enable standardSQL_TRACE functionality
    event 10046, level 4 = as level 1, plus trace the BIND values
    event 10046, level 8 = as level 1, plus trace the WAITs
    event 10046, level 12 = as level 1, plus trace the BIND values and the WAITs
    
    不同级别的使用情况如下:
    level 1: lowest level tracing - not alwayssufficient to determine cause of errors;
    level 4: useful when an error in DataPump's worker or master process occurs;
    level 12: useful when there is an issuewith Data Pump performance
    
    注意:
     当我们设置 10046 的级别高于 8 或者 12 的时候,需要将 TIMED_STATISTICS 设置为 TRUE. 临时的将这个参数设置为 true,可以将 trace 数据性能的影响降到最低,在 11gR2 里,该参数默认为 true。
    一般只有遇到性能问题时,才会使用 8 或者 12 的 level。一般用 4 级别
    
    

    3.1 对当前正在运行的进程进行 trace

    01、对当前正在运行的进程进行 trace
    查看 expdp 进程
    ## 备份全库
     expdp system/oracle directory=data dumpfile=expdp_full.dmp logfile=expdp_full.log full=y 
    --查看数据泵进程的信息:
    set lines 150 pages 100 numwidth 7 
    col username for a10 
    col spid for a7 
    col program for a25
    select to_char(sysdate,'YYYY-MM-DDHH24:MI:SS') "DATE", s.program, s.sid, 
     s.status, s.username, d.job_name, p.spid, s.serial#, p.pid 
    from v$session s, v$process p,dba_datapump_sessions d 
    where p.addr=s.paddr and s.saddr=d.saddr;
    
    DATE		   PROGRAM			 SID STATUS   USERNAME	 JOB_NAME    SPID	SERIAL#     PID
    ------------------ ------------------------- ------- -------- ---------- ------------------------------ ------- ------- -------
    2020-08-2616:59:56 oracle@ogg12c (DW00) 	  18 ACTIVE   SYSTEM	 SYS_EXPORT_FULL_01		4905	     99      37
    2020-08-2616:59:56 oracle@ogg12c (DM00) 	  45 ACTIVE   SYSTEM	 SYS_EXPORT_FULL_01		4903	    243      35
    2020-08-2616:59:56 ude@ogg12c (TNS V1-V3)	  43 ACTIVE   SYSTEM	 SYS_EXPORT_FULL_01		4901	    113      34
    使用 sys.dbms_system.set_ev 设置 10046
    在上节的查询结果里:
    Data Pump Master process (DM00)的 SID 是 58,serial#是 45.
    Data Pump Worker process (DW01)的 SID 是 23,serial#是 18.
    
    使用 10046 跟踪活动 session 的语法如下:
    Syntax: DBMS_SYSTEM.SET_EV([SID],[SERIAL#],[EVENT],[LEVEL],'') 
     
    --在 level 4 跟踪 Worker process 进程(Bind values):
    使用 10046 跟踪活动 session 的语法如下:
    Syntax: DBMS_SYSTEM.SET_EV([SID],[SERIAL#],[EVENT],[LEVEL],'') 
     
    --在 level 4 跟踪 Worker process 进程(Bind values):
    SYS@orcl > execute sys.dbms_system.set_ev(45,18,10046,4,'');
    
    PL/SQL procedure successfully completed.
    
    SYS@orcl > 
    
    -- stop tracing: 
    execute sys.dbms_system.set_ev(44,43,10046,0,''); 
    
    --在 level 8 跟踪 Master 进程(Waits):
    execute sys.dbms_system.set_ev(143,50,10046,8,''); 
    -- stop tracing: 
    execute sys.dbms_system.set_ev(143,50,10046,0,'');
    
    

    3.2 使用 oradebug

    可以在 oradebug 中设置 SPID,来进行 trace:
     
    --在 level 4 跟踪 Worker process 进程(Bind values):
    oradebug setospid 8173 
    oradebug unlimit 
    oradebug event 10046 trace name context forever,level 4
    oradebug tracefile_name
    
    --在 level 8 跟踪 Master 进程(Waits):
    oradebug setospid 8171 
    oradebug unlimit 
    oradebug event 10046 trace name context forever,level 8 
    oradebug tracefile_name
    
    --stop tracing: 
    oradebug event 10046 trace name context off
    

    1.3 使用 tkprof 分析 trace 文件

    10046 生成的 trace 文件可读性并不好,所有我们可以使用 tkprof 工具进行格式化,
    方便阅读。
     
    如:
    $ tkprof itpux_dm00_17292.trc tkprof_itpux_dm00_17292.out waits=y sort=exeela
    $ tkprof itpux_dw01_17294.trc tkprof_itpux_dw01_17294.out waits=y sort=exeela
    

    十一、关于 expdp/impdp 的使用总结

    1、expdp/impdp 默认就是使用直接路径的,所以速度比较快,但是 expdp/impdp 
    是服务端程序,影响它速度的只有磁盘 io。
    
    2、导出多表时,expdp/impdp 用法是 tables='table1','table2','table3'。
    
    3、dumpfile 参数 ,可以用%u 指定多个数据文件
    expdp xxx/xxx schemas=xxx directory=dump1 dumpfile=xxx_%u.dmp filesize=50g
    这样每个文件 50g ,xxx_01.dump,xxx_02.dump 这样。
    
    4、如果要把用户 usera 的对象导到用户 userb,操作如下:
    impdp system/passwd directory=expdp dumpfile=expdp.dmp remap_schema='usera':'userb' logfile=/oracle/exp.log;
    
    5、如果导入需要更换表空间, impdp 用remap_tablespace='tabspace_old':'tablespace_new'
    
    6、关于数据导出时要导出哪些内容:
    expdp content(all:对象+导出数据行,data_only:只导出对象,metadata_only:只导出数据的记录)
    
    7、数据泵 expdp/impdp 影响速度和性能最大的就是 paralle。 所以使用数据泵,要想提高速度,就要设置并行参数。如:
    expdp full=y directory=dump dumpfile=test_%u.dmp parallel=4
    那么 expdp 将为 parallel 创建 4 个文件: test_01.dmp,test_02.dmp,test_03.dmp,test_04.dmp。 每个进程一个文件。 这样的话,每个文件的大小会因进程而不同。 可以某个文件很大,某个文件却很小。 要解决这个问题,就是设置
    filesize 参数。 来指定每个文件的最大值。 这样当一个文件达到最大值的之后,就会创建一个新的文件。
    
    如 : expdp full=y directory=dump dumpfile=test_%u.dmp parallel=4 filesize=50m
    导出的 dump 文件和 paralle 有关系,那么导入也有关系。 paralle 要小于 dump 文件数。 如果 paralle 大于 dump 文件的个数,就会因为超过的那个进程获取不到文件,就不能对性能提高。一般 parall 参数值等于 cpu 的个数。而且要小于dump文件的个数
    
    
    
  • 相关阅读:
    [liu yanling]常用的测试工具
    [liu yanling]软件测试的过程
    [liu yanling]测试方法
    [Buffalo] 一些SQL函数
    [Stephen]C#中调用C++动态链接库
    [Jacky] 解决Ext.Net GridPanel 选择的行数据刷新后不能获取最新值
    [Tommas] dateadd() 函数用法
    [Tommas] UNION 和 UNION ALL 的区别
    文件I/O编程
    分房问题
  • 原文地址:https://www.cnblogs.com/zy-303/p/13895847.html
Copyright © 2011-2022 走看看