MySQL 5.7 SYS SCHEMA

lhrbest發表於2017-08-23
 MySQL 5.7 SYS SCHEMA



官方地址:https://dev.mysql.com/doc/refman/5.7/en/sys-schema.html



1、performance schema:介紹

在MySQL5.7中,performance schema有很大改進,包括引入大量新加入的監控項、降低佔用空間和負載,以及透過新的sys schema機制顯著提升易用性。在監控方面,performance schema有如下功能:

①:後設資料鎖:

對於瞭解會話之間後設資料鎖的依賴關係至關重要。從MySQL5.7.3開始,就可以透過metadata_locks表來了解後設資料鎖的相關資訊;

--哪些會話擁有哪些後設資料鎖

--哪些會話正在等待後設資料鎖

--哪些請求由於死鎖被殺掉,或者鎖等待超時而被放棄

②:進度跟蹤:

跟蹤長時間操作的進度(比如alter table),從MySQL5.7.7開始,performance schema自動提供了語句進度資訊。我們可以透過events_stages_current表來檢視當前事件的進度資訊;

③:事務:

監控服務層和儲存引擎層事務的全部方面。從MySQL5.7.3開始,新增了 events_transactions_current表,可以透過setup_consumers、setup_instruments表開啟事務監控,透過該表查詢到當前事務的狀態。如果線上資料庫遇到undo log大量增長、資料庫效能急劇下降的情況,可以透過該表查詢當前是否存在處於未提交狀態的事務。如果發現的確有大量事務的state處於active,這時可以確定資料庫有大量的事務未提交;

④:記憶體使用:

提供記憶體使用資訊統計,有利於瞭解和調整伺服器的記憶體消耗。從MySQL5.7.2開始,performance schema新增記憶體有關的統計資訊,分別從賬戶、訪問主機、執行緒、使用者及事件的角度統計了記憶體的使用過程;

⑤:儲存程式:

儲存過程、儲存方法、事件排程器和表觸發器的檢測器。在MySQL5.7中的setup_objects表中,新增了event、function、procedure、trigger的檢測器。performance schema用於檢測該表中匹配object_schema和object_name的物件;

2、sys schema介紹:

在MySQL5.7中新增的sys schema。是由一系列物件(檢視、儲存過程、儲存方法、表和觸發器)組成的schema,它本身不採集和儲存什麼資訊,而是將performance_schema 和 information_schema中的資料以更容易理解的方式總結出來歸納為“檢視”。

---sys schema可用於典型的調優和診斷用例,這些物件包括如下三個:

①:將效能模式資料彙總到更容易理解的檢視;

②:諸如效能模式配置和生成診斷報告等操作的儲存過程

③:用於查詢效能模式配置並提供格式化服務的儲存函式

---sys schema在查詢中的功能,可以檢視資料庫服務資源的使用情況?哪些主機對資料庫伺服器的訪問量最大?例項上的記憶體使用情況?

3、sys schema裡面的表的分類:

①:主機相關資訊:

以host_summary開頭的檢視,主要彙總了IO延遲的資訊,從主機、檔案事件型別、語句型別等角度展示檔案IO的資訊;

②:innodb相關資訊:

以innodb開頭的檢視,彙總了innodb buffer page資訊和事務等待innodb鎖資訊;

③:IO使用情況:

以IO開頭的檢視,總結了IO使用者的資訊,包括等待IO的情況、IO使用量情況,從各個角度分組展示;

④:記憶體使用情況:

以memory開頭的檢視,從主機、執行緒、使用者、事件角度展示記憶體使用情況;

⑤:連線與會話資訊:

其中,processlist 和 session相關的檢視,總結了會話相關的資訊;

⑥:表相關資訊:

以schema_table開頭的檢視,從全表掃描、innodb緩衝池等方面展示了表統計資訊;

⑦:索引資訊:

其中包含index的檢視,統計了索引使用的情況,以及重複索引和未使用的索引情況;

⑧:語句相關資訊:

