如何对 Oracle 数据泵(expdp/impdp) 进行 debug(一)

2014-11-24 17:57:30 · 作者: · 浏览: 5

这两篇都是介绍数据泵的使用。


那么在实际的使用中,我们也会遇到一个问题,发生一些ORA-xx的错误,有具体的错误,我们都可以去google去分析,但是还有情况,就是也不错误,而是在某一步停住了,而且很长时间不动。


这是时候,我们是不好判断数据泵的操作是否正常。


在数据泵卡住的时候,有一个很好的方法来判断:


1. 在expdp的时候,我们要观察dump 文件的变化,只要dump 文件大小在变化,那就说明expdp是正常的。


2. 在impdp的时候,我们可以及时查看表空间的变化,只要我们的表空间在变化,说明我们的impdp是正常的。


如果在数据泵操作的时候,表空间和dump都没有变化,数据泵操作也停止在某一步不动。那么我们就只能对数据泵进行debug操作。


trace 生成的文件可能很大,所以在进行trace之前,必须先检查dump文件的大小:max_dump_file_size。


[oracle@asm trace]$ orz param max_dump


Session altered.


NAME ISDEFAULT SESMO SYSMOD VALUE


---------------------- --------- -------------- ---------------


max_dump_file_size TRUE TRUE IMMEDIATE unlimited



如果不是unlimited,就进行修改:


ALTER SYSTEM SETmax_dump_file_size = unlimited SCOPE = both;





启动trace 功能只需要在expdp/impdp 命令后加上一个trace 参数,该参数由一个7位的16进制数据组成。



前三位指定Data Pump组件的代码,后四位一般是:0300。



任何已0开头的trace的值都会被忽略,trace值不区分大小写。



如:


TRACE = 04A0300 或者 TRACE=4a0300




trace值的一些注意事项:


(1) trace 值不要超过7位十六进制数字。


(2) 不要添加十六进制的0x符号。


(3) 不要将16进制转换成10进制。


(4) 会忽略最前面的0,即使长度不满足7位。


(5) 参数不区分大小写。




在使用trace 参数时,执行数据泵操作的用户需要具有DBA 角色或者EXP_FULL_DATABASE /IMP_FULL_DATABASE的角色,如果权限不足,就会报ORA-31631的错误。


ORA-31631: privileges are required



解决方法:给用户赋权。 如:


GRANT exp_full_database TO tianlesoftware;



操作完成之后,在收回权限即可:


revoke exp_full_database from tianlesoftware;



使用TRACE的示例:


expdp scott/tiger DIRECTORY=my_dir DUMPFILE=expdp_s.dmp LOGFILE=expdp_s.log TABLES=empTRACE=480300


2.1.2 TRACE值的具体计算规则


在前面我们讲了TRACE 值的前3位表示的是数据泵的组件代码,具体如下:


-- 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 Shadowprocess (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 ControlProcess (MCP) (DM)


100300 x x KUPF: To trace File Manager


200300 x x x KUPC: To trace Queue services


400300 x KUPW: To trace Workerprocess(es) (DW)


800300 x KUPD: To trace DataPackage


1000300 x META: To trace Metadata Package


--- +


1FF0300 x x x 'all' To trace all components (full tracing)



如果想trace 所有的数据泵组件,只需要指定trace的值为1ff0300即可。



如果我们想通知trace 多个数据泵组件,就把这些组件的代码叠加起来即可,如:



-- Example of combination(last 4 digits are usually 0300):



40300 to trace Process services


80300 to trace Master Control Process (MCP)


400300 to trace Worker process(es)


-- +


4C0300 to trace Process services and MasterControl and Worker processes



叠加的时候,最后4位不变,把前面3位的值相加。



注意:


Oracle 建议使用480300的trace值,设置该值将会trace Master Control process (MCP) 和 theWorker process(es)。




2个trace 文件在BACKGROUND_DUMP_DEST目录下:


Master Process trace file: _dm_.trc
Worker Process trace file: _dw_.trc



还有一个在USER_DUMP_DEST目录:


Shadow Processtrace file: _ora_.trc




[oracle@asm u01]$ orzparam background



Session altered.



NAME ISDEFAULT SESMO SYSMOD VALUE


----------------------- --------- -------------- ----------------------------------------


background_core_dump TRUE FALSE FALSE partial


background_dump_dest TRUE FALSE IMMEDIATE /u01/app/oracle/diag/rdbms/dave/dave/trace




[oracle@asm u01]$ orzparam user_dump



Session altered.



NAME ISDEFAULT SESMO SYSMOD VALUE


--------------------- --------- -------------- ----------------------------------------


user_dump_dest TRUE FALSE IMMEDIATE/u01/app/oracle/diag/rdbms/dave/dave/trace







SQL> set lin 160 pages