標籤:

MySQL 的 help 命令你真的會用嗎?

MySQL 的 help 命令你真的會用嗎?

1 人贊了文章

MySQL 的幫助信息重要嗎?不太重要!有用嗎?有!就好比你在家洗澡的時候,突然有人不停地按你家的門鈴,能把你憋出心臟病來,嘿嘿,我想,各位DBA同行們,在資料庫的日常維護過程中,如果突然忘記某個SQL或者說某個管理命令如何拼寫的時候,一定首先想到的就是使用"help xxx" 語句來查看MySQL 自帶的幫助信息。但你一定或多或少能碰到這樣的場景:記不清某個語句的具體拼寫了,只能模糊的記得幾個字母,或者說很清楚知道想要查什麼幫助信息,但是卻不知道用什麼關鍵字來查詢幫助信息(例如:想要查看解析relaylog的SQL語句)。這個時候怎麼辦呢? 別慌,本文來告訴你答案!

要想知道怎麼辦,那得全面了解MySQL 提供的幫助系統,下面,我們將帶領大家一窺廬山真面目!

01.help 語句信息從哪裡取的

MySQL Server提供4張表用於保存服務端的幫助信息(使用help語法查看的幫助信息),這些表位於mysql 系統字典庫下。help 語句就是從這些表中獲取數據並返回給客戶端,如下:

  • help_category:關於幫助主題類別的信息
  • help_keyword:與幫助主題相關的關鍵字信息
  • help_relation:幫助關鍵字信息和主題信息之間的映射
  • help_topic:幫助主題的詳細內容

02.help 語句信息何時產生的

這些表在資料庫初始化時通過載入share/fill_help_tables.sql文件創建,如果是在Unix上使用二進位或源代碼發行版安裝MySQL,則在初始化數據目錄時會直接導入該文件對幫助表內容進行初始化。對於在Linux上的RPM分發版或Windows上的二進位發行版,幫助表的內容初始化是作為MySQL安裝過程的一部分執行。

  • 如果使用二進位發行版升級MySQL,則不會自動升級幫助表,但可以手動升級(手工載入share/fill_help_tables.sql文件),如:shell> mysql -u root mysql <fill_help_tables.sql
  • 您可以隨時獲取最新的fill_help_tables.sql以升級您的幫助表。從dev.mysql.com/doc/index下載適用於您的MySQL版本的正確文件

03.help 幫助信息存儲表詳解

help 語法支持3種模式的匹配查詢:查看所有主題頂層類別或子類別、查看幫助主題下的關鍵字、使用給定主題下的唯一關鍵字查看幫助信息,這些信息分表保存在 help_category、help_topic、help_keyword表,help_relation表存放help_topic與help_keyword表中信息的映射信息。下面將針對這幾張表的基礎知識進行簡單的科普。

(1)help_category

該表提供查詢幫助主題的類別信息,每一個類別分別對應著N個幫助主題名或者主題子類別名,通過查詢表中的信息我們也可以看出來,如下:

root@localhost : mysql 01:10:59> select * from help_category;+------------------+-----------------------------------------------+--------------------+-----+| help_category_id | name | parent_category_id | url |+------------------+-----------------------------------------------+--------------------+-----+| 1 | Geographic | 0 | || 2 | Polygon properties | 35 | |......| 39 | Functions | 36 | || 40 | Data Definition | 36 | |+------------------+-----------------------------------------------+--------------------+-----+40 rows in set (0.00 sec)

表欄位含義

  • help_category_id:幫助主題名稱或子類別名稱在表中的記錄ID
  • name:幫助主題類別名稱或字類別名稱
  • parent_category_id:父主題類別名稱在表中的記錄ID,一些主題類別具有子主題類別,例如:絕大多數的主題類別其實是Contents類別的子類別(且是頂層類別,也是一級父類別),還有一部分是Geographic Features 類別的子類別(二級父類別),一部分是Functions的子類別(二級父類別)
  • url :對應在MySQL 官方手冊中的鏈接地址

(2)help_keyword

該表提供查詢與幫助主題相關的關鍵字字元串信息,如下:

