▲问题引出:
测试环境,进行oralce的shutdown
immediate,等待时间很长,长得让人接受不了。
ORACLE
shutdown过程:
1、shutdown
normal(正常关闭方式):阻止任何用户建立新的连接;等待当前所有正在连接的用户主动断开连接;当所有的用户都断开连接后,将立即关闭数据库。
2、shutdown
transactional(事务关闭方式):阻止用户连接新的连接和开始新事务;等待所有活动事务提交后,再断开用户连接;当所有的活动事务提交完毕、所有的用户都断开连接后,将关闭数据库。
3、shutdown
immediate(立即关闭方式):阻止用户连接新连接和开始新事务;将未提交的活动事务回退;关闭数据库。
4、shutdown
abort(终止关闭方式):阻止用户建立新连接和开始新事务;取消未提交的活动事务,而不是回退;立即终止正在执行的任何SQL语句;立即关闭数据库。
无疑,shutdown
abort是最快速关闭数据库的方式,但是很可能会使数据库处于不一致状态,严重可能损坏数据库,导致数据库起不来,特别是在生产环境中。虽然现在是测试环境,但是也不建议这样做。推荐使用shutdown
immediate方式关闭数据库。
▲快速关闭数据库的因素:
1、连接的客户端进程数量
2、未提交的事务占用的UNDO BLOCK数量
3、长时间运行的会话
4、SMON进程清理临时段的速度
▲问题分析与解决:
金融业务,频繁使用PL/SQL developer连接数据库进行查询
输入ps
aux | grep oracle查看进程
oracle
5496 1 0 Jun26 ? 00:00:00 oracleorcl (LOCAL=NO)
oracle
5498 1 0 Jun26 ? 00:00:00 oracleorcl (LOCAL=NO)
oracle
5500 1 0 Jun26 ? 00:00:00 oracleorcl (LOCAL=NO)
oracle
5502 1 0 Jun26 ? 00:00:00 oracleorcl (LOCAL=NO)
oracle
5504 1 0 Jun26 ? 00:00:00 oracleorcl (LOCAL=NO)
oracle
5506 1 0 Jun26 ? 00:00:00 oracleorcl (LOCAL=NO)
oracle
5508 1 0 Jun26 ? 00:00:00 oracleorcl (LOCAL=NO)
oracle
5510 1 0 Jun26 ? 00:00:00 oracleorcl (LOCAL=NO)
oracle
5512 1 0 Jun26 ? 00:00:00 oracleorcl (LOCAL=NO)
oracle
5514 1 0 Jun26 ? 00:00:00 oracleorcl (LOCAL=NO)
oracle
5516 1 0 Jun26 ? 00:00:00 oracleorcl (LOCAL=NO)
oracle
5518 1 0 Jun26 ? 00:00:00 oracleorcl (LOCAL=NO)
oracle
5520 1 0 Jun26 ? 00:00:00 oracleorcl (LOCAL=NO)
oracle
5522 1 0 Jun26 ? 00:00:00 oracleorcl (LOCAL=NO)
oracle
5524 1 0 Jun26 ? 00:00:00 oracleorcl (LOCAL=NO)
oracle
5526 1 0 Jun26 ? 00:00:00 oracleorcl (LOCAL=NO)
oracle 5528 1 0 Jun26 ? 00:00:00 oracleorcl (LOCAL=NO)
可以看到LOCAL=NO,即通过监听进行的网络连接,看了下环境,大概有好几千个。
可以使用kill
-9 pid进行结束会话,但是好几千个会话,一个个的输入是要累死的节奏。shutdown
immediate的时候,oracle也会自动去断开所有的客户端连接,这样也很慢。使用如下语句进行批量结束会话,就可以快速关闭数据库了。
我写的脚本: