数据泵在数据的导入、导出方面突出了它特有的优势,给数据库管理人员提供了极大的方便

expdp导出数据

  • expdp常用参数介绍
ATTACH 连接到现有作业, 例如 ATTACH [=作业名]。
COMPRESSION 减小有效的转储文件内容的大小
                      关键字值为: (METADATA_ONLY) 和 NONE。
CONTENT 指定要卸载的数据, 其中有效关键字为:
                      (ALL), DATA_ONLY 和 METADATA_ONLY。
DIRECTORY 供转储文件和日志文件使用的目录对象。
DUMPFILE 目标转储文件 (expdat.dmp) 的列表,
                      例如 DUMPFILE=scott1.dmp, scott2.dmp, dmpdir:scott3.dmp。
EXCLUDE 排除特定的对象类型, 例如 EXCLUDE=TABLE:EMP。
FILESIZE 以字节为单位指定每个转储文件的大小。
FULL 导出整个数据库 (N)。
INCLUDE 包括特定的对象类型, 例如 INCLUDE=TABLE_DATA。
JOB_NAME 要创建的导出作业的名称。
LOGFILE 日志文件名 (export.log)。
NETWORK_LINK 链接到源系统的远程数据库的名称。
NOLOGFILE 不写入日志文件 (N)。
PARALLEL 更改当前作业的活动 worker 的数目。
PARFILE 指定参数文件。
QUERY 用于导出表的子集的谓词子句。
SCHEMAS 要导出的方案的列表 (登录方案)。
STATUS 在默认值 (0) 将显示可用时的新状态的情况下,
                      要监视的频率 (以秒计) 作业状态。
TABLES 标识要导出的表的列表 - 只有一个方案。
TABLESPACES 标识要导出的表空间的列表。
TRANSPORT_TABLESPACES 要从中卸载元数据的表空间的列表。

命令 说明
ADD_FILE 向转储文件集中添加转储文件。
CONTINUE_CLIENT 返回到记录模式。如果处于空闲状态, 将重新启动作业。
EXIT_CLIENT 退出客户机会话并使作业处于运行状态。
FILESIZE 后续 ADD_FILE 命令的默认文件大小 (字节)。
HELP 总结交互命令。
KILL_JOB 分离和删除作业。
PARALLEL 更改当前作业的活动 worker 的数目。
                      PARALLEL=<worker 的数目>。
START_JOB 启动/恢复当前作业。
STATUS 在默认值 (0) 将显示可用时的新状态的情况下,
                      要监视的频率 (以秒计) 作业状态。
                      STATUS[=interval]
STOP_JOB 顺序关闭执行的作业并退出客户机。
                      STOP_JOB=IMMEDIATE 将立即关闭
                      数据泵作业。

下面介绍几种常用的expdp方法π

  • 在不同数据库中把一个schema中所有的对象导入到另一个schema中。
1、在目标数据库中创建Database links
语法如下:
(create public database link LINK_CDMABASE
  connect to CDMABASE identified by cdmabase
  using '//192.168.1.202:1521/release.haitu.com')
2、将原数据库中的schema中所有的对象导入到目标数据库的schema中
语法如下:
impdp system/orcl network_link=link_cdmabase re
map_schema=cdmabase:zsk tables=cdmabase.action_info
其中:NETWORK_LINK是指链接到源系统的远程数据库的名称也就是创建好的Database links。
  • 导出数据库中以字母A开头的表 -
expdp system/orcl CONTENT=DATA_ONLY network_link=LINK_TEST_bak remap_schema=(cdmatest:zsk) INCLUDE=TABLE:"LIKE'A%'"
  • 导出数据库中除以字母B开头的表 -
expdp system/orcl CONTENT=DATA_ONLY network_link=LINK_TEST_bak remap_schema=(cdmatest:zsk) EXCLUDE=TABLE:"LIKE'B'"
  • 导出数据库中指定的schema -
expdp system/orcl CONTENT=DATA_ONLY directory=DATA_PUMP_DIR dumpfile=cdmabase.dmp logfile=cdmabase.log schemas=cdmaostest
  • 导出数据库中某一表的部分数据(即把数据过滤)-
