一 。mysql性能指標php
mysql服務器 內置的狀態信息 能夠獲取mysql性能 html
查看當前登陸後的session相關的狀態信息
node
[root@node1 ~]# mysql -uroot -proot -e "show status"查看全局的狀態信息
mysqladmin -h192.168.58.147 -P3306 -uroot -proot extended-status查看簡易全局狀態信息
[root@node1 ~]# mysqladmin -h192.168.58.147 -P3306 -uroot -proot status Uptime: 196844 Threads: 13 Questions: 24377 Slow queries: 0 Opens: 248 Flush tables: 2 Open tables: 4 Queries per second avg: 0.123Uptime表示mysql運行的時間
mysqladmin -h192.168.58.147 -P3306 -uroot -proot extended-status | grep Uptime查詢總查詢次數(查詢Com_select 修改 Com_update 插入 Com_insert 刪除 Com_delete)
[root@node1 ~]# mysqladmin -h192.168.58.147 -P3306 -uroot -proot extended-status | grep Com_select | Com_select | 14710zabbix模板中有個模板 Template DB MySQL
點擊進入發現裏面定義的全部監控項所有都是上面的一些參數
mysql
咱們須要找一個獲取mysql版本和是否存活的命令 用於檢測 存活輸出 1 非返回0web
mysqladmin -h192.168.58.147 -P3306 -uroot -proot ping | grep -c alive查看mysql的版本
[root@node1 ~]# mysqladmin -h192.168.58.147 -P3306 -uroot -proot version mysqladmin Ver 9.0 Distrib 5.5.56-MariaDB, for Linux on x86_64 Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others. Server version 5.5.56-MariaDB Protocol version 10 Connection 192.168.58.147 via TCP/IP TCP port 3306 Uptime: 18 sec Threads: 2 Questions: 3 Slow queries: 0 Opens: 0 Flush tables: 2 Open tables: 4 Queries per second avg: 0.166
總結其餘status的參數值(轉從 http://www.sandzhang.com/blog/2010/04/07/mysql-show-status-explained-detail/)算法
狀態名sql |
做用域數據庫 |
詳細解釋緩存 |
Aborted_clients安全 |
Global |
因爲客戶端沒有正確關閉鏈接致使客戶端終止而中斷的鏈接數 |
Aborted_connects |
Global |
試圖鏈接到MySQL服務器而失敗的鏈接數 |
Binlog_cache_disk_use |
Global |
使用臨時二進制日誌緩存但超過binlog_cache_size值並使用臨時文件來保存事務中的語句的事務數量 |
Binlog_cache_use |
Global |
使用臨時二進制日誌緩存的事務數量 |
Bytes_received |
Both |
從全部客戶端接收到的字節數。 |
Bytes_sent |
Both |
發送給全部客戶端的字節數。 |
com* |
|
各類數據庫操做的數量 |
Compression |
Session |
客戶端與服務器之間只否啓用壓縮協議 |
Connections |
Global |
試圖鏈接到(不論是否成功)MySQL服務器的鏈接數 |
Created_tmp_disk_tables |
Both |
服務器執行語句時在硬盤上自動建立的臨時表的數量 |
Created_tmp_files |
Global |
mysqld已經建立的臨時文件的數量 |
Created_tmp_tables |
Both |
服務器執行語句時自動建立的內存中的臨時表的數量。若是Created_tmp_disk_tables較大,你可能要增長tmp_table_size值使臨時 表基於內存而不基於硬盤 |
Delayed_errors |
Global |
用INSERT DELAYED寫的出現錯誤的行數(可能爲duplicate key)。 |
Delayed_insert_threads |
Global |
使用的INSERT DELAYED處理器線程數。 |
Delayed_writes |
Global |
寫入的INSERT DELAYED行數 |
Flush_commands |
Global |
執行的FLUSH語句數。 |
Handler_commit |
Both |
內部提交語句數 |
Handler_delete |
Both |
行從表中刪除的次數。 |
Handler_discover |
Both |
MySQL服務器能夠問NDB CLUSTER存儲引擎是否知道某一名字的表。這被稱做發現。Handler_discover說明經過該方法發現的次數。 |
Handler_prepare |
Both |
A counter for the prepare phase of two-phase commit operations. |
Handler_read_first |
Both |
索引中第一條被讀的次數。若是較高,它建議服務器正執行大量全索引掃描;例如,SELECT col1 FROM foo,假定col1有索引。 |
Handler_read_key |
Both |
根據鍵讀一行的請求數。若是較高,說明查詢和表的索引正確。 |
Handler_read_next |
Both |
按照鍵順序讀下一行的請求數。若是你用範圍約束或若是執行索引掃描來查詢索引列,該值增長。 |
Handler_read_prev |
Both |
按照鍵順序讀前一行的請求數。該讀方法主要用於優化ORDER BY ... DESC。 |
Handler_read_rnd |
Both |
根據固定位置讀一行的請求數。若是你正執行大量查詢並須要對結果進行排序該值較高。你可能使用了大量須要MySQL掃描整個表的查詢或你的鏈接沒有正確使用鍵。 |
Handler_read_rnd_next |
Both |
在數據文件中讀下一行的請求數。若是你正進行大量的表掃描,該值較高。一般說明你的表索引不正確或寫入的查詢沒有利用索引。 |
Handler_rollback |
Both |
內部ROLLBACK語句的數量。 |
Handler_savepoint |
Both |
在一個存儲引擎放置一個保存點的請求數量。 |
Handler_savepoint_rollback |
Both |
在一個存儲引擎的要求回滾到一個保存點數目。 |
Handler_update |
Both |
在表內更新一行的請求數。 |
Handler_write |
Both |
在表內插入一行的請求數。 |
Innodb_buffer_pool_pages_data |
Global |
包含數據的頁數(髒或乾淨)。 |
Innodb_buffer_pool_pages_dirty |
Global |
當前的髒頁數。 |
Innodb_buffer_pool_pages_flushed |
Global |
要求清空的緩衝池頁數 |
Innodb_buffer_pool_pages_free |
Global |
空頁數。 |
Innodb_buffer_pool_pages_latched |
Global |
在InnoDB緩衝池中鎖定的頁數。這是當前正讀或寫或因爲其它緣由不能清空或刪除的頁數。 |
Innodb_buffer_pool_pages_misc |
Global |
忙的頁數,由於它們已經被分配優先用做管理,例如行鎖定或適用的哈希索引。該值還能夠計算爲Innodb_buffer_pool_pages_total - Innodb_buffer_pool_pages_free - Innodb_buffer_pool_pages_data。 |
Innodb_buffer_pool_pages_total |
Global |
緩衝池總大小(頁數)。 |
Innodb_buffer_pool_read_ahead_rnd |
Global |
InnoDB初始化的「隨機」read-aheads數。當查詢以隨機順序掃描表的一大部分時發生。 |
Innodb_buffer_pool_read_ahead_seq |
Global |
InnoDB初始化的順序read-aheads數。當InnoDB執行順序全表掃描時發生。 |
Innodb_buffer_pool_read_requests |
Global |
InnoDB已經完成的邏輯讀請求數。 |
Innodb_buffer_pool_reads |
Global |
不能知足InnoDB必須單頁讀取的緩衝池中的邏輯讀數量。 |
Innodb_buffer_pool_wait_free |
Global |
通常狀況,經過後臺向InnoDB緩衝池寫。可是,若是須要讀或建立頁,而且沒有乾淨的頁可用,則它還須要先等待頁面清空。該計數器對等待實例進行記數。若是已經適當設置緩衝池大小,該值應小。 |
Innodb_buffer_pool_write_requests |
Global |
向InnoDB緩衝池的寫數量。 |
Innodb_data_fsyncs |
Global |
fsync()操做數。 |
Innodb_data_pending_fsyncs |
Global |
當前掛起的fsync()操做數。 |
Innodb_data_pending_reads |
Global |
當前掛起的讀數。 |
Innodb_data_pending_writes |
Global |
當前掛起的寫數。 |
Innodb_data_read |
Global |
至此已經讀取的數據數量(字節)。 |
Innodb_data_reads |
Global |
數據讀總數量。 |
Innodb_data_writes |
Global |
數據寫總數量。 |
Innodb_data_written |
Global |
至此已經寫入的數據量(字節)。 |
Innodb_dblwr_pages_written |
Global |
已經執行的雙寫操做數量 |
Innodb_dblwr_writes |
Global |
雙寫操做已經寫好的頁數 |
Innodb_log_waits |
Global |
咱們必須等待的時間,由於日誌緩衝區過小,咱們在繼續前必須先等待對它清空 |
Innodb_log_write_requests |
Global |
日誌寫請求數。 |
Innodb_log_writes |
Global |
向日志文件的物理寫數量。 |
Innodb_os_log_fsyncs |
Global |
向日志文件完成的fsync()寫數量。 |
Innodb_os_log_pending_fsyncs |
Global |
掛起的日誌文件fsync()操做數量。 |
Innodb_os_log_pending_writes |
Global |
掛起的日誌文件寫操做 |
Innodb_os_log_written |
Global |
寫入日誌文件的字節數。 |
Innodb_page_size |
Global |
編譯的InnoDB頁大小(默認16KB)。許多值用頁來記數;頁的大小很容易轉換爲字節。 |
Innodb_pages_created |
Global |
建立的頁數。 |
Innodb_pages_read |
Global |
讀取的頁數。 |
Innodb_pages_written |
Global |
寫入的頁數。 |
Innodb_row_lock_current_waits |
Global |
當前等待的待鎖定的行數。 |
Innodb_row_lock_time |
Global |
行鎖定花費的總時間,單位毫秒。 |
Innodb_row_lock_time_avg |
Global |
行鎖定的平均時間,單位毫秒。 |
Innodb_row_lock_time_max |
Global |
行鎖定的最長時間,單位毫秒。 |
Innodb_row_lock_waits |
Global |
一行鎖定必須等待的時間數。 |
Innodb_rows_deleted |
Global |
從InnoDB表刪除的行數。 |
Innodb_rows_inserted |
Global |
插入到InnoDB表的行數。 |
Innodb_rows_read |
Global |
從InnoDB表讀取的行數。 |
Innodb_rows_updated |
Global |
InnoDB表內更新的行數。 |
Key_blocks_not_flushed |
Global |
鍵緩存內已經更改但尚未清空到硬盤上的鍵的數據塊數量。 |
Key_blocks_unused |
Global |
鍵緩存內未使用的塊數量。你可使用該值來肯定使用了多少鍵緩存 |
Key_blocks_used |
Global |
鍵緩存內使用的塊數量。該值爲高水平線標記,說明已經同時最多使用了多少塊。 |
Key_read_requests |
Global |
從緩存讀鍵的數據塊的請求數。 |
Key_reads |
Global |
從硬盤讀取鍵的數據塊的次數。若是Key_reads較大,則Key_buffer_size值可能過小。能夠用Key_reads/Key_read_requests計算緩存損失率。 |
Key_write_requests |
Global |
將鍵的數據塊寫入緩存的請求數。 |
Key_writes |
Global |
向硬盤寫入將鍵的數據塊的物理寫操做的次數。 |
Last_query_cost |
Session |
用查詢優化器計算的最後編譯的查詢的總成本。用於對比同一查詢的不一樣查詢方案的成本。默認值0表示尚未編譯查詢。 默認值是0。Last_query_cost具備會話範圍。 |
Max_used_connections |
Global |
服務器啓動後已經同時使用的鏈接的最大數量。 |
ndb* |
|
ndb集羣相關 |
Not_flushed_delayed_rows |
Global |
等待寫入INSERT DELAY隊列的行數。
|
Open_files |
Global |
打開的文件的數目。 |
Open_streams |
Global |
打開的流的數量(主要用於記錄)。 |
Open_table_definitions |
Global |
緩存的.frm文件數量 |
Open_tables |
Both |
當前打開的表的數量。 |
原文地址:http://www.sandzhang.com/blog/2010/04/07/mysql-show-status-explained-detail/ |
||
Opened_files |
Global |
文件打開的數量。不包括諸如套接字或管道其餘類型的文件。 也不包括存儲引擎用來作本身的內部功能的文件。 |
Opened_table_definitions |
Both |
已經緩存的.frm文件數量 |
Opened_tables |
Both |
已經打開的表的數量。若是Opened_tables較大,table_cache 值可能過小。 |
Prepared_stmt_count |
Global |
當前的預處理語句的數量。 (最大數爲系統變量: max_prepared_stmt_count) |
Qcache_free_blocks |
Global |
查詢緩存內自由內存塊的數量。 |
Qcache_free_memory |
Global |
用於查詢緩存的自由內存的數量。 |
Qcache_hits |
Global |
查詢緩存被訪問的次數。 |
Qcache_inserts |
Global |
加入到緩存的查詢數量。 |
Qcache_lowmem_prunes |
Global |
因爲內存較少從緩存刪除的查詢數量。 |
Qcache_not_cached |
Global |
非緩存查詢數(不可緩存,或因爲query_cache_type設定值未緩存)。 |
Qcache_queries_in_cache |
Global |
登記到緩存內的查詢的數量。 |
Qcache_total_blocks |
Global |
查詢緩存內的總塊數。 |
Queries |
Both |
服務器執行的請求個數,包含存儲過程當中的請求。 |
Questions |
Both |
已經發送給服務器的查詢的個數。 |
Rpl_status |
Global |
失敗安全複製狀態(還未使用)。 |
Select_full_join |
Both |
沒有使用索引的聯接的數量。若是該值不爲0,你應仔細檢查表的索引 |
Select_full_range_join |
Both |
在引用的表中使用範圍搜索的聯接的數量。 |
Select_range |
Both |
在第一個表中使用範圍的聯接的數量。通常狀況不是關鍵問題,即便該值至關大。 |
Select_range_check |
Both |
在每一行數據後對鍵值進行檢查的不帶鍵值的聯接的數量。若是不爲0,你應仔細檢查表的索引。 |
Select_scan |
Both |
對第一個表進行徹底掃描的聯接的數量。 |
Slave_heartbeat_period |
Global |
複製的心跳間隔 |
Slave_open_temp_tables |
Global |
從服務器打開的臨時表數量 |
Slave_received_heartbeats |
Global |
從服務器心跳數 |
Slave_retried_transactions |
Global |
本次啓動以來從服務器複製線程重試次數 |
Slave_running |
Global |
若是該服務器是鏈接到主服務器的從服務器,則該值爲ON。 |
Slow_launch_threads |
Both |
建立時間超過slow_launch_time秒的線程數。 |
Slow_queries |
Both |
查詢時間超過long_query_time秒的查詢的個數。 |
Sort_merge_passes |
Both |
排序算法已經執行的合併的數量。若是這個變量值較大,應考慮增長sort_buffer_size系統變量的值。 |
Sort_range |
Both |
在範圍內執行的排序的數量。 |
Sort_rows |
Both |
已經排序的行數。 |
Sort_scan |
Both |
經過掃描表完成的排序的數量。 |
ssl* |
|
ssl鏈接相關 |
Table_locks_immediate |
Global |
當即得到的表的鎖的次數。 |
Table_locks_waited |
Global |
不能當即得到的表的鎖的次數。若是該值較高,而且有性能問題,你應首先優化查詢,而後拆分表或使用複製。 |
Threads_cached |
Global |
線程緩存內的線程的數量。 |
Threads_connected |
Global |
當前打開的鏈接的數量。 |
Threads_created |
Global |
建立用來處理鏈接的線程數。若是Threads_created較大,你可能要增長thread_cache_size值。緩存訪問率的計算方法Threads_created/Connections。 |
Threads_running |
Global |
激活的(非睡眠狀態)線程數。 |
Uptime |
Global |
服務器已經運行的時間(以秒爲單位)。 |
Uptime_since_flush_status |
Global |
最近一次使用FLUSH STATUS 的時間(以秒爲單位)。 |
#!/bin/sh MYSQL_HOST=192.168.58.147 MYSQL_PORT=3306 MYSQL_UID=root MYSQL_PWD=root MY_COMMAD="mysqladmin -h${MYSQL_HOST} -P${MYSQL_PORT} -u${MYSQL_UID} -p${MYSQL_PWD} " #支持 ping version qps 以及其餘狀態值 if [ ${1} = "ping" ] then MYSQL_C="${1}" MYSQL_STATUS=`${MY_COMMAD} ping | grep -c alive` echo "${MYSQL_STATUS}" elif [ ${1} = "version" ] then echo $(${MY_COMMAD} version) elif [ ${1} = "qps" ] then #QPS=查詢的總次數/上線運行的總時間 能夠經過 mysqladmin -uroot -proot status 截取最後一段 我這裏本身計算 複習下awk QueryCount=$(mysqladmin -uroot -proot extended-status | grep Queries | cut -f3 -d'|'); Uptime=$(mysqladmin -uroot -proot extended-status | grep Uptime | awk -F '|' '{if(NR==1)print $3}') #echo `expr ${QueryCount} / ${Uptime}` 不支持浮點數 echo -e ${QueryCount} \\t ${Uptime} | awk '{printf("%.3f",$1/$2)}' else echo `${MY_COMMAD} extended-status | grep ${1} | awk -F '|' '{if(NR==1)print $3}'` fi
[root@node1 ~]# ./mysql.sh Com_select 194 [root@node1 ~]# ./mysql.sh Com_update 0 [root@node1 ~]# ./mysql.sh Com_delete 0 [root@node1 ~]# ./mysql.sh Com_insert 80 [root@node1 ~]# ./mysql.sh ping 1 [root@node1 ~]# ./mysql.sh version mysqladmin Ver 9.0 Distrib 5.5.56-MariaDB, for Linux on x86_64 Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others. Server version 5.5.56-MariaDB Protocol version 10 Connection 192.168.58.147 via TCP/IP TCP port 3306 Uptime: 29 min 38 sec Threads: 12 Questions: 454 Slow queries: 0 Opens: 1 Flush tables: 2 Open tables: 4 Queries per second avg: 0.255
二。 zabbix配置mysql監控
這裏爲了研究zabbix定義模板 監控項 觸發器等常見配置 因此我從頭開始創建一個模板 首先了解下自定義採集的過程
》》 用戶自定義採集的腳本 腳本傳入一些特定的參數 來決定獲取哪些結果 結果輸出一些數字或者轉改信息用於統計
》》 被監控的機器 須要安裝zabbix-agent 同時配置調用自定義腳本已經傳入的參數信息
》》在zabbit-server端嘗試使用zabbit-get測試agent定義的參數是否能正常獲取數據
》》 在web界面添加主機 對應的監控項以及圖表 觸發器等
演示環境
192.168.58.152 zabbix-server和zabbix-web 192.168.58.147 zabbix-agent 被監控的mysql主機1》自定義監控腳本
配置zabbix-agent調用自定義腳本
zabbix使用 UserParamerter指定 定義監控項和腳本間的調用關係 好比
UserParameter=web監控項名稱(在web上定義key名稱), 調用的命令
修改配置文件 (/etc/zabbix/zabbix_agentd.conf) 【注意key名稱 我使用mysql.沒法啓動不知爲什麼】
Server=192.168.58.152 ServerActive=192.168.58.152 Hostname=MysqlMonitor UserParameter=mysqlm.ping, /root/mysql.sh ping UserParameter=mysqlm.version, /root/mysql.sh version UserParameter=mysqlm.qps, /root/mysql.sh qps UserParameter=mysqlm.status[*], /root/mysql.sh $1 AllowRoot=1 #不設置 默認的帳號zabbix無權限執行3》使用zabbix-get測試
[root@bogon ~]# yum -y install zabbix-get測試
[root@bogon ~]# zabbix_get -s 192.168.58.147 -k mysqlm.ping sh: /root/mysql.sh: Permission denied發現已經調用 說沒有權限執行mysql.sh 後面到147上發現zabbix-agent是以zabbix帳號運行的將腳本的全部者 賦給zabbix 將AllowRoot=1設置
[root@bogon ~]# zabbix_get -s 192.168.58.147 -k mysqlm.ping 1 [root@bogon ~]# zabbix_get -s 192.168.58.147 -k mysqlm.version mysqladmin Ver 9.0 Distrib 5.5.56-MariaDB, for Linux on x86_64 Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others. Server version 5.5.56-MariaDB Protocol version 10 Connection 192.168.58.147 via TCP/IP TCP port 3306 Uptime: 1 hour 25 min 18 sec Threads: 12 Questions: 1650 Slow queries: 0 Opens: 1 Flush tables: 2 Open tables: 4 Queries per second avg: 0.322 [root@bogon ~]# zabbix_get -s 192.168.58.147 -k mysqlm.status[Com_select] 5714》zabbix-web添加主機和監控項
》》添加監控項
再次進入全部模板列表點擊列表中的監控項 進入
進入監控項列表 右上角 添加 彈出窗口
這裏 我就監控 四個數據 版本號(verson) 是否存活(ping) 每秒查詢次數(Queries/Uptime) 鏈接線程數(Threads_connected)
版本號監控項以下
是否存活 監控項
Qps監控項:
鏈接線程數(key是 mysqlm.status["Threads_connected"])圖片上填錯
mysql服務時間(key是 mysqlm.status["Uptime"])圖片上填錯
》》添加主機
點擊 配置 -主機 -右上角添加主機
模板頁簽上選擇咱們自定義的模板 注意點擊下面的超連接添加
最後點擊主機界面下角的添加 列表中出現mysql監控的主機 點擊圖形
好比添加一個qps的圖形
圖形類別中 若是須要用其餘圖形能夠選擇圖形類別
預覽一下 看效果
也能夠點擊 檢測中 - 圖形 進入查看對應 主機的圖形 其餘幾個線程數 本身添加便可
mysql.ping主要用於判斷mysql是否掛掉 須要配置觸發器 當mysql.ping=0時 發郵件通知管理員
5》發送郵件預警
藉助mailx來配置第三方郵件發送郵件
安裝 mailx
yum -y install mailx查看mailx全部文件
[root@node1 ~]# rpm -ql mailx-12.5-16.el7.x86_64 /bin/mail /bin/mailx /etc/mail.rc /usr/bin/Mail /usr/bin/nail /usr/share/doc/mailx-12.5 /usr/share/doc/mailx-12.5/AUTHORS /usr/share/doc/mailx-12.5/COPYING /usr/share/doc/mailx-12.5/README /usr/share/man/man1/Mail.1.gz /usr/share/man/man1/mail.1.gz /usr/share/man/man1/mailx.1.gz /usr/share/man/man1/nail.1.gz修改/etc/mail.rc添加發送帳號的郵箱地址 smtp服務器 以及用戶名和密碼(我這裏使用了126 由於126默認開啓了smtp qq必須二次密保才能開 麻煩)
set from=lixin1112003@126.com set smtp=smtp.126.com set smtp-auth-user=lixin1112003 set smtp-auth-password=你的郵箱密碼 set smtp-auth=login嘗試 發送郵件
echo "郵件內容" |mail -s "郵件標題" 接受郵箱地址好比個人測試
echo "zabbix郵箱測試" |mail -s "測試郵箱是否正常發送" 973465719@qq.com登陸qq郵箱 發現該郵件被自動丟進了垃圾箱
AlertScriptsPath=/usr/lib/zabbix/alertscripts建立一個sm.sh內容*
echo "$3" |mail -s "$2" $1添加權限測試
cd /usr/lib/zabbix/alertscripts chmod +x ./sm.sh ./sm.sh lixin1112003@126.com hello jiaoziweb界面添加報警媒介類型 點擊 管理-報警媒介類型 修改email
用戶 添加報警媒介 點擊管理-用戶-點擊|Admin進入-點擊報警媒介 輸入須要接受報警郵件的郵箱地址
主機添加觸發器 點擊配置 主機 點擊mysql監控列表中的 觸發器
新建一個mysql觸發器(什麼條件知足就觸發 mysql的ping爲0表示mysql掛了 須要觸發)
配置動做 觸發器觸發後須要做出一些動做 好比通知哪些用戶 點擊配置-動做 -右上角新建觸發器
動做頁籤 用於輸入 知足什麼觸發器條件
操做 頁籤表示出現異常後的 發送消息的格式 以及通知的用戶(用戶配置了報警媒介 )
恢復操做 同操做
測試關閉 147的數據庫
service mariadb stop點擊web界面的log進入首頁
肯定出現狀態 也經過fox接受到了郵件
最後查看儀表盤 發現動做狀態由啓用中 - 完成 也能夠試着重啓一下 mariadb 看是否也有郵件提醒