今天碰到奇怪的事情,資料庫里的update或delete執行經常超時,有問題的表涉及到不同庫的不同表,這些庫、表之間沒有任何業務關聯。
發現的共性如下:
1. 表的id都是自增欄位,2. id欄位的資料不知為什么基本不連續,比如1,2,12,33,124,137...,問了一下,沒人洗掉過資料
2. 超時的陳述句非常簡單,就是update table set col="xxx" where id = 1,獲得delete from table where id=1,單獨執行select * from table where id=1,資料可以查詢到;
3. 呼叫show processlist,顯示這些陳述句一直是updating,后來把有問題的表整個TRUNCATE,重新生成資料,再update或delete,可以正常執行,不再卡死。
4. 資料庫是5.7,innodb引擎
這是當時show processlist的截圖

執行的陳述句是:UPDATE logintoken SET token = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJERVMifQ==.eyJpZCI6MjcsImV4cCI6IjE1MDg3NDg4NjY0MDIiLCJsb2dpbk5hbWUiOiIxMzU3MTgzMDYyNSJ9.7b01517332f630d897893322f51e6a2d47d123d1ec73de38a2b4d7f3de732269cd3c6c3f23ae54064aec6d84f00adccf968da94ae4a07f0130ec872b4ebacd0b2687bd1d098989f7dcea03d59aa050d004e8ea3165075ff5162c247e4cd80a93d3e25039dd177c0dbf11599472fbadbeddc02afd1f0ef8fd',tokenExpiredTime = '2017-11-22 16:54:26.402' WHERE Id = 118
表結構是:
CREATE TABLE `logintoken` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`type` CHAR(1) NOT NULL DEFAULT '0' ,
`loginName` VARCHAR(20) NULL DEFAULT NULL,
`token` VARCHAR(2000) NULL DEFAULT NULL,
`tokenExpiredTime` TIMESTAMP NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `loginName` (`loginName`, `type`) USING BTREE
)
COMMENT='登錄Token'
COLLATE='utf8mb4_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=15
;
表被TRUNCATE了,所以有問題的資料沒有辦法截圖
uj5u.com熱心網友回復:
不連續id是因為唯一索引,沖突后id自增1長時間updateing 應該是有事務鎖住了相應的id造成等待鎖
可以看下事務的情況 select * from information_schem.INNODB_TRX
uj5u.com熱心網友回復:
1、自增欄位id不連續是正常的, 中間的空號很多,說明包含該插入陳述句的事務不成功的比例很多。2、出現很多不相干陳述句的update等待,有可能系統出現故障,比如磁盤錯誤,或其他錯誤, 最好查下mysql的錯誤記錄
uj5u.com熱心網友回復:
不連續就不說了,很多情況導致,處境的設計也不是以連續為目標,不糾結洗掉的問題,你可以試一下 select ,如果 select 同樣慢,應該考慮系統問題,如果只是 update / delete 慢,那檢查是否鎖的問題,比如把所有的行程都斷開,在沒有其他人操作的情況下,如果操作慢,那么是并發沖突導致
uj5u.com熱心網友回復:
INNODB_TRX 確實有記錄,殺掉trx_mysql_thread_id的對應值就好了。
但是其trx_mysql_thread_id在processlist表里對應的id,command都是sleep,且state、info兩列都是空

uj5u.com熱心網友回復:
select沒有問題。并發應該不至于,因為資料庫是剛清的,總共只有不到10條資料,現在還在測驗階段,2個測驗人員。innodb_trx確實有東西,科室processlist里是sleep,且info里沒有sql陳述句
uj5u.com熱心網友回復:
你把陳述句單獨拿出來執行看看是否也慢如果也慢,開 PROFILE 看看
SET PROFILING = 1
uj5u.com熱心網友回復:
阻塞是trx表里有一條資料在running,但是相應的執行緒在processlist表里的資料是sleep,可是info一列沒有SQL陳述句。我有什么辦法能看到什么東西阻塞了?
uj5u.com熱心網友回復:
查下 information_schema.innodb_locks ,如果這個沒有資料,只在 trx 中有資料,那么你需要 PROFILE轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/108021.html
標籤:MySQL
下一篇:求一圖書資料資料庫
