MySQL常用監控命令


一、查看mysql鎖相關命令

1、通過INFORMATION_SCHEMA.INNODB_TRX、INNODB_LOCKS、INNODB_LOCK_WAITS 獲取事務與鎖的信息

1)查看哪些事務正在執行

命令:SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;

trx_state表示事務的狀態

mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX \G
*************************** 1. row ***************************
trx_id: 4391
trx_state: LOCK WAIT   //事務狀態,LOCK WAIT表示等待鎖
trx_started: 2019-09-27 11:39:09
trx_requested_lock_id: 4391:57:962:104
trx_wait_started: 2019-09-27 11:39:09
trx_weight: 2
trx_mysql_thread_id: 9  //線程ID
trx_query: select * from employees where birth_date = '1953-09-02' 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: 1136
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: 0
trx_is_read_only: 0
trx_autocommit_non_locking: 0
*************************** 2. row ***************************
trx_id: 4390
trx_state: RUNNING    //事務狀態,RUNNING表示正在運行的事務,如果一直運行中,有可能是block了
trx_started: 2019-09-27 11:38:41
trx_requested_lock_id: NULL
trx_wait_started: NULL
trx_weight: 65
trx_mysql_thread_id: 20   //線程ID
trx_query: NULL
trx_operation_state: NULL
trx_tables_in_use: 0
trx_tables_locked: 1
trx_lock_structs: 65
trx_lock_memory_bytes: 8400
trx_rows_locked: 127
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: 0
trx_is_read_only: 0
trx_autocommit_non_locking: 0
2 rows in set (0.00 sec)

 

2)查看當前鎖定的事務

命令:SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;

mysql> select * from information_schema.INNODB_LOCKS\G
*************************** 1. row ***************************
lock_id: 17778:82:3:6 --當前鎖ID
lock_trx_id: 17778 --該鎖對應的事務ID
lock_mode: X -- 鎖類型,排它鎖X
lock_type: RECORD --鎖范圍,記錄鎖:record lock,其他鎖范圍:間隙鎖:gap lock,或者next-key lock(記錄鎖+間隙鎖)
lock_table: `test`.`trx_fee`
lock_index: PRIMARY --加載在哪個索引上的鎖
lock_space: 82
lock_page: 3
lock_rec: 6
lock_data: 4
*************************** 2. row ***************************
lock_id: 17773:82:3:6
lock_trx_id: 17773
lock_mode: X
lock_type: RECORD
lock_table: `test`.`trx_fee`
lock_index: PRIMARY
lock_space: 82
lock_page: 3
lock_rec: 6
lock_data: 4

 

3)查看當前正在等待鎖的事務

命令:SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS; 

mysql> select * from information_schema.INNODB_LOCK_WAITS\G
*************************** 1. row ***************************
requesting_trx_id: 17778 --請求鎖的事務ID(等待方)
requested_lock_id: 17778:82:3:6 -- 請求鎖ID
blocking_trx_id: 17773 -- 阻塞該鎖的事務ID(當前持有方,待釋放)
blocking_lock_id: 17773:82:3:6 -- 持有的鎖ID

  

2、查詢鎖爭用情況

1)查詢表級鎖爭用情況

可以通過檢查table_locks_waited和table_locks_immediate狀態變量來分析表鎖爭奪情況。

mysql> show status like 'table%';
+----------------------------+-------+
| Variable_name | Value |
+----------------------------+-------+
| Table_locks_immediate | 6165 |
| Table_locks_waited | 0 |
| Table_open_cache_hits | 0 |
| Table_open_cache_misses | 0 |
| Table_open_cache_overflows | 0 |
+----------------------------+-------+

變量解釋:

table_lock_waited 表示不能馬上獲得鎖的數量

table_lock_immediate表示馬上獲得鎖的數量

 

2)查看記錄鎖使用情況

mysql> show status like 'innodb_row_lock_%';
+-------------------------------+-------+
| Variable_name | Value |
+-------------------------------+-------+
| Innodb_row_lock_current_waits | 0 |
| Innodb_row_lock_time | 1896 |
| Innodb_row_lock_time_avg | 6 |
| Innodb_row_lock_time_max | 193 |
| Innodb_row_lock_waits | 274 |
+-------------------------------+-------+

變量解釋:

Innodb_row_lock_current_waits:當前等待鎖的數量  
Innodb_row_lock_time:系統啟動到現在,鎖定的總時間長度  
Innodb_row_lock_time_avg:每次平均鎖定的時間  
Innodb_row_lock_time_max:最長一次鎖定時間
Innodb_row_lock_waits:系統啟動到現在總共鎖定的次數

二、查看MySQL的運行狀態

我們需要了解MySQL的服務器狀態信息,比如查看當前MySQL啟動后的運行時間,MySQL的客戶端會話連接數,MySQL服務器執行的慢查詢數,MySQL執行了多少SELECT/UPDATE/DELETE/INSERT語句等統計信息。查看MySQL運行狀態,優化MySQL運行效率,就需要使用show status命令。

1、線程緩存命中率

1)查看當前連接數

命令:SHOW STATUS LIKE 'Thread_%';

Thread_cached:被緩存的線程的個數
Thread_running:處於激活狀態的線程的個數
Thread_connected:當前連接的線程的個數
Thread_created:總共被創建的線程的個數

