日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

监控mysql锁定状态_mysql InnoDB锁等待的查看及分析

發布時間:2023/12/20 数据库 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 监控mysql锁定状态_mysql InnoDB锁等待的查看及分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

說明:前面已經了解了InnoDB關于在出現鎖等待的時候,會根據參數innodb_lock_wait_timeout的配置,判斷是否需要進行timeout的操作,本文檔介紹在出現鎖等待時候的查看及分析處理;

在InnoDB Plugin之前,一般通過show full processlist和show engine innodb status命令查看當前的數據庫請求,然后再判斷當前事務中鎖的情況。隨著mysql的發展,已經提供更加便捷的方法來監控數據庫中的鎖等待現象了。

在information_schema下面有三張表:INNODB_TRX、INNODB_LOCKS、INNODB_LOCK_WAITS,通過這三張表,可以更簡單地監控當前的事務并分析可能存在的問題。

INNODB_TRX表及結構

Column name

Description

TRX_WEIGHT

The weight of a transaction, reflecting (but not necessarily the exact count of) the number of rows altered and the number of rows locked by the transaction. To resolve a deadlock, InnoDB selects the transaction with the smallest weight as the “victim” to rollback. Transactions that have changed non-transactional tables are considered heavier than others, regardless of the number of altered and locked rows.

TRX_STATE

Transaction execution state. One of RUNNING, LOCK WAIT, ROLLING BACK or COMMITTING.

TRX_STARTED

Transaction start time.

TRX_REQUESTED_LOCK_ID

ID of the lock the transaction is currently waiting for (if TRX_STATE is LOCK WAIT, otherwise NULL). Details about the lock can be found by joining with INNODB_LOCKS on LOCK_ID.

TRX_WAIT_STARTED

Time when the transaction started waiting on the lock (if TRX_STATE is LOCK WAIT, otherwise NULL).

TRX_QUERY

The SQL query that is being executed by the transaction.

TRX_OPERATION_STATE

The transaction's current operation, or NULL.

TRX_TABLES_IN_USE

The number of InnoDB tables used while processing the current SQL statement of this transaction.

TRX_TABLES_LOCKED

Number of InnoDB tables that the current SQL statement has row locks on. (Because these are row locks, not table locks, the tables can usually still be read from and written to by multiple transactions, despite some rows being locked.)

TRX_LOCK_STRUCTS

The number of locks reserved by the transaction.

TRX_LOCK_MEMORY_BYTES

Total size taken up by the lock structures of this transaction in memory.

TRX_ROWS_LOCKED

Approximate number or rows locked by this transaction. The value might include delete-marked rows that are physically present but not visible to the transaction.

TRX_ROWS_MODIFIED

The number of modified and inserted rows in this transaction.

TRX_CONCURRENCY_TICKETS

A value indicating how much work the current transaction can do before being swapped out, as specified by the innodb_concurrency_tickets option.

TRX_ISOLATION_LEVEL

The isolation level of the current transaction.

TRX_UNIQUE_CHECKS

Whether unique checks are turned on or off for the current transaction. (They might be turned off during a bulk data load, for example.)

TRX_FOREIGN_KEY_CHECKS

Whether foreign key checks are turned on or off for the current transaction. (They might be turned off during a bulk data load, for example.)

TRX_LAST_FOREIGN_KEY_ERROR

Detailed error message for last FK error, or NULL.

TRX_ADAPTIVE_HASH_LATCHED

Whether or not the adaptive hash index is locked by the current transaction. (Only a single transaction at a time can modify the adaptive hash index.)

TRX_ADAPTIVE_HASH_TIMEOUT

Whether to relinquish the search latch immediately for the adaptive hash index, or reserve it across calls from MySQL. When there is no AHI contention, this value remains zero and statements reserve the latch until they finish. During times of contention, it counts down to zero, and statements release the latch immediately after each row lookup.

TRX_IS_READ_ONLY

A value of 1 indicates the transaction is read-only. (5.6.4 and up.)

TRX_AUTOCOMMIT_NON_LOCKING

A value of 1 indicates the transaction is a SELECT statement that does not use the FOR UPDATE or LOCK IN SHARED MODE clauses, and is executing with the autocommit setting turned on so that the transaction will only contain this one statement. (5.6.4 and up.) When this column and TRX_IS_READ_ONLY are both 1, InnoDB optimizes the transaction to reduce the overhead associated with transactions that change table data.

比較常用的列:

trx_id:InnoDB存儲引擎內部唯一的事物ID

trx_status:當前事務的狀態

trx_status:事務的開始時間

trx_requested_lock_id:等待事務的鎖ID

trx_wait_started:事務等待的開始時間

trx_weight:事務的權重,反應一個事務修改和鎖定的行數,當發現死鎖需要回滾時,權重越小的值被回滾

