MySQL日常監控及sys庫的使用【轉】


一、統計信息(SQL維度)

關於SQL維度的統計信息主要集中在events_statements_summary_by_digest表中,通過將SQL語句抽象出digest,可以統計某類SQL語句在各個維度的統計信息(比如:執行次數,排序次數,使用臨時表等)

1、執行次數最多的SQL

SELECT
DIGEST_TEXT,
COUNT_STAR,
FIRST_SEEN,
LAST_SEEN
FROM
`performance_schema`.events_statements_summary_by_digest
ORDER BY
COUNT_STAR DESC;
mysql DBA日常監控--統計SQL信息+統計對象+統計等待事件

 

可以看到執行次數最多的SQL是INSERT INTO `t_ocs_group_production_temporary` VALUES (...) ,FIRST_SEEN和LAST_SEEN分別顯示了語句第一次執行和最后一次執行的時間點。

2、平均響應時間最多的sql

SELECT
DIGEST_TEXT,
AVG_TIMER_WAIT,
COUNT_STAR,
FIRST_SEEN,
LAST_SEEN
FROM
`performance_schema`.events_statements_summary_by_digest
ORDER BY
AVG_TIMER_WAIT DESC;
mysql DBA日常監控--統計SQL信息+統計對象+統計等待事件

 

可以看到平均響應時間最長的sql是SELECT * FROM `lcp_mq_record` ,這個是一張日志表。

3、排序記錄數最多的sql

SELECT
DIGEST_TEXT,
SUM_SORT_ROWS,
COUNT_STAR,
FIRST_SEEN,
LAST_SEEN
FROM
`performance_schema`.events_statements_summary_by_digest
ORDER BY
SUM_SORT_ROWS DESC;
mysql DBA日常監控--統計SQL信息+統計對象+統計等待事件

 

4、掃描記錄數最多的sql

SELECT
DIGEST_TEXT,
SUM_ROWS_EXAMINED,
COUNT_STAR,
FIRST_SEEN,
LAST_SEEN
FROM
`performance_schema`.events_statements_summary_by_digest
ORDER BY
SUM_ROWS_EXAMINED DESC;
mysql DBA日常監控--統計SQL信息+統計對象+統計等待事件

 

5、使用臨時表最多的sql

SELECT
DIGEST_TEXT,
SUM_CREATED_TMP_TABLES,
SUM_CREATED_TMP_DISK_TABLES,
COUNT_STAR,
FIRST_SEEN,
LAST_SEEN
FROM
`performance_schema`.events_statements_summary_by_digest
ORDER BY
SUM_CREATED_TMP_TABLES desc,SUM_CREATED_TMP_DISK_TABLES desc
mysql DBA日常監控--統計SQL信息+統計對象+統計等待事件

 

6、返回結果集最多的SQL

SELECT
DIGEST_TEXT,
SUM_ROWS_SENT,
COUNT_STAR,
FIRST_SEEN,
LAST_SEEN
FROM
`performance_schema`.events_statements_summary_by_digest
ORDER BY
SUM_ROWS_SENT desc;
mysql DBA日常監控--統計SQL信息+統計對象+統計等待事件

 

通過上述指標我們可以間接獲得某類SQL的邏輯IO(SUM_ROWS_EXAMINED),CPU消耗(SUM_SORT_ROWS),網絡帶寬(SUM_ROWS_SENT)的對比,但還無法得到某類SQL的物理IO消耗,以及某類SQL訪問數據的buffer命中率。


二、統計信息(對象維度)

1、哪個表物理IO最多?

SELECT
file_name,
event_name,
SUM_NUMBER_OF_BYTES_READ,
SUM_NUMBER_OF_BYTES_WRITE
FROM
`performance_schema`.file_summary_by_instance
ORDER BY
SUM_NUMBER_OF_BYTES_READ + SUM_NUMBER_OF_BYTES_WRITE DESC;
mysql DBA日常監控--統計SQL信息+統計對象+統計等待事件

 

通過file_summary_by_instance表,可以獲得系統運行到現在,哪個文件(表)物理IO最多,這可能意味着這個表經常需要訪問磁盤IO,從結果來看perf_stat庫里面的is_global_variables的數據文件訪問最多。

2、哪個表邏輯IO最多?

SELECT
object_schema,
object_name,
COUNT_READ,
COUNT_WRITE,
COUNT_FETCH,
SUM_TIMER_WAIT
FROM
`performance_schema`.table_io_waits_summary_by_table
ORDER BY
sum_timer_wait DESC;
mysql DBA日常監控--統計SQL信息+統計對象+統計等待事件

 

通過table_io_waits_summary_by_table表,可以獲得系統運行到現在,哪個表邏輯IO最多,亦即最“熱”的表,從結果來看fsl_prod庫里面的t_ocs_employee_attendace表訪問次數最多。

3、哪個索引訪問最多?

SELECT
OBJECT_SCHEMA,
OBJECT_NAME,
INDEX_NAME,
COUNT_FETCH,
COUNT_INSERT,
COUNT_UPDATE,
COUNT_DELETE
FROM
`performance_schema`.table_io_waits_summary_by_index_usage
ORDER BY
SUM_TIMER_WAIT DESC;
mysql DBA日常監控--統計SQL信息+統計對象+統計等待事件

 

通過table_io_waits_summary_by_index_usage表,可以獲得系統運行到現在,哪個表的具體哪個索引(包括主鍵索引,二級索引)使用最多,從結果來看,我們知道t_ocs_employee_attendace表訪問最多,並且都是通過t_ocs_production_lines_n1索引訪問。

4、哪個索引從來沒有使用過?

SELECT
OBJECT_SCHEMA,
OBJECT_NAME,
INDEX_NAME
FROM
`performance_schema`.table_io_waits_summary_by_index_usage
WHERE
INDEX_NAME IS NOT NULL
AND COUNT_STAR = 0
AND OBJECT_SCHEMA <> 'mysql'
ORDER BY
OBJECT_SCHEMA,
OBJECT_NAME;
mysql DBA日常監控--統計SQL信息+統計對象+統計等待事件

 

通過table_io_waits_summary_by_index_usage表,我們還可以獲得系統運行到現在,哪些索引從來沒有被用過。由於索引也會占用大量的空間,我們可以利用這個統計信息,結合一定的時間策略將無用的索引刪除。上面的結果顯示,fsl_prod庫act_hi_actinst表的ACT_IDX_HI_ACT_INST_END索引從來沒有被使用過。


三、統計信息(等待事件維度)

1、哪個等待事件消耗的時間最多?

SELECT
EVENT_NAME,
COUNT_STAR,
SUM_TIMER_WAIT,
AVG_TIMER_WAIT
FROM
`performance_schema`.events_waits_summary_global_by_event_name
WHERE
event_name != 'idle'
ORDER BY
SUM_TIMER_WAIT DESC;
mysql DBA日常監控--統計SQL信息+統計對象+統計等待事件

 

通過events_waits_summary_global_by_event_name表,可以獲取到系統運行到現在,消耗時間最多的事件,當然還可以根據其它維度排序,比如平均等待時間,從結果來看wait/io/table/sql/handler這個事件消耗的累計時間最長。

概述

MySQL5.7的新特性中,非常突出的特性之一就是sys庫,不僅可以通過sys庫完成MySQL信息的收集,還可以用來監控和排查問題。下面介紹一些常用的用法。


一、用戶、連接類

1、查看每個客戶端IP過來的連接消耗資源情況。

select * from sys.host_summary;
一文看懂mysql sys庫常見用法--實現數據庫信息的收集及監控

 

2、查看每個用戶消耗資源情況

select * from sys.user_summary;
一文看懂mysql sys庫常見用法--實現數據庫信息的收集及監控

 

3、查看當前連接情況(有多少連接就應該有多少行)

select host,current_connections,statements from sys.host_summary;
一文看懂mysql sys庫常見用法--實現數據庫信息的收集及監控

 

4、查看當前正在執行的SQL

和執行show full processlist的結果差不多

