MySQL巡檢
系統基本信息
機型號
IP
CPU
內存
磁盤
(業務)系統信息
操作系統
主機名
操作系統巡檢
檢查內容 說明 檢查方法 結果(異常需詳細說明) 正常輸出結果
系統配置檢查 操作系
統版本 #uname –a □正常 □異常 顯示系統版本和核心補丁信息
系統I/O檢查 檢查系統I/O負載情況 #iostat、top □正常 □異常 Top中CPUS中的%wa與iostat中的%iowait不應同時有值
系統CPU檢查 檢查系統CPU負載情況 #top、
Cat/proc/cpuinfo □正常 □異常 %wa(等待)的時間無或者較小
系統內存檢查 檢查系統內存負載情況 #vmstat、free □正常 □異常 Swap中的so有值證明內存不足
系統網絡檢查 檢查系統網絡連通性 #ping、telnet □正常 □異常 網絡可連通
MySQL監控類巡檢
1、TPS/QPS
1.1、TPS
tps: Transactions Per Second,每秒事務數;
TPS = Com_commit/s + Com_rollback/s
Com_commit /s= mysqladmin extended-status --relative --sleep=1|grep -w Com_commit
Com_rollback/s = mysqladmin extended-status --relative --sleep=1|grep -w Com_rollback
理想狀態:
參照日常數,當出現峰值時告警
1.2、QPS
qps: Queries Per Second每秒查詢數;
QPS = mysqladmin extended-status --relative --sleep=1|grep -w Questions
理想狀態:
參照日常數,當出現峰值時告警
2、innodb_buffer_pool_status
innodb_buffer_pool_reads: 平均每秒從物理磁盤讀取頁的次數?
innodb_buffer_pool_read_requests: 平均每秒從innodb緩沖池的讀次數(邏輯讀請求數)
innodb_buffer_pool_write_requests: 平均每秒向innodb緩沖池的寫次數
innodb_buffer_pool_pages_dirty: 平均每秒innodb緩存池中臟頁的數目
innodb_buffer_pool_pages_flushed: 平均每秒innodb緩存池中刷新頁請求的數目
innodb緩沖池的讀命中率
innodb_buffer_read_hit_ratio =?( 1 - Innodb_buffer_pool_reads/Innodb_buffer_pool_read_requests) * 100
Innodb緩沖池的利用率
Innodb_buffer_usage =? ( 1 - Innodb_buffer_pool_pages_free / Innodb_buffer_pool_pages_total) * 100
理想狀態:
參照日常數,當出現峰值時告警;
當緩沖池的讀命中率較低時可以適當的增大innodb_buffer_pool或檢查SQL語句
3、slow_queries status
執行時間超過long_query_time秒的查詢的個數
理想狀態:
查詢值波動不大,若出現大量慢查詢,需檢查近期上線的SQL語句
4、Sort status
mysql> show global status like ‘%sort%’ ;
Sort_merge_passes
Sort_range
Sort_rows
Sort_scan
理想狀態:
Sort_merge_passes表示當需要排序時,在排序緩沖中無法將結果完全存放,則將會基于磁盤創建臨時文件進行排序。如果該值較高,則應提高sort_buffer_size大小。最好的辦法是找到是由哪些排序SQL造成的。
5、select status
5.1、select_scan
對表進行完全掃描的聯接的數量
mysql> show global status like ‘select_scan’ ;
理想狀態:
恒定的值,不會隨時間增長而有明顯的增長。
5.2、select_full_join
沒有主鍵(key)聯合(Join)的執行。該值可能是零。這是捕獲開發錯誤的好方法,因為一些這樣的查詢可能降低系統的性能。
mysql> show global status like ’ select_full_join ’ ;
理想狀態:
出現full join的次數,如果該值不為0,需要檢查表上是否有合適的索引
6、Lock status
mysql> show global status like ’ table_locks%’ ;
table_locks_immediate表示立即釋放表鎖數;
table_locks_waited表示需要等待的表鎖數;
理想狀態:
table_locks_waited如果該值很大,而且性能很慢,建議針對業務拆分主表
7、Thread status
mysql> show global status like ‘thread%‘;
Threads_cached
Threads_connected
Threads_created
Threads_running
理想狀態:
threads_created表示創建過的線程數,如果發現threads_created值過大的話,表明mysql服務器一直在創建線程,這也是比較耗資源,可以適當增加配置文件中thread_cache_size值,
MySQL參數類巡檢
1、Connections settings
1.1、max_connections
查詢服務器最大連接數
mysql> show variables like ‘max_connections‘;
查詢服務器響應的最大連接數
mysql> show global status like ‘max_used_connections’;
理想狀態:
?max_used_connections / max_connections * 100% ≈ 85%;
error_log中未出現MySQL: ERROR 1040: Too many connections該類錯誤。
1.2、Aborted_connects
查詢服務器嘗試已經失敗的MySQL服務器的連接的次數;
mysql> show global status like ‘Aborted_connects’;
理想狀態:
固定值,不隨時間增長而增長(或增長幅度較小),若該數出現持續增長,需檢查
連接狀況或錯誤日志,定位異常連接主機(一般為應用賬號密碼問題)。
1.3、Aborted_clients
查詢服務器異常客戶端數(由于客戶沒有正確關閉連接已經死掉,已經放棄的連接數量);
mysql> show global status like ‘Aborted_clients’;
理想狀態:
固定值,不隨時間增長而增長(或增長幅度較小),若該數出現持續增長,需檢查
連接狀況或錯誤日志,定位異常連接主機(一般為程序邏輯開啟連接后未正常關閉)。
2、innodb settings
2.1、innodb_buffer_pool_size
查詢innodb存儲引擎數據緩存大小
mysql> show variables like ‘innodb_buffer_pool_size ‘;
理想狀態:
建議設置為物理內存的60%~80%,或根據業務決定
2.2、innodb_io_capacity
配置刷新I/O操作性能,此參數可以限制I/O操作
mysql> show variables like ‘innodb_io_capacity ‘;
理想狀態:
根據實際磁盤情況設置
innodb_io_capacity 磁盤配置
200 單盤SAS/SATA
2000 SAS*12 RAID 10
5000 SSD
20000 FUSION-IO
2.3、innodb_flush_neighbors
刷新相同extent臟塊
mysql> show variables like ‘innodb_flush_neighbors ‘;
理想狀態:
默認為1,建議開啟,在SSD環境建議配置為0
2.4、innodb_print_all_deadlocks
記錄死鎖記錄
mysql> show variables like ‘innodb_print_all_deadlocks ‘;
理想狀態:
默認關閉,建議開啟
2.5、innodb_lock_wait_timeout
InnoDB行鎖等待時間
mysql> show variables like ‘innodb_lock_wait_timeout ‘;
理想狀態:
默認為50秒,建議配置為5秒
2.6、innodb_flush_method
配置刷新方法
mysql> show variables like ‘innodb_flush_method ‘;
理想狀態:
Linux系統MySQL建議配置為:O_DIRECT
3、Log Settings
3.1、binlog settings
3.1.1、binlog_format
binlog日志格式
mysql> show variables like ‘binlog_format ‘;
理想狀態:
建議配置為row格式,特殊業務情況另考慮
3.1.2、binlog_rows_query_log_events
寫log 事件(例如 行操作日志時間)到binglog
mysql> show variables like ‘binlog_rows_query_log_events ‘;
理想狀態:
默認為:0,建議配置為:1
注:此參數需要在binlog格式為ROW下配置
3.1.3、sync_binlog
控制binlog 同步磁盤方式
當sync_binlog=1時,所有的事務都在提交前寫入binlog。因此即使binlog事件遇到意外重啟,一些在prepared狀態的binlog會丟失。這導致服務器在恢復數據時自動回滾這些事務。這確保了從binlog不丟失事務,因此是最安全的選項。事實上,這增加了同步到磁盤的總次數。但是從MySQL5.6開始,已經支持組提交和合并同步了,這使得出現性能問題的可能性最小化了。
當sync_binlog=0時,mysql-server并不把binlog同步到磁盤,而是依賴操作系統把binlog的內容同步到磁盤。因此,當出現掉電或操作系統崩潰時,很可能出現已經提交的事務沒有被同步到磁盤的情況。因此mysql在自動恢復時無法恢復這些事務,他們從binlog中丟失了。
所以說,新的默認設置sync_binlog=1更安全。
mysql> show variables like ‘binlog_rows_query_log_events ‘;
理想狀態:
設置sync_binlog=1更安全。
3.1.4、expire_logs_days
自動清理二進制日志的天數
mysql> show variables like ‘expire_logs_days ‘;
理想狀態:
根據備份策略與業務要求設置(如備份保留的天數是一周,則expire_logs_days可設置為>7,如:8,業務要求隨時能提取1年內的數據,則設置>365)。
3.1.5、master_info_repository
slave 記錄 master 狀態和連接信息是否放在文件(master.info)或者是寫表(mysql.slave_master_info)
mysql> show variables like ‘master_info_repository ‘;
理想狀態:
默認為:file,建議配置為:table
3.1.6、relay_log_info_repository
slave 上的relay log的位置信息寫在文件(relay-log.info)或者是寫表(mysql.slave_relay_log_info)
mysql> show variables like ‘relay_log_info_repository ‘;
理想狀態:
默認為:file,建議配置為:table
3.1.7、slave_parallel_type& slave_parallel_workers
并行復制方法(庫級別,表級別)
mysql> show variables like ‘slave_parallel_type ‘;
并行復制線程數
mysql> show variables like ‘slave_parallel_workers ‘;
理想狀態:
slave_parallel_type
默認為:DATABASE,配置為:LOGICALC_CLOCK
Slave_parallel_workers
默認為:0,配置為:16
3.1.8、relay_log_recovery
在服務啟動時自動執行relay log 恢復操作
mysql> show variables like ‘relay_log_recovery ‘;
理想狀態:
默認關閉,建議開啟
3.2、slowlog settings
4.2.1、slow_query_log
是否開啟慢查詢日志
mysql> show variables like ‘slow_query_log ‘;
理想狀態:
默認為關閉慢查詢日志,建議開啟
3.2.2、Others
slow_query_log_file
慢查詢日志記錄文件
long_query_time
設置慢查詢日志的時間閥值(單位:秒)
min_examined_row_limit
設置檢查行數小于多少行數的查詢不記錄到慢查詢日志
log_queries_not_using_indexes
開啟后記錄沒有使用索引查找說有行的查詢;也會記錄使用索引查詢了所有行的查詢
理想狀態:
根據業務需求設置
3.3、generallog settings
記錄所有SQL語句,包含查詢甚至語法錯誤的語句都會被記錄
mysql> show variables like ‘generallog settings ‘;
理想狀態:
不建議開啟。在做測試的時候想知道MySQL都執行了什么命令的時候可以開啟。
4、mysqld settings
以下參數建議在配置文件中體現:
參數項 參考值 參數解釋
socket /tmp/mysql.sock 在unix環境下,指定用于本地連接的套接字文件
pid_file /opt/mysql/mysql.pid MySQL的進程文件路徑名稱
port 3306 MySQL的監聽端口
log_bin /opt/mysql/data/bin.log 開啟數據庫二進制
log_bin_index /opt/mysql/data/bin.index 二進制日志文件名的索引文件
server-id 2 服務器ID,在復制環境中主從服務器的唯一標識
datadir /opt/mysql/data MySQL數據目錄路徑
user mysql MySQL服務的運行用戶
interactive_timeout 300 關閉一個交互式連接等待的時間
wait_timeout 300 關閉一個非交付時連接等待的時間
read_buffer_size 16777216 MyISAM表順序掃描時分配的讀入緩沖區大小
read_rnd_buffer_size 33554432 MyISAM表隨機掃描時分配的讀入緩沖區大小
sort_buffer_size 33554432 每個回話進行排序的緩存大小
lower_case_table_names 1 表名大小寫敏感設置
character_set_server utf8mb4 MySQL服務器的默認字符集
skip_name_resolve 1 客服端連接數據庫時,不進行主機名解析
max_connections 2000 MySQL服務器允許的客服端最大連接數
transaction_isolation READ-COMMITTED MySQL服務器的默認事務隔離級別
join_buffer_size 134217728 不使用索引的連接、普通索引、范圍索引掃描的緩沖區最小值
tmp_table_size 67108864 內存臨時表的最大大小
tmpdir /tmp MySQL 臨時文件和臨時表存放目錄
max_allowed_packet 16777216 設置在網絡傳輸中一次消息傳輸量的最大值
Replication巡檢
查看master狀態
(master操作)
mysql> show master status\G
查看slave狀態
(slave操作)
mysql> show slave status\G
理想狀態:
1、線程正常:Slave_IO_Running、Slave_SQL_Running(狀態YES);
2、未出現延遲狀態:Seconds_Behind_Master 為0或較小、Master_Log_File與Relay_Master_Log_File相同;
3、?Last_Error無值,若報錯的話根據報錯信息與對應數據字典查看報錯信息。
查看slave_hosts狀態
(master操作)
mysql> show slave hosts\G
備份巡檢
1、不管庫數據量的大小,都應該有備份策略,并按時執行;
2、規范化備份路徑與文件名;
3、定期進行備份有效性檢測;
4、定期對備份保存數量檢查;
5、定期執行災難演練;
權限巡檢
1、收集現有系統所有用戶權限;
2、確定應用側業務需求與權限是否匹配;
3、回收額外權限;
4、維護權限文檔。
其他巡檢
1、高可用架構巡檢
2、數據庫中間件巡檢
其他規范
1、統一使用二進制包安裝(形成軟件庫)
2、統一軟件目錄
3、統一數據文件目錄
4、統一日志文件目錄
5、統一其他文件位置(sock,pid)
6、統一server_id命名方式