Thread Cache Hits
Thread_connected = SHOW GLOBAL STATUS LIKE Thread_created;
Connections = SHOW GLOBAL STATUS LIKE 'Connections';
TCH = (1 - ( Threads_created / Connections ) ) * 100

如果TCH數小於90%,說明命中率不高,創建連接耗費了不少時間,可以考慮加大 thread_cache_size 變量值來增大Thread_cached的數量。

2)線程緩存大小 thread_cache_size

當客戶端斷開連接之后,MySQL會把線程緩存起來以響應下一個請求而不是直接銷毀(前提是緩存數未達上限)

查看thread_cache_size的值
show global variables like 'thread_cache_size';

設置thread_cache_size大小:
如果是短連接,可以適當設大一點。因為短連接往往需要不停地創建和銷毀。如果設大一點,重新創建和銷毀的數量會小一些,對性能提升有較大的作用。
如果是長連接,如果是長連接,可以適當設置小一點。

物理內存設置規則:
可以大致根據物理內存來設置,1G-->8、2G-->16、3G-->32、4G-->64

兩種設置方法:
mysql> set global thread_cache_size = 16
編輯/etc/my.cnf  更改/添加 thread_concurrency = 16

2、QPS、TPS 和 RW Ratio
幾個重要參數:

Qcache_hits:查詢緩存命中次數
  SHOW GLOBAL STATUS LIKE 'Qcache_hits';
Com_select:總的查詢語句量
  SHOW GLOBAL STATUS LIKE 'Com_select';
Com_insert:執行插入語句量
  SHOW GLOBAL STATUS LIKE 'Com_insert';
Com_update:執行更新語句量
  SHOW GLOBAL STATUS LIKE 'Com_update';
Com_delete:執行刪除語句量
  SHOW GLOBAL STATUS LIKE 'Com_delete';
Com_replace:執行字符串替換語句量
  SHOW GLOBAL STATUS LIKE 'Com_replace';
Uptime:本次啟動服務到現在執行的時長
  SHOW GLOBAL STATUS LIKE 'Uptime';

1)QPS,每秒查詢量
基於Questions計算QPS。Questions表示發送給服務器的查詢數量

Questions:
  SHOW GLOBAL STATUS LIKE 'Questions';
QPS = Questions / Uptime

基於com_*計算QPS。Com_select表示查詢語句執行數量

QPS = Com_select / Uptime

使用Questions進行計算QPS時,人為拉高了計算結果。相對來說,使用Com_select這種計算方式更符合實際一些。

2)TPS,每秒事務量
服務器每秒處理的事務數,如果是InnoDB會顯示,沒有InnoDB就不會顯示。
基於Com_commit和Com_rollback計算。Com_commit表示執行的事務提交次數,Com_rollback表示執行的事務回滾次數

Com_commit:
  SHOW GLOBAL STATUS LIKE 'Com_commit';
Com_rollback:
  SHOW GLOBAL STATUS LIKE 'Com_rollback';
TPS = (Com_commit + Com_rollback) / Uptime

QPS 和 TPS值一定要實時監控,如果接近架構搭建時的測試峰值,表示系統壓力很大

3)R/W Ratio,讀寫比
Read/Writes Ratio,數據庫讀寫比

R/W = (Com_select + Qcache_hits) / (Com_insert + Com_update + Com_delete + Com_replace) * 100

讀寫比:優化數據庫的重要依據,讀的多優化讀,寫的多優化寫

3、慢查詢、無索引 join查詢

1)慢查詢

/*查看慢查詢時間 */
show variables like "long_query_time";默認10s
/*查看慢查詢配置情況 */
show status like "%slow_queries%";
/*查看慢查詢日志路徑 */
show variables like "%slow%";

=======================================

/*開啟慢日志 */
set global slow_query_log = ON;
/*設置慢查詢時間 2s */
set global long_query_time = 2;
/*設置慢查詢日志路徑 */
set global slow_query_log_file='/usr/local/mysql/data/slow.log';
/*設置無索引的查詢,設置后沒有使用索引的查詢也會被認為是慢查詢 */
set global log_queries_not_using_indexes = ON;

======================================

Slow queries per minute
Slow_queries:
SHOW GLOBAL STATUS LIKE 'Slow_queries';
SQPM = Slow_queries/(Uptime/60)
S/Q = Slow_queries/Questions

新版本上線時要重點關注慢查詢,出現慢查詢sql,要盡快優化。

2)無索引join查詢
Full_join per minute
Select_full_join:
SHOW GLOBAL STATUS LIKE 'Select_full_join';
FJPM = Select_full_join / (Uptime / 60)

沒有使用索引而造成的全表掃描的join,需要優化索引。

4、buffer 和cache設置

Innodb buffer read hits,buffer命中率
Innodb_buffer_pool_reads:
  SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_reads';
Innodb_buffer_pool_read_requests:
  SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_read_requests';
IFRH = (1 - Innodb_buffer_pool_reads/Innodb_buffer_pool_read_requests) * 100
InnoDB Buffer命中率,目標95%-99%;

Table Cache,表緩存
Open_tables:
  SHOW GLOBAL STATUS LIKE 'Open_tables';
Opened_tables:
  SHOW GLOBAL STATUS LIKE 'Opened_tables';
table_cache:
  SHOW GLOBAL STATUS LIKE 'table_cache';

table_cache應該大於Open_tables小於Opened_tables

https://www.cnblogs.com/yuqiandoudou/p/4665537.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM