oracle如何锁一张表_运维日记|一个TX锁处理小工具

1efcc6be7c8a2921097410f96714ca41.gif

各位新朋友~记得先点蓝字关注我哦~

大噶好呀,开门见山地说,今天我们来做一个TX锁处理小工具。

7ad023e09ca04d15db33e2fc60365f13.png

什么是TX锁呢?我们这里简单的说明下:

在 Oracle数据库中,当一个事务首次发起一个DML语句时就获得一个TX锁,该锁保持到事务被提交或回滚。当两个或多个会话在表的同一条记录上执行 DML语句时,第一个会话在该条记录上加锁,其他的会话处于等待状态。当第一个会话提交后,TX锁被释放,其他会话才可以加锁。

当Oracle数据库发生TX锁等待时,若处理不及时常会引起Oracle数据库挂起或死锁,产生ORA-00060的错误,导致应用出现长时间未响应、大量事务失败等问题。

35c84b579d003e77795d41d5947c0cb4.png

下面我们可以简单的模拟一个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,按道理应该很快的啊???

eae055fda2b0d5b10f97166857f0c8de.png

01

如何查询到TX锁的相关信息:

这个时候,我们用以下语句去查询,就会发现数据库出现了个TX锁:

81f04f0e4ae684a99366bf3b6e13ab88.png a36ba0813907d1e3d9ff43093508802d.png

查询到会话B被阻塞了。

我们再使用以下sql,可以查询到被锁对象的具体信息:

705be43306415ab66696beddd097087c.png c3298d8e2b51d1c21b5d0f0d026880b8.png

再再使用以下sql,我们可以查询到罪魁祸首的会话信息:

2eff4b20e00ccc5513d91617e041c184.png 813ae9ad7cdad28c2de245ac66e8345a.png

原来内鬼就是会话id为73的会话。

02

如何处理TX锁:

接下来你可以选择以下的方法去处理这个会话(在确保不会影响业务的情况下):

1.用以下SQL来kill该会话:

alter system kill session'{sid},{serial_id}' immediate;

2.直接找到这个会话的操作系统进程,直接kill -9 杀掉

进程号就是它:

06e64592430d701667060523bd3fd87a.png

一个简单的TX锁处理过程就如以上所示,步骤就这么几步,但能不能包装好让我直接去处理TX锁呢?

03

如何写一个TX锁处理工具

当然有啦,我们开始步入真正的正题,写一个TX锁处理工具。我们需要的是:

Python3环境,安装cx_Oracle模块、prettytable模块。

cx_Oracle模块

cx_Oracle是一个Python扩展模块,它允许Python访问Oracle数据库。用户通过调用python的cx_oracle函数,函数内部动态加载Oracle Client libraries以访问Oracle数据库。

以下是使用该模块的示例代码:

5c6fcd9c0c2496076bc5d4b913f2d62d.png

该函数输入数据库连接串,要执行的sql,及数据库连接模式,就可以远程连接到指定数据库执行sql了。

我们将以上提到的几条sql作为参数传进去,就可以获取到想要的信息了。

最后,我们再使用prettytable模块,把我们得到的信息表格输出了,更容易看啦。

Prettytable模块

PrettyTable 是python中的一个第三方库,可用来生成美观的ASCII格式的表格。

示例代码如下:

d4ae0747d4e76782569843a300452a21.png

该函数输入cx_oracle查询返回值,将该输入值表格输出

852c0be43fdbd7b402114a93f14c6a9c.png

最后,我们可以在出现TX锁的时候,运行该脚本,得到以下内容:

df497c63f4408f2fe73f1e998bec282f.png

终于不用在出现TX锁的时候,反复的复制粘贴SQL,切换会话来获取及处理TX锁啦。

a2824dbc33e62b06c68860a3c4c0bbc1.png

美创运维中心数据库服务团队拥有Oracle ACE 1人、OCM 10余人、数十名Oracle OCP、MySQL OCP、红帽RHCA、中间件weblogic、tuxedo认证、达梦工程师 ,著有《Oracle DBA实战攻略》,《Oracle数据库性能优化方法和最佳实践》,《Oracle内核技术揭秘》等多本数据运维优化书籍。目前运维各类数据库合计2000余套,精通Oracle、MySQL、SQLServer、DB2、PostgreSQL、达梦等主流商业和开源数据库。并成为首批国内达梦战略合作伙伴之一,拥有海量经验和完善的人员培养体系。并同时提供超融合,私有云整体解决方案。

fab445c8f613a2bf1f5dd8ec0fc6e4a9.png

207035adf97ed5c8cca1181743f2b7ac.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值