mysqldump单个库导出_初相识 | 全方位认识 sys 系统库
前陣子,我們的"全方位認識performance_schema"系列為大家完整的介紹了performance_schema系統庫。在我們的發布計劃中為什么要把performance_schema放在最前面呢?其中一個原因就是因為它是sys 系統庫的數據來源,今天開始,我們將為大家逐步推出“全方位認識 sys 系統庫”系列文章,下面我們將為大家帶來系列第一篇《初相識|全方位認識 sys 系統庫》,請跟隨我們一起開始 sys 系統庫的系統學習之旅吧~
PS:本系列基于MySQL 5.7.18 版本整理
|? 初識sys系統庫
1. sys系統庫使用基礎環境
在使用sys系統庫之前,你需要確保你的數據庫環境滿足如下條件:
1)sys系統庫支持MySQL 5.6或更高版本,5.5.x及其以下版本不支持;
2)因為sys系統庫提供了一些代替直接訪問performance_schema的視圖,所以必須啟用performance_schema(performance_schema系統參數設置為ON)之后sys系統庫的大部分功能才能正常使用;
3)要完全訪問sys系統庫,用戶必須具有以下權限:?
* 對所有sys表和視圖具有SELECT權限?
* 對所有sys存儲過程和函數具有EXECUTE權限?
* 對sys_config表具有INSERT、UPDATE權限?
* 對某些特定的sys系統庫存儲過程和函數需要額外權限,如,ps_setup_save()存儲過程,需要臨時表相關的權限
4)還有sys系統庫執行訪問的對象相關的權限:?
* 任何被sys系統庫訪問的performance_schema表需要有SELECT權限,如果要使用sys系統庫對performance_schema相關表執行更新,則需要performance_schema相關表的UPDATE權限?
* INFORMATION_SCHEMA.INNODB_BUFFER_PAGE表的PROCESS
5)如果要充分使用sys系統庫的功能,則必須啟用某些performance_schema的instruments和consumers,如下:?
* 所有wait instruments?
* 所有stage instruments?
* 所有statement instruments?
* 對于所啟用的類型事件的instruments,還需要啟用對應類型的consumers(xxx_current和xxx_history_long),要了解某存儲過程具體做了什么事情可能通過show create procedure procedure_name;語句查看
您可以使用sys系統庫本身來啟用所有需要的instruments和consumers:
* 啟用所有wait instruments:CALLsys.ps_setup_enable_instrument('wait');
* 啟用所有stage instruments:CALLsys.ps_setup_enable_instrument('stage');
* 啟用所有statement instruments:CALLsys.ps_setup_enable_instrument('statement');
* 啟用所有事件類型的current表:CALLsys.ps_setup_enable_consumer('current');
* 啟用所有事件類型的history_long表:CALLsys.ps_setup_enable_consumer('history_long');
* 注意:performance_schema的默認配置就可以滿足sys系統庫的大部分數據收集功能。啟用上述所提及的所有instruments和consumers會對性能產生一定影響,因此最好僅啟用所需的配置。如果你在啟用了一些默認配置之外的配置,則可以使用存儲過程:CALLsys.ps_setup_reset_to_default(TRUE); 來快速恢復到performance_schema的默認配置
PS:對于以上繁雜的權限要求,通常創建一個具有管理員權限的賬號即可,當然如果你有明確的需求,那另當別論,但sys系統庫通常都是提供給專業的DBA人員排查一些特定問題使用的,其下所涉及的各項查詢或多或少都會對性能有一定影響(主要體現在performance_schema功能實現的性能開銷),在不明需求的情況下,不建議開放這些功能來作為常規的監控手段使用。
2. sys系統庫初體驗
當你使用了use語句切換默認數據庫,那么就可以直接使用sys系統庫下的視圖名稱進行查詢,就像查詢某個庫下的表一樣操作,如下:
#?version視圖可以查看sys?系統庫和mysql?server的版本號mysql>?USE?sys;
mysql>?SELECT?*?FROM?version;
+?-------------?+?-----------------?+
|?sys_version?|?mysql_version?|
+?-------------?+?-----------------?+
|?1.5.0?|?5.7.9-debug-log?|
+?-------------?+?-----------------?+
也可以使用db_name.view_name、db_name.procedure_name、db_name.func_name等方式在不指定默認數據庫的情況下訪問sys 系統庫中的對象(這叫做名稱限定對象引用),如下:
mysql>?SELECT?*?FROM?sys.version;+?-------------?+?-----------------?+
|?sys_version?|?mysql_version?|
+?-------------?+?-----------------?+
|?1.5.0?|?5.7.9-debug-log?|
+?-------------?+?-----------------?+
PS:下文中的示例中,對于sys 系統庫的訪問都是假定指定了默認數據庫為sys 系統庫。
sys 系統庫下包含許多視圖,它們以各種方式對performance_schema表進行聚合計算展示。這些視圖中大部分都是成對出現,兩個視圖名稱相同,但有一個視圖是帶'x$'字符前綴的,例如:host_summary_by_file_io和x$host_summary_by_file_io,代表按照主機進行匯總統計的文件I/O性能數據,兩個視圖訪問數據源是相同的,但是創建視圖的語句中,不帶x$的視圖是把相關數值數據經過單位換算再顯示的(顯示為毫秒、秒、分鐘、小時、天等),帶x$前綴的視圖顯示的是原始的數據(皮秒),如下:
#?x$host_summary_by_file_io視圖匯總數據,顯示未格式化的皮秒單位延遲時間,沒有x$前綴字符的視圖輸出的信息經過單位換算之后可讀性更高mysql>?SELECT?*?FROM?host_summary_by_file_io;
+------------+-------+------------+
|?host??????|?ios??|?io_latency?|
+------------+-------+------------+
|?localhost??|?67570?|?5.38?s????|
|?background?|??3468?|?4.18?s????|
+------------+-------+------------+
#?對于帶x$的視圖顯示原始的皮秒單位數值,對于程序或工具獲取使用更易于數據處理
mysql>?SELECT?*?FROM?x$host_summary_by_file_io;
+------------+-------+---------------+
|?host??????|?ios??|?io_latency????|
+------------+-------+---------------+
|?localhost??|?67574?|?5380678125144?|
|?background?|??3474?|?4758696829416?|
+------------+-------+---------------+
要查看sys 系統庫對象定義語句,可以使用適當的SHOW語句或INFORMATION_SCHEMA庫查詢。例如,要查看session視圖和format_bytes()函數的定義,可以使用如下語句:
mysql>?SHOW?CREATE?VIEW?session;mysql>?SHOW?CREATE?FUNCTION?format_bytes;
然而,這些語句文本是經過格式化的,可讀性比較差。要查看更易讀的格式對象定義語句,可以訪問sys 系統庫開發網站https://github.com/mysql/mysql-sys上的各個.sql文件,或者使用mysqldump與mysqlpump工具導出sys庫,默認情況下,mysqldump和mysqlpump都不會導出sys 系統庫。要生成包含sys 系統庫的導出文件,可以使用如下命令顯式指定sys 系統庫(雖然可以導出視圖定義,但是與原始的定義語句相比仍然缺失了相當一部分內容,只是可讀性比直接show create view要好一些):
mysqldump?--databases?--routines?sys>?sys_dump.sqlmysqlpump?sys>?sys_dump.sql
如果要重新導入sys 系統庫,可以使用如下命令:
mysql?sys_dump.sql3. sys 系統庫的進度報告功能
從MySQL 5.7.9開始,sys 系統庫視圖提供查看長時間運行的事務的進度報告,通過processlist和session以及x$前綴的視圖進行查看,其中processlist包含了后臺線程和前臺線程當前的事件信息,session不包含后臺線程和command為Daemon的線程,如下:
processlistsession
x$processlist
x$session
session視圖是直接調用processlist視圖過濾了后臺線程和command為Daemon的線程(所以兩個視圖輸出結果的字段相同),而processlist線程聯結查詢了threads、events_waits_current、events_stages_current、events_statements_current、events_transactions_current、sys.x$memory_by_thread_by_current_bytes、session_connect_attrs表,so,需要打開相應的instruments和consumers,否則誰沒打開誰對應的信息字段列就為NULL,對于trx_state字段為ACTIVE的線程,progress可以輸出百分比進度信息(只有支持進度的事件才會被統計并打印進來)
查詢示例
#?查看當前正在執行的語句進度信息admin@localhost?:?sys?06:57:21>?select?*?from?session?where?conn_id!=connection_id()?and?trx_state='ACTIVE'\G;
***************************?1.?row?***************************
????????????thd_id:?47
??????????conn_id:?5
??????????????user:?admin@localhost
????????????????db:?sbtest
??????????command:?Query
????????????state:?alter?table?(merge?sort)
??????????????time:?29
current_statement:?alter?table?sbtest1?add?index?i_c(c)
statement_latency:?29.34?s
??????????progress:?49.70
??????lock_latency:?4.34?ms
????rows_examined:?0
????????rows_sent:?0
????rows_affected:?0
????????tmp_tables:?0
??tmp_disk_tables:?0
????????full_scan:?NO
????last_statement:?NULL
last_statement_latency:?NULL
????current_memory:?4.52?KiB
????????last_wait:?wait/io/file/innodb/innodb_temp_file
last_wait_latency:?369.52?us
????????????source:?os0file.ic:470
??????trx_latency:?29.45?s
????????trx_state:?ACTIVE
????trx_autocommit:?YES
??????????????pid:?4667
??????program_name:?mysql
1?row?in?set?(0.12?sec)
#?查看已經執行完的語句相關統計信息
admin@localhost?:?sys?07:02:21>?select?*?from?session?where?conn_id!=connection_id()?and?trx_state='COMMITTED'\G;
***************************?1.?row?***************************
????????????thd_id:?47
??????????conn_id:?5
??????????????user:?admin@localhost
????????????????db:?sbtest
??????????command:?Sleep
????????????state:?NULL
??????????????time:?372
current_statement:?NULL
statement_latency:?NULL
??????????progress:?NULL
??????lock_latency:?4.34?ms
????rows_examined:?0
????????rows_sent:?0
????rows_affected:?0
????????tmp_tables:?0
??tmp_disk_tables:?0
????????full_scan:?NO
????last_statement:?alter?table?sbtest1?add?index?i_c(c)
last_statement_latency:?1.61?m
????current_memory:?4.52?KiB
????????last_wait:?idle
last_wait_latency:?Still?Waiting
????????????source:?socket_connection.cc:69
??????trx_latency:?1.61?m
????????trx_state:?COMMITTED
????trx_autocommit:?YES
??????????????pid:?4667
??????program_name:?mysql
1?row?in?set?(0.12?sec)
對于stage事件進度報告要求必須啟用events_stages_current consumers,啟用需要查看進度相關的instruments。例如:
stage/sql/Copying?to?tmp?tablestage/innodb/alter?table?(end)
stage/innodb/alter?table?(flush)
stage/innodb/alter?table?(insert)
stage/innodb/alter?table?(log?apply?index)
stage/innodb/alter?table?(log?apply?table)
stage/innodb/alter?table?(merge?sort)
stage/innodb/alter?table?(read?PK?and?internal?sort)
stage/innodb/buffer?pool?load
對于不支持進度的stage 事件,或者未啟用所需的instruments或consumers的stage事件,則對應的進度信息列顯示為NULL。
本期內容就介紹到這里,本期內容參考鏈接如下:
https://dev.mysql.com/doc/refman/5.7/en/sys-schema-progress-reporting.html
https://dev.mysql.com/doc/refman/5.7/en/sys-schema-prerequisites.html
https://dev.mysql.com/doc/refman/5.7/en/sys-schema-usage.html
"翻過這座山,你就可以看到一片海!"。堅持閱讀我們的"全方位認識 sys 系統庫"系列文章分享,你就可以系統地學完它。謝謝你的閱讀,我們下期不見不散!
| 作者簡介
羅小波·數據庫技術專家
《千金良方——MySQL性能優化金字塔法則》、《數據生態:MySQL復制技術與生產實踐》作者之一。熟悉MySQL體系結構,擅長數據庫的整體調優,喜好專研開源技術,并熱衷于開源技術的推廣,在線上線下做過多次公開的數據庫專題分享,發表過近100篇數據庫相關的研究文章。
全文完。
Enjoy MySQL?:)
葉老師的「MySQL核心優化」大課已升級到MySQL 8.0,掃碼開啟MySQL 8.0修行之旅吧
總結
以上是生活随笔為你收集整理的mysqldump单个库导出_初相识 | 全方位认识 sys 系统库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: xp系统qq安装不上网络连接服务器,wi
- 下一篇: 公平锁非公平锁的实际使用_3. redi