ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

记一次Mysql锁问题

2021-12-16 20:03:22  阅读:215  来源: 互联网

标签:语句 一次 java 数据库 mysql 问题 MysqlIO Mysql NULL


一、问题现象

1.现象:

页面上所有对数据库的操作都无法进行,程序连接池跑满。

2.应用侧报错如下:

Caused by: java.sql.SQLException: [1388d8fe714001-1][10.0.*.*:3306][saas]ERR-CODE: [TDDL-4614][ERR_EXECUTE_ON_MYSQL] Error occurs when execute on GROUP 'SAAS_DB_*_WXET_0*' ATOM 'rm-*_saas_db_qac2_0000': wait millis 5000, active 100, maxActive 100, creating 0 
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:998)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3835)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3771)
	at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2435)

3.数据库现象:

出现大量 Waiting for table metadata lock  锁等待

请添加图片描述

二、执行操作


ALTER TABLE dj_fwqxx ADD COLUMN skply varchar(10) CHARACTER SET gbk COLLATE gbk_chinese_ci comment '税控盘来源'

三、问题复现

1、同一个数据库中,开启三个会话。

2、在第一个会话中开启一个显示事务,并且执行一条dml语句,模拟应用侧操作。

begin;
INSERT INTO `sk_lock`.`dj_fwqxx` (`id`, `jqbh`, `ipdz`, `dkh`, `fwqlx`, `fwqxh`, `fwqrl`, `fplxdm`, `qybz`, `fwqbm`, `fwqbbh`, `kpdwdm`, `kpdwmc`, `swjgdm`, `swjgmc`, `sldz`, `sldkh`, `kpjh`, `zcm`, `zcm_qsrq`, `zcm_zzrq`, `zcm_num`, `app_url`, `app_state`, `prov`, `ORG_ID`, `TENANT_ID`, `dqsz`, `qysj`, `qylx`, `blxx`, `qtkzxx`, `gzzt`, `jkkzzt`, `sbzskl`, `cpyxgsl`, `locations`, `lasttimes`, `czfs`, `pzid`, `bsipdz`, `bsdkh`, `tqm`, `ptbs`, `dxfwqybz`, `mac`, `bz`, `falg`, `zs`, `usb`, `xfbs`) VALUES ('0000724c-1a06-4ce9-969e-7449827f9b36', '53990****', 'j****.org', '60**', '1', '', '0', '004,007,', 'Y', '5399****', '', '913****', '常州******', '132******', '常州************', 'fpsc.j******', '******', '0', NULL, NULL, NULL, NULL, 'http://******', 'Y', '江******', NULL, NULL, '202******', '201******', '00', '00******', '', '', NULL, '12345678', NULL, NULL, NULL, NULL, '084ffd51-b714-48d******3', 'bswj.j******', '9001', NULL, NULL, NULL, '', NULL, '是', '是', NULL, NULL);

3、在第二个会话中中进行ddl操作

ALTER TABLE dj_fwqxx ADD COLUMN skply varchar(10) CHARACTER SET gbk COLLATE gbk_chinese_ci comment '税控盘来源'

4、在第三个会话中查看线程状态

出现源数据锁

请添加图片描述

四、问题分析

在对该表执行DDL语句时,正好有DML语句对该表进行操作,由于DDl语句已经进行了表结构修改,导致DML语句处于一个即未提交,也未回滚的状态(猜测应用侧对这种情况没有进行处理
所以就会一直出现meta lock,后续所有进来的sql,也就会出现waiting lock ,而由于这个表使用比较频繁,很快就导致 Proxy 到实际 db的连接池被打满,
也就出现了 "wait millis 5000, active 100, maxActive 100",而应用侧整体连接数大于 Db,也就出现了程序重启后无法连接到数据库。

五、问题解决

#终止DDL语句,选择业务低峰期或其他时间段执行。
show PROCESSLIST #找到对应的ddl语句,kill掉 对应的进程id


#注意:
数据库在执行该操作时,需要考虑表是否进行分库分表,如果表进行了分库分表,可能会导致出现数据不一致情况,
如分库分表出现元数据库锁,切忌不可在实际rds进行kill操作。

标签:语句,一次,java,数据库,mysql,问题,MysqlIO,Mysql,NULL
来源: https://blog.csdn.net/qq_44078641/article/details/121982474

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有