前言
曾经接到开发人员求救,由于测试环境速度太慢,尝试通过重启数据库的方式来解决,但是由于当时数据库有很多任务在执行,数据库很久都没有办法停止,之后就经历了多次强制关数据库,重启服务器的操作,最后数据库出现坏块无法启动,由于是测试环境,数据库没有备份,最后只能重建数据库,重新从其它环境获得测试数据,折腾了好几天。
本文主要列出重启数据库的注意事项,尽量避免由于重启数据库引起数据库无法启动的情况
重启注意事项
如果关闭数据库较慢,建议耐心等待,不要频繁对数据库强制关闭,重启服务器的操作,有可能会引起数据库启动时出现坏块,无法启动的情况
如果该数据库是生产系统
1)与业务沟通后,需要在可变更时间,进行数据库重启
2)在变更时间,业务人员停止所有的应用
3)停止数据库监听
4)重启数据库
如果是数据库是测试环境
1)建议在相对比较空闲的时间重启数据库
2)如果可能,建议停止所有测试连接后再进行数据库重启
数据库重启步骤
1. 在可变更时间,停止应用连接
2. 关闭监听,防止有新的连接
$ lsnrctl stop
3. 执行日志切换
SQL>select count(distinct group#) from v$log; -- 查询日志组的数量
SQL> alter system switch logfile; -- 执行次数为:日志组数据量+1 次
4. 查看当前是否还有active的连接
select sid, serial#,username, machine, program from v$session where username is not null and status='ACTIVE';
5. 关闭数据库
SQL>shutdown immediate
如果数据库启动较慢,可以查看数据库alert日志,Oracle 11g及以上默认路径为$ORACLE_BASE/diag/rdbms/<sid>/<sid>/alert_<sid>.log
在ORACLE10G及以上版本,可能会有如下提示:
Active call for process 12345 user 'oracle' program 'oracle@abcd'
SHUTDOWN: waiting for active calls to complete.
也就是指出哪个进程引起的等待,有时候会自动释放,建议等待30分钟以上,如果还是没有办法释放,可使用此时kill -9 <ospid> 进程即可,在本例中process 12345为ospid, 即:kill -9 12345
6. 重新启动数据库
SQL> startup
7. 启动监听
$ lsnrctl start
8. 连接测试
9. 启动应用