Mysql和Oracle数据库死锁查看以及解决

这篇具有很好参考价值的文章主要介绍了Mysql和Oracle数据库死锁查看以及解决。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、Mysql数据库死锁排查

1.1 锁事务查询

1.1.1  查看正在锁的事务

SQL :

SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;

1.1.2 查看等待锁的事务

SQL:

SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;

1.1.3 查询正在执行的事务


SQL:

SELECT * FROM information_schema.INNODB_TRX;

示例:

备注:通过查看事务的trx_started(开始时间)来判断该事务的阻塞时间。

1.2 死锁解决

SQL :

 kill   线程ID

备注:线程ID指的是 1.1.3步骤中查询出来的 trx_mysql_thread_id。

二、Oracle数据库死锁排查

2.1  查看是否有死锁

SQL

select s.username,l.object_id, l.session_id,s.serial#, s.lockwait,s.status,s.machine,s.program from v$session s,v$locked_object l where s.sid = l.session_id;

示例


字段解析

Username:<span style='color:rgb(244,67,54)' >死锁</span>语句所用的数据库用户;
SID: session identifier, session 标示符,session 是通信双方从开始通信到通信结束期间的一个上下文。
SERIAL#: sid 会重用,但是同一个sid被重用时,serial#会增加,不会重复。
Lockwait:可以通过这个字段查询出当前正在等待的锁的相关信息。
Status:用来判断session状态。Active:正执行SQL语句。Inactive:等待操作。Killed:被标注为删除。
Machine: <span style='color:rgb(244,67,54)' >死锁</span>语句所在的机器。
Program: 产生<span style='color:rgb(244,67,54)' >死锁</span>的语句主要来自哪个应用程序。

2.2  查看引起死锁的语句

SQL:

select sql_text from v$sql where hash_value in   (select sql_hash_value from v$session where sid in  (select session_id from v$locked_object));

示例:

2.3 死锁解决

SQL:

alter system kill session 'sid,s.serial#';

备注:多个session用逗号隔开。

2.4 自动生成killsql

Mysql和Oracle数据库死锁查看以及解决Mysql和Oracle数据库死锁查看以及解决
SELECT distinct SESS.SID,
    SESS.SERIAL#,
    LO.ORACLE_USERNAME,
    LO.OS_USER_NAME,
    AO.OBJECT_NAME,
    LO.LOCKED_MODE,
    'ALTER SYSTEM KILL SESSION ''' || SESS.SID || ',' || SESS.SERIAL# || ''' immediate;',
    SESS.STATUS
FROM GV$LOCKED_OBJECT LO,
    DBA_OBJECTS     AO,
    GV$SESSION       SESS,
    Gv$process       p
WHERE AO.OBJECT_ID = LO.OBJECT_ID
AND LO.SESSION_ID = SESS.SID
and SESS.paddr = p.addr;
View Code

 

三、死锁的产生原因

3.1 死锁产生的原因

造成死锁的原因就是多个线程或进程对同一个资源的争抢或相互依,具体有下列情况:

a. 删除和更新之间引起的<span style='color:rgb(244,67,54)' >死锁</span>
b. 两个表之前不同顺序之间的相互更新操作引起的<span style='color:rgb(244,67,54)' >死锁</span>
c. 主子表上删除数据,缺少索引导致行级锁升级为表级锁,最终导致大量的锁等待和<span style='color:rgb(244,67,54)' >死锁</span>。

3.2  死锁的避免

 死锁不能完全避免,但可以使死锁的数量减至最少,下列方法有助于最大限度地降低死锁:  

文章来源地址https://www.toymoban.com/news/detail-807353.html

1、按同一顺序访问对象
    如果所有并发事务按同一顺序访问对象,则发生<span style='color:rgb(244,67,54)' >死锁</span>的可能性会降低。例如,如果两个并发事务获得 Supplier 表上的锁,然后获得 Part 表上的锁,则在其中一个事务完成之前,另一个事务被阻塞在 Supplier 表上。第一个事务提交或回滚后,第二个事务继续进行。不发生<span style='color:rgb(244,67,54)' >死锁</span>。将存储过程用于所有的数据修改可以标准化访问对象的顺序。 
3、避免事务中的用户交互 避免编写包含用户交互的事务,因为运行没有用户交互的批处理的速度要远远快于用户手动响应查询的速度;
     例如答复应用程序请求参数的提示。例如,如果事务正在等待用户输入,而用户去吃午餐了或者甚至回家过周末了,则用户将此事务挂起使之不能完成。这样将降低系统的吞吐量,因为事务持有的任何锁只有在事务提交或回滚时才会释放。
 即使不出现<span style='color:rgb(244,67,54)' >死锁</span>的情况,访问同一资源的其它事务也会被阻塞,等待该事务完成。 