trx_mysql_thread_id:MySQL中的進程ID,與show processlist中的ID值相對應

trx_query:事務運行的SQL語句

INNODB_LOCKS

Column name

Description

LOCK_ID

Unique lock ID number, internal to InnoDB. Treat it as an opaque string. Although LOCK_ID currently contains TRX_ID, the format of the data in LOCK_ID is not guaranteed to remain the same in future releases. Do not write programs that parse the LOCK_ID value.

LOCK_TRX_ID

ID of the transaction holding this lock. Details about the transaction can be found by joining with INNODB_TRX on TRX_ID.

LOCK_MODE

Mode of the lock. One of S, X, IS, IX, S_GAP, X_GAP, IS_GAP, IX_GAP, or AUTO_INC for shared, exclusive, intention shared, intention exclusive row locks, shared and exclusive gap locks, intention shared and intention exclusive gap locks, and auto-increment table level lock, respectively. Refer to the sections Section 14.5.3, “InnoDB Lock Modes” and Section 14.5.2, “The InnoDB Transaction Model and Locking” for information on InnoDB locking.

LOCK_TYPE

Type of the lock. One of RECORD or TABLE for record (row) level or table level locks, respectively.

LOCK_TABLE

Name of the table that has been locked or contains locked records.

LOCK_INDEX

Name of the index if LOCK_TYPE='RECORD', otherwise NULL.

LOCK_SPACE

Tablespace ID of the locked record if LOCK_TYPE='RECORD', otherwise NULL.

LOCK_PAGE

Page number of the locked record if LOCK_TYPE='RECORD', otherwise NULL.

LOCK_REC

Heap number of the locked record within the page if LOCK_TYPE='RECORD', otherwise NULL.

LOCK_DATA

Primary key value(s) of the locked record if LOCK_TYPE='RECORD', otherwise NULL. This column contains the value(s) of the primary key column(s) in the locked row, formatted as a valid SQL string (ready to be copied to SQL commands). If there is no primary key then the InnoDB internal unique row ID number is used. If a gap lock is taken for key values or ranges above the largest value in the index, LOCK_DATA reports “supremum pseudo-record”. When the page containing the locked record is not in the buffer pool (in the case that it was paged out to disk while the lock was held), InnoDB does not fetch the page from disk, to avoid unnecessary disk operations. Instead, LOCK_DATA is set to NULL.

INNODB_LOCK_WAITS

Column name

Description

REQUESTING_TRX_ID

ID of the requesting transaction.

REQUESTED_LOCK_ID

ID of the lock for which a transaction is waiting. Details about the lock can be found by joining with INNODB_LOCKS on LOCK_ID.

BLOCKING_TRX_ID

ID of the blocking transaction.

BLOCKING_LOCK_ID

ID of a lock held by a transaction blocking another transaction from proceeding. Details about the lock can be found by joining with INNODB_LOCKS on LOCK_ID.

以上這些表,其實只要知道其中比較常用的字段,就差不多能夠滿足日常的工作需求了,下面通過測試進行演示;

一、準備工作

1、在test下面隨便創建一張表john,并取消自動commit操作,腳本如下:

mysql> use information_schema

Database changed

mysql> select count(*) from tables;

+----------+

| count(*) |

+----------+

|?????? 81 |

+----------+1 row in set (0.06 sec)

mysql>?create table test.john as select * from tables;

Query OK, 82 rows affected (0.29 sec)

Records: 82? Duplicates: 0? Warnings: 0

mysql>?insert into john select * from john;

Query OK, 671744 rows affected (2 min 19.03 sec)

Records: 671744? Duplicates: 0? Warnings: 0

(經過幾次插入后john表的數據671744行)

mysql>?set @@autocommit=0;Query OK, 0 rows affected (0.00 sec)

(取消數據庫的自動commit)

二、進行表john加鎖操作,腳本如下:

mysql> select count(*) from john for update;

+----------+

| count(*) |

+----------+

|? 2686976 |

+----------+

1 row in set (8.19 sec)

在另外一個窗口中監控innodb鎖的狀態;

mysql> SELECT? * FROM INNODB_TRX\G;

*************************** 1. row ***************************

trx_id: B14????????????????????????????????????????????????/請記住該trx_id/

trx_state: RUNNING?????????????????????????????????????? /當前狀態/

trx_started: 2014-11-29 14:07:51

trx_requested_lock_id: NULL

trx_wait_started: NULL

trx_weight: 15905

trx_mysql_thread_id: 10????????????????????????????????? ????????/在process 里面的id值/

trx_query: select count(*) from john for update;????/當前執行的語句/

trx_operation_state: fetching rows

trx_tables_in_use: 1

trx_tables_locked: 1

trx_lock_structs: 15905

