建立一双机系统,在主机上进行SQLLDR时,系统SHUTDOWN。备机启动后,向同一表中LOAD数据时报错:SQL*Loader-951: Error calling once/load initialization
ORA-00604: error occurred at recursive SQL level 1
ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired很明显sqlldr使用了direct=true,造成锁表。sqlldr user/passwd@dbtns DIRECT=TRUE SKIP_UNUSABLE_INDEXES=TRUE SKIP_INDEX_MAINTENANCE=FALSE control=test.ctl不想使用alter system kill session方式来处理。请问有没有oracle系统维护过程能够实现清理死掉会话,我们想在双机切换时,即对数据库中会话进行处理。又或者有其它途径,希望不吝赐教,不胜感谢!

解决方案 »

  1.   

    解锁:
    1.事务处理完,自动解锁
    2.kill session,楼主这样情况估计只能kill session了. 
      用Toad里的session Brower 来kill session还是比较方便的. 
    SQL> select 'alter system kill session '''||sid||','||serial#||''';' from v$session where sid in (select sid from v$lock where block = 1); 
    'ALTER SYSTEM KILL SESSION'''||SID||','||SERIAL#||''';' 我们可以在切换之后手动的用SQL来检查检查有没有死锁,如果有,kill 就可以了..
    至于楼主的意思:在双机切换时,自动对数据库中会话进行处理, 个人认为实现有难度,数据库如何去判断在哪些session是死锁的? 这个还是需要人工的介入.. 期待其他答案..
      

  2.   


    你rollback就好了。不会思索了!
      

  3.   

    楼上兄弟,系统都挂了,你让俄上哪儿ROLLBACK去?实际上,使用CTRL+C做测试时,SESSION也是可以得到释放的,只是OS SHUTDOWN时,这个SESSION会挂在数据库中。
    PMON进程可以清理类似数据垃圾,但触发条件是什么?
    可以考虑KILL SESSION,但在数据库如何判断客户端已断开?
    观察LOAD过程中时的SESSION的状态也是一会ACTIVE, 一会INACTIVE的,不能以SESSION的STATUS做为正在LOAD判断依据。
      

  4.   

    什么样的双机?rac还是ha这样的?
      

  5.   

    这个和双机其实没有太大关系,重点是将锁表的死去SESSION清除掉