用Oracle的眼光來學習MySQL 5.7的sys(上)(r11筆記第24天)
sys的初衷
MySQL 5.7的sys自從推出以來,整體的反響似乎沒有預期的那麼高,而我看到這個sys庫的時候,第一感覺是越發和Oracle像了,不是裡面的內容像,而是很多設計的方式越來相似。所以按照這種方式,我感覺離AWR這樣的工具推出也不遠了。
對於實時全面的抓取效能資訊,MySQL依舊還在不斷進步的路上。因為開源,所以有很多非常不錯的工具,產品推出。myawr算是其中的一個,現在看來當初的設計方式和現在sys庫很有相似之處,感興趣的可以自行搜尋檢視。
所以對於sys庫的學習,我是用Oracle的眼光來學習的,準備好了嗎,老司機開車了。
我的總結是基於5.7.13-6這個版本,首先sys是對於information_schema,performance_schema的一個補充,在sys裡面是做了整合,把一些資訊透過檢視的方式彙總起來,讓很多資訊的展現更合理一些。
化繁為簡,sys下的物件分佈情況
sys下的物件分佈其實資訊量很大,除了我們關心關心的檢視和表意外,還有函式,儲存過程和觸發器。這些資訊可以透過sys下的檢視schema_object_overview來檢視。
> select * from schema_object_overview where db='sys';
+-----+---------------+-------+
| db | object_type | count |
+-----+---------------+-------+
| sys | VIEW | 100 |
| sys | BASE TABLE | 1 |
| sys | INDEX (BTREE) | 1 |
| sys | TRIGGER | 2 |
| sys | FUNCTION | 21 |
| sys | PROCEDURE | 26 |
+-----+---------------+-------+
6 rows in set (0.10 sec)
sys下唯一的表
如果你觀察仔細其實會發現裡面的table只有一個,那就是sys_config,使用命令show tables顯示出來的除了這個表都是檢視。
這個檢視有什麼特別之處呢。
> select * from sys_config;
+--------------------------------------+-------+---------------------+--------+
| variable | value | set_time | set_by |
+--------------------------------------+-------+---------------------+--------+
| diagnostics.allow_i_s_tables | OFF | 2016-11-09 11:21:12 | NULL |
| diagnostics.include_raw | OFF | 2016-11-09 11:21:12 | NULL |
| ps_thread_trx_info.max_length | 65535 | 2016-11-09 11:21:12 | NULL |
| statement_performance_analyzer.limit | 100 | 2016-11-09 11:21:12 | NULL |
| statement_performance_analyzer.view | NULL | 2016-11-09 11:21:12 | NULL |
| statement_truncate_len | 64 | 2016-11-09 11:21:12 | NULL |
+--------------------------------------+-------+---------------------+--------+
6 rows in set (0.00 sec)
可以看到裡面是一個基礎引數的設定,比如一些範圍,基數的設定。而且值得一提的是這個表裡設定了幾個觸發器,對這個表的DML操作都會觸發裡面的資料級聯變化。
Oracle中類似的實現
這個和awr裡面的設定非常相似,Oracle中是使用dba_hist_wr_control來得到。
select *from dba_hist_wr_control DBID SNAP_INTERVAL RETENTION TOPNSQL
---------- -------------------- -------------------- ----------
3645037571 +00000 01:00:00.0 +00008 00:00:00.0 DEFAULT
然後我們繼續檢視,還是使用show tables來看,會看到整個sys下的表/檢視有101個,其中x$開頭的物件有48個,所以簡單換算一下,裡面的表/檢視有53個。
x$檢視
x$的檢視是什麼意思,這個透過Oracle的角度來看,就很容易理解,不知道這樣類比對不對,在Oracle中,資料字典分為兩種型別,一類是資料字典表,像dba_tables這樣的,基表都是tab$這種的表,資料是存放在sys下的,這些資訊在MySQL中就有些類似information_schema下的資料字典,而另外一類資料字典是動態效能檢視,Oracle是以v$開頭的,比如v$session,它的基表是x$開頭的“記憶體表”,在MySQL sys中也是類似的意思,只是這些資訊MySQL都毫無保留的開放出來了。按照官方的說法,是x$的資訊是沒有經過格式化的,比如下面的兩個檢視對比。
# mysql -e "use sys; desc waits_global_by_latency\g"
Logging to file '/home/mysql/query.log'
+---------------+---------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------------+---------------------+------+-----+---------+-------+
| events | varchar(128) | NO | | NULL | |
| total | bigint(20) unsigned | NO | | NULL | |
| total_latency | text | YES | | NULL | |
| avg_latency | text | YES | | NULL | |
| max_latency | text | YES | | NULL | |
+---------------+---------------------+------+-----+---------+-------+
x$的檢視的定義如下:
# mysql -e "use sys; desc x\$waits_global_by_latency\g"
Logging to file '/home/mysql/query.log'
+---------------+---------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------------+---------------------+------+-----+---------+-------+
| events | varchar(128) | NO | | NULL | |
| total | bigint(20) unsigned | NO | | NULL | |
| total_latency | bigint(20) unsigned | NO | | NULL | |
| avg_latency | bigint(20) unsigned | NO | | NULL | |
| max_latency | bigint(20) unsigned | NO | | NULL | |
+---------------+---------------------+------+-----+---------+-------+
可以看到資料型別也有一些差別。如果是時間欄位,在x$檢視中可能精度是picosecond(皮秒,萬億分之一秒),而在普通檢視中,就會顯示為秒。
sys下的session檢視
我們抽取一個檢視來看,就session吧,使用show create view session可以看到引用的基表為`sys`.`processlist`,我們繼續檢視sys.processlist,可以發現它的基表是performance_schema下的`events_waits_current`,`events_stages_current`,`events_statements_current`,`events_transactions_current`,`session_connect_attrs`和sys下的基表`x$memory_by_thread_by_current_bytes` ,透過引用的這些檢視其實可以看到也分了很多的層面。
sys下的檢視分類
sys下的檢視分了哪些層面呢。我簡單來總結一下,大體分為一下幾個層面
host_summary,這個是伺服器層面的,比如裡面的檢視host_summary_by_file_io
user_summary,這個是使用者層級的,比如裡面的檢視user_summary_by_file_io
innodb,這個是innodb層面的,比如innodb_buffer_stats_by_schema
io,這個是I/O層的統計,比如檢視 io_global_by_file_by_bytes
memory,關於記憶體的使用情況,比如檢視memory_by_host_by_current_bytes
schema,關於schema級別的統計資訊,比如schema_table_lock_waits
session,關於會話級別的,這個檢視少一些,就兩個,session和session_ssl_status
statement,關於語句級別的,比如statements_with_errors_or_warnings
wait,關於等待的,這個還是處於起步階段,等待模型有待完善,目前只有基於io/file, lock/table, io/table這三個方面,提升空間還很大。
> select *from wait_classes_global_by_avg_latency\g
+-----------------+--------------+---------------+-------------+-------------+-------------+
| event_class | total | total_latency | min_latency | avg_latency | max_latency |
+-----------------+--------------+---------------+-------------+-------------+-------------+
| wait/io/file | 12228640 | 25.66 m | 0 ps | 125.88 us | 5.96 s |
| wait/lock/table | 1320560 | 2.64 s | 125.25 ns | 2.00 us | 228.54 us |
| wait/io/table | 144689737016 | 22.78 h | 114.23 ns | 566.77 ns | 3.92 s |
+-----------------+--------------+---------------+-------------+-------------+-------------+
這個sys的使用其實還是比較靈活的,在5.6及以上版本都可以,是完全獨立的。和Oracle裡面的statspack,awr非常相似。
sys的備份和重建
如果檢視sys的版本,可以使用檢視version來得到。可見是把它當做一個獨立的元件一樣來維護的。
[sys]> select *from version;
+-------------+---------------+
| sys_version | mysql_version |
+-------------+---------------+
| 1.5.0 | 5.7.13-6-log |
+-------------+---------------+
如果要匯出,可以使用 mysqlpump sys > sys_dump.sql 或者mysqldump --databases --routines sys > sys_dump.sql來得到sys的建立語句,如果需要重建則更簡單 mysql<sys_dump.sql 即可。
個人微信公眾號如下,歡迎訂閱置頂。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23718752/viewspace-2131354/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 用Oracle的眼光來學習MySQL 5.7的sys(下)(r11筆記第25天)OracleMySql筆記
- MySQL 5.7 General Tablespace學習(r11筆記第34天)MySql筆記
- 近期的學習計劃(2017.3)(r11筆記第95天)筆記
- MySQL中的undo截斷(r11筆記第89天)MySql筆記
- MySQL中的半同步複製(r11筆記第65天)MySql筆記
- MySQL和Oracle行值表示式對比(r11筆記第74天)MySqlOracle筆記
- MySQL 5.7 SYS SCHEMAMySql
- mysql 5.7中嶄新的 mysql sys schemaMySql
- 動態建立MySQL Group Replication的節點(r11筆記第84天)MySql筆記
- MySQL Online DDL(二)(r11筆記第88天)MySql筆記
- Oracle Data Guard延遲的幾個可能(r11筆記第69天)Oracle筆記
- 我的女兒二三事(r11筆記第87天)筆記
- MySQL引數對比淺析(r11筆記第97天)MySql筆記
- 返京途中(r11筆記第61天)筆記
- 【Mysql】mysql5.7新特性之-sys schema的作用MySql
- 淺談MySQL中的事務隔離級別(r11筆記第86天)MySql筆記
- oracle學習筆記--oracle常用的命令Oracle筆記
- Coursera 機器學習 第9章(上) Anomaly Detection 學習筆記機器學習筆記
- 軟體技術大會歸來(r11筆記第8天)筆記
- 需要了解的pssh(r11筆記第28天)筆記
- 我眼中的寶雞景點(r11筆記第53天)筆記
- 我眼中的兵馬俑(r11筆記第55天)筆記
- 使用sysbench壓力測試MySQL(一)(r11筆記第3天)MySql筆記
- MySql學習筆記MySql筆記
- 記下原來學習Oracle的筆記之——體系結構Oracle筆記
- Oracle 12c資料字典的小問題(r11筆記第49天)Oracle筆記
- oracle學習筆記-常用的命令Oracle筆記
- Oracle 12cR2初體驗(r11筆記第91天)Oracle筆記
- Oracle高階培訓 第5課 學習筆記Oracle筆記
- Oracle高階培訓 第6課 學習筆記Oracle筆記
- Oracle高階培訓 第7課 學習筆記Oracle筆記
- mysql 5.7 sys資料庫初探MySql資料庫
- MySQL:Innodb恢復的學習筆記MySql筆記
- MySql 學習筆記四:表的拆分MySql筆記
- 學習筆記:MySQL Cluster 的binlog筆記MySql
- Mysql 5.7儲存過程的學習MySql儲存過程
- 【記錄】MySQL 學習筆記MySql筆記
- [記錄] MySQL 學習筆記MySql筆記