expdp/impdp 挂起处理
现象:在执行expdp或者是impdp时,往往会出现导入表成功,但是在Processing object type SCHEMA_EXPORT/TABLE/INDEX/INDEX或者其他地方挂起
处理方法:
1、检查alert日志
2、检查主机资源 top(内存) + df -h
3、查看表空间使用率
4、确定等待事件
select sid,serial#,username,program,sql_id,event,p1,p2,p3 from v$session s, dba_datapump_sessions d where s.saddr = d.saddr;
依据等待事件进一步分析
常见的等待事件:
1)、statement suspended, wait error to be cleared
一般是由表空间不足,此时增加datafile,等待事件消失,但是仍然会报错。
解决方法是:重新导入
2)、Streams AQ: enqueue blocked on low memory 与wait for unread message on broadcast channel等待
通过调整streams_pool_size解决(该参数为SGA动态调整,但在执行expdp时,未能变化,默认为0,导致内存不足而挂起)
SQL> show parameter streams
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
streams_pool_size big integer 0
SQL> alter system set streams_pool_size=200M scope=memory;
expdp/impdp涉及到一个参数:
SQL> SELECT SESSION_ID, STATUS, TIMEOUT, SUSPEND_TIME, RESUME_TIME, ERROR_NUMBER from DBA_RESUMABLE;
SESSION_ID STATUS TIMEOUT SUSPEND_TIME RESUME_TIME ERROR_NUMBER
---------- --------- ---------- -------------------- -------------------- ------------
2140 SUSPENDED 7200 03/06/12 14:07:17 1659
1999 NORMAL 7200 0
查看resumable特性:
在dba_resumable表中可以查询到resumable_timeout的值
SQL> show parameter timeout
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
ddl_lock_timeout integer 0
distributed_lock_timeout integer 60
log_checkpoint_timeout integer 1800
resumable_timeout integer 0
虽然查看到timeout=0,但是在视图中可以看到还是7200
SQL> SELECT SESSION_ID, STATUS, TIMEOUT, SUSPEND_TIME, RESUME_TIME, ERROR_NUMBER from DBA_RESUMABLE;
SESSION_ID STATUS TIMEOUT SUSPEND_TIME RESUME_TIME ERROR_NUMBER
---------- --------- ---------- -------------------- -------------------- ------------
2140 NORMAL 7200 03/06/12 14:15:02 0
1999 NORMAL 7200
10g导入的时候,有可能造成system表空间不足,Bug发生在导入表的统计信息处,解决bug可能很困难,绕过bug,使用EXCLUDE=TABLE_STATISTICIS
select * from dba_datapump_jobs t where t.owner_name like 'XXXX' and t.state='EXECUTING';
STATE:正常导入的状态是executing,而挂起是的状态是DEFINING
查询导入导出进程
select dds.owner_name,dds.job_name,dds.saddr,dds.session_type,vs.sid,vs.serial#,vp.spid from dba_datapump_sessions dds,v$session vs,v$process vp where dds.saddr=vs.saddr and vs.paddr=vp.addr;
如果状态全为not running则可以直接drop;如果状态不为not running,则需要找出相应的操作系统进程 ,并进行kill;
SQL> drop table SYS_EXPORT_SCHEMA_01 purge;
如果系统还有非LOCAL=NO的连接,且时间都超过几天了,一般都是异常的进程,建议查清楚后KILL掉
ps -ef | grep oracleprod | grep -v LOCAL=NO | grep -v grep
查询对应的sql
select a.username,a.sid,a.serial#,c.piece,c.sql_text
from v$session a,v$sqltext c
where a.sql_address = c.address
and a.sql_hash_value = c.hash_value
and (a.sid,a.serial#) in (select a.sid,a.serial# from v$session a, v$process b where a.paddr=b.addr and b.spid = &spid )
order by a.sid,a.serial#,c.piece;
现象:在执行expdp或者是impdp时,往往会出现导入表成功,但是在Processing object type SCHEMA_EXPORT/TABLE/INDEX/INDEX或者其他地方挂起
处理方法:
1、检查alert日志
2、检查主机资源 top(内存) + df -h
3、查看表空间使用率
4、确定等待事件
select sid,serial#,username,program,sql_id,event,p1,p2,p3 from v$session s, dba_datapump_sessions d where s.saddr = d.saddr;
依据等待事件进一步分析
常见的等待事件:
1)、statement suspended, wait error to be cleared
一般是由表空间不足,此时增加datafile,等待事件消失,但是仍然会报错。
解决方法是:重新导入
2)、Streams AQ: enqueue blocked on low memory 与wait for unread message on broadcast channel等待
通过调整streams_pool_size解决(该参数为SGA动态调整,但在执行expdp时,未能变化,默认为0,导致内存不足而挂起)
SQL> show parameter streams
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
streams_pool_size big integer 0
SQL> alter system set streams_pool_size=200M scope=memory;
expdp/impdp涉及到一个参数:
SQL> SELECT SESSION_ID, STATUS, TIMEOUT, SUSPEND_TIME, RESUME_TIME, ERROR_NUMBER from DBA_RESUMABLE;
SESSION_ID STATUS TIMEOUT SUSPEND_TIME RESUME_TIME ERROR_NUMBER
---------- --------- ---------- -------------------- -------------------- ------------
2140 SUSPENDED 7200 03/06/12 14:07:17 1659
1999 NORMAL 7200 0
查看resumable特性:
在dba_resumable表中可以查询到resumable_timeout的值
SQL> show parameter timeout
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
ddl_lock_timeout integer 0
distributed_lock_timeout integer 60
log_checkpoint_timeout integer 1800
resumable_timeout integer 0
虽然查看到timeout=0,但是在视图中可以看到还是7200
SQL> SELECT SESSION_ID, STATUS, TIMEOUT, SUSPEND_TIME, RESUME_TIME, ERROR_NUMBER from DBA_RESUMABLE;
SESSION_ID STATUS TIMEOUT SUSPEND_TIME RESUME_TIME ERROR_NUMBER
---------- --------- ---------- -------------------- -------------------- ------------
2140 NORMAL 7200 03/06/12 14:15:02 0
1999 NORMAL 7200
10g导入的时候,有可能造成system表空间不足,Bug发生在导入表的统计信息处,解决bug可能很困难,绕过bug,使用EXCLUDE=TABLE_STATISTICIS
select * from dba_datapump_jobs t where t.owner_name like 'XXXX' and t.state='EXECUTING';
STATE:正常导入的状态是executing,而挂起是的状态是DEFINING
查询导入导出进程
select dds.owner_name,dds.job_name,dds.saddr,dds.session_type,vs.sid,vs.serial#,vp.spid from dba_datapump_sessions dds,v$session vs,v$process vp where dds.saddr=vs.saddr and vs.paddr=vp.addr;
如果状态全为not running则可以直接drop;如果状态不为not running,则需要找出相应的操作系统进程 ,并进行kill;
SQL> drop table SYS_EXPORT_SCHEMA_01 purge;
如果系统还有非LOCAL=NO的连接,且时间都超过几天了,一般都是异常的进程,建议查清楚后KILL掉
ps -ef | grep oracleprod | grep -v LOCAL=NO | grep -v grep
查询对应的sql
select a.username,a.sid,a.serial#,c.piece,c.sql_text
from v$session a,v$sqltext c
where a.sql_address = c.address
and a.sql_hash_value = c.hash_value
and (a.sid,a.serial#) in (select a.sid,a.serial# from v$session a, v$process b where a.paddr=b.addr and b.spid = &spid )
order by a.sid,a.serial#,c.piece;