select conn_id,pid,user,db,command,current_statement,last_statement,time,lock_latency from sys.session
一文看懂mysql sys庫常見用法--實現數據庫信息的收集及監控

 


二、SQL 和io類

1、查看發生IO請求前5名的文件。

select * from sys.io_global_by_file_by_bytes order by total limit 5;
一文看懂mysql sys庫常見用法--實現數據庫信息的收集及監控

 


三、buffer pool 、內存

1、查看總共分配了多少內存

select * from sys.memory_global_total;
select * from sys.memory_global_by_current_bytes;
一文看懂mysql sys庫常見用法--實現數據庫信息的收集及監控

 

2、每個庫(database)占用多少buffer pool

select * from sys.innodb_buffer_stats_by_schema order by allocated desc;
一文看懂mysql sys庫常見用法--實現數據庫信息的收集及監控

 

pages是指在buffer pool中的page數量;pages_old指在LUR 列表中處於后37%位置的page。

當出現buffer page不夠用時,就會征用這些page所占的空間。37%是默認位置,具體可以自定義。

3、統計每張表具體在InnoDB中具體的情況,比如占多少頁?

注意和前面的pages的總數都是相等的,也可以借用sum(pages)運算驗證一下。

select * from sys.innodb_buffer_stats_by_table;
一文看懂mysql sys庫常見用法--實現數據庫信息的收集及監控

 

4、查詢每個連接分配了多少內存

利用session表和memory_by_thread_by_current_bytes分配表進行關聯查詢。

SELECT
b.USER,
current_count_used,
current_allocated,
current_avg_alloc,
current_max_alloc,
total_allocated,
current_statement
FROM
sys.memory_by_thread_by_current_bytes a,
sys.SESSION b
WHERE
a.thread_id = b.thd_id;
一文看懂mysql sys庫常見用法--實現數據庫信息的收集及監控

 


四、字段、索引、鎖

1、查看表自增字段最大值和當前值,有時候做數據增長的監控,可以作為參考。

select * from sys.schema_auto_increment_columns;
一文看懂mysql sys庫常見用法--實現數據庫信息的收集及監控

 

2、MySQL索引使用情況統計

select * from sys.schema_index_statistics order by rows_selected desc;
一文看懂mysql sys庫常見用法--實現數據庫信息的收集及監控

 

3、MySQL中有哪些冗余索引和無用索引

若庫中展示沒有冗余索引,則沒有數據;當有聯合索引idx_abc(a,b,c)和idx_a(a),那么idx_a就算冗余索引了。

select * from sys.schema_redundant_indexes;
一文看懂mysql sys庫常見用法--實現數據庫信息的收集及監控

 

4、查看INNODB 鎖信息

在未來的版本將被移除,可以采用其他方式

select * from sys.innodb_lock_waits
一文看懂mysql sys庫常見用法--實現數據庫信息的收集及監控

 

5、查看庫級別的鎖信息,這個需要先打開MDL鎖的監控:

--打開MDL鎖監控
update performance_schema.setup_instruments set enabled='YES',TIMED='YES' where name='wait/lock/metadata/sql/mdl';
select * from sys.schema_table_lock_waits;
一文看懂mysql sys庫常見用法--實現數據庫信息的收集及監控

 


五、線程類

1、MySQL內部有多個線程在運行,線程類型及數量

select user,count(*) from sys.`processlist` group by user;
一文看懂mysql sys庫常見用法--實現數據庫信息的收集及監控

 


六、主鍵自增

查看MySQL自增id的使用情況

SELECT
table_schema,
table_name,
ENGINE,
Auto_increment
FROM
information_schema.TABLES
WHERE
TABLE_SCHEMA NOT IN ( "INFORMATION_SCHEMA", "PERFORMANCE_SCHEMA", "MYSQL", "SYS" )
一文看懂mysql sys庫常見用法--實現數據庫信息的收集及監控

 

mysql DBA日常監控--統計SQL信息+統計對象+統計等待事件
https://www.toutiao.com/i6733922916485825035/

一文看懂mysql sys庫常見用法--實現數據庫信息的收集及監控
https://www.toutiao.com/i6733911133750559245/


免責聲明!

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



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