author:skate
time:2010-05-27
oracle添加字段引起的问题
由于同事在添加了表的字段后,没有重新编译数据库的对象,导致和这个表相关的很多procedure和package都失效。
由于发现后是在修改后2个小时吧,而在这期间很多程序在调用这些过程,致使很多会话都僵死在那,所以也无法
再重新编译过去,及时kill相应session进程也无法编译,由于业务需要数据库快速提供服务,于是决定重启数据库
当我发出shutdown immediate1分钟后,有一种不祥的预感,数据库很难关闭,数据库里存在active事务,而且因为
对象失效,所以在那一直跑(僵死在那),我赶紧查看alert.log,如下所示:
Thu May 27 13:07:19 2010
Thread 1 advanced to log sequence 3666
Current log# 5 seq# 3666 mem# 0: /u01/oradata/dbtica/redo05.log
Thu May 27 13:59:37 2010
Starting background process EMN0
EMN0 started with pid=53, OS id=12951
Thu May 27 13:59:37 2010
Shutting down instance: further logons disabled
Thu May 27 13:59:37 2010
Stopping background process CJQ0
Thu May 27 13:59:37 2010
Stopping background process QMNC
Thu May 27 13:59:38 2010
Stopping background process MMNL
Thu May 27 13:59:39 2010
Stopping background process MMON
Thu May 27 13:59:41 2010
Shutting down instance (immediate)
License high water mark = 111
Thu May 27 13:59:41 2010
Stopping Job queue slave processes
Thu May 27 13:59:41 2010
Job queue slave processes stopped
Thu May 27 14:04:40 2010
Active call for process 19325 user 'oracle' program'oracle@ticketA.happypool.cn(TNS V1-V3)'
SHUTDOWN: waiting for active calls to complete.
Thu May 27 14:19:31 2010
MMNL absent for 1206 secs; Foregrounds taking over
从alert.log里可以证实我的想法,确实存在active的事务,看样子一时半会是不能关闭的,并且如果事务在shutdown后1小时还没有跑完,系统就自动取消shutdown。而业务又急需提供给服务
我于是想了如下几个方法
1. 用 shutdown abort强制关闭
2. 用kill进程的方法 : ps -ef |grep ora_|awk '{print $2}'| xargs kill -9
3. 实在不行就reboot(根据现在的情况,不会到这一步的)
我于是又耐心的等10分钟,还是没有反应。我决定执行shutdown abort ,在继续观察alert.log,如下:
Thu May 27 14:24:06 2010
Shutting down instance (abort)
License high water mark = 111
Instance terminated by USER, pid = 13255
Thu May 27 14:24:52 2010
Starting ORACLE instance (normal)
这回数据库关闭了,然后startup数据库,数据库很快正常启动了,启动后,重新编译数据库无效的对象,最后验证无误,应用正常工作
总结:
1.修改数据库对象物理结构时要注意重新编译所有无效对象,要寻找业务低峰期,并采用正确的方法减少锁对业务的影响
2.事先要仔细考虑修改字段对其他的影响
3.在解决问题时,要冷静,要多想几套方案以备处理最坏情况
-----end-----