MySQL運維的一款利器sys schema
MySQL運維中有很多的工具,就好比你進了一個雜貨鋪,各種運維中的小技巧幾乎都有一些小工具, 走一圈發現真是琳琅滿目,可見MySQL充分享受了開源社群的紅利。
而比較特別的一點是MySQL社群中,官方提供的工具在以前不會成為市面上的拳頭產品,有些甚至維護一段之後就沒有深入維護了。所以走一圈發現,MySQL很多實用成熟的工具都來自於社群,而官方推出的一些工具不是因為企業版的限制就是功能的不成熟而被有限使用。
當然不一而論,在早些年我可以說這些話,但是在5.7開始,你會明顯發現官方的投入已經很大了,官方推出的社群版迭代很快,已經早早超越了兩個流行的分支Percona和MariaDB,尤其是MGR的推出,算是讓MySQL在這方面有了不少的亮點和話語權。
我們繼續回到工具,還是工具,工具是DBA的一把瑞士軍刀,其實對我們來說,我們也不希望有一大把的小工具,如果有太多的工具,太多的瑞士軍刀,我們的行李箱就會很沉重,哪些都需要,哪些都要單獨安裝,所以我們有時候希望做減法。如果官方有而且做得不錯,那毫無疑問是我們首選的方案了。
所以在此我要推薦MySQL 的sys schema。這是在5.7推出的一個特性。算是對以前的performance_schema和information_schema的一個抽象層。
有的同學可能會問,這都是MySQL 5.7的特性了,我們的很多環境使用的依舊是5.5,5.6,這個特性對我們來說有什麼意義,如果只是這樣想,只能說明你只是意識到了這個問題而已,但是對於解決問題沒有實質性建議。
我們來簡單說下sys schema裡面的一些小細節。
之前發表在DBAplus社群的一篇文章可供參考:
在Oracle專家眼中,MySQL sys Schema是怎樣一種存在?
我對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這三個方面,提升空間還很大。
所以這確實是一個寶貝,讓我們對原本難以入手的效能問題有了一些很清晰的定位方式。
比如我很看好的一個功能是自增列的溢位問題檢測,如果能夠提前發現,那麼對於運維工作會從被動變為主動。
在MySQL 5.7中我會這樣來用:
select *from schema_auto_increment_columns;
如果自增列值快要溢位(我們可以設定一個閾值,比如90%之類的),我們可以透過檢視的方式來很容易定位到。
如果要檢視這個檢視的具體實現就會發現邏輯遠比我們想象的複雜,檢視的定義如下:
select `information_schema`.`COLUMNS`.`TABLE_SCHEMA` AS `table_schema`,`information_schema`.`COLUMNS`.`TABLE_NAME` AS `table_name`,`information_schema`.`COLUMNS`.`COLUMN_NAME` AS `column_name`,`information_schema`.`COLUMNS`.`DATA_TYPE` AS `data_type`,`information_schema`.`COLUMNS`.`COLUMN_TYPE` AS `column_type`,(locate('unsigned',`information_schema`.`COLUMNS`.`COLUMN_TYPE`) = 0) AS `is_signed`,(locate('unsigned',`information_schema`.`COLUMNS`.`COLUMN_TYPE`) > 0) AS `is_unsigned`,((case `information_schema`.`COLUMNS`.`DATA_TYPE` when 'tinyint' then 255 when 'smallint' then 65535 when 'mediumint' then 16777215 when 'int' then 4294967295 when 'bigint' then 18446744073709551615 end) >> if((locate('unsigned',`information_schema`.`COLUMNS`.`COLUMN_TYPE`) > 0),0,1)) AS `max_value`,`information_schema`.`TABLES`.`AUTO_INCREMENT` AS `auto_increment`,(`information_schema`.`TABLES`.`AUTO_INCREMENT` / ((case `information_schema`.`COLUMNS`.`DATA_TYPE` when 'tinyint' then 255 when 'smallint' then 65535 when 'mediumint' then 16777215 when 'int' then 4294967295 when 'bigint' then 18446744073709551615 end) >> if((locate('unsigned',`information_schema`.`COLUMNS`.`COLUMN_TYPE`) > 0),0,1))) AS `auto_increment_ratio`
from (`INFORMATION_SCHEMA`.`COLUMNS`
join `INFORMATION_SCHEMA`.`TABLES`
on(((`information_schema`.`COLUMNS`.`TABLE_SCHEMA` = `information_schema`.`TABLES`.`TABLE_SCHEMA`)
and (`information_schema`.`COLUMNS`.`TABLE_NAME` = `information_schema`.`TABLES`.`TABLE_NAME`))))
where ((`information_schema`.`COLUMNS`.`TABLE_SCHEMA` not in ('mysql','sys','INFORMATION_SCHEMA','performance_schema')) and (`information_schema`.`TABLES`.`TABLE_TYPE` = 'BASE TABLE') and (`information_schema`.`COLUMNS`.`EXTRA` = 'auto_increment'))
order by (`information_schema`.`TABLES`.`AUTO_INCREMENT` / ((case `information_schema`.`COLUMNS`.`DATA_TYPE` when 'tinyint' then 255 when 'smallint' then 65535 when 'mediumint' then 16777215 when 'int' then 4294967295 when 'bigint' then 18446744073709551615 end) >> if((locate('unsigned',`information_schema`.`COLUMNS`.`COLUMN_TYPE`) > 0),0,1))) desc,((case `information_schema`.`COLUMNS`.`DATA_TYPE` when 'tinyint' then 255 when 'smallint' then 65535 when 'mediumint' then 16777215 when 'int' then 4294967295 when 'bigint' then 18446744073709551615 end) >> if((locate('unsigned',`information_schema`.`COLUMNS`.`COLUMN_TYPE`) > 0),0,1))
裡面引用了performance_schema和information_schema的資料字典。
所以有一個很重要的問題,5.7的檢視內容是否可以照搬到5.5來用呢。
顯然不是一個完全肯定的答案,因為5.7中的information_schema中的表有72個,而5.5中只有37個,大部分的差異是在InnoDB的資料字典上。
但是巧的是對於檢視schema_auto_increment_columns的實現來說,5.5的邏輯已經足夠了。
所以儘管我們使用的5.5的版本,我們依舊可以享用這個5.7的特性帶來的福利,當然不是簡單的拿來主義,對於這列操作,我更希望是放在從庫來執行,提前測試避免不必要的麻煩。所以很多問題都能夠有定位的方法,對於解決問題就會如虎添翼。
所以順著這個思路走下去,你會發現有很多工作待發掘。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23718752/viewspace-2152313/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL 如何重建/恢復刪除的 sys SchemaMySql
- MySQL 5.7 performance_schema庫和sys庫常用SQLMySqlORM
- IT運維人員的神兵利器運維
- 介紹一個 MySQL 自動化運維利器 - InceptionMySql運維
- mysql運維利器percona-toolkit工具之pt-query-digestMySql運維
- mysql運維案例MySql運維
- 格式校驗利器:JSON Schema 簡介JSON
- MySQL Performance SchemaMySqlORM
- MySQL基礎運維——percona-toolkit運維工具MySql運維
- 雲原生時代 RocketMQ 運維管控的利器 - RocketMQ OperatorMQ運維
- 自動化運維利器Ansible要點彙總運維
- mysql的mysql.event和information_schema.eventsMySqlORM
- win 伺服器 批次管理 伺服器運維利器伺服器運維
- MySQL Performance Schema詳解MySqlORM
- MySQL運維5-Mycat配置MySql運維
- 輕量化日誌 Loki 全攻略,運維利器要收好Loki運維
- MySQL sys效能監控MySql
- MySQL 資料庫日常運維文件MySql資料庫運維
- MySQL運維4-Mycat入門MySql運維
- EMR重磅釋出智慧運維診斷系統(EMR Doctor)——開源大資料平臺運維利器運維大資料
- 如何高效地遠端部署?自動化運維利器 Fabric 教程運維
- MYSQL中information_schema簡介MySqlORM
- KingbaseES 叢集運維典型案例 03 --“雙主” sys_rewind恢復機制運維
- MySQL運維實戰系列:MySQL5.7GroupBy問題MySql運維
- 入坑 docsify,一款神奇的文件生成利器!
- mysql的 information_schema 資料庫介紹MySqlORM資料庫
- MySQL運維2-主從複製MySql運維
- MySQL運維實戰(7)建立複製MySql運維
- MySQL運維6-Mycat垂直分庫MySql運維
- MySQL運維7-Mycat水平分表MySql運維
- mysql 5.7 sys資料庫初探MySql資料庫
- 常見的IT自動化運維工具有哪些?推薦一款好用的?運維
- MySQL 進階:INFORMATION_SCHEMA 簡介MySqlORM
- MySQL5.6 PERFORMANCE_SCHEMA 說明MySqlORM
- MySQL運維8-Mycat範圍分表MySql運維
- Mysql運維-資料庫及表相關操作MySql運維資料庫
- 如何實現MySQL運維體系建設MySql運維
- MySQL運維之binlog_gtid_simple_recovery(GTID)MySql運維