trx_lock_memory_bytes: 1554872

trx_rows_locked: 1360743

trx_rows_modified: 0

trx_concurrency_tickets: 0

trx_isolation_level: REPEATABLE READ

trx_unique_checks: 1

trx_foreign_key_checks: 1

trx_last_foreign_key_error: NULL

trx_adaptive_hash_latched: 0

trx_adaptive_hash_timeout: 10000

1 row in set (0.02 sec)

trx_id: B14 只是持有鎖,但并沒有產生鎖等待;

三、模擬鎖等待

3.1 在另外一個窗口中,執行語句:

mysql> select count(*) from john where table_name='CHARACTER_SETS' for update;

3.2 查看當前鎖等待的情況

INNODB_TRX的鎖情況:

mysql> SELECT? * FROM INNODB_TRX\G;

*************************** 1. row ***************************

trx_id: B15

trx_state: LOCK WAIT?????????????????????? //狀態為鎖等待//

trx_started: 2014-11-29 14:12:28

trx_requested_lock_id: B15:0:32777:2

trx_wait_started: 2014-11-29 14:12:28

trx_weight: 2

trx_mysql_thread_id: 10?????????????????????????? //在process里面可以看到相應的狀態//

trx_query: select count(*) from john where table_name='CHARACTER_SETS' for update??????????????? //鎖等待的語句//

trx_operation_state: starting index read

trx_tables_in_use: 1

trx_tables_locked: 1

trx_lock_structs: 2

trx_lock_memory_bytes: 376

trx_rows_locked: 1

trx_rows_modified: 0

trx_concurrency_tickets: 0

trx_isolation_level: REPEATABLE READ

trx_unique_checks: 1

trx_foreign_key_checks: 1

trx_last_foreign_key_error: NULL

trx_adaptive_hash_latched: 0

trx_adaptive_hash_timeout: 10000

*************************** 2. row ***************************

trx_id: B14

trx_state: RUNNING

trx_started: 2014-11-29 14:07:51

trx_requested_lock_id: NULL

trx_wait_started: NULL

trx_weight: 31777

trx_mysql_thread_id: 8

trx_query: NULL

trx_operation_state: NULL

trx_tables_in_use: 0

trx_tables_locked: 0

trx_lock_structs: 31777

trx_lock_memory_bytes: 3094968

trx_rows_locked: 2718752

trx_rows_modified: 0

trx_concurrency_tickets: 0

trx_isolation_level: REPEATABLE READ

trx_unique_checks: 1

trx_foreign_key_checks: 1

trx_last_foreign_key_error: NULL

trx_adaptive_hash_latched: 0

trx_adaptive_hash_timeout: 10000

2 rows in set (0.02 sec)

請注意:因為我們只有模擬兩個session,所以這邊只有兩個會話。(因此一個處于鎖等待,另外一個必然就是持有鎖的對象。實際的生產環境中可能這邊會出現很多列,所以需要用下面的語句才能判斷:鎖等待和持有鎖對象的匹配關系)

3.3 鎖等待和持有鎖的相互關系

mysql> SELECT * FROM INNODB_LOCK_WAITS\G;

*************************** 1. row ***************************

requesting_trx_id: B15

requested_lock_id: B15:0:32777:2

blocking_trx_id: B14

blocking_lock_id: B14:0:32777:2

1 row in set (0.03 sec)

ERROR:

No query specified

通過視圖INNODB_LOCK_WAITS可以清晰的看到B14持有鎖,而B15處于鎖等待;

3.4 鎖等待的原因

mysql> SELECT * FROM INNODB_LOCKS\G;

*************************** 1. row ***************************

lock_id: B15:0:32777:2

lock_trx_id: B15

lock_mode: X

lock_type: RECORD

lock_table: `test`.`john`

lock_index: `GEN_CLUST_INDEX`

lock_space: 0

lock_page: 32777

lock_rec: 2

lock_data: 0x000000640000

*************************** 2. row ***************************

lock_id: B14:0:32777:2

lock_trx_id: B14

lock_mode: X

lock_type: RECORD

lock_table: `test`.`john`

lock_index: `GEN_CLUST_INDEX`

lock_space: 0

lock_page: 32777

lock_rec: 2

lock_data: 0x000000640000

2 rows in set (0.01 sec)

可以看到持有鎖的模式、對象

3.5 在進程里面查看狀態

Id值為8的進程,Info顯示為NULL值,可以推斷當前的session由于未進行commit導致鎖未釋放的;

總結:通過以上幾個視圖,就可以很快速的判斷出鎖等待的對象及原因了,從這上面也可以看出mysql管理更加便捷和容易了;

總結

以上是生活随笔為你收集整理的监控mysql锁定状态_mysql InnoDB锁等待的查看及分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。