用Oracle的眼光來學習MySQL 5.7的sys(上)(r11筆記第24天)

jeanron100發表於2016-12-25

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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章