4、保持事务简短并在一个批处理中 
   在同一数据库中并发执行多个需要长时间运行的事务时通常发生<span style='color:rgb(244,67,54)' >死锁</span>。事务运行时间越长,其持有排它锁或更新锁的时间也就越长,从而堵塞了其它活动并可能导致<span style='color:rgb(244,67,54)' >死锁</span>。 保持事务在一个批处理中,可以最小化事务的网络通信往返量,减少完成事务可能的延迟并释放锁。

到了这里,关于Mysql和Oracle数据库死锁查看以及解决的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MySQL数据库——存储过程-介绍以及基本语法(特点、创建、调用、查看、删除、示例)

    目录 介绍 特点 基本语法 创建 调用 查看 删除  示例  存储过程是 事先经过编译 并 存储在数据库 中的一段 SQL 语句的 集合 ,调用存储过程可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是有好处的。 存储过程思想

    2024年02月06日
    浏览(67)
  • 数据库中出现死锁,如何解决?

    数据库中出现死锁是很常见的情况,我们需要对其进行解决。在解决死锁问题之前,需要先了解一下什么是死锁。 死锁是指两个或多个事务互相等待对方持有的资源而无法继续执行的情况。比如,事务A和事务B分别占用了资源X和资源Y,当A试图请求Y而B占用了Y的时候,A就会被

    2024年02月15日
    浏览(32)
  • 如何查看Oracle数据库的端口列表Portlist?

    要在SQL/PLUS工具中查看Oracle数据库的端口列表,可以执行以下步骤: 在SQL/PLUS中使用系统管理员帐户登录到Oracle数据库。 运行以下命令: 这将显示数据库中所有监听器使用的协议和端口。如果该命令返回端口号,则表示数据库已配置为允许通过Web访问。如果命令返回空值或错

    2024年02月13日
    浏览(37)
  • java八股文面试[数据库]——MySQL死锁的原因和处理方法

    1) 表的死锁 产生原因 : 用户A访问表A(锁住了表A),然后 又访问表B ;另一个用户B访问表B(锁住了表B),然后企图 访问表A ;这时用户A由于用户B已经锁住表B,它必须等待用户B释放表B才能继续,同样用户B要等用户A释放表A才能继续,这就死锁就产生了。 用户A--》A表(表

    2024年02月09日
    浏览(47)
  • oracle数据库给用户授权DBA权限&Oracle查看哪些用户具有DBA权限

    步骤一:以sysdba身份登录到Oracle数据库 在授予DBA权限之前,我们首先要以sysdba身份登录到Oracle数据库。使用以下命令登录: 步骤二:创建用户(如有用户跳过) 要授予DBA权限,首先需要创建一个新用户。使用以下命令创建一个新用户: 步骤三:授予DBA权限 一旦用户创建成

    2024年02月09日
    浏览(48)
  • Oracle 数据库查看锁表的语句和解锁的方法

    死锁级别: 级别 描述 0 none 1 null 空 2 Row-S 行共享(RS):共享表锁 3 Row-X 行专用(RX):用于行的修改 4 Share 共享锁(S):阻止其他DML操作 5 S/Row-X 共享行专用(SRX):阻止其他事务操作 6 exclusive 专用(X):独立访问使用

    2024年02月16日
    浏览(47)
  • 数据库问题记录(粗略版)oracle、mysql等主流数据库通用

    1. ORA-00918:未明确定义列 该问题情况大致为:select 所取列名错误、重复等问题。 2. “select * from temp where 1=0; ”的含义 布尔值为FALSE,只返回表结构,不返回数据。 举一反三: select * from temp where 10 , 布尔值为TRUE,返回所有数据记录; select * from temp where 1=0, 暂不清楚是何

    2024年02月07日
    浏览(48)
  • DBeaver连接mysql、oracle数据库

    1) 下载DBeaver https://dbeaver.io/download/,并安装 2) 新建数据库连接    3)选择mysql驱动程序  4)填写连接设置内容 5)点击 “编辑驱动设置”,并填写相关信息  6)选择本地自己下载的驱动库jar包 (也可以点击下载驱动)  7)完成后,点击测试连接,可以查看是否连接成功

    2024年02月05日
    浏览(64)
  • 查询数据库空间(mysql和oracle)

    1.查看数据库表空间文件: 2.查看所有表空间的总容量: 3.查看数据库表空间使用率 4.1.查看表空间总大小、使用率、剩余空间 4.2.查看表空间使用率(包含temp临时表空间) 5.查看具体表的占用空间大小 1.更改表空间的dbf数据文件分配空间大小 2. 为表空间新增一个数据文件(表空间

    2024年02月05日
    浏览(45)
  • 数据库去重(MYSQL和ORACLE)

    一、数据库中的去重操作(删除数据库中重复记录的SQL语句)主要有三种方法 (1)、rowid方法 (2)、group by 方法 (3)、distinct方法 1、用rowid方法 根据Oracle带的rowid属性,可以进行判断是否存在重复语句; (1)、查出表1和表2中name相同的数据 Select * from table1 a Where rowid !=

    2024年02月09日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包