MySQL 簡介
MySQL 是一個廣泛使用的開源關系型數據庫管理系統(RDBMS),以其高性能、可靠性和易用性而聞名,適用于各種規模的應用,從小型網站到大型企業級系統。
監控 MySQL 指標是維護數據庫健康、優化性能和確保數據安全的基礎,通過監控查詢響應時間和事務處理速度,可以及時發現并解決性能瓶頸。同時,監控 CPU 和內存使用情況有助于合理分配資源,避免過載。在出現故障時,歷史指標數據能夠快速定位和解決問題。此外,分析數據增長趨勢可以幫助提前規劃存儲擴展,防止空間不足。
采集全系統環境下 MySQL 相關指標信息:
- MySQL Global Status 基礎數據采集
- Schema 相關數據
- InnoDB 相關指標
- 支持自定義查詢數據采集
觀測云
觀測云是一款專為 IT 工程師打造的全鏈路可觀測產品,它集成了基礎設施監控、應用程序性能監控和日志管理,為整個技術棧提供實時可觀察性。這款產品能夠幫助工程師全面了解端到端的用戶體驗追蹤,了解應用內函數的每一次調用,以及全面監控云時代的基礎設施。此外,觀測云還具備快速發現系統安全風險的能力,為數字化時代提供安全保障。
部署 DataKit
DataKit 是一個開源的、跨平臺的數據收集和監控工具,由觀測云開發并維護。它旨在幫助用戶收集、處理和分析各種數據源,如日志、指標和事件,以便進行有效的監控和故障排查。DataKit 支持多種數據輸入和輸出格式,可以輕松集成到現有的監控系統中。
登錄觀測云控制臺,在「集成」 - 「DataKit」選擇對應安裝方式,當前采用 Linux 主機部署 DataKit。
MySQL 配置
前置條件
- MySQL 版本 5.7+
創建監控賬號
創建監控賬號(一般情況,需用 MySQL root 賬號登陸才能創建 MySQL 用戶),使用 CREATE USER 語句來創建用戶。以下是一個示例。
注意:
- 創建操作,限定了?
datakit
?這個用戶,只能在 MySQL 主機上(localhost
)訪問 MySQL。 - 如果需要對 MySQL 進行遠程采集,建議將?
localhost
?替換成?%
(表示 DataKit 可以在任意機器上訪問 MySQL),也可用指定的 DataKit 安裝機器地址。
該語句將在MySQL數據庫中創建一個名為'datakit'的用戶,并為該用戶設置密碼為'<UNIQUEPASSWORD>'
CREATE USER 'datakit'@'localhost' IDENTIFIED BY '<UNIQUEPASSWORD>';
-- MySQL 8.0+以上可使用caching_sha2_password 方法創建
CREATE USER 'datakit'@'localhost' IDENTIFIED WITH caching_sha2_password by '<UNIQUEPASSWORD>';
為監控賬號授權
注意:
- 授權操作,限定了?
datakit
?這個用戶,只能在 MySQL 主機上(localhost
)訪問 MySQL。 - 如果需要對 MySQL 進行遠程采集,建議將 localhost 替換成 %(表示 DataKit 可以在任意機器上訪問 MySQL),也可用指定的 DataKit 安裝機器地址。
GRANT PROCESS ON *.* TO 'datakit'@'localhost';
GRANT SELECT ON *.* TO 'datakit'@'localhost';
show databases like 'performance_schema';
GRANT SELECT ON performance_schema.* TO 'datakit'@'localhost';
GRANT SELECT ON mysql.user TO 'datakit'@'localhost';
GRANT replication client on *.* to 'datakit'@'localhost';#性能指標采集需
CREATE SCHEMA IF NOT EXISTS datakit;
GRANT EXECUTE ON datakit.* to datakit@'%';
GRANT CREATE TEMPORARY TABLES ON datakit.* TO datakit@'%';-- MySQL 5.6 & 5.7
GRANT REPLICATION CLIENT ON *.* TO datakit@'%' WITH MAX_USER_CONNECTIONS 5;-- MySQL >= 8.0
ALTER USER datakit@'%' WITH MAX_USER_CONNECTIONS 5;
GRANT REPLICATION CLIENT ON *.* TO datakit@'%';
GRANT PROCESS ON *.* TO datakit@'%';
Tips:
- 如用 localhost 時發現采集器有如下報錯,需要將上述步驟的 localhost 換成 ::1
Error 1045: Access denied for user 'datakit'@'localhost' (using password: YES) - 另外,也需要注意下 MySQL 5.7 和 8.0 版本,授權上有所區別。
DataKit 采集器配置
DataKit 內置了 MySQL 采集器,采集 MySQL 相關數據。
- 進入 datakit 安裝目錄下的?
conf.d/db
?目錄,復制?mysql.conf.sample
?并命名為?mysql.conf
cp mysql.conf.sample mysql.conf
- 調整?
mysql.conf
[[inputs.mysql]]host = "localhost"user = "datakit"pass = "<PASS>"port = 3306[inputs.mysql.log]# files = ["/var/log/mysql/*.log"]## grok pipeline script pathpipeline = "mysql.p"## Config dbm metric [inputs.mysql.dbm_metric]enabled = true## Config dbm sample [inputs.mysql.dbm_sample]enabled = true ## Config dbm activity[inputs.mysql.dbm_activity]enabled = true # 開啟數據庫性能指標采集dbm = true...# 監控指標配置[inputs.mysql.dbm_metric]enabled = true# 監控采樣配置[inputs.mysql.dbm_sample]enabled = true# 等待事件采集[inputs.mysql.dbm_activity]enabled = true ...[inputs.mysql.tags]# some_tag = "some_value"# more_tag = "some_other_value"
- 重啟 DataKit
datakit service -R
高級配置(采集更多性能指標)
Binlog 開啟
統計 Binlog 大小,需要開啟 MySQL 對應 Binlog 功能(默認情況下,MySQL Binlog 默認是不開啟的)。
1、檢查狀態
-- ON: 開啟/OFF: 關閉
SHOW VARIABLES LIKE 'log_bin';
2、開啟 Binlog 的步驟
開啟 MySQL 的 Binlog 功能主要涉及修改 MySQL 的配置文件并重啟服務。
1)編輯 MySQL 配置文件:找到 MySQL 的配置文件?my.cnf
?或?my.ini
,通常位于?/etc/mysql
?目錄下,如果找不到可以通過命令?find / -name "my.cnf"
?進行查找。
2)添加 Binlog 配置:在配置文件的?[mysqld]
?部分添加以下配置:
log_bin=ON
:開啟 Binlog 日志。log_bin_basename=/var/lib/mysql/mysql-bin
:指定 Binlog 日志的基本文件名。log_bin_index=/var/lib/mysql/mysql-bin.index
:指定 Binlog 文件的索引文件。server-id=1
:為 MySQL 服務分配一個唯一的 ID,用于在復制集群中標識服務器 1。
3)簡單配置方式:也可以只添加一行配置?log-bin=/var/lib/mysql/mysql-bin
,MySQL 會自動設置?log_bin
?為 ON 狀態,并自動設置?log_bin_index
?文件。
4)對于 MySQL 5.7 及以上版本:如果使用的是 5.7 及以上版本,在添加上述配置后,還需要重啟 MySQL 服務,否則可能會報錯。
5)重啟 MySQL 服務:配置完成后,需要重啟 MySQL 服務以使配置生效。可以使用命令?service mysqld restart
?進行重啟。
6)驗證 Binlog 是否開啟:通過登錄 MySQL 并執行?SHOW VARIABLES LIKE '%log_bin%';
?來檢查 Binlog 是否已經開啟。
7)查看 Binlog 日志:可以通過?SHOW MASTER LOGS;
?查看所有 Binlog 日志列表,或者使用?mysqlbinlog
?工具查看 Binlog 內容。
3、數據庫性能指標采集
修改配置文件(如 mysql.conf),開啟?MySQL Performance Schema
,并配置相關參數。
[mysqld]
performance_schema = on
max_digest_length = 4096
performance_schema_max_digest_length = 4096
performance_schema_max_sql_text_length = 4096
performance-schema-consumer-events-statements-current = on
performance-schema-consumer-events-waits-current = on
performance-schema-consumer-events-statements-history-long = on
performance-schema-consumer-events-statements-history = on
4、創建存儲過程?explain_statement
,用于獲取 SQL 執行計劃
DELIMITER $$
CREATE PROCEDURE datakit.explain_statement(IN query TEXT)SQL SECURITY DEFINER
BEGINSET @explain := CONCAT('EXPLAIN FORMAT=json ', query);PREPARE stmt FROM @explain;EXECUTE stmt;DEALLOCATE PREPARE stmt;
END $$
DELIMITER ;
5、consumers
?配置
---------------方式1-------------------:DELIMITER $$
CREATE PROCEDURE datakit.enable_events_statements_consumers()SQL SECURITY DEFINER
BEGINUPDATE performance_schema.setup_consumers SET enabled='YES' WHERE name LIKE 'events_statements_%';UPDATE performance_schema.setup_consumers SET enabled='YES' WHERE name = 'events_waits_current';
END $$
DELIMITER ;GRANT EXECUTE ON PROCEDURE datakit.enable_events_statements_consumers TO datakit@'%';---------------方式2-------------------:
UPDATE performance_schema.setup_consumers SET enabled='YES' WHERE name LIKE 'events_statements_%';
UPDATE performance_schema.setup_consumers SET enabled='YES' WHERE name = 'events_waits_current';
主從復制指標采集
1、前提條件
采集主從復制?mysql_replication
?指標的前提是開啟主從復制,mysql_replication
?指標都是由從數據庫采集的。
確認主從復制環境是否正常可以在從數據庫輸入:
SHOW SLAVE STATUS;
Replica_IO_Running、Replica_SQL_Running 的值均為 Yes,說明主從復制環境狀態正常。
2、count_transactions_in_queue
將【組復制插件】添加到服務器在啟動時加載的插件列表(group_replication 從 MySQL 版本 5.7.17 開始支持)。在從數據庫的配置文件?/etc/my.cnf
?中,添加一行。
plugin_load_add ='group_replication.so'
通過?show plugins;
?確認組復制插件已安裝。
show plugins
3、DataKit mysql 采集器配置
新增以下配置內容:
[[inputs.mysql]]## Set replication to true to collect replication metrics
replication = true
## Set group_replication to true to collect group replication metrics
group_replication = true
...
關鍵指標
指標 | 描述 | 類型 | 單位 |
---|---|---|---|
Aborted_clients | 因客戶端未正常關閉連接而導致連接被終止的次數 | int | count |
Aborted_connects | 連接到MySQL服務器失敗的嘗試次數 | int | count |
Binlog_cache_disk_use | 使用臨時二進制日志緩存但超出binlog_cache_size值,并使用臨時文件存儲事務語句的事務數量 | int | B |
Binlog_cache_use | 使用二進制日志緩存的事務數量 | int | B |
Binlog_space_usage_bytes | 總二進制日志文件大小 | int | B |
Bytes_received | 從所有客戶端接收的字節數 | int | B |
Bytes_sent | 向所有客戶端發送的字節數 | int | B |
Com_commit | 執行提交語句的次數 | int | count |
Com_delete | 執行刪除語句的次數 | int | count |
Com_delete_multi | 執行多表刪除語句的次數 | int | count |
Com_insert | 執行插入語句的次數 | int | count |
Com_insert_select | 執行插入選擇語句的次數 | int | count |
Com_load | 執行加載語句的次數 | int | count |
Com_replace | 執行替換語句的次數 | int | count |
Com_replace_select | 執行替換選擇語句的次數 | int | count |
Auto_Position | 如果使用自動定位則為1,否則為0 | bool | count |
Connect_Retry | 連接重試之間的時間間隔(默認為60秒)。可以通過CHANGE MASTER TO語句設置 | int | count |
Exec_Master_Log_Pos | SQL線程已讀取并執行的當前源二進制日志文件中的位置,標志著下一個要處理的事務或事件的開始 | int | count |
Last_Errno | 這些列是Last_SQL_Errno的別名 | int | count |
Last_IO_Errno | 導致I/O線程停止的最近一次錯誤的錯誤編號。錯誤編號為0且消息為空字符串表示“無錯誤” | int | count |
Last_SQL_Errno | 導致SQL線程停止的最近一次錯誤的錯誤編號。錯誤編號為0且消息為空字符串表示“無錯誤” | int | count |
Master_Server_Id | 源的server_id值 | int | count |
Relay_Log_Space | 所有現有中繼日志文件的總大小 | int | count |
Replicas_connected | 連接到復制源的副本數量 | int | count |
SQL_Delay | 副本必須落后于源的秒數 | int | count |
Seconds_Behind_Master | 主服務器和從服務器之間的延遲秒數 | int | count |
更多指標描述,參考觀測云官方文檔。
日志采集
MySQL 運行日志
如需采集 MySQL 的日志,將配置中 log 相關的配置打開,如需要開啟 MySQL 慢查詢日志,需要開啟慢查詢日志,在 MySQL 中執行以下語句:
SET GLOBAL slow_query_log = 'ON';
-- 未使用索引的查詢也認為是一個可能的慢查詢
set global log_queries_not_using_indexes = 'ON';
注意:在使用日志采集時,需要將 DataKit 安裝在 MySQL 服務同一臺主機中,或使用其它方式將日志掛載到 DataKit 所在機器。
MySQL 日志分為普通日志和慢日志兩種。
MySQL 普通日志
日志原文:
2017-12-29T12:33:33.095243Z 2 Query SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE CREATE_OPTIONS LIKE '%partitioned%';
切割后的字段列表如下:
字段名 | 字段值 | 說明 |
---|---|---|
status | Warning | 日志級別 |
msg | System table 'plugin' is expected to be transactional. | 日志內容 |
time | 1514520249954078000 | 納秒時間戳(作為行協議時間) |
MySQL 慢查詢日志
日志原文:
# Time: 2019-11-27T10:43:13.460744Z
# User@Host: root[root] @ localhost [1.2.3.4] Id: 35
# Query_time: 0.214922 Lock_time: 0.000184 Rows_sent: 248832 Rows_examined: 72
# Thread_id: 55 Killed: 0 Errno: 0
# Bytes_sent: 123456 Bytes_received: 0
SET timestamp=1574851393;
SELECT * FROM fruit f1, fruit f2, fruit f3, fruit f4, fruit f5
切割后的字段列表如下:
字段名 | 字段值 | 說明 |
---|---|---|
bytes_sent | 123456 | 發送字節數 |
db_host | localhost | hostname |
db_ip | 1.2.3.4 | IP |
db_slow_statement | SET timestamp=1574851393;\nSELECT * FROM fruit f1, fruit f2, fruit f3, fruit f4, fruit f5 | 慢查詢 SQL |
db_user | root[root] | 用戶 |
lock_time | 0.000184 | 鎖時間 |
query_id | 35 | 查詢 ID |
query_time | 0.2l4922 | SQL 執行所消耗的時間 |
rows_examined | 72 | 為了返回查詢的數據所讀取的行數 |
rows_sent | 248832 | 查詢返回的行數 |
thread_id | 55 | 線程 ID |
time | 1514520249954078000 | 納秒時間戳(作為行協議時間) |
如果值是?OFF
,請參考阿里云相關?文檔?進行開啟。
場景視圖
登錄觀測云控制臺,點擊「場景」 -「新建儀表板」,輸入 “mysql”, 選擇 “mysql 監控視圖”,點擊 “確定” 即可添加視圖。
MySQL 監控視圖
MySQL DBM 監控視圖
MySQL Activity 監控視圖
MySQL Slow Query 監控視圖
監控器(告警)
MySQL 每秒立即獲得鎖的數過高告警
MySQL 每秒獲取鎖數量過高會導致性能瓶頸、死鎖風險、事務延遲及業務中斷,本質是資源爭用,需通過優化事務邏輯、降低鎖粒度、調整隔離級別和分布式架構等手段解決。
MySQL 慢查詢數量過高告警
MySQL 慢查詢數量過高會導致數據庫性能瓶頸、資源耗盡及業務響應延遲,通常由索引缺失或低效查詢引起,需通過優化 SQL 語句、添加索引或調整執行計劃解決。
MySQL 由于客戶端沒有正確關閉連接而中止的連接數過高告警
MySQL 因客戶端未正確關閉連接導致的中止連接數過高告警具有顯著必要性,其直接危害包括:資源耗竭(占用內存、線程及文件描述符)、性能下降(連接握手與回收開銷增大)、穩定性風險(連接泄漏引發服務崩潰)及安全隱患(潛在攻擊者利用殘留連接)。該告警可幫助及時識別代碼缺陷、網絡異常或連接池配置問題,通過優化客戶端連接釋放邏輯、調整 wait_timeout/interactive_timeout 參數、引入連接池管理等方式,避免數據庫因“連接雪崩”陷入不可用狀態,保障服務高可用性與資源高效利用。
總結
MySQL 指標監控對于維護數據庫的健康和性能至關重要。它允許管理員實時跟蹤關鍵性能指標,如查詢響應時間、連接數、緩沖池使用情況和磁盤 I/O 活動。通過這些數據,可以識別和解決性能瓶頸,預測資源需求,優化數據庫配置,以及確保數據的完整性和安全性。此外,監控還可以幫助檢測和防范潛在的攻擊,通過觀測云設置告警閾值快速響應異常活動,減少系統故障時間,從而提高數據庫的可靠性和業務連續性。總之,MySQL 指標監控是數據庫管理的核心部分,對于保障企業數據資產的穩定性和高效性起著至關重要的作用。