如何快速停库
作为
DBA
,有时会遇到数据库实例重启,停机维护,升级之类的
case
,而做
这些事之前经常会被客户问的一个问题是:数据库多长时间能起来?这个问题
的背后其实是希望数据库的关闭和启动时间尽量短,以便有更多的时间做
"
正
事
"
。
大多数情况下,起停库的时间主要消耗在停库上。为什么呢?正常关库时数据
库要清理连接数据库的进程,清理临时段以及回滚未提交事务等操作,这些操
作所需时间就与停库时数据库的状态有关了,本人曾见过正常停库用了一个半
小时之久,这是一个
7*24
小时运行的库,只是希望改个参数,可以想见,执
行操作的工程师在这段时间里内心承受了多么大的煎熬。
其实如果在执行
shutdown immediate
(极少有人使用
shutdown normal
或者
shutdown transaction
,因为很难停下来)之前,能够对可能产生停库
慢的情况做一下检查,并且对某些情况做针对性的处理,有些时候可以大大加
快停库的速度。
比较推荐的是先停应用,由应用主动释放数据库会话。只有当停应用不方便时,
才通过手工杀会话的方式进行处理。
导致关库慢的一个主要原因是有长操作在执行,以下语句检查部分长操作会话:
select inst_id,sid,serial#,sql_id,time_remaining from
gv$session_longops where time_remaining>0;
长操作会话只是查询,可直接将其杀掉。杀会话可以在数据库层面
alter
system disconnect/kill session
, 但
kill session
操 作 只 是 标 记 会 话 为
KILLED
状态,还要等
pmon
释放资源,所以尽量用
disconnect session
的
命令;也可以在操作系统层面直接杀会话对应的进程。
导致关库慢的另一个主要原因是有大事务,停库需要做事务回滚,下面的语句
可以查当前事务的量
select inst_id,addr,start_time,used_ublk from gv$transaction order
by used_ublk;
评论