oracle数据库中锁等待方法的快速检测
当程序提交修改(提交)或回滚(回滚)时,锁定在只读锁和独占行级独占锁中,资源将被释放,允许其他用户操作。
但在某些情况下,由于一些特殊的原因,在节目中,长时间在作业提交后没有锁;或因为用户是不合理的,如需要修改数据,不能及时修改和提交,但抛开;或者因为客户端客户端服务器模式出现在然而,崩溃的服务器没有被检测到,导致锁定的资源不能及时释放,最终影响其他用户的操作。
因此,快速诊断锁定资源并解决锁定的用户对数据库管理员来说是一个挑战。
因为数据库应用系统越来越复杂。一旦锁资源没有及时释放,就会导致大量用户在同一个表上操作,从而影响系统的运行。此时,DBA应该尽可能快地解决问题。但是,由于Oracle 8中的查询执行,获得了等待锁资源的用户名。
选择a.username,A.sid,a.serial #,b.id1
从V $会话A,v $锁B
在a.lockwait = b.kaddr
很慢,(迅速执行Oracle 7.3.4),并执行一个查询,查找用户的过程中,其他用户
选择a.username,A.sid,a.serial #,b.id1
从V $会话A,v $锁B
b.id1在哪里
(选择不同的e.id1
从v $会话D,v $锁定E
在d.lockwait = e.kaddr)
和a.sid = b.sid
和b.request = 0
执行得也很慢。因此,我们经常要消除惰性状态V $ SESSION状态(无效)和最后的运行时间的用户进程已经超过20分钟(last_call_et > 20×60秒),然后解决问题。
但是这种单刀方法实际上是扔掉婴儿和脏水,因为一些用户的进程,尽管它们是非活动的。
因此,我想到了一个解决方案,通过保存相关记录在V和V $ SESSION视图美元锁在表中建立自己的问题的时间,然后查询表,速度大大提高,我们可以很快找到问题。在实践中的作用很好。接收用户响应后,我们可以发现几秒钟锁定资源,影响其他用户的过程并进行相应的处理。
首先,登录到数据库DBA的身份(不一定是系统),创建三个基本表:my_session,my_lock,my_sqltext,并建立相应的索引列,将查询。以下声明如下:
REM时间从V $ SESSION视图关注的领域,创造my_session表,并创建一个你想要使用加快查询速度等指标
my_session表;
创建表my_session
作为
选择a.username,A.sid,a.serial #,
A.lockwait,a.machine,a.status,
a.last_call_et,a.sql_hash_value,中情局
从V $会话A
1=2;
创建唯一索引my_session_u1 my_session(SID);
创建my_session指数my_session_n2(锁等待);
创建my_session指数my_session_n3(sql_hash_value);
雷以领域出V $锁定视图,创建my_lock表,并创建一个在现场使用索引加快查询速度
my_lock表;
创建表my_lock
作为
选择ID1,kaddr,Sid,请求类型
从v锁定
1=2;
创建my_lock指数my_lock_n1(SID);
创建my_lock指数my_lock_n2(kaddr);
雷以领域走出V sqltext美元,创造my_sqltext表,并创建一个在现场使用索引加快查询速度
my_sqltext表;
创建表my_sqltext
作为
选择hash_value,sql_text
从V sqltext美元
1=2;
创建my_sqltext指数my_sqltext_n1(hash_value);
然后,创建一个SQL脚本文件,你可以把它直接从SQL * Plus的当你需要它。在这方面,第一,表中的记录被删除的表的表名为截断的命令。命令的理由,而不是使用删除命令,因为删除命令,将产生重复的记录,速度较慢,和空间的指数是不是真正的自由,如果重复插入和删除,空间的指数将继续增加,查询速度将是缓慢的。截断命令不产生回放记录,执行速度比删除,并释放相应的索引空间后,记录被删除,在三视图的相关记录插入表三在他们创造的。最后,我们查询它,因为有索引,同时,因为过滤后的记录数量相对较小,所以查询速度很快,我们可以立即看到它的结果。
这时,如果发现其他用户进程的阻塞是正常的操作,您可以通知用户其提交,从而达到释放锁资源的目的;如果它不是正常操作,也就是说,它的状态是非活动的。
改变系统杀死session'sid,串行#;
SQL脚本如下所示:
设置回音
设置反馈了
提示删除旧记录。…
TRUNCATETABLE my_session;
TRUNCATETABLE my_lock;
TRUNCATETABLE my_sqltext;
快速访问数据。…
插入my_session
选择a.username,A.sid,a.serial #,
A.lockwait,a.machine,a.status,
a.last_call_et,a.sql_hash_value,中情局
从V $会话A
在NVL(a.username,'null)'null;
插入my_lock
选择ID1,kaddr,Sid,请求类型
从v锁定;
插入my_sqltext
选择hash_value,sql_text
从V sqltext美元,my_session M
在s.hash_value = m.sql_hash_value;
列用户名格式
柱机格式A15
柱last_call_et格式99999标题秒
列SID格式9999
提示等待他人
选择A.sid,a.serial #,
a.machine,a.last_call_et,a.username,b.id1
从my_session,my_lock B
在a.lockwait = b.kaddr;
提示等待用户
选择A.sid,a.serial #,
A.机器,a.last_call_et,a.username,
B.班级,a.status,b.id1
从my_session,my_lock B
b.id1在哪里
(选择不同的e.id1
从my_session D,my_lock E
在d.lockwait = e.kaddr)
和a.sid = b.sid
和b.request = 0;
提示检查它的SQL
选择a.username,A.sid,a.serial #,
b.id1,班级,c.sql_text
从my_session,my_lock B、C my_sqltext
b.id1在哪里
(选择不同的e.id1
从my_session D,my_lock E
在d.lockwait = e.kaddr)
和a.sid = b.sid
和b.request = 0
和c.hash_value = a.sql_hash_value;
上述观点也适用于其它大型数据库系统,如Informix、Sybase、DB2。使用这个脚本,可以大大提高获取当前锁定系统等条件,从而解决了锁的数据库应用系统中的等待时间。此外,因为程序名称和对应的SQL语句已被删除,它可以记录之后,去分析解决它的开发者。