expdp system/haitu@192.168.1.200 directory=DATA_PUMP_DIR dumpfile=cdmabase.dmp logfile=cdmabase.log QUERY=\"where\" logfile=cm.log content=data_only

expdp查看任务状态 π

假如我们的导出作业 (EXAMPLE1) 遇到了严重错误,导致导出失败,则可以通过以下方法来解决。
第一步、查看数据库中任务的状态
SQL> select job_name,state from dba_datapump_jobs;

JOB_NAME STATE
EXAMPLE1 NOT RUNNING
第二步、连接任务
>expdp system/manager attach=JOB_NAME



第 3 步:添加转储文件
此时,可以在 Export> 提示符下发出 ADD_FILE 指令来添加转储文件。新的转储文件将自动创建在与原始转储文件相同的目录 (DATA_PUMP_DIR) 中。
Export>add_file=hr1.dmp
接下来,我们可以执行 status 命令,看到现在显示出这个添加的转储文件。
第四步:重新启动/继续作业
最后,我们发出 CONTINUE_CLIENT 命令。作业 EXAMPLE1 此时将恢复运行。
我们也可以使用 START_JOB 命令。CONTINUE_CLIENT 命令将模式从交互式命令模式更改为记录模式,然后执行 START_JOB。
第 7 步:检查作业状态

我们可以随意地查看作业的状态。

Import> status




impdp导入数据

  • 把数据从oracle11g中导入到oracle10g中 -
第一步:从oracle11g中导出数据
expdp system/dbserver CONTENT=DATA_ONLY directory=DATA_PUMP_DIR dumpfile=cm.dmp logfile=cm.log tables=cdmaos.cm_ctiy version=10.2 注意: 在导出数据时需指定导出数据oracle的版本号,该版本号必须低于所要导入数据的oracle的版本号。

第二步:把从oracle11g中导出来的数据导入到oracle10g中
impdp system/dbserver content=data_only directory=dumpdir dumpfile=cm.dmp logfile=cm.log remap_schema=cdmaos:cdmatest




============================

如果导出过程中出现异常中断,可能任务还残留在数据库中
可以通过DBA_DATAPUMP_JOBS或USER_DATAPUMP_JOBS视图查询
根据得到的表名 删除任务
drop table hr.SYS_EXPORT_SCHEMA_01 purge;
这里的purge子句,是不将表放入Oracle回收站,彻底 删除
Oracle回收站还可以用PURGE recyclebin来清空
也可PURGE TABLE tablename来指定清空之前 删除并放入回收站的表


============================================================

expdp dba_datapump_jobs

expdp/impd 是Job形式的,会调用DBMS_DATAPUMP PL/SQL包,这个API提供高速的导出导入功能;还有DBMS_METADATA PL/SQL包,这个包是将metadata(对象定义)存储在XML里。 所有的进程都能load 和unload 这些metadata。
       在备份期间,会自动的生成一张与Job_name 相同名称的表, 该表在备份期间保存metadata数据。 当备份技术后,自动删除该表。
       我们可以使用SQL:
               SQL>select *  FROM dba_datapump_jobs
       查看Job 的信息。 如果意外情况导致备份Job失败,那么对应保存metadata的表,还是会存在。 这个时候,如果查询dba_datapump_jobs,会显示该Job为not running。 这时候,我们只需要drop 掉对应的表,在查询dba_datapump_jobs。 就没有记录了。 这个也是一种处理方法。
      
       在开始我就说了,这里没有指定Job name。 所以系统自动给我们生成了一个:SYS_EXPORT_FULL_02。
       默认是从SYS_EXPORT_FULL_01开始,因为我之前有一个没有运行的Job,所以这里从2开始了。
 
(2)指定Job_name
[oracle@qs-dmm-rh2 ~]$ expdp  "'/  as sysdba/'" directory=backup full=y dumpfile=fullexp3.dmp logfile=fullexp3.log parallel=2 job_name=daveJob;
--在这里我指定了Job_name


-----------------------------------------------------------*****

