问题描述:
plsql工具下pkg包正常编译的,中途有一次编译较慢,便强制结束了plsql进程,重新登录plsql编译同一个包无论如何都会无响应卡死。
plsql中kill掉session后重新编译同样卡死
原因分析:
1、在编译过程时plsql未反应便强制关掉了plsql导致
(1)存储过程编译没完成,或者编译失败时,oracle 数据库会自动把相应的存储过程锁起来;
(2)DBA_DDL_LOCKS视图中记录存储过程、表结构、视图、包等数据库对象锁的信息;
(3)V$ACCESS视图显示数据库中当前锁定的对象及访问它们的会话 。
查询锁定(运行中的)的包对应的SID号: SELECT * FROM V$ACCESS WHERE OBJECT='CMSVOUCHER'; select * from dba_ddl_locks where name='CMSVOUCHER'; 根据SID号查出会话信息: select sid,serial# from v$session where sid in('78','209'); kill掉: alter system kill session '78,4883'; alter system kill session '209,57021';
如果以上会话kill掉之后还是不行,查询V$ACCESS时无法出结果,需要重启数据库服务器
1. 停应用层的各种程序
2. 停Oralce的监听进程
$ lsnrctl stop
3. 在独占的系统用户下,备份控制文件:
$ sqlplus "/as sysdba"
SQL> alter database backup controlfile to trace;
4. 在独占的系统用户下,手工切换重作日志文件,确保当前已修改过的数据存入文件:
SQL> alter system switch logfile;
5. 在独占的系统用户下,运行下面SQL语句,生成杀数据库用户连接的kill_all_session.sql文件:
SQL> set head off;
SQL> set feedback off;
SQL> set newpage none;
SQL> spool ./kill_session.sql
SQL> select 'alter system kill session '''||sid||','||serial#||''';' from v$session where username is not null;
SQL> spool off;
6. 在独占的系统用户下,执行杀数据库用户连接的kill_session.sql文件
SQL> @./kill_session.sql
7. 在独占的系统用户下,关闭数据库, 输入命令: shutdown immediate;
SQL> shutdown immediate;
或者
SVRMGRL> shutdown immediate;
8. 启动oralce的监听进程
$ lsnrctl start
9. 进入独占的系统用户下,启动Oralce数据库
$sqlplus /nolog
进入oracle控制台。输入命令: sqlplus / as sysdba;
SQL> connect / as sysdba
SQL> startup;
启动数据库,输入命令: startup;
或者
$ svrmgrl
SVRMGRL> connect internal;
SVRMGRL> startup;
10.启动应用层的各种程序