以statement開頭的檢視,統計的規範化後的語句使用情況,包括錯誤數、警告數、執行全表掃描的、使用臨時表、執行排序等資訊;

⑨:使用者相關資訊:

以user開頭的檢視,統計了使用者使用的檔案IO,執行的語句統計資訊等;

⑨:等待事件相關資訊

以wait開頭的檢視,從主機和事件角度展示等待類事件的延遲情況;

4、sys schema使用列子:

名單


在說明系統資料庫之前,先來看下MySQL在資料字典方面的演變歷史:
MySQL4.1 提供了information_schema 資料字典。從此可以很簡單的用SQL語句來檢索需要的系統後設資料了。
MySQL5.5 提供了performance_schema 效能字典。 但是這個字典比較專業,一般人可能也就看看就不了了之了。
MySQL5.7 提供了 sys系統資料庫。 sys資料庫裡面包含了一系列的儲存過程、自定義函式以及檢視來幫助我們快速的瞭解系統的後設資料資訊。


sys系統資料庫結合了information_schema和performance_schema的相關資料,讓我們更加容易的檢索後設資料。 現在呢,我就示範下幾種場景下如何快速的使用。


第一,
比如之前想要知道某個表是否存在與否,可以用以下兩種方法:

A, 悲觀的方法,寫SQL從information_schema中拿資訊:

