ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 按计划了解数据泵expdp/impdp

按计划了解数据泵expdp/impdp

原创 Linux操作系统 作者:louloueva 时间:2009-01-09 18:07:32 0 删除 编辑

昨天接触了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
但数据已经导入完毕

简单练习就到此为止
还有许多高级应用等需要的时候再做练习

昨天和今天,简单接触了Oracle的逻辑备份恢复
从明天开始,计划开始更多的接触RMAN ^_^

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/556359/viewspace-534837/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-01-02

  • 博文量
    134
  • 访问量
    118446