mysql8查看鎖信息
一。準備環境
1.登錄mysql,設置鎖等待時間,然后退出。
mysql> set global innodb_lock_wait_timeout=1200;Query OK, 0 rows affected (0.00 sec)2.再次登錄MySQL。打開第一個session
3.登錄msyql,打開第二個session
2.登錄打開第二個sessionmysql> set autocommit=0;Query OK, 0 rows affected (0.00 sec)mysql> mysql> select @@autocommit;+--------------+| @@autocommit |+--------------+| 0 |+--------------+1 row in set (0.00 sec)mysql> use testmysql> update temp set name='bb' where id=1; #執行這條sql,會一直卡住。4.登錄MySQL,打開第三個session。
a:查看
mysql> select trx_id,trx_state,trx_started,trx_tables_locked,trx_rows_locked,trx_query from information_schema.innodb_trx;看上圖trx_state的狀態LOCK_WAIT,同時trx_query對應的sql語句,說明執行這條sql阻塞了。事務id的字段trx_id的值1755425
b:查看
mysql> select ENGINE_LOCK_ID,ENGINE_TRANSACTION_ID,LOCK_MODE,LOCK_TYPE,INDEX_NAME,OBJECT_SCHEMA,OBJECT_NAME,LOCK_DATA,LOCK_STATUS,THREAD_ID from performance_schema.data_locks;看上圖的lock_status出現了一個WAITING,同時THREAD_ID為57的線程處于等待狀態。對應的ENGINE_TRANSACTION_ID的值就是a操作的圖字段trx_id的值1755425。
4.還要查看鎖事務的對應關系,
mysql> select locked_table_name,locked_index,waiting_pid,waiting_lock_id,blocking_lock_id,blocking_pid from sys.innodb_lock_waits;再次對比下??梢哉业疥P系,1等待的事務處理,是被2阻塞了。也就是鎖住了,需要2釋放鎖,1才可以執行
mysql> select ENGINE_LOCK_ID,ENGINE_TRANSACTION_ID,LOCK_MODE,LOCK_TYPE,INDEX_NAME,OBJECT_SCHEMA,OBJECT_NAME,LOCK_DATA,LOCK_STATUS,THREAD_ID from performance_schema.data_locks;mysql> select locked_table_name,locked_index,waiting_pid,waiting_lock_id,blocking_lock_id,blocking_pid from sys.innodb_lock_waits;同時,查看waiting_pid跟blocking_pid的值就是線程id,對應processlist
mysql> select locked_table_name,locked_index,waiting_pid,waiting_lock_id,blocking_lock_id,blocking_pid from sys.innodb_lock_waits;mysql> show processlist;5.現在上面圖看不到blocking_pid對應的線程THREAD_PID
mysql> select ENGINE_LOCK_ID,ENGINE_TRANSACTION_ID,LOCK_MODE,LOCK_TYPE,INDEX_NAME,OBJECT_SCHEMA,OBJECT_NAME,LOCK_DATA,LOCK_STATUS,THREAD_ID from performance_schema.data_locks;mysql> select locked_table_name,locked_index,waiting_pid,waiting_lock_id,blocking_lock_id,blocking_pid from sys.innodb_lock_waits;6.通過上圖可以看到。 blocking_pid為15 對應的線程THREAD_PID 為56.
waiting_pid為16 對應的線程THREAD_PID 為57.
mysql> select THREAD_ID,EVENT_ID,EVENT_NAME,SQL_TEXT from performance_schema.events_statements_history where THREAD_ID in (56,57) order by THREAD_ID,EVENT_ID;從圖上分析,就可以看出blocking_pid,也就是已經鎖了執行的sql是啥。
附:mysql8.0查看死鎖
記錄工作日常遇到的問題
在mysql5.7、mysql5.8等5系版本中
查看死鎖代碼是
select * from information_schema.innodb_locks;查看等待鎖的代碼
select * from information_schema.innodb_lock_waitsmysql 8.0中查看死鎖代碼變了
如果繼續用5.7的代碼會提示報錯
Unknown table ‘INNODB_LOCKS' in information_schema所以在8.0使用以下代碼
#查看死鎖select * from performance_schema.data_locks;#查看死鎖等待時間select * from performance_schema.data_lock_waits;然后kill就行了
總結
到此這篇關于mysql8查看鎖信息的文章就介紹到這了,更多相關mysql8查看鎖內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!