昨天接触了exp/imp,今天再来练练Oracle10g之后的新工具,数据泵
数据泵同原来的导入导出工具最大的不同,数据泵是服务器端的工具
而原来的导入导出工具是客户端的
另外,按照 Oracle文档的说法
新的数据泵工具,支持许多Oracle10g新特性
(不支持XML schema或以XML schema为基础的表)
而且,在传输性能和易用性上比原导入导出工具改进不少
像并行传输,中断/继续传输,跨网传输,过滤对象,空间消耗测算等……
数据泵工具有三个组成部分
命令行形式的客户端,就是expdp和impdp
名为DBMS_DATAPUMP的PL/SQL包,作为数据泵的API
名为DBMS_METADATA的PL/SQL包,作为元数据API
今天个人是练习命令行客户端的使用
命令行的导入导出是通过DBMS_DATAPUMP包中的存储过程来实现的
在数据泵任务中,Oracle会建立一个主进程(master process)
用来控制包括与客户端通信,创建并控制工作进程,跟踪日志等功能
还要建立主表,为导出任务记录 数据库对象和其位置,并最终写到转储文件
为导入任务从转储文件中读取需要的数据库对象,并控制操作顺序
其它步骤就要看用户如何来调用数据泵(是否转换对象,监视任务)
因为数据泵是服务器端的工具,在使用前可能还需要建立一个目录对象
并赋予相应用户对此目录的Oracle可读写权限(不能直接读写)
以便整个执行过程使用
使用数据泵前,将此目录对象设定为DATA_PUMP_DIR参数值
(未指定,Oracle将会使用自动设定值)
可通过下面语句查看当前数据库该值情况
SELECT directory_name, directory_path FROM dba_directories
WHERE directory_name='DATA_PUMP_DIR';
练习开始,先建立一个directory对象,并给hr用户赋读写权限
create directory dumptest as '/home/oracle/dumptest';
grant read,write on directory dumptest to hr;
另外,因为用的是Oracle的hr示例schema
数据库中已经自动建立好了一些必要的数据库对象
来看看导出,expdp
下面的命令是先 测试导出hr的所有对象所需空间
expdp hr/hr ESTIMATE_ONLY=y NOLOGFILE=y
在调用expdp时,下面命令默认导出hr全部对象和数据
expdp hr/hr directory=dumptest
再做一个仅仅导出元数据(描述数据格式用,可以理解为对象的定义)的例子
操作目录就是刚才创建的dumptest,文件名为hr.dmp
CONTENT参数为METADATA_ONLY就是指仅导出元数据
expdp hr/hr DIRECTORY=dumptest DUMPFILE=hr.dmp CONTENT=METADATA_ONLY
再来利用参数文件,导出某个表的部分数据
expdp hr/hr parfile='/home/oracle/pump.par'
参数文件内容:
DUMPFILE=exp.dmp
TABLES=empb
QUERY=empb:"WHERE department_id > 10 AND salary > 10000"  #导出数据的条件
DIRECTORY=dumptest
LOGFILE=exp.log
接下来练习一下数据泵与原先的exp工具最大不同(个人认为)
因为数据库是服务端的工具,它可以停止/继续某个任务
这里可以添加一个JOB_NAME参数来指定任务名称,也可使用Oracle自动生成的
要进行停止任务操作,需要在数据泵出现starting提示后,按ctrl+c组合键
expdp hr/hr parfile='/home/oracle/pump.par'
参数文件内容:
DUMPFILE=exp.dmp
TABLES=t_test
DIRECTORY=dumptest
LOGFILE=exp.log
看到starting后迅速中断,进入Export>提示符
输入status查看当前任务状态:
Job: SYS_EXPORT_TABLE_01
  Operation: EXPORT
  Mode: TABLE
  State: EXECUTING
  Bytes Processed: 0
  Current Parallelism: 1
  Job Error Count: 0
  Dump File: /home/oracle/dumptest/exp.dmp
  bytes written: 4,096
Worker 1 Status:
  State: EXECUTING