root@localhost : mysql 01:12:07> select * from help_keyword limit 5;+-----------------+---------+| help_keyword_id | name |+-----------------+---------+| 681 | (JSON || 486 | -> || 205 | ->> || 669 | <> || 521 | ACCOUNT |+-----------------+---------+5 rows in set (0.00 sec)

表欄位含義

  • help_keyword_id:幫助關鍵字名稱在表中記錄對應的ID
  • name:幫助關鍵字字元串

(3)help_relation

該表提供查詢幫助關鍵字信息和主題詳細信息之間的映射,用於關聯查詢help_keyword與help_topic表,如下:

root@localhost : mysql 01:13:09> select * from help_relation limit 5;+---------------+-----------------+| help_topic_id | help_keyword_id |+---------------+-----------------+| 0 | 0 || 535 | 0 || 294 | 1 || 277 | 2 || 2 | 3 |+---------------+-----------------+5 rows in set (0.00 sec)

表欄位含義

  • help_topic_id:幫助主題詳細信息ID,該ID值與help_topic表中的help_topic_id相等
  • help_keyword_id:幫助主題關鍵字信息ID,該ID值與help_keyword表中的help_keyword_id相等

(4)help_topic

該表提供查詢幫助主題給定關鍵字的詳細內容(詳細幫助信息),如下:

root@localhost : mysql 01:13:31> select * from help_topic limit 1G;*************************** 1. row ***************************help_topic_id: 0 name: JOINhelp_category_id: 28 description: MySQL supports the following JOIN syntaxes for the table_referencespart of SELECT statements and multiple-table DELETE and UPDATEstatements:table_references:escaped_table_reference [, escaped_table_reference] ...escaped_table_reference:table_reference| { OJ table_reference }...... url: http://dev.mysql.com/doc/refman/5.7/en/join.html1 row in set (0.00 sec)

表欄位含義

  • help_topic_id:幫助主題詳細信息在表記錄中對應的ID
  • name:幫助主題給定的關鍵字名稱,與help_keyword表中的name欄位值相等
  • help_category_id:幫助主題類別ID,與help_category表中的help_category_id欄位值相等
  • description:幫助主題的詳細信息(這裡就是我們通常查詢幫助信息真正想看的內容,例如:告訴我們某某語句如何使用的語法與注意事項等)
  • example:幫助主題的示例信息(這裡告訴我們某某語句如何使用的示例)
  • url:該幫助主題對應在MySQL官方在線手冊中的URL鏈接地址

04.help 語句用法示例

前面我們提到過,help 語法支持3種模式的匹配查詢。那麼,回到文章開頭我們拋出的問題,記不清某個語句的具體拼寫了,只能模糊的記得幾個字母,或者說很清楚知道想要查什麼幫助信息,但是卻不知道用什麼關鍵字來查詢幫助信息(例如:想要查看解析relaylog的SQL語句)。這個時候怎麼辦呢?

(1)我只記得某幾個字母怎麼辦

MySQL 提供的幫助信息實際上可以直接給定一個主題關鍵字進行查詢,不需要指定主題名稱,如果你記錄某個SQL子句關鍵字的其中的幾個字母,那麼可以使用這些字母多嘗試幾次,如下:

root@localhost : performance_schema 10:43:40> help relay # 嘗試第一次Nothing foundPlease try to run help contents for a list of all accessible topicsroot@localhost : performance_schema 10:44:00> help relay logs # 嘗試第二次Nothing foundPlease try to run help contents for a list of all accessible topicsroot@localhost : performance_schema 10:44:06> help relaylogs # 嘗試第三次Nothing foundPlease try to run help contents for a list of all accessible topicsroot@localhost : performance_schema 10:44:09> help relaylog # 嘗試第四次,oy,成功了Name: SHOW RELAYLOG EVENTSDescription:Syntax:SHOW RELAYLOG EVENTS[IN log_name] [FROM pos] [LIMIT [offset,] row_count] # 原來是這樣用的Shows the events in the relay log of a replication slave. If you do notspecify log_name, the first relay log is displayed. This statementhas no effect on the master.URL: http://dev.mysql.com/doc/refman/5.7/en/show-relaylog-events.html

PS:這裡實際上就相當於那help 語句給定的關鍵字去匹配help_keyword表的name欄位,如果有記錄返回,則使用help_category、help_keyword、help_relation、help_topic四表做複雜的關聯查詢,右聯結help_topic表中的name欄位,如果返回唯一記錄就返回幫助信息,如果返回多行,則返回一個關鍵字列表,使用這些具體的關鍵字可查詢到具體的幫助信息,例如:

root@localhost : performance_schema 11:05:06> help where.....where <item> is one of the followingtopics: # 使用where作為關鍵字返回了一個關鍵字列表,表示where還會與這三個關鍵字組合使用,where的詳細用法從列表中隨便挑選一個關鍵字即可看到DELETEHANDLERUPDATEroot@localhost : performance_schema 11:09:05> help deleteName: DELETEDescription:Syntax:DELETE is a DML statement that removes rows from a table.Single-Table SyntaxDELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name[PARTITION (partition_name,...)][WHERE where_condition] # where關鍵字的用法在這裡[ORDER BY ...][LIMIT row_count]......

(2)我啥都不記得怎麼辦

如果你啥都不記得,那就只能使用最笨的方法,地毯式查找

首先,我們就隨便敲幾個字母給help語句好了,例如:help xxx

root@localhost : performance_schema 10:09:49> help xxx;Nothing found # 這句告訴你幫助信息沒找到# 不要緊,下面這句告訴你,用help contents語句來列出所有的可能的幫助主題信息Please try to run help contents for a list of all accessible topics

然後,查看所有的主題類別

root@localhost : performance_schema 10:31:47> help contentsYou asked for help about help category: "Contents"For more information, type help <item>, where <item> is one of the followingcategories:Account ManagementAdministration # 通過主題或主題類別名稱,大致判定一下,查看relaylog事件內容的語句應該是屬於管理語句Compound StatementsData DefinitionData ManipulationData TypesFunctionsFunctions and Modifiers for Use with GROUP BYGeographic FeaturesHelp MetadataLanguage StructurePluginsProceduresStorage EnginesTable MaintenanceTransactionsUser-Defined FunctionsUtility

使用help Administration 查看該幫助主題下的所有關鍵字

root@localhost : performance_schema 10:37:27> help Administration......SHOW PROCEDURE CODESHOW PROCEDURE STATUSSHOW PROCESSLISTSHOW PROFILESHOW PROFILESSHOW RELAYLOG EVENTS # 找到了,在這裡......

使用SHOW RELAYLOG EVENTS語句來查看具體的幫助信息

root@localhost : performance_schema 10:41:53> help SHOW RELAYLOG EVENTSName: SHOW RELAYLOG EVENTSDescription:Syntax:SHOW RELAYLOG EVENTS[IN log_name] [FROM pos] [LIMIT [offset,] row_count] # 原來是這樣用的Shows the events in the relay log of a replication slave. If you do notspecify log_name, the first relay log is displayed. This statementhas no effect on the master.URL: http://dev.mysql.com/doc/refman/5.7/en/show-relaylog-events.html

OK,現在相信你已經比較清晰地了解了MySQL 幫助系統的組成以及help 到底能給我們提供一些什麼幫助信息了,下面給大家再補充點小知識:

  • HELP語句中給定的搜索關鍵字不區分大小寫
  • 搜索關鍵字可以包含通配符%和_,效果與LIKE運算符執行的模式匹配操作含義相同。例如:HELP rep%返回以rep開頭的主題列表
  • 如果幫助類別字元串、幫助主題字元串包含多個字元的,則可以使用引號引起來,也可以不使用引號,為避免歧義,最好使用引號引起來

05.幫助信息表相關的注意事項

對於參與複製的資料庫實例,幫助表更新有一些注意事項。幫助表默認情況下會寫入到binlog中(因為這些幫助表是跟版本匹配的,升級一個實例的版本,其他實例也有同步更新的必要),所以,你需要考慮是否需要在升級主庫幫助表的時候同時把這些更新通過主庫binlog同步更新到從庫中。

  • 如果主從庫版本不同,那麼主從庫就需要單獨升級幫助信息表

* 如果是MySQL 5.7.5之前的版本,則主從庫分別升級幫助信息表使用命令:mysql --init-command="SET sql_log_bin=0" mysql < fill_help_tables.sql

* 如果是MySQL 5.7.5 及其之後的版本,則不需要使用--init-command="SET sql_log_bin=0" ,因為fill_help_tables.sql文件中包含了SET sql_log_bin=0,所以主從庫只需要分別執行命令:mysql mysql < fill_help_tables.sql 即可

  • 如果是主從版本相同,那麼主從庫可以通過在主庫升級,通過複製來更新從庫的幫助信息表

* 如果是MySQL 5.7.5之前的版本,則只需要在主庫中執行命令:mysql mysql < fill_help_tables.sql 即可

* 如果是MySQL 5.7.5 及其之後的版本,則需要先在主庫伺服器中修改ll_help_tables.sql 文件,去掉SET sql_log_bin=0,然後在主庫執行命令:mysql mysql < fill_help_tables.sql 即可

PS:在MySQL 5.7.5之前這些表使用MyISAM,在這個版本之後改為InnoDB引擎

| 作者簡介

羅小波·沃趣科技高級資料庫技術專家

IT從業多年,歷任運維工程師,高級運維工程師,運維經理,資料庫工程師,曾參與版本發布系統,輕量級監控系統,運維管理平台,資料庫管理平台的設計與編寫,熟悉MySQL的體系結構時,InnoDB存儲引擎,喜好專研開源技術,追求完美。


推薦閱讀:

MySQL 主從複製的常用拓撲結構
mysql死鎖的問題?
SQL初次練習
MySQL 5.5 多實例 主從複製非同步、半同步實踐(1)
如何通過Mysql的二進位日誌恢復資料庫數據

TAG:MySQL |