各位新朋友~记得先点蓝字关注我哦~
大噶好呀,开门见山地说,今天我们来做一个TX锁处理小工具。
什么是TX锁呢?我们这里简单的说明下:
在 Oracle数据库中,当一个事务首次发起一个DML语句时就获得一个TX锁,该锁保持到事务被提交或回滚。当两个或多个会话在表的同一条记录上执行 DML语句时,第一个会话在该条记录上加锁,其他的会话处于等待状态。当第一个会话提交后,TX锁被释放,其他会话才可以加锁。
当Oracle数据库发生TX锁等待时,若处理不及时常会引起Oracle数据库挂起或死锁,产生ORA-00060的错误,导致应用出现长时间未响应、大量事务失败等问题。
下面我们可以简单的模拟一个TX锁:
会话A: 我要对表zqz.t1做更新,而且我还故意不提交
SQL> update zqz.t1 set id=2 where id=1;
5 rows updated.
会话B:我对会话A的恶行一无所知,我也要去更新表zqz.t1的同样的行:
SQL> update zqz.t1 set id=10086 where id=1;
漫长的等待过后,会话B发现,我怎么还没运行完这条sql,按道理应该很快的啊???
01
如何查询到TX锁的相关信息:
这个时候,我们用以下语句去查询,就会发现数据库出现了个TX锁:
查询到会话B被阻塞了。
我们再使用以下sql,可以查询到被锁对象的具体信息:
再再使用以下sql,我们可以查询到罪魁祸首的会话信息:
原来内鬼就是会话id为73的会话。
02
如何处理TX锁:
接下来你可以选择以下的方法去处理这个会话(在确保不会影响业务的情况下):
1.用以下SQL来kill该会话:
alter system kill session'{sid},{serial_id}' immediate;
2.直接找到这个会话的操作系统进程,直接kill -9 杀掉
进程号就是它:
一个简单的TX锁处理过程就如以上所示,步骤就这么几步,但能不能包装好让我直接去处理TX锁呢?
03
如何写一个TX锁处理工具
当然有啦,我们开始步入真正的正题,写一个TX锁处理工具。我们需要的是:
Python3环境,安装cx_Oracle模块、prettytable模块。
cx_Oracle模块
cx_Oracle是一个Python扩展模块,它允许Python访问Oracle数据库。用户通过调用python的cx_oracle函数,函数内部动态加载Oracle Client libraries以访问Oracle数据库。
以下是使用该模块的示例代码:
该函数输入数据库连接串,要执行的sql,及数据库连接模式,就可以远程连接到指定数据库执行sql了。
我们将以上提到的几条sql作为参数传进去,就可以获取到想要的信息了。
最后,我们再使用prettytable模块,把我们得到的信息表格输出了,更容易看啦。
Prettytable模块
PrettyTable 是python中的一个第三方库,可用来生成美观的ASCII格式的表格。
示例代码如下:
该函数输入cx_oracle查询返回值,将该输入值表格输出
最后,我们可以在出现TX锁的时候,运行该脚本,得到以下内容:
终于不用在出现TX锁的时候,反复的复制粘贴SQL,切换会话来获取及处理TX锁啦。
美创运维中心数据库服务团队拥有Oracle ACE 1人、OCM 10余人、数十名Oracle OCP、MySQL OCP、红帽RHCA、中间件weblogic、tuxedo认证、达梦工程师 ,著有《Oracle DBA实战攻略》,《Oracle数据库性能优化方法和最佳实践》,《Oracle内核技术揭秘》等多本数据运维优化书籍。目前运维各类数据库合计2000余套,精通Oracle、MySQL、SQLServer、DB2、PostgreSQL、达梦等主流商业和开源数据库。并成为首批国内达梦战略合作伙伴之一,拥有海量经验和完善的人员培养体系。并同时提供超融合,私有云整体解决方案。