在提示符下输入stop_job,然后会询问是否停止
[yes]/no:#这里直接按回车就可以,expdp自动退出
要继续之前的任务,运行 expdp hr/hr attach=SYS_EXPORT_TABLE_01
得到提示
Job: SYS_EXPORT_TABLE_01
  Owner: HR
  Operation: EXPORT
  Creator Privs: FALSE
  GUID: 600900F7324CC476E040007F010033B4
  Start Time: Friday, 09 January, 2009 15:54:18
  Mode: TABLE
  Instance: test
  Max Parallelism: 1
  EXPORT Job Parameters:
  Parameter Name      Parameter Value:
     CLIENT_COMMAND        hr/******** parfile=/home/oracle/pump.par
  State: IDLING
  Bytes Processed: 0
  Current Parallelism: 1
  Job Error Count: 0
  Dump File: /home/oracle/dumptest/exp.dmp
    bytes written: 4,096
Worker 1 Status:
  State: UNDEFINED
然后在Export>提示符下,start_job
输入status查看任务状态,State: EXECUTING,任务又开始了
过一会儿,再次查看状态,State: WORK WAITING,任务已结束并进入等待状态
如果导出过程中出现异常中断,可能任务还残留在数据库中
可以通过DBA_DATAPUMP_JOBS或USER_DATAPUMP_JOBS视图查询
根据得到的表名删除任务
drop table hr.SYS_EXPORT_SCHEMA_01 purge;
这里的purge子句,是不将表放入Oracle回收站,彻底删除
Oracle回收站还可以用PURGE recyclebin来清空
也可PURGE TABLE tablename来指定清空之前删除并放入回收站的表
导入impdp的练习,先删除t_test表内全部数据,再用dmp文件导入
impdp hr/hr parfile=/home/oracle/pump.par
参数文件内容:
DUMPFILE=exp.dmp
TABLES=t_test
DIRECTORY=dumptest
JOB_NAME=impdp01
TABLE_EXISTS_ACTION=APPEND
LOGFILE=exp2.log
开始后,中断,进入Import>提示符
status查看状态
Job: IMPDP01
  Operation: IMPORT
  Mode: TABLE
  State: EXECUTING
  Bytes Processed: 0
  Current Parallelism: 1
  Job Error Count: 0
  Dump File: /home/oracle/dumptest/exp.dmp
Worker 1 Status:
  State: EXECUTING
  Object Schema: HR
  Object Name: T_TEST
  Object Type: TABLE_EXPORT/TABLE/TABLE_DATA
  Completed Objects: 1
  Completed Bytes: 138,009,296
  Percent Done: 100
  Worker Parallelism: 1
Import> stop_job
Are you sure you wish to stop this job ([yes]/no):
中断后,执行impdp hr/hr attach=impdp01
Job: IMPDP01
  Owner: HR
  Operation: IMPORT
  Creator Privs: FALSE
  GUID: 60095FC1D1FD9DB0E040007F010036E6
  Start Time: Friday, 09 January, 2009 16:19:28
  Mode: TABLE
  Instance: test
  Max Parallelism: 1
  EXPORT Job Parameters:
     CLIENT_COMMAND        hr/******** parfile=/home/oracle/pump.par
  IMPORT Job Parameters:
  Parameter Name      Parameter Value:
     CLIENT_COMMAND        hr/******** parfile=/home/oracle/pump.par
     TABLE_EXISTS_ACTION   APPEND
  State: IDLING
  Bytes Processed: 0
  Current Parallelism: 1
  Job Error Count: 0
  Dump File: /home/oracle/dumptest/exp.dmp
Worker 1 Status:
  State: UNDEFINED
  Object Schema: HR
  Object Name: T_TEST
  Object Type: TABLE_EXPORT/TABLE/TABLE_DATA
  Completed Objects: 1
  Completed Bytes: 138,009,296
  Percent Done: 100
  Worker Parallelism: 1
执行start_job(continue_client也可以),任务继续执行直至完毕
因为开始只删除了数据,保留了t_test表,所以导入过程有错误
ORA-39152: Table "HR"."T_TEST" exists.
Data will be appended to existing table
but all dependent metadata will be skipped
due to table_exists_action of append
Processing object type TABLE_EXPORT/TABLE/TABLE_DATA
但数据已经导入完毕