本文概要:
0、前言;
1、監控MySQL的哪些指標;
2、一目瞭然的MySQL監控的UI界面;
3、Python代碼獲取MySQL監控狀態。
0、前言
我們知道“SHOW STATUS”命令是獲取MySQL實例狀態的,“SHOW VARIABLES”命令是獲取MySQL實例設置變量的,也是監控數據的最重要來源。
這兩個命令使用如下:
“SHOW VARIABLES”命令獲取狀態:
mysql> SHOW GLOBAL STATUS;
mysql> SHOW [SESSION] STATUS;
查詢特定狀態值:
SHOW GLOBAL STATUS LIKE 'xxx'";
這裏數據的主要來源是“information_schema”數據庫,它是每個MySQL實例中的數據庫,存儲有關MySQL實例維護的所有其他數據庫的信息。
“SHOW STATUS”命令設置參數:
mysql> SHOW GLOBAL VARIABLES;
mysql> SHOW [SESSION] VARIABLES;
查詢特定變量值:
mysql> SHOW GLOBAL VARIABLES LIKE "XXX";
注意:
其中有些參數支持運行時修改,會立即生效;有些參數不支持,且只能通過修改配置文件,並重啓服務器程序生效;
有些參數作用域是全局的,且不可改變;有些可以爲每個用戶提供單獨的設置;
所以需要對一些重要的參數進行監控。
另外,MySQL有一個性能監控功能,MySQL Performance Schema是一種用於在較低級別監視MySQL實例執行的功能,這些監控數據保存在“performance_schema”數據庫。
Performance Schema開關變量“performance_schema”:
mysql版本<= 5.6.5默認關閉; >=5.6.6默認開啓。
如果關閉就沒有“performance_schema”數據庫了,一般也可以減少幾百M內存佔用。
下面列出了每個Performance Schema表,並提供了每個表的簡短描述:
accounts 每個客戶帳戶的連接統計
cond_instances 同步對象實例
events_stages_current 當前的舞臺活動
events_stages_history 每個線程最近的階段事件
events_stages_history_long 最近的舞臺活動
events_stages_summary_by_account_by_event_name 每個帳戶和事件名稱的舞臺活動
events_stages_summary_by_host_by_event_name 每個主機名和事件名稱的階段事件
events_stages_summary_by_thread_by_event_name Stage等待每個線程和事件名稱
events_stages_summary_by_user_by_event_name 每個用戶名和事件名稱的舞臺事件
events_stages_summary_global_by_event_name 舞臺等待每個事件名稱
events_statements_current 當前的陳述事件
events_statements_history 每個線程最近的語句事件
events_statements_history_long 總體上最近的陳述事件
events_statements_summary_by_account_by_event_name 每個帳戶和事件名稱的語句事件
events_statements_summary_by_digest 每個架構和摘要值的語句事件
events_statements_summary_by_host_by_event_name 每個主機名和事件名稱的語句事件
events_statements_summary_by_thread_by_event_name 每個線程和事件名稱的語句事件
events_statements_summary_by_user_by_event_name 每個用戶名和事件名稱的語句事件
events_statements_summary_global_by_event_name 每個事件名稱的語句事件
events_waits_current 目前的等待事件
events_waits_history 每個線程最近的等待事件
events_waits_history_long 最近的等待事件
events_waits_summary_by_account_by_event_name 每個帳戶和事件名稱等待事件
events_waits_summary_by_host_by_event_name 每個主機名和事件名稱等待事件
events_waits_summary_by_instance 每個實例等待事件
events_waits_summary_by_thread_by_event_name 每個線程和事件名稱等待事件
events_waits_summary_by_user_by_event_name 每個用戶名和事件名稱等待事件
events_waits_summary_global_by_event_name 每個事件名稱等待事件
file_instances 文件實例
file_summary_by_event_name 每個事件名稱的文件事件
file_summary_by_instance 每個文件實例的文件事件
host_cache 來自內部主機緩存的信息
hosts 每個客戶端主機名的連接統計
mutex_instances 互斥同步對象實例
objects_summary_global_by_type 對象摘要
performance_timers 哪些活動計時器可用
rwlock_instances 鎖定同步對象實例
session_account_connect_attrs 當前會話的每個連接屬性
session_connect_attrs 所有會話的連接屬性
setup_actors 如何初始化新前臺線程的監視
setup_consumers 可以存儲事件信息的消費者
setup_instruments 可以收集事件的檢測對象的類
setup_objects 應監控哪些對象
setup_timers 當前事件計時器
socket_instances 活動連接實例
socket_summary_by_event_name 套接字等待和每個事件名稱的I / O.
socket_summary_by_instance 套接字等待每個實例的I / O.
table_io_waits_summary_by_index_usage 表I / O等待每個索引
table_io_waits_summary_by_table 表I / O每個表等待
table_lock_waits_summary_by_table 表鎖等待每個表
threads 有關服務器線程的信息
users 每個客戶端用戶名的連接統計
下面我們還是以“SHOW STATUS”命令獲取MySQL實例狀態,“SHOW VARIABLES”命令獲取MySQL實例設置變量來看有哪些重要的監控指標。
1、監控MySQL的哪些指標
#系統重要指標
version
mysql版本
設置變量
runTime
mysql運行時間(秒)
Uptime
服務器已啓動的秒數。
#會話相關
#、會話連接
maxConnections
max_connections
variables
最大連接數(max_connections)
mysqld實際上允許 max_connections + 1個客戶端連接。保留額外的連接,以供具有SUPER特權的帳戶使用 。通過將特權授予管理員而不是普通用戶(該用戶不需要),具有PROCESS特權的管理員也 可以連接到服務器並用於SHOW PROCESSLIST診斷問題,即使連接了最大數量的非特權客戶端也是如此。
如果服務器由於max_connections達到限制而拒絕連接 ,則它將增加 Connection_errors_max_connections 狀態變量。
threadsConnected
Threads_connected
當前打開的連接數
threadsRunning
Threads_running
當前活躍的連接數 : 當前正處於激活狀態的線程個數
threadsCreated
創建處理連接的線程數
計算爲兩次監控間隔時間的增量。
Threads_created :
創建用於處理連接的線程數。
如果 Threads_created較大,則可能要增加 thread_cache_size值。
高速緩存未命中率可以計算爲 Threads_created/ Connections。
threadCacheSize
最大緩存線程數
thread_cache_size
variables
服務器可以緩存多少線程以供重用。
當客戶端斷開連接時,如果當前線程的少於thread_cache_size線程,則將客戶端的線程放入緩存中。
通過儘可能地重用從緩存中獲取的線程來滿足線程請求,並且僅當緩存爲空時才創建新線程。如果您有很多新連接,則可以增加此變量以提高性能。
通常,如果您具有良好的線程實現,則這不會顯着提高性能。但是,如果您的服務器每秒看到數百個連接,則通常應設置thread_cache_size足夠高,以便大多數新連接使用緩存的線程。
通過檢查Connections和Threads_created狀態變量之間的差異 ,您可以瞭解線程緩存的效率。有關詳細信息,請參見第5.1.9節“服務器狀態變量”。
默認值基於以下公式,上限爲100:
8 + (max_connections / 100)
threadsCached
緩存線程數量
Threads_cached :
線程緩存中的線程數。
threadCacheHitRates
線程緩存命中率,範圍0~1。
可以計算爲: thread_cache_hit_rate = 1 - Threads_created_increment / Connections_increment
Threads_created_increment和Connections_increment表示兩次監控間隔時間的增量
connections
嘗試連接MySQL次數(成功或失敗)。
計算爲兩次監控間隔時間的增量。
Connections
與MySQL服務器的連接嘗試次數(成功或失敗)。
abortedClients
由於客戶端在未正確關閉連接而中止的連接數
Aborted_clients
由於客戶端在未正確關閉連接的情況下死亡而中止的連接數。
abortedConnects
連接到MySQL的失敗嘗試次數
Aborted_connects
連接到MySQL服務器的失敗嘗試次數。請參見第B.4.2.11節“通信錯誤和中止的連接”。
有關其他與連接有關的信息,請檢查Connection_errors_xxx狀態變量和host_cache表格。
connectionErrorsInternal
由於服務器內部錯誤(例如無法啓動新線程或內存不足情況)而被拒絕的連接數
Connection_errors_internal
由於服務器內部錯誤(例如無法啓動新線程或內存不足情況)而被拒絕的連接數。
connectionErrorsMaxConnections
達到最大連接限制而拒絕的連接數
Connection_errors_max_connections
由於max_connections達到服務器限制,拒絕的連接數 。
Connection_errors_xxx
這些變量提供有關客戶端連接過程中發生的錯誤的信息。它們僅是全局的,代表跨所有主機的連接彙總的錯誤計數。
這些變量跟蹤主機緩存未解決的錯誤(請參見第8.12.5.2節“ DNS查找優化和主機緩存”),例如與TCP連接不相關的錯誤,它們發生在連接過程的早期(甚至更早) IP地址是已知的),或者不是特定於任何特定IP地址的(例如,內存不足的情況)。
Connection_errors_accept
accept()在偵聽端口上 進行呼叫期間發生的錯誤數 。
Connection_errors_internal
由於服務器內部錯誤(例如無法啓動新線程或內存不足情況)而被拒絕的連接數。
Connection_errors_max_connections
由於max_connections達到服務器限制,拒絕的連接數 。
Connection_errors_peer_address
搜索連接客戶端IP地址時發生的錯誤數。
Connection_errors_select
呼叫 偵聽端口select()或poll()在偵聽端口上發生的錯誤數 。(此操作失敗不一定表示客戶端連接被拒絕。)
Connection_errors_tcpwrap
libwrap庫拒絕的連接數
#、會話流量
bytesReceivedPerSec
平均每秒從所有客戶端接收到的字節數,單位B
Bytes_received
從所有客戶端收到的字節數。
bytesSentPerSec
平均每秒發送給所有客戶端的字節數,單位B
Bytes_sent
發送給所有客戶端的字節數。
#、會話操作統計
commitCount
提交的操作次數
Com_commit
rollbackCount
回滾的操作次數
Com_rollback
insertCount
插入的操作次數
Com_insert + Com_insert_select
Com_insert_select統計:
INSERT SELECT FROM
如果您的數據在其他表中已經存在,可以通過INSERT SELECT FROM將數據複製到另外一張表。
updateCount
更新的操作次數
Com_update + Com_update_multi
deleteCount
刪除的操作次數
Com_delete + Com_delete_multi
selectCount
查詢的操作次數,不包括從緩存中返回結果的查詢
Com_select
selectTotalCount
查詢的操作次數,包括從緩存中返回結果的查詢
selectTotalCount = Com_select + Qcache_hits
SELECT 查詢總數由以下公式給出:
Com_select
+ Qcache_hits
+ queries with errors found by parser
該Com_select值由以下公式給出:
Qcache_inserts
+ Qcache_not_cached
+ queries with errors found during the column-privileges check
tps
每秒處理事務數
tps = Com_commit/s + Com_rollback/s
qps
每秒操作數
qps = selectTotalCount/s + Com_insert/s + Com_update/s + Com_delete/s
相關說明:
Com_xxx
Com_xxx語句計數器變量指示每個xxx語句已執行的次數。
每種類型的語句都有一個狀態變量。例如,Com_delete和Com_update分別計數DELETE和UPDATE語句。
Com_delete_multi和Com_update_multi類似,但適用於使用多表語法的DELETE和UPDATE語句。
如果從查詢緩存返回查詢結果,則服務器將遞增Qcache_hits狀態變量,而不是Com_select。請參見第8.10.3.4節“查詢緩存狀態和維護”。
即使準備好的語句參數未知或執行期間發生錯誤,所有Com_stmt_xxx變量也會增加。
換句話說,它們的值對應於發出的請求數,而不是成功完成的請求數。
Com_stmt_xxx狀態變量如下:
Com_stmt_prepare
Com_stmt_execute
Com_stmt_fetch
Com_stmt_send_long_data
Com_stmt_reset
Com_stmt_close
這些變量代表準備好的語句命令。它們的名稱指的是網絡層中使用的COM_xxx命令集。
換句話說,只要執行諸如mysql_stmt_prepare(),mysql_stmt_execute()之類的預備語句API調用,它們的值就會增加。
但是,對於PREPARE,EXECUTE或DEALLOCATE PREPARE,Com_stmt_prepare,Com_stmt_execute和Com_stmt_close也分別增加。
此外,對於PREPARE,EXECUTE和DEALLOCATE PREPARE語句,較舊的語句計數器變量Com_prepare_sql,Com_execute_sql和Com_dealloc_sql的值增加。
Com_stmt_fetch代表從遊標獲取時發出的網絡往返總數。
Com_stmt_reprepare指示在元數據更改語句所引用的表或視圖之後,服務器自動重新準備語句的次數。
reprepare操作會遞增Com_stmt_reprepare以及Com_stmt_prepare。
#SQL性能統計相關
slowQueryCount
慢查詢的次數
轉增量
Slow_queries
耗時超過long_query_time秒的查詢數 。無論是否啓用慢查詢日誌,此計數器都會遞增。
有關該日誌的信息,請參見 第5.4.5節“慢查詢日誌”。
tableLocksWaited
需要等待獲得表鎖的請求次數
轉增量
Table_locks_waited
無法立即授予對錶鎖的請求並需要等待的次數。
如果這很高,並且您有性能問題,則應首先優化查詢,然後拆分一個或多個表或使用複製。
tableLocksWaitedPercent
需要等待獲得表鎖的請求比例
tableLocksWaitedPercent = Table_locks_waited / (Table_locks_waited + Table_locks_immediate)
Table_locks_immediate
可以立即授予對錶鎖定的請求的次數。
selectScan
對第一個表進行完全掃描的聯接數量(全表掃描)
轉增量
Select_scan
對第一個表進行完全掃描的聯接數量
selectFullJoin
由於不使用索引而執行表掃描的聯接數量
轉增量
Select_full_join
由於不使用索引而執行表掃描的聯接數。
如果該值不爲0,則應仔細檢查表的索引。
handlerReadRndPerSec
平均每秒基於固定位置讀取行的請求數
Handler_read_rnd
基於固定位置讀取行的請求數。
如果您要執行很多需要對結果進行排序的查詢,則此值很高。
您可能有很多查詢需要MySQL掃描整個表,或者您的聯接未正確使用鍵。
handlerReadRndNextPerSec
平均每秒讀取數據文件下一行的請求數
Handler_read_rnd_next
讀取數據文件下一行的請求數。
如果要進行大量表掃描,則此值較高。
通常,這表明您的表未正確建立索引,或者未編寫查詢來利用您擁有的索引。
sortMergePasses
排序必須執行合併的次數
轉增量
Sort_merge_passes
排序算法必須執行合併的次數。
如果該值很大,則應考慮增加sort_buffer_size系統變量的值。
sortScanPerSec
平均每秒通過掃描表完成的排序數量
Sort_scan
通過掃描表完成的排序次數。
sortRangePerSec
平均每秒使用範圍完成的排序數量
Sort_range
使用ranges完成的排序數量。
#查詢緩存
先查詢判斷是否支持查詢緩存,沒有話就沒有這些指標
have_query_cache
YES如果mysqld支持查詢緩存,NO則不支持。
設置變量
queryCacheSize
查詢緩存空間大小,單位是字節
設置變量
query_cache_size
查詢緩存空間大小。
qcacheFreeMemory
查詢緩存可用空間
Qcache_free_memory
查詢緩存的可用內存量。
qcacheFreePercent
查詢緩存空閒率
qcacheFreePercent = qcacheFreeMemory / queryCacheSize
qcacheHitRate
查詢緩存命中率
qcacheHitRate = Qcache_hits/(Qcache_hits + Com_select)
Qcache_hits
查詢緩存命中數。
SELECT 查詢總數由以下公式給出:
Com_select
+ Qcache_hits
+ queries with errors found by parser
該Com_select值由以下公式給出:
Qcache_inserts
+ Qcache_not_cached
+ queries with errors found during the column-privileges check
qcacheInsertsPercent
緩存查詢結果的查詢比例
qcacheInsertsPercent = Qcache_inserts / (Qcache_inserts + Qcache_not_cached)
Qcache_inserts :
添加到查詢緩存中的查詢次數。
Qcache_not_cached
無法緩存查詢的數量(不可緩存或由於query_cache_type設置而無法緩存)。
qcacheLowmemPrunes
由於查詢緩存空間不足而進行LRU內存回收的次數
次數過多,增加query_cache_size。
增量
Qcache_lowmem_prunes
查詢緩存空間不足而進行LRU內存回收的次數。
次數過多,增加query_cache_size。
#innodb相關
#、innodb數據讀寫
innodbDataReadBytesPerSec
平均每秒InnoDB讀取的數據量,單位爲B
Innodb_data_read
自服務器啓動以來讀取的數據量(以字節爲單位)。
innodbDataWrittenBytesPerSec
平均每秒InnoDB寫入的數據量,單位爲B
Innodb_data_written
到目前爲止已寫入的數據量(以字節爲單位)。
innodbDataReadsPerSec
平均每秒InnoDB讀取系統文件的次數
Innodb_data_reads
讀取的數據總次數(讀取OS文件)
innodbDataWritesPerSec
平均每秒InnoDB寫入系統文件的次數
Innodb_data_writes
數據寫入總次數。
innodbDataFsyncsPerSec
平均每秒InnoDB進行fsync操作的次數
Innodb_data_fsyncs
到目前爲止,fsync()操作的數量。 fsync()調用的頻率受innodb_flush_method配置選項的設置影響。
innodbDataPendingReads
InnoDB當前掛起的讀取數
Innodb_data_pending_reads
當前掛起的讀取數。
innodbDataPendingWrites
InnoDB當前掛起的寫入數
Innodb_data_pending_writes
當前掛起的寫入數。
innodbDataPendingFsyncs
InnoDB當前待處理的fsync操作數
Innodb_data_pending_fsyncs
當前待處理的fsync()操作數。 fsync()調用的頻率受innodb_flush_method配置選項的設置影響。
#、innodb行操作統計
innodbRowsInsertedPerSec
平均每秒插入InnoDB表的行數
Innodb_rows_inserted
插入InnoDB表的行數。
innodbRowsDeletedPerSec
平均每秒從InnoDB表刪除的行數
Innodb_rows_deleted
從InnoDB表中刪除的行數。
innodbRowsUpdatedPerSec
平均每秒更新InnoDB表的行數
Innodb_rows_updated
InnoDB表中更新的行數。
innodbRowsReadPerSec
平均每秒從InnoDB表讀取的行數
Innodb_rows_read
從InnoDB表讀取的行數。
innodbRowLockCurrentWaits
InnoDB表上的操作當前正在等待的行鎖數
Innodb_row_lock_current_waits
InnoDB表上的操作當前正在等待的行鎖數。
innodbRowLockwaits
InnoDB表上的操作必須等待行鎖的次數
增量
Innodb_row_lock_waits
InnoDB表上的操作必須等待行鎖定的次數。
innodbRowLockTime
獲取InnoDB表的行鎖所花費的總時間,以毫秒爲單位
增量
Innodb_row_lock_time
獲取InnoDB表的行鎖所花費的總時間(以毫秒爲單位)。
innodbRowLockTimeAvg
獲取InnoDB表的行鎖的平均時間,以毫秒爲單位
innodbRowLockTimeAvg增量 = innodbRowLockTime增量 / innodbRowLockwaits增量
而不是獲取下面這個,下面這個是統計所有的,不能代表最近一段時間的狀態
Innodb_row_lock_time_avg
獲取InnoDB表的行鎖的平均時間,以毫秒爲單位。
#、innodb緩衝池狀態
innodbBufferPoolSize
InnoDB緩存池最大空間大小,以字節爲單位
innodb_buffer_pool_size
mysql配置變量參數。
緩衝池(用於InnoDB緩存表和索引數據的內存區域) 的大小(以字節爲單位) 。
innodbBufferPoolBytesData
InnoDB緩存池可緩存數據的空間大小(包括髒頁和乾淨頁),以字節爲單位
Innodb_buffer_pool_bytes_data
InnoDB緩衝池中包含數據的字節總數。 該數字包括髒頁和乾淨頁。
與Innodb_buffer_pool_pages_data相比,爲了更準確地計算內存使用量,當壓縮表導致緩衝池保存不同大小的頁面時。
innodbBufferPoolBytesDirty
InnoDB緩衝池中的髒頁佔用空間,字節
Innodb_buffer_pool_bytes_dirty
InnoDB緩衝池中的髒頁中保存的當前字節總數。
與Innodb_buffer_pool_pages_dirty相比,爲了更準確地計算內存使用量,當壓縮表導致緩衝池保存不同大小的頁面時。
innodbBufferPoolBytesMisc
InnoDB緩衝池中由於分配給管理開銷(例如行鎖或自適應哈希索引)的空間大小,以字節爲單位
innodbBufferPoolBytesMisc = Innodb_buffer_pool_pages_misc * Innodb_page_size
Innodb_buffer_pool_pages_misc
InnoDB緩衝池中由於分配給管理開銷(例如行鎖或自適應哈希索引)而繁忙的頁面數。
此值也可以計算爲Innodb_buffer_pool_pages_total-Innodb_buffer_pool_pages_free-Innodb_buffer_pool_pages_data。
使用壓縮表時,Innodb_buffer_pool_pages_misc可能會報告超出範圍的值(錯誤#59550)。
Innodb_page_size
InnoDB頁面大小(默認爲16KB)。頁面中包含許多內存頁統計值;頁面大小使它們可以輕鬆轉換爲字節。
innodbBufferPoolDirtyPercent
Innodb緩衝池髒頁空間佔最大空間的比例
innodbBufferPoolDirtyPercent = innodbBufferPoolBytesDirty / innodbBufferPoolSize
innodbBufferPoolUsedPercent
Innodb緩衝池使用率
innodbBufferPoolUsedPercent = 1 - Innodb_buffer_pool_pages_free / Innodb_buffer_pool_pages_total
Innodb_buffer_pool_pages_total = Innodb_buffer_pool_pages_free + Innodb_buffer_pool_pages_data + Innodb_buffer_pool_pages_misc
Innodb_buffer_pool_pages_total
InnoDB緩衝池的總大小(以頁爲單位)。使用壓縮表時,報告的Innodb_buffer_pool_pages_data值可能大於Innodb_buffer_pool_pages_total(錯誤#59550)
Innodb_buffer_pool_pages_free
InnoDB緩衝池中的可用頁數。
Innodb_buffer_pool_pages_data
InnoDB緩衝池中包含數據的頁面數。 該數字包括髒頁和乾淨頁。
使用壓縮表時,報告的Innodb_buffer_pool_pages_data值可能大於Innodb_buffer_pool_pages_total(錯誤#59550)。
Innodb_buffer_pool_pages_misc
InnoDB緩衝池中由於分配給管理開銷(例如行鎖或自適應哈希索引)而繁忙的頁面數。
此值也可以計算爲Innodb_buffer_pool_pages_total-Innodb_buffer_pool_pages_free-Innodb_buffer_pool_pages_data。
使用壓縮表時,Innodb_buffer_pool_pages_misc可能會報告超出範圍的值(錯誤#59550)。
innodbBufferPoolReadsPerSec
平均每秒Innodb從物理磁盤讀取頁的次數(物理讀次數)
Innodb_buffer_pool_reads
InnoDB無法從緩衝池滿足的邏輯讀取數,必須直接從磁盤讀取。
innodbBufferPoolReadRequestsPerSec
平均每秒從Innodb緩衝池的讀次數(邏輯讀請求數)
Innodb_buffer_pool_read_requests
邏輯讀取請求的數量。
innodbBufferPoolReadHitRate
Innodb緩衝池的讀取命中率
計算最近時間段的:
innodb_buffer_read_hit_rate = 1 - innodbBufferPoolReadsPerSec/innodbBufferPoolReadRequestsPerSec
而整體的:
innodb_buffer_read_hit_rate = 1 - Innodb_buffer_pool_reads/Innodb_buffer_pool_read_requests
innodbBufferPoolWriteRequestsPerSec
平均每秒對Innodb緩衝池的寫次數
Innodb_buffer_pool_write_requests
對InnoDB緩衝池的寫入次數。
innodbBufferPoolPagesFlushedPerSec
平均每秒對Innodb緩存池中刷新頁請求數
Innodb_buffer_pool_pages_flushed
從InnoDB緩衝池刷新頁面的請求數。
innodbBufferPoolWaitFree
Innodb等待可用的乾淨頁面的次數
Innodb_buffer_pool_wait_free
通常,對InnoDB緩衝池的寫操作在後臺進行。
當InnoDB需要讀取或創建頁面並且沒有可用的乾淨頁面時,InnoDB首先刷新一些髒頁面並等待該操作完成。
該計數器計算這些等待的次數。如果已經正確設置了innodb_buffer_pool_size,則此值應較小。
#、key buffer/MyISAM索引緩存
keyBufferSize
MyISAM key緩存區空間大小
key_buffer_size
設置變量
MyISAM表的 索引塊被緩衝並由所有線程共享。 key_buffer_size是用於索引塊的緩衝區的大小。密鑰緩衝區也稱爲密鑰緩存。
keyCacheUsedSize
MyISAM key緩存已使用空間大小
keyCacheUsedSize = key_buffer_size - (Key_blocks_unused * key_cache_block_size)
keyCacheUsedPercent
MyISAM key緩存使用率
KeyCacheUsedPercent = 1 - ((Key_blocks_unused * key_cache_block_size) / key_buffer_size)
key_cache_block_size
設置變量
密鑰緩存中塊的大小(以字節爲單位)。默認值爲1024。
Key_blocks_unused
MyISAM密鑰緩存中未使用的塊數。您可以使用此值來確定正在使用的密鑰緩存數量。
keyReadRequestsPerSec
平均每秒MyISAM key緩存讀請求次數
轉化爲增量
Key_read_requests
從MyISAM密鑰高速緩存中讀取密鑰塊的請求數。
keyReadsPerSec
平均每秒從硬盤讀取數據塊到MyISAM key緩存的次數(物理讀)
平均每秒從硬盤讀取數據塊到MyISAM key緩存的物理讀取次數
轉化爲增量
Key_reads
從磁盤到MyISAM密鑰高速緩存中的密鑰塊的物理讀取數。
如果Key_reads很大,則您的key_buffer_size值可能太小。可以將緩存未命中率計算爲Key_reads / Key_read_requests。
keyReadHitRate
MyISAM key緩存讀取命中率
keyReadHitRate = 1 - Key_reads / Key_read_requests
keyWriteRequestPerSec
平均每秒將數據塊寫入到MyISAM key緩存的寫入請求次數
轉化爲增量
Key_write_requests
將密鑰塊寫入MyISAM密鑰高速緩存的請求數。
keyWritesPerSec
平均每秒從MyISAM key緩存寫入到磁盤的寫入次數(物理寫)
平均每秒從MyISAM key緩存寫入到磁盤的物理寫入次數
轉化爲增量
Key_writes
從MyISAM密鑰高速緩存到磁盤的密鑰塊的物理寫入次數。
keyWritesPercent
MyISAM key緩存物理寫佔比
keyWritesPercent = keyWrites / keyWriteRequest
Key_reads/Key_read_requests比率通常應小於0.01。
Key_writes/Key_write_requests如果您主要使用更新和刪除操作,則該比率通常接近1;
但是如果您傾向於同時影響多個行的更新操作或使用DELAY_KEY_WRITEtable選項,則該比率可能會小得多 。
#. 臨時表
createdTmpTables
創建內部臨時表的數量(內存或磁盤中)
在執行語句時創建的內部臨時表的數量(在內存或磁盤中)
增量
createdTmpTablesPerSec
創建內部臨時表的數量(內存或磁盤中)/秒
平均每秒在執行語句時創建的內部臨時表的數量(在內存或磁盤中)
Created_tmp_tables
服務器在執行語句時創建的內部臨時表的數量。(在內存或磁盤中)
您可以通過比較Created_tmp_disk_tables和 Created_tmp_tables 變量的值,將創建的內部磁盤臨時表的數量與創建的內部臨時表的總數進行比較 。
另請參見第8.4.4節“ MySQL中的內部臨時表使用”。
SHOW STATUS語句的 每次調用都使用內部臨時表並增加全局 Created_tmp_tables值。
createdTmpDiskTables
創建磁盤臨時表的數量
在執行語句時創建磁盤臨時表的數量
增量
createdTmpDiskTablesPerSec
創建磁盤臨時表的數量/秒
平均每秒在執行語句時創建磁盤臨時表的數量
Created_tmp_disk_tables
服務器在執行語句時創建的內部磁盤臨時表的數量。
如果內部臨時表最初是作爲內存表創建的,但是變得太大,MySQL會自動將其轉換爲磁盤表。
內存中臨時表的最大大小爲tmp_table_size和 max_heap_table_size值的最小值 。
如果Created_tmp_disk_tables 較大,則可能需要增加 tmp_table_size或 max_heap_table_size值,以減少內存中內部臨時表將轉換爲磁盤表的可能性。
您可以通過比較Created_tmp_disk_tables和 Created_tmp_tables 變量的值,將創建的內部磁盤臨時表的數量與創建的內部臨時表的總數進行比較 。
另請參見第8.4.4節“ MySQL中的內部臨時表使用”。
createdTmpDiskTablesPercent
創建磁盤臨時表的比例
在執行語句時創建到磁盤的磁盤臨時表的比例。
createdTmpDiskTablesPercent = Created_tmp_disk_tables/Created_tmp_tables
比值最好不要超過10%,如果Created_tmp_tables值比較大,可能是排序句子過多或者連接句子不夠優化
#、打開表的緩存
openTables
當前正在打開的表數量
Open_tables
打開的表數。(當前)
openedTables
打開表的次數
轉化爲增量
Opened_tables
已打開的表數。(計數)
如果 Opened_tables太大或迅速增加,您的table_open_cache值可能太小。
#. 其他
openFiles:
打開的文件數量
Open_files
打開的文件數。 此計數包括服務器打開的常規文件。
它不包括其他類型的文件,例如套接字或管道。 此外,該計數不包括存儲引擎使用其自身內部功能打開的文件,而不是要求服務器級別打開的文件。
Slave delay: 備庫延遲
可以在slave節點上執行show slave status\G命令,Seconds_Behind_Master項的值即爲slave當前的延時量,單位秒。
另外可以區分主/從庫角色
2、一目瞭然的MySQL監控的UI界面
3、Python程序獲取MySQL監控狀態
# -*- coding: utf-8 -*-
import logging
import time
from xxx_utils import erlangutils
from .task import Task
from .task_config import TaskConfig
from erlang_utils.monitor_level import Level
from erlang_message.task_message import TaskMessage
import erlang_utils.mysql_template as mysql_template
logger = logging.getLogger("xxx-monitor")
class MysqlMonitorTask(Task):
def __init__(self, globalConfig: dict, instanceConfig: dict):
self.monitorPeriodTimeSec = globalConfig.get('monitorPeriodTimeSec')
self.enable = globalConfig.get(
'monitorEnable') & instanceConfig.get('enable')
self.mysqlId = instanceConfig.get('mysqlid')
self.mysqlHost = instanceConfig.get('host')
self.mysqlPort = instanceConfig.get('port')
self.mysqlUser = instanceConfig.get('user')
self.mysqlPasswd = instanceConfig.get('passwd')
self.lastMonitorTimeSec = None
self.lastMysqlUptime = None
super(MysqlMonitorTask, self).__init__()
def get_mysqlid(self):
return self.mysqlId
def do_create_config(self):
return TaskConfig('mysqlinfo', self.monitorPeriodTimeSec, enable=self.enable, level=Level.INFO, description='mysql monitoring(' + self.mysqlId + ')')
def do_run(self):
logger.debug(self.mysqlId + ' mysql monitoring task running...')
conn = None
cursor = None
try:
conn = mysql_template.get_connect(
self.mysqlHost, self.mysqlPort, self.mysqlUser, self.mysqlPasswd)
cursor = conn.cursor()
currentMonitorTimeSec = int(time.time())
mysqlVariables = mysql_template.get_mysql_variables(cursor)
mysqlStatus = mysql_template.get_mysql_status(cursor)
# print(str(mysql_variables))
# print(str(mysql_status))
# 服務器已啓動的秒數
mysqlUptime = mysql_template.get_item_int(mysqlStatus, 'Uptime')
# 監控程序啓動首次運行,或監控的mysql重啓了
# 需要重新設置上一次狀態
if self.lastMysqlUptime is None or self.lastMysqlUptime > mysqlUptime:
time.sleep(2)
self.lastMonitorTimeSec = currentMonitorTimeSec
self.lastMysqlUptime = mysqlUptime
self.lastMysqlVariables = mysqlVariables
self.lastMysqlStatus = mysqlStatus
currentMonitorTimeSec = int(time.time())
mysqlVariables = mysql_template.get_mysql_variables(cursor)
mysqlStatus = mysql_template.get_mysql_status(cursor)
mysqlUptime = mysql_template.get_item_int(
mysqlStatus, 'Uptime')
self.currentMonitorTimeSec = currentMonitorTimeSec
self.mysqlVariables = mysqlVariables
self.mysqlStatus = mysqlStatus
msg = TaskMessage()
# 系統重要指標
msg['mysqlid'] = self.mysqlId
msg['host'] = self.mysqlHost
msg['port'] = int(self.mysqlPort)
self._get_mysql_item(msg, 'version', mysqlVariables, 'version')
self._get_mysql_item_int(msg, 'runTime', mysqlStatus, 'Uptime')
# 會話連接指標
self._get_mysql_item_int(
msg, 'maxConnections', mysqlVariables, 'max_connections')
self._get_mysql_item_int(
msg, 'threadCacheSize', mysqlVariables, 'thread_cache_size')
self._get_mysql_status_item_increment(
msg, 'connections', 'Connections')
self._get_mysql_item_int(
msg, 'threadsConnected', mysqlStatus, 'Threads_connected')
self._get_mysql_item_int(
msg, 'threadsRunning', mysqlStatus, 'Threads_running')
self._get_mysql_item_int(
msg, 'threadsCached', mysqlStatus, 'Threads_cached')
self._get_mysql_status_item_increment(
msg, 'threadsCreated', 'Threads_created')
connectionsIncrement = self._return_mysql_status_item_increment(
'Connections')
threadsCreatedIncrement = self._return_mysql_status_item_increment(
'Threads_created')
if connectionsIncrement is not None and threadsCreatedIncrement is not None:
if connectionsIncrement > 0 and threadsCreatedIncrement > 0:
msg['threadCacheHitRates'] = erlangutils.math_1MinusDivision(
threadsCreatedIncrement, connectionsIncrement)
else:
msg['threadCacheHitRates'] = 1
self._get_mysql_status_item_increment(
msg, 'abortedClients', 'Aborted_clients')
self._get_mysql_status_item_increment(
msg, 'abortedConnects', 'Aborted_connects')
self._get_mysql_status_item_increment(
msg, 'connectionErrorsInternal', 'Connection_errors_internal')
self._get_mysql_status_item_increment(
msg, 'connectionErrorsMaxConnections', 'Connection_errors_max_connections')
# 會話流量指標
self._get_mysql_status_item_rates(
msg, 'bytesReceivedPerSec', 'Bytes_received')
self._get_mysql_status_item_rates(
msg, 'bytesSentPerSec', 'Bytes_sent')
# 會話操作統計指標
self._get_mysql_status_item_increment(
msg, 'commitCount', 'Com_commit')
self._get_mysql_status_item_increment(
msg, 'rollbackCount', 'Com_rollback')
insertIncrement = self._return_mysql_status_item_increment(
'Com_insert')
insertSelectIncrement = self._return_mysql_status_item_increment(
'Com_insert_select')
msg['insertCount'] = insertIncrement + insertSelectIncrement
updateIncrement = self._return_mysql_status_item_increment(
'Com_update')
updateMultiIncrement = self._return_mysql_status_item_increment(
'Com_update_multi')
msg['updateCount'] = updateIncrement + updateMultiIncrement
deleteIncrement = self._return_mysql_status_item_increment(
'Com_delete')
deleteMultiSelectIncrement = self._return_mysql_status_item_increment(
'Com_delete_multi')
msg['deleteCount'] = deleteIncrement + deleteMultiSelectIncrement
self._get_mysql_status_item_increment(
msg, 'selectCount', 'Com_select')
Qcache_hits = self._return_mysql_status_item_increment(
'Qcache_hits')
if Qcache_hits is not None:
msg['selectTotalCount'] = msg['selectCount'] + Qcache_hits
else:
msg['selectTotalCount'] = msg['selectCount']
msg['tps'] = erlangutils.math_division((msg['commitCount'] + msg['rollbackCount']),
(currentMonitorTimeSec - self.lastMonitorTimeSec))
msg['qps'] = erlangutils.math_division((msg['selectTotalCount'] + msg['insertCount'] + msg['updateCount'] + msg['deleteCount']),
(currentMonitorTimeSec - self.lastMonitorTimeSec))
# 查詢緩存
# 先查詢判斷是否支持查詢緩存,沒有話就沒有這些指標
haveQueryCache = mysql_template.get_item_boolean(
mysqlVariables, 'have_query_cache')
if haveQueryCache is not None and haveQueryCache is True:
self._get_mysql_item_int(
msg, 'queryCacheSize', mysqlVariables, 'query_cache_size')
self._get_mysql_item_int(
msg, 'qcacheFreeMemory', mysqlStatus, 'Qcache_free_memory')
if msg['qcacheFreeMemory'] > 0 and msg['queryCacheSize'] > 0:
msg['qcacheFreePercent'] = erlangutils.math_division(
msg['qcacheFreeMemory'], msg['queryCacheSize'])
else:
msg['qcacheFreePercent'] = 0
Qcache_hits = self._return_mysql_status_item_increment(
'Qcache_hits')
Com_select = self._return_mysql_status_item_increment(
'Com_select')
if Qcache_hits > 0 or Com_select > 0:
msg['qcacheHitRate'] = erlangutils.math_division(
Qcache_hits, (Qcache_hits + Com_select))
else:
msg['qcacheHitRate'] = 1
Qcache_inserts = self._return_mysql_status_item_increment(
'Qcache_inserts')
Qcache_not_cached = self._return_mysql_status_item_increment(
'Qcache_not_cached')
if Qcache_inserts > 0 or Qcache_not_cached > 0:
msg['qcacheInsertsPercent'] = erlangutils.math_division(
Qcache_inserts, (Qcache_inserts + Qcache_not_cached))
else:
msg['qcacheInsertsPercent'] = 1
self._get_mysql_status_item_increment(
msg, 'qcacheLowmemPrunes', 'Qcache_lowmem_prunes')
# SQL性能統計相關
self._get_mysql_status_item_increment(
msg, 'slowQueryCount', 'Slow_queries')
self._get_mysql_status_item_increment(
msg, 'selectScan', 'Select_scan')
self._get_mysql_status_item_increment(
msg, 'selectFullJoin', 'Select_full_join')
self._get_mysql_status_item_rates(
msg, 'handlerReadRndPerSec', 'Handler_read_rnd')
self._get_mysql_status_item_rates(
msg, 'handlerReadRndNextPerSec', 'Handler_read_rnd_next')
self._get_mysql_status_item_increment(
msg, 'sortMergePasses', 'Sort_merge_passes')
self._get_mysql_status_item_rates(
msg, 'sortScanPerSec', 'Sort_scan')
self._get_mysql_status_item_rates(
msg, 'sortRangePerSec', 'Sort_range')
self._get_mysql_status_item_increment(
msg, 'tableLocksWaited', 'Table_locks_waited')
Table_locks_immediate = self._return_mysql_status_item_increment(
'Table_locks_immediate')
if msg['tableLocksWaited'] > 0:
msg['tableLocksWaitedPercent'] = erlangutils.math_division(
msg['tableLocksWaited'], (msg['tableLocksWaited'] + Table_locks_immediate))
else:
msg['tableLocksWaitedPercent'] = 0
# innodb數據讀寫
self._get_mysql_status_item_rates(
msg, 'innodbDataReadBytesPerSec', 'Innodb_data_read')
self._get_mysql_status_item_rates(
msg, 'innodbDataWrittenBytesPerSec', 'Innodb_data_written')
self._get_mysql_status_item_rates(
msg, 'innodbDataReadsPerSec', 'Innodb_data_reads')
self._get_mysql_status_item_rates(
msg, 'innodbDataWritesPerSec', 'Innodb_data_writes')
self._get_mysql_status_item_rates(
msg, 'innodbDataFsyncsPerSec', 'Innodb_data_fsyncs')
self._get_mysql_item_int(
msg, 'innodbDataPendingReads', mysqlStatus, 'Innodb_data_pending_reads')
self._get_mysql_item_int(
msg, 'innodbDataPendingWrites', mysqlStatus, 'Innodb_data_pending_writes')
self._get_mysql_item_int(
msg, 'innodbDataPendingFsyncs', mysqlStatus, 'Innodb_data_pending_fsyncs')
# innodb行操作統計
self._get_mysql_status_item_rates(
msg, 'innodbRowsDeletedPerSec', 'Innodb_rows_deleted')
self._get_mysql_status_item_rates(
msg, 'innodbRowsInsertedPerSec', 'Innodb_rows_inserted')
self._get_mysql_status_item_rates(
msg, 'innodbRowsReadPerSec', 'Innodb_rows_read')
self._get_mysql_status_item_rates(
msg, 'innodbRowsUpdatedPerSec', 'Innodb_rows_updated')
self._get_mysql_status_item_rates(
msg, 'innodbDataFsyncsPerSec', 'Innodb_data_fsyncs')
self._get_mysql_item_int(
msg, 'innodbRowLockCurrentWaits', mysqlStatus, 'Innodb_row_lock_current_waits')
self._get_mysql_status_item_increment(
msg, 'innodbRowLockwaits', 'Innodb_row_lock_waits')
self._get_mysql_status_item_increment(
msg, 'innodbRowLockTime', 'Innodb_row_lock_time')
if msg['innodbRowLockwaits'] > 0 and msg['innodbRowLockTime'] > 0:
msg['innodbRowLockTimeAvg'] = erlangutils.math_division(msg['innodbRowLockTime'],
msg['innodbRowLockwaits'])
else:
msg['innodbRowLockTimeAvg'] = 0
# innodb緩衝池狀態
self._get_mysql_item_int(
msg, 'innodbBufferPoolSize', mysqlVariables, 'innodb_buffer_pool_size')
self._get_mysql_item_int(
msg, 'innodbBufferPoolBytesData', mysqlStatus, 'Innodb_buffer_pool_bytes_data')
self._get_mysql_item_int(
msg, 'innodbBufferPoolBytesDirty', mysqlStatus, 'Innodb_buffer_pool_bytes_dirty')
innodbPageSize = mysql_template.get_item_int(
mysqlStatus, 'Innodb_page_size')
if msg['innodbBufferPoolBytesData'] is None:
Innodb_buffer_pool_pages_data = mysql_template.get_item_int(
mysqlStatus, 'Innodb_buffer_pool_pages_data')
msg['innodbBufferPoolBytesData'] = Innodb_buffer_pool_pages_data * \
innodbPageSize
if msg['innodbBufferPoolBytesDirty'] is None:
Innodb_buffer_pool_pages_dirty = mysql_template.get_item_int(
mysqlStatus, 'Innodb_buffer_pool_pages_dirty')
msg['innodbBufferPoolBytesDirty'] = Innodb_buffer_pool_pages_dirty * innodbPageSize
innodbBufferPoolPagesMisc = mysql_template.get_item_int(
mysqlStatus, 'Innodb_buffer_pool_pages_misc')
msg['innodbBufferPoolBytesMisc'] = innodbBufferPoolPagesMisc * \
innodbPageSize
innodbBufferPoolPagesTotal = mysql_template.get_item_int(
mysqlStatus, 'Innodb_buffer_pool_pages_total')
innodbBufferPoolPagesFree = mysql_template.get_item_int(
mysqlStatus, 'Innodb_buffer_pool_pages_free')
msg['innodbBufferPoolDirtyPercent'] = erlangutils.math_division(msg['innodbBufferPoolBytesDirty'],
msg['innodbBufferPoolSize'])
msg['innodbBufferPoolUsedPercent'] = erlangutils.math_1MinusDivision(
innodbBufferPoolPagesFree, innodbBufferPoolPagesTotal)
self._get_mysql_status_item_rates(
msg, 'innodbBufferPoolReadsPerSec', 'Innodb_buffer_pool_reads')
self._get_mysql_status_item_rates(
msg, 'innodbBufferPoolReadRequestsPerSec', 'Innodb_buffer_pool_read_requests')
if msg['innodbBufferPoolReadRequestsPerSec'] is not None and msg['innodbBufferPoolReadRequestsPerSec'] > 0:
msg['innodbBufferPoolReadHitRate'] = erlangutils.math_1MinusDivision(
msg['innodbBufferPoolReadsPerSec'], msg['innodbBufferPoolReadRequestsPerSec'])
else:
msg['innodbBufferPoolReadHitRate'] = 1
self._get_mysql_status_item_rates(
msg, 'innodbBufferPoolWriteRequestsPerSec', 'Innodb_buffer_pool_write_requests')
self._get_mysql_status_item_rates(
msg, 'innodbBufferPoolPagesFlushedPerSec', 'Innodb_buffer_pool_pages_flushed')
self._get_mysql_status_item_increment(
msg, 'innodbBufferPoolWaitFree', 'Innodb_buffer_pool_wait_free')
# key buffer/MyISAM索引緩存
self._get_mysql_item_int(
msg, 'keyBufferSize', mysqlVariables, 'key_buffer_size')
KeyBlocksUnused = mysql_template.get_item_int(
mysqlStatus, 'Key_blocks_unused')
keyCacheBlockSize = mysql_template.get_item_int(
mysqlVariables, 'key_cache_block_size')
msg['keyCacheUsedSize'] = msg['keyBufferSize'] - \
(KeyBlocksUnused * keyCacheBlockSize)
msg['keyCacheUsedPercent'] = erlangutils.math_1MinusDivision(
(KeyBlocksUnused * keyCacheBlockSize), msg['keyBufferSize'])
self._get_mysql_status_item_rates(
msg, 'keyReadRequestsPerSec', 'Key_read_requests')
self._get_mysql_status_item_rates(
msg, 'keyReadsPerSec', 'Key_reads')
if msg['keyReadsPerSec'] > 0 and msg['keyReadRequestsPerSec'] > 0:
msg['keyReadHitRate'] = erlangutils.math_1MinusDivision(
msg['keyReadsPerSec'], msg['keyReadRequestsPerSec'])
else:
msg['keyReadHitRate'] = 1
self._get_mysql_status_item_rates(
msg, 'keyWriteRequestPerSec', 'Key_write_requests')
self._get_mysql_status_item_rates(
msg, 'keyWritesPerSec', 'Key_writes')
if msg['keyWritesPerSec'] > 0 and msg['keyWriteRequestPerSec'] > 0:
msg['keyWritesPercent'] = erlangutils.math_division(
msg['keyWritesPerSec'], msg['keyWriteRequestPerSec'])
else:
msg['keyWritesPercent'] = 0
# 臨時表
self._get_mysql_status_item_increment(
msg, 'createdTmpTables', 'Created_tmp_tables')
self._get_mysql_status_item_rates(
msg, 'createdTmpTablesPerSec', 'Created_tmp_tables')
self._get_mysql_status_item_increment(
msg, 'createdTmpDiskTables', 'Created_tmp_disk_tables')
self._get_mysql_status_item_rates(
msg, 'createdTmpDiskTablesPerSec', 'Created_tmp_disk_tables')
if msg['createdTmpDiskTables'] > 0 and msg['createdTmpTables'] > 0:
msg['createdTmpDiskTablesPercent'] = erlangutils.math_division(
msg['createdTmpDiskTables'], msg['createdTmpTables'])
else:
msg['createdTmpDiskTablesPercent'] = 0
# 打開表的緩存
self._get_mysql_item_int(
msg, 'openTables', mysqlStatus, 'Open_tables')
self._get_mysql_status_item_increment(
msg, 'openedTables', 'Opened_tables')
# 其他
self._get_mysql_item_int(
msg, 'openFiles', mysqlStatus, 'Open_files')
self.lastMonitorTimeSec = currentMonitorTimeSec
self.lastMysqlUptime = mysqlUptime
self.lastMysqlVariables = mysqlVariables
self.lastMysqlStatus = mysqlStatus
return msg
except Exception:
logger.exception(self.mysqlId + ' mysql monitoring task error!')
finally:
if cursor is not None:
cursor.close()
if conn is not None:
conn.close()
def _get_mysql_item(self, msg, keyName, mysqlInfo, itemName):
value = mysql_template.get_item(mysqlInfo, itemName)
if value is not None:
msg[keyName] = value
def _get_mysql_item_int(self, msg, keyName, mysqlInfo, itemName):
value = mysql_template.get_item_int(mysqlInfo, itemName)
if value is not None:
msg[keyName] = value
def _get_mysql_item_boolean(self, msg, keyName, mysqlInfo, itemName):
value = mysql_template.get_item_boolean(mysqlInfo, itemName)
if value is not None:
msg[keyName] = value
def _return_mysql_status_item_increment(self, itemName):
lastValue = mysql_template.get_item_int(self.lastMysqlStatus, itemName)
value = mysql_template.get_item_int(self.mysqlStatus, itemName)
if lastValue is not None and value is not None:
return value - lastValue
def _get_mysql_status_item_increment(self, msg, keyName, itemName):
lastValue = mysql_template.get_item_int(self.lastMysqlStatus, itemName)
value = mysql_template.get_item_int(self.mysqlStatus, itemName)
if lastValue is not None and value is not None:
msg[keyName] = value - lastValue
def _get_mysql_status_item_rates(self, msg, keyName, itemName):
lastValue = mysql_template.get_item_int(self.lastMysqlStatus, itemName)
value = mysql_template.get_item_int(self.mysqlStatus, itemName)
if lastValue is not None and value is not None:
msg[keyName] = round((value - lastValue) / (
self.currentMonitorTimeSec - self.lastMonitorTimeSec), 2)