00:00
好,欢迎来到腾讯云数据库小堂,今天和大家分享如何在当中快速定位。我们的慢查询或者是阻塞的一些。啊,经常我们会遇到啊,有一些语句执行很简单,但是啊执行时间非常长,当遇到这种情况的时候,不一定是因为我们S写的不好啊,执行时间很长。那有可能。就是因为遇到数据库的一些等待事件了,那最常见的那就是一些等待了,那么我们怎么样快速定位到。乳山,我们当年circle。的另外一个C型或者是SQ语句类,那我们今天就通过一个实际的测试样例啊为大家演示一下,首先我们已经剩下一个数据库实例啊,开启了两个。登录到这个数据库当中,然后开启一个测试数据。
01:02
然后进入到我们这个测试数据库当中。那我们在第一个事情当中创建一个表。随便插入一点数据。执行一个执行一条,把这个数据全部删除掉。我们不把这个失误结束掉。我们在另外一个车型当中。再去执行同样一条,同样开启一个事务。但是不结束会话就会发现在执行的时候就会遇到此话就被锁卡住了。我们这时候再重新开一个。对吧。登录进去。此时。啊,一般场景我们可以从网上搜索到很多很快捷很现成的一些售后语句,那直接定位出来到底是谁组塞的,就让我们本次会和大家分享如何使用B原始方法,看到是谁阻塞了谁。首先我们要知道有两个视图,一个是PG stand activity,这个要试图。
02:19
这张视图记录了我们所有当前连接到数据库当中的绘画信息。第二个视图是PG。Dogs。视图,这个视图记录了所有当中的。相关的信息。通过这两个视图相关的一些字段信息就可以清晰的找到。我们正在执行的以及被阻塞的。我们可以看到。找一个详细一点的。可以看到这么多字段。啊。数据库。
03:00
明。有执行的用户。还有用户的ID。还有连接的application,连接客户端的名字以及客户端的地址。客户端的。客户端的地址,客户端的主机,客户端连接。呃,端口还有后端服务进程,后端用户进程启动的。时间。查询执行的时间。还有状态变更的一些时间,并且有的等待时间类型以及等待时间。还有当前这个的一个状态。I呢,还是activity?并且当前正在执行的。那我们怎么看哪一些是被阻塞的?那我这。用了一条比较简单的一个,因为字段太多了,很多字段我们都没有什么太大必要,我们用一个简单的删减的一些字段来查。
04:05
我们把关掉,用表格的形式来看。好,首先PID非常重要,就是。如果说我们需要去K绘画,那么需要就就会需要用到这个PID啊,执行时间啊,这是我变过的,就是用当前的执行时时间,当前的时间减去我们查询啊启动的时间啊,就是我们当前这个SL执行的时长。等待时间类型以及等待时间,具体的等待时间,还有具体的查询语句啊,这几个字段就够了。我们这个时候就可以看到,执行时间最长的一条已经达到了。四分钟了。那对应的L语句是delete from t啊,同理,另外这有条L是。同样的语句啊,Form也行,时间很长了,那刚好就对应我们。
05:01
这两个连接绘画开启了两个显现事物。一个是正在执行,已经执行过,但是事务没有提交,一个是正在执行,但是因为被锁住,所以说没有办法执行完成。那对应过来我们可以看到。有一个。Type lock锁意思被锁住。有一个。客户有一个等待时间,类型是client client意思是什么呢?就等待我们的客户端返回信息,意味着当前事物实际上就是一个未提交的事务,或者是他还有后续的任务并没有执行,正在等待客户端反馈一些信息。使这个15结束。那么这条赛课这个会话,它的一个等待时间是所意思是什么,就是当前正在执行的这条会话呀。就被锁住了,没有办法继续往下执行。
06:04
那么我们如何更进一步的去查看?这些锁一个锁个的息,实际运行过程,实业运行过,我个circle查出来,我们这个视图查出来的会画信息是非常多的。我们怎么去精准的看到对应的啊,对应的查询和对应的是谁呢?因为没有顺序啊,无法看到。那我们就会引入第二个视图。谢谢。这个。这是不是可以看到所有的锁信息?虽然说这个地方字段很多啊,我们把这个信息稍微拉长一点,重新执行一下。
07:02
那么我们去看管体的字段,主要是为T的,意味着当前执行会把其他的绘画给锁住。如果是F的。那么则代表。这个绘画哦,这个。信息这一条绘画是被其他绘画锁住的的。那么对应的PID是九四,九四,那么九四这个PID就是锁。那其他的锁住,被其他的PID锁住,那锁住它的呢,那我们就要看。对象这个地方有个和啊,我们看一下到底是哪一个对象被锁住了,可以看到F的这一行是为空啊,没法看到,我们看一下同PID的其他对象是什么呢?啊,9747对应的,嗯,9747这个PID所对应的对象的。
08:05
ID是多少?一个是170和117709。那么117706和117709。共同有17017,并且。锁的对象,并且是一个独占所。行独债所的,那就可以看到是11111,这个所对应的哪个绘画。就是锁住了。这个废话。的一个罪魁祸首。11111。嗯。那么可以看到这个锁的对象,锁的类型是什么呀?长级独占,那这样就找到了我们对应的PD了。
09:00
那么可以通过这个PID反查。我们对应的是什么?把这两个PID的。信息。把它查出来。可以看到的的确确啊,和我们刚才推论是一致的。就是。1111。11155锁住。9747。那得得到了这个结论之后,我们可以通过多加一个IP地址,看一下是哪一个IP地址访问过来的。
10:08
或者是确认哪一个业务,找到这个业务。然后明确一下到底适不适把它掉。首先我明确了啊,这个绘画可以K,那我们在PG里边提供两种的K方法,第一种是直接杀死这个绘画,直接把这个绘画关闭掉,但是呢,这个直接关闭会话的一个操作啊,就要求我们业务具有重连接制,不然的话,这个业务是没有办法直接再连过来,就相当于把连接池直接干掉了。第二种方法呢,是直接关闭这个会话当中正在执行的烧烤。首先第一个。关闭这个规划中正在执行的。执行一个函数就可以了,PG。Candle。B。跟我们的PID,因为我们要删除这个。
11:03
所以说。跟这个PID。他自行返回一个T。我们看一下,我们刚才这个绘画被干掉没有,这个就是锁住。这个绘画的罪魁祸首。我们再来执行一下语句。发现这个会话并没有被结束掉是什么原因啊?就是因为g g Kindle bank,它只能够结束正在执行的circle语句,比如说我们刚才执行的一个select新,或者是刚才最开始执行的delete。操作都是已经执行完成过了,只是在干什么,只是在等待客户端的一个提交而已。那么这个时候我们去结束是没有任何反应的,的的确确啊,我们的话一也没有正常的执行完成。然后绘画二。
12:01
也没有什么反应,也能正常操作,那么这个时候。就有两种处理方法了,要么是把我们卡住的。这个会话直接干掉,要么是把我们这个会话尽早的结束掉,结束有两种方法,一个是做,一个是commit,要么我们就用户端客户端啊,直接去执行commit或者bank操作,要么就是我们通过第二个操作方法就是PG。执行完成之后。返回T。提交成功。我们看一下第二条,我们第二个我们进入执行一下语是否能够正常执行,发现我们执行的时候。我们。这个绘画被。给关掉了,当然我们又重新连进来了啊,这个是括号,那我们可以看第一个号,可以发现我们的刚才被卡住的那条语句成功的执行完成,并且我们提交也成功了。
13:07
啊,这个就是。今天的分享就到这,到此为止。大家学会了吗?
我来说两句