[sql] view plain copy
  1. mysql> SELECT IF(COUNT(*) = 0,'Not exists!','Exists!'AS 'result' FROM information_schema.tables WHERE table_schema = 'new_feature' AND table_name = 't1';  
  2. +-------------+  
  3. | result      |  
  4. +-------------+  
  5. Not exists! |  
  6. +-------------+  
  7. 1 row in set (0.00 sec)  



B,樂觀的方法,假設表存在,寫一個儲存過程:
[sql] view plain copy
  1. DELIMITER $$  
  2.   
  3.   
  4. USE `new_feature`$$  
  5.   
  6.   
  7. DROP PROCEDURE IF EXISTS `sp_table_exists`$$  
  8.   
  9.   
  10. CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_table_exists`(  
  11.     IN db_name VARCHAR(64),  
  12.     IN tb_name VARCHAR(64),  
  13.     OUT is_exists VARCHAR(60)  
  14.     )  
  15. BEGIN  
  16.       DECLARE no_such_table CONDITION FOR 1146;  
  17.       DECLARE EXIT HANDLER FOR no_such_table  
  18.       BEGIN  
  19.         SET is_exists = 'Not exists!';  
  20.       END;  
  21.         
  22.       SET @stmt = CONCAT('select 1 from ',db_name,'.',tb_name);  
  23.       PREPARE s1 FROM @stmt;  
  24.       EXECUTE s1;  
  25.       DEALLOCATE PREPARE s1;  
  26.       SET is_exists = 'Exists!';  
  27.     END$$  
  28.   
  29.   
  30. DELIMITER ;  




現在來呼叫:
[sql] view plain copy
  1. mysql> call sp_table_exists('new_feature','t1',@result);  
  2. Query OK, 0 rows affected (0.00 sec)  
  3.   
  4.   
  5. mysql> select @result;  
  6. +-------------+  
  7. | @result     |  
  8. +-------------+  
  9. Not exists! |  
  10. +-------------+  
  11. 1 row in set (0.00 sec)  




現在我們直接用sys資料庫裡面現有的儲存過程來進行呼叫,
[sql] view plain copy
  1. mysql> CALL table_exists('new_feature','t1',@v_is_exists);  
  2. Query OK, 0 rows affected (0.00 sec)  
  3.   
  4.   
  5. mysql> SELECT IF(@v_is_exists = '','Not exists!',@v_is_exists) AS 'result';  
  6. +-------------+  
  7. | result      |  
  8. +-------------+  
  9. Not exists! |  
  10. +-------------+  
  11. 1 row in set (0.00 sec)  




第二,獲取沒有使用過的索引。


[sql] view plain copy
  1. mysql> SELECT * FROM schema_unused_indexes;  
  2. +---------------+-------------+--------------+  
  3. | object_schema | object_name | index_name   |  
  4. +---------------+-------------+--------------+  
  5. | new_feature   | t1          | idx_log_time |  
  6. | new_feature   | t1          | idx_rank2    |  
  7. +---------------+-------------+--------------+  
  8. rows in set (0.00 sec)  




第三, 檢索指定資料庫下面的表掃描資訊,過濾出執行次數大於10的查詢,
[sql] view plain copy
  1. mysql> SELECT * FROM statement_analysis WHERE db='new_feature' AND full_scan = '*'  AND exec_count > 10\G  
  2. *************************** 1. row ***************************  
  3.             query: SHOW STATUS   
  4.                db: new_feature  
  5.         full_scan: *  
  6.        exec_count: 26  
  7.         err_count: 0  
  8.        warn_count: 0  
  9.     total_latency: 74.68 ms  
  10.       max_latency: 3.86 ms  
  11.       avg_latency: 2.87 ms  
  12.      lock_latency: 4.50 ms  
  13.         rows_sent: 9594  
  14.     rows_sent_avg: 369  
  15.     rows_examined: 9594  
  16. rows_examined_avg: 369  
  17.     rows_affected: 0  
  18. rows_affected_avg: 0  
  19.        tmp_tables: 0  
  20.   tmp_disk_tables: 0  
  21.       rows_sorted: 0  
  22. sort_merge_passes: 0  
  23.            digest: 475fa3ad9d4a846cfa96441050fc9787  
  24.        first_seen: 2015-11-16 10:51:17  
  25.         last_seen: 2015-11-16 11:28:13  
  26. *************************** 2. row ***************************  
  27.             query: SELECT `state` , `round` ( SUM ... uration (summed) in sec` DESC   
  28.                db: new_feature  
  29.         full_scan: *  
  30.        exec_count: 12  
  31.         err_count: 0  
  32.        warn_count: 12  
  33.     total_latency: 16.43 ms  
  34.       max_latency: 2.39 ms  
  35.       avg_latency: 1.37 ms  
  36.      lock_latency: 3.54 ms  
  37.         rows_sent: 140  
  38.     rows_sent_avg: 12  
  39.     rows_examined: 852  
  40. rows_examined_avg: 71  
  41.     rows_affected: 0  
  42. rows_affected_avg: 0  
  43.        tmp_tables: 24  
  44.   tmp_disk_tables: 0  
  45.       rows_sorted: 140  
  46. sort_merge_passes: 0  
  47.            digest: 538e506ee0075e040b076f810ccb5f5c  
  48.        first_seen: 2015-11-16 10:51:17  
  49.         last_seen: 2015-11-16 11:28:13  
  50. rows in set (0.01 sec)  






第四, 同樣繼續上面的,過濾出有臨時表的查詢,


[sql] view plain copy
  1. mysql> SELECT * FROM statement_analysis WHERE db='new_feature' AND tmp_tables > 0 ORDER BY tmp_tables DESC LIMIT 1\G  
  2. *************************** 1. row ***************************  
  3.             query: SELECT `performance_schema` .  ... name` . `SUM_TIMER_WAIT` DESC   
  4.                db: new_feature  
  5.         full_scan: *  
  6.        exec_count: 2  
  7.         err_count: 0  
  8.        warn_count: 0  
  9.     total_latency: 87.96 ms  
  10.       max_latency: 59.50 ms  
  11.       avg_latency: 43.98 ms  
  12.      lock_latency: 548.00 us  
  13.         rows_sent: 101  
  14.     rows_sent_avg: 51  
  15.     rows_examined: 201  
  16. rows_examined_avg: 101  
  17.     rows_affected: 0  
  18. rows_affected_avg: 0  
  19.        tmp_tables: 332  
  20.   tmp_disk_tables: 15  
  21.       rows_sorted: 0  
  22. sort_merge_passes: 0  
  23.            digest: ff9bdfb7cf3f44b2da4c52dcde7a7352  
  24.        first_seen: 2015-11-16 10:24:42  
  25.         last_seen: 2015-11-16 10:24:42  
  26. 1 row in set (0.01 sec)  




可以看到上面查詢詳細的詳細,再也不用執行show status 手工去過濾了。




第五, 檢索執行次數排名前五的語句,
[sql] view plain copy
  1. mysql> SELECT statement,total FROM user_summary_by_statement_type WHERE `user`='root' ORDER BY total DESC LIMIT 5;  
  2. +-------------------+-------+  
  3. | statement         | total |  
  4. +-------------------+-------+  
  5. | jump_if_not       | 17635 |  
  6. | freturn           |  3120 |  
  7. | show_create_table |   289 |  
  8. | Field List        |   202 |  
  9. | set_option        |   190 |  
  10. +-------------------+-------+  
  11. rows in set (0.01 sec)  






示例我就寫這麼多了,詳細的去看使用手冊並且自己摸索去吧。


mysql5.7增加了sys 系統資料庫,透過這個庫可以快速的瞭解系統的後設資料資訊
這個庫確實可以方便DBA發現資料庫的很多資訊,解決效能瓶頸都提供了巨大幫助
 
這個庫在mysql5.7中是預設存在的,在mysql5.6版本以上可以手動匯入,資料庫包請在github自行查詢
 
這個庫包括了哪些內容?
這個庫是透過檢視的形式把information_schema 和performance_schema結合起來,查詢出更加令人容易理解的資料
儲存過程可以可以執行一些效能方面的配置,也可以得到一些效能診斷報告內容
儲存函式可以查詢一些效能資訊
 
分析每個檢視和表之前先說明一下:關於帶不帶x$,去掉x$同名的檢視他們的資料是相同的,區別在於不帶x$的單位更加符合直接閱讀經過了轉換,而帶x$是為了某些工具存在而使用的原始單位(多數應該是mysql預設的)
 
下面就結合mysql官方手冊來詳細分析sys庫

1.表 
    1.1 sys_config 表
        這是在這個系統庫上存在的唯一一個表了
        先看看錶結構
CREATE TABLE `sys_config` (
  `variable` varchar(128) NOT NULL,
  `value` varchar(128) DEFAULT NULL,
  `set_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `set_by` varchar(128) DEFAULT NULL,
  PRIMARY KEY (`variable`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

        variable 配置選項名稱

        value     配置選項值
        set_time 該行配置修改的時間
        set_by     該行配置資訊修改者,如果從被安裝沒有修改過,那麼這個資料應該為NULL
 
    表中預設資料為
variable    
value    
set_time    
set_by
diagnostics.allow_i_s_tables  
  OFF 
  2015-11-20 16:04:38 
    
diagnostics.include_raw 
   OFF
   2015-11-20 16:04:38 
    
statement_performance_analyzer.limit 
  100
  2015-11-20 16:04:38  
    
statement_performance_analyzer.view 
 
2015-11-20 16:04:38
    
statement_truncate_len  
  64 
   2016-01-22 17:00:16    
    
 
    以上值的會話變數為@sys.+表中variable欄位,譬如:@sys.statement_truncate_len 
可以set @sys.statement_truncate_len = 32 臨時改變值,在會話中會一直使用這個值,如果想要恢復使用表的預設值,只需要將這個會話值設定為null;set @sys.statement_truncate_len = null;
 
diagnostics.allow_i_s_tables  
diagnostics.include_raw 
這兩個值預設為OFF ,前者如果開啟表示允許diagnostics() 儲存過程執行掃描information_schema.tables 表,如果表很多,那麼可能會很耗效能,後者開啟將會從metrics 檢視輸出未加工處理的資料 。diagnostics() 具體內容見下面對diagnostics()的解釋。
 
statement_performance_analyzer.limit 
檢視在沒有加limit限制時,返回的最大行數
statement_performance_analyzer.view 
(略)
以上引數為mysql5.7.9加入
 
statement_truncate_len  
透過format_statement()函式返回值的最大長度
 
這個表非預設選項還有一個@sys.debug引數
可以手動加入
INSERT INTO sys_config (variable, value) VALUES('debug', 'ON');
UPDATE sys_config SET value = 'OFF' WHERE variable = 'debug';
SET @sys.debug = NULL;
具體內容請參考官方文件,此處不做介紹
 
關於這個表有兩個觸發器
1.1.1 sys_config_insert_set_user觸發器
如果加入新行透過insert語句,那麼這個觸發器會把set_by列設定為當前操作者
1.1.2 sys_config_update_set_user觸發器           
 
如果加入新行透過update語句,那麼這個觸發器會把set_by列設定為當前操作者
 
2.檢視
以下部分只介紹不包含x$的檢視內容
 
2.1 host_summary (主機概要)
有如下列:
? host
監聽連線過的主機
? statements
當前主機執行的語句總數
? statement_latency
語句等待時間(延遲時間)
? statement_avg_latency
執行語句平均延遲時間
? table_scans
表掃描次數
? file_ios
io時間總數
? file_io_latency
檔案io延遲
? current_connections
當前連線數
? total_connections
總連結數
? unique_users
該主機的唯一使用者數
? current_memory
當前賬戶分配的記憶體
? total_memory_allocated
該主機分配的記憶體總數
 
2.2  The host_summary_by_file_io_type
?host
主機
?event_name
IO事件名稱
?total
該主機發生的事件
?total_latency
該主機發生IO事件總延遲時間
?max_latency
該主機IO事件中最大的延遲時間
 
2.3 The host_summary_by_file_io
?host
主機
?ios
IO事件總數
?io_latency
IO總的延遲時間
 
2.4 The host_summary_by_stages
? host
主機
? event_name
stage event名稱
? total
stage event發生的總數
? total_latency
stage event總的延遲時間
? avg_latency
stage event平均延遲時間
 
 
2.5 The host_summary_by_statement_latency
? host
主機
? total
這個主機的語句總數
? total_latency
這個主機總的延遲時間
? max_latency
主機最大的延遲時間
? lock_latency
等待鎖的鎖延遲時間
? rows_sent
該主機透過語句返回的總行數
? rows_examined
在儲存引擎上透過語句返回的行數
? rows_affected
該主機透過語句影響的總行數
? full_scans
全表掃描的語句總數
 
 
2.6  The host_summary_by_statement_type
? host
主機
? statement
最後的語句事件名稱
? total
sql語句總數
? total_latency
sql語句總延遲數
? max_latency
最大的sql語句延遲數
? lock_latency
鎖延遲總數
? rows_sent
語句返回的行總數
? rows_examined
透過儲存引擎的sql語句的讀取的總行數
? rows_affected
語句影響的總行數
? full_scans
全表掃描的語句事件總數
 
 
2.7 The innodb_buffer_stats_by_schema  
這個表是透過資料庫統計innodb引擎的innodb快取
? object_schema
資料庫名稱
? allocated
分配給當前資料庫的總的位元組數
? data
分配給當前資料庫的資料位元組數
? pages
分配給當前資料庫的總頁數
? pages_hashed
分配給當前資料庫的hash頁數
? pages_old
 
分配給當前資料庫的舊頁數
? rows_cached
 
當前資料庫快取的行數
 
2.8 The innodb_buffer_stats_by_table
這個表是透過每個表innodb引擎的innodb快取
? object_schema
資料庫名稱
? object_name
表名稱
? allocated
分配給表的總位元組數
? data
分配該表的資料位元組數
? pages
分配給表的頁數
? pages_hashed
分配給表的hash頁數
? pages_old
分配給表的舊頁數
? rows_cached
表的行快取數
 
2.9 The innodb_lock_waits
這個表其實從檢視的語句來看就是information_schema這個資料庫中的innodb_locks、innodb_trx這兩個表的整合,能夠更清晰的顯示當前例項的鎖情況
? wait_started
鎖等待發生的時間
? wait_age
鎖已經等待了多長時間
? wait_age_secs
以秒為單位顯示鎖已經等待的時間(5.7.9中新增此列)
? locked_table
被鎖的表
? locked_index
被鎖住的索引
? locked_type
鎖型別
? waiting_trx_id
正在等待的事務ID
? waiting_trx_started
等待事務開始的時間
? waiting_trx_age
已經等待事務多長時間
? waiting_trx_rows_locked
正在等待的事務被鎖的行數量
? waiting_trx_rows_modified
正在等待行重定義的數量
? waiting_pid
正在等待事務的執行緒id
? waiting_query
正在等待鎖的查詢
? waiting_lock_id
正在等待鎖的ID
? waiting_lock_mode
等待鎖的模式
? blocking_trx_id
阻塞等待鎖的事務id
? blocking_pid
正在鎖的執行緒id
? blocking_query
正在鎖的查詢
?blocking_lock_id
正在阻塞等待鎖的鎖id.
?blocking_lock_mode
阻塞鎖模式
? blocking_trx_started
阻塞事務開始的時間
? blocking_trx_age
阻塞的事務已經執行的時間
? blocking_trx_rows_locked
阻塞事務鎖住的行的數量
? blocking_trx_rows_modified
阻塞事務重定義行的數量
? sql_kill_blocking_query
kill 語句殺死正在執行的阻塞事務
在mysql5.7.9中被加入
? sql_kill_blocking_connection
kill 語句殺死會話中正在執行的阻塞事務
在mysql5.7.9中被加入
 
 
2.10 The io_by_thread_by_latency
這個檢視主要資訊是透過IO的消耗展示IO等待的時間
? user
對於當前執行緒來說,這個值是執行緒被分配的賬戶,對於後臺執行緒來講,就是執行緒的名稱
? total
IO事件的總數
? total_latency
IO事件的總延遲
? min_latency
單個最小的IO事件延遲
? avg_latency
平均IO延遲
? max_latency
最大IO延遲
? thread_id
執行緒ID
? processlist_id
對於當前執行緒就是此時的ID,對於後臺就是null

 








About Me

.............................................................................................................................................

● 本文整理自網路

● 本文在itpub(http://blog.itpub.net/26736162/abstract/1/)、部落格園(http://www.cnblogs.com/lhrbest)和個人微信公眾號(xiaomaimiaolhr)上有同步更新

● 本文itpub地址:http://blog.itpub.net/26736162/abstract/1/

● 本文部落格園地址:http://www.cnblogs.com/lhrbest

● 本文pdf版、個人簡介及小麥苗雲盤地址:http://blog.itpub.net/26736162/viewspace-1624453/

● 資料庫筆試面試題庫及解答:http://blog.itpub.net/26736162/viewspace-2134706/

● DBA寶典今日頭條號地址:

.............................................................................................................................................

● QQ群號:230161599(滿)、618766405

● 微信群:可加我微信,我拉大家進群,非誠勿擾

● 聯絡我請加QQ好友646634621,註明新增緣由

● 於 2017-08-01 09:00 ~ 2017-08-31 22:00 在魔都完成

● 文章內容來源於小麥苗的學習筆記,部分整理自網路,若有侵權或不當之處還請諒解

● 版權所有,歡迎分享本文,轉載請保留出處

.............................................................................................................................................

小麥苗的微店

小麥苗出版的資料庫類叢書http://blog.itpub.net/26736162/viewspace-2142121/

.............................................................................................................................................

使用微信客戶端掃描下面的二維碼來關注小麥苗的微信公眾號(xiaomaimiaolhr)及QQ群(DBA寶典),學習最實用的資料庫技術。

   小麥苗的微信公眾號      小麥苗的DBA寶典QQ群1     小麥苗的DBA寶典QQ群2        小麥苗的微店

.............................................................................................................................................

MySQL 5.7 SYS SCHEMA
DBA筆試面試講解群1
DBA筆試面試講解群2
歡迎與我聯絡



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26736162/viewspace-2143988/,如需轉載,請註明出處,否則將追究法律責任。

相關文章