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

沃趣科技發表於2018-07-19

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以升級您的幫助表。從http://dev.mysql.com/doc/index-other.html下載適用於您的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 1\G;
*************************** 1. row ***************************
help_topic_id: 0
        name: JOIN
help_category_id: 28
 description: MySQL supports the following JOIN syntaxes for the table_references
part of SELECT statements and multiple-table DELETE and UPDATE
statements:
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.html
1 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 found
Please try to run 'help contents' for a list of all accessible topics
root@localhost : performance_schema 10:44:00> help relay logs  # 嘗試第二次
Nothing found
Please try to run 'help contents' for a list of all accessible topics
root@localhost : performance_schema 10:44:06> help relaylogs  # 嘗試第三次
Nothing found
Please try to run 'help contents' for a list of all accessible topics
root@localhost : performance_schema 10:44:09> help relaylog  # 嘗試第四次,oy,成功了
Name: 'SHOW RELAYLOG EVENTS'
Description:
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 not
specify 'log_name', the first relay log is displayed. This statement
has 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 following
topics:  # 使用where作為關鍵字返回了一個關鍵字列表,表示where還會與這三個關鍵字組合使用,where的詳細用法從列表中隨便挑選一個關鍵字即可看到
DELETE
HANDLER
UPDATE
root@localhost : performance_schema 11:09:05> help delete
Name: 'DELETE'
Description:
Syntax:
DELETE is a DML statement that removes rows from a table.
Single-Table Syntax
DELETE [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 contents
You asked for help about help category: "Contents"
For more information, type 'help <item>', where <item> is one of the following
categories:
Account Management
Administration  # 透過主題或主題類別名稱,大致判定一下,檢視relaylog事件內容的語句應該是屬於管理語句
Compound Statements
Data Definition
Data Manipulation
Data Types
Functions
Functions and Modifiers for Use with GROUP BY
Geographic Features
Help Metadata
Language Structure
Plugins
Procedures
Storage Engines
Table Maintenance
Transactions
User-Defined Functions
Utility


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

root@localhost : performance_schema 10:37:27> help Administration
......
SHOW PROCEDURE CODE
SHOW PROCEDURE STATUS
SHOW PROCESSLIST
SHOW PROFILE
SHOW PROFILES
SHOW RELAYLOG EVENTS  # 找到了,在這裡
......


使用SHOW RELAYLOG EVENTS語句來檢視具體的幫助資訊

root@localhost : performance_schema 10:41:53> help SHOW RELAYLOG EVENTS
Name: 'SHOW RELAYLOG EVENTS'
Description:
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 not
specify 'log_name', the first relay log is displayed. This statement
has 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儲存引擎,喜好專研開源技術,追求完美。






來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28218939/viewspace-2158161/,如需轉載,請註明出處,否則將追究法律責任。

相關文章