1. 程式人生 > >初相識 | 全方位認識 information_schema

初相識 | 全方位認識 information_schema

在"全方位認識 sys 系統庫"系列文章中,已為大家詳細介紹了 sys系統庫,而sys 系統庫中有一部分檢視的資料來自information_schema。那麼,什麼是information_schema?information_schema組成物件又有哪些?本文將帶領大家,啟程去往information_schema學習之旅第一站。

PS:以下內容主要針對MySQL 5.7版本進行整理。

| 什麼是information_schema

information_schema提供了對資料庫元資料、統計資訊、以及有關MySQL Server的資訊訪問(例如:資料庫名或表名,欄位的資料型別和訪問許可權等)。該庫中儲存的資訊也可以稱為MySQL的資料字典或系統目錄。

  • 在每個MySQL 例項中都有一個獨立的information_schema,用來儲存MySQL例項中所有其他資料庫的基本資訊。information_schema資料庫下包含多個只讀表(非持久表),所以在磁碟中的資料目錄下沒有對應的關聯檔案,且不能對這些表設定觸發器。雖然在查詢時可以使用USE語句將預設資料庫設定為information_schema,但該庫下的所有表是隻讀的,不能執行INSERT、UPDATE、DELETE等資料變更操作。

針對information_schema下的表的查詢操作可以替代一些show查詢語句(例如:SHOW DATABASES,SHOW TABLES等),與使用show語句相比,通過查詢information_schema下的表獲取資料有以下優勢:

  • 它符合"Codd法則",所有的訪問都是基於表的訪問完成的。

  • 可以使用SELECT語句的SQL語法,只需要學習你要查詢的一些表名和列名的含義即可

  • 基於SQL語句的查詢,對來自information_schema中的查詢結果可以做過濾、排序、聯結操作,查詢的結果集格式對應用程式來說更友好

  • 這種技術實現與其他資料庫系統中類似的實現更具互操作性。例如:Oracle資料庫的使用者熟悉查詢Oracle資料字典中的表,那麼在MySQL中查詢資料字典的表也可以使用同樣的方法來執行查詢獲取想要的資料

訪問information_schema需要的許可權

  • 所有使用者都有訪問information_schema下的表許可權(但只能看到這些表中使用者具有訪問許可權的物件相對應的資料行),但只能訪問Server層的部分資料字典表,Server層中的部分資料字典表以及InnoDB層的資料字典表需要額外授權才能訪問,如果使用者許可權不足,當查詢Server層資料字典表時將不會返回任何資料,或者某個列沒有許可權訪問時,該列返回NULL值。當查詢InnoDB資料字典表時將直接拒絕訪問(要訪問這些表需要有process許可權,注意不是select許可權)

  • 從information_schema中查詢相關資料需要的許可權也適用於SHOW語句。無論使用哪種查詢方式,都必須擁有某個物件的許可權才能看到相關的資料。

PS:

  • 在MySQL 5.6版本中總共有59張表,其中10張MyISAM引擎臨時表(資料字典表),49張Memory引擎臨時表(儲存統計資訊和一些臨時資訊)。在MySQL 5.7版本中,該schema下總共有61張表,其中10個InnoDB儲存引擎臨時表(資料字典表),51個Memory引擎臨時表。在MySQL 8.0中該schema下資料字典表(包含部分原memory引擎臨時表)都遷移到了mysql schema下,且在mysql schema下這些資料字典表被隱藏,無法直接訪問,需要通過information_schema下的同名表進行訪問(統計資訊表保留在information_schema下且仍然為Memory引擎)

  • 雖然直接通過查詢information_schema中的表獲取資料有眾多優勢,但是因為SHOW語法已經耳熟能詳且被廣泛使用,所以SHOW語句仍然是一個備選方法,且隨著information_schema的實現,SHOW語句中的功能還有所增強(可以使用like或where子句進行過濾),例如:

# 語法
Syntax:
SHOW [GLOBAL | SESSION] VARIABLES
[LIKE 'pattern' | WHERE expr]

# 示例1
[email protected] : information_schema 12:20:31> show variables like '%log_bin%';
+---------------------------------+----------------------------------------------------+
| Variable_name                  | Value                                              |
+---------------------------------+----------------------------------------------------+
| log_bin                        | ON                                                |
| log_bin_basename                | /home/mysql/data/mysqldata1/binlog/mysql-bin      |
| log_bin_index                  | /home/mysql/data/mysqldata1/binlog/mysql-bin.index |
| log_bin_trust_function_creators | ON                                                |
| log_bin_use_v1_row_events      | OFF                                                |
| sql_log_bin                    | ON                                                |
+---------------------------------+----------------------------------------------------+
6 rows in set (0.00 sec)

# 例項2
[email protected] : information_schema 12:21:41> show variables where Variable_name like 'log_bin%' and Value='ON';
+---------------------------------+-------+
| Variable_name                  | Value |
+---------------------------------+-------+
| log_bin                        | ON    |
| log_bin_trust_function_creators | ON    |
+---------------------------------+-------+
2 rows in set (0.00 sec)

# 注意,like與where子句可單獨使用,但要同時使用where與like子句時,like子句必須在where之後

| information_schema 組成物件

information_schema下的所有表都是使用的Memory和InnoDB儲存引擎,且都是臨時表,不是持久表,在資料庫重啟之後這些資料會丟失,在MySQL 的4個系統庫中,也是唯一一個在檔案系統上沒有對應庫表的目錄和檔案的系統庫。

下面我們按照這些表的各自用途的相似度,我們把information_schema下的表做了如下歸類,本期我們先大致瞭解下information_schema系統庫中都有哪些表,這些表大致都有什麼用途。

1. Server層統計資訊字典表

COLUMNS:

  • 提供查詢表中的列(欄位)資訊

  • 該表為InnoDB 儲存引擎的臨時表

KEY_COLUMN_USAGE:

  • 提供查詢哪些索引列存在約束條件

  • 該表中的資訊包含主鍵、唯一索引、外來鍵等約束的資訊,例如:所在庫表列名,引用的庫表列名等。表中的資訊與TABLE_CONSTRAINTS表中記錄的資訊有些類似,但TABLE_CONSTRAINTS表中沒有記錄約束引用的庫表列資訊。但是卻記錄了TABLE_CONSTRAINTS表中所沒有的約束型別資訊

  • 該表為Memory引擎臨時表

REFERENTIAL_CONSTRAINTS:

  • 提供查詢關於外來鍵約束的一些資訊

  • 該表為Memory引擎臨時表

STATISTICS:

  • 提供查詢關於索引的一些統計資訊,一個索引對應一行記錄

  • 該表為Memory引擎臨時表

TABLE_CONSTRAINTS:

  • 提供查詢表相關的約束資訊

  • 該表為Memory引擎臨時表

FILES:

  • 提供查詢MySQL的資料表空間檔案相關的資訊,包含InnoDB儲存引擎和NDB儲存引擎相關的資料檔案資訊,由於NDB儲存引擎在國內較少使用,我們大多數場景(95%以上場景InnoDB儲存引擎都滿可以使用)都是使用InnoDB儲存引擎

  • 該表為Memory儲存引擎表

ENGINES:

  • 提供查詢MySQL Server支援的引擎相關的資訊

  • 該表為Memory引擎臨時表

TABLESPACES:

  • 提供查詢關於活躍表空間的相關資訊(主要記錄的是NDB儲存引擎表空間資訊)

  • 注意:該表不提供有關InnoDB儲存引擎的表空間的資訊。 對於InnoDB表空間元資料資訊,請查詢INNODB_SYS_TABLESPACES和INNODB_SYS_DATAFILES表。另外,從MySQL 5.7.8開始,INFORMATION_SCHEMA.FILES表也提供查詢InnoDB表空間的元資料資訊

  • 該表為Memory引擎臨時表。

SCHEMATA:

  • 提供查詢MySQL Server中的資料庫列表資訊,一個schema就代表一個database

  • 該表為Memory引擎臨時表

2. Server層表級別物件字典表

VIEWS:

  • 提供查詢資料庫中的檢視相關的資訊,查詢該表的帳號需要擁有show view許可權

  • 該表為InnoDB引擎臨時表

TRIGGERS:

  • 提供查詢關於某個資料庫下的觸發器相關的資訊,要查詢某個表的觸發器,查詢的賬戶必須要有trigger許可權

  • 該表為InnoDB引擎臨時表

TABLES:

  • 提供查詢資料庫內的表相關的基本資訊

  • 該表為Memory引擎臨時表

ROUTINES:

  • 提供查詢關於儲存過程和儲存函式的資訊(不包括使用者自定義函式UDF),該表中的資訊與“mysql.proc”中記錄的資訊相對應(如果該表中有值的話)

  • 該表為InnoDB引擎臨時表

PARTITIONS:

  • 提供查詢關於分割槽表的資訊

  • 該表為InnoDB引擎臨時表

EVENTS:

  • 提供查詢計劃任務事件相關的資訊

  • 該表是InnoDB引擎臨時表

PARAMETERS:

  • 提供有關儲存過程和函式的引數資訊,以及有關儲存函式的返回值的資訊。 這些引數資訊與mysql.proc表中的param_list列記錄的內容類似

  • 該表為InnoDB引擎臨時表

3. Server 層混雜資訊字典表

GLOBAL_STATUS、GLOBAL_VARIABLES、SESSION_STATUS、SESSION_VARIABLES:

  • 提供查詢全域性、會話級別的的狀態變數與系統變數資訊,這些表為Memory引擎臨時表

OPTIMIZER_TRACE:

  • 提供優化程式跟蹤功能產生的資訊。

  • 跟蹤功能預設關閉,使用optimizer_trace系統變數啟用跟蹤功能。如果開啟該功能,則每個會話只能跟蹤他自己執行的語句,不能看到其他會話執行的語句,且每個會話只能記錄最後一個跟蹤的SQL語句

  • 該表為InnoDB引擎臨時表

PLUGINS:

  • 提供查詢關於MySQL Server中支援哪些外掛的資訊

  • 該表為InnoDB引擎臨時表

PROCESSLIST:

  • 提供查詢一些關於執行緒執行過程中的狀態資訊

  • 該表為InnoDB引擎臨時表

PROFILING:

  • 提供查詢關於語句效能分析的資訊。其記錄內容對應於SHOW PROFILES和SHOW PROFILE語句產生的資訊。該表需要在會話變數 profiling=1時才會記錄語句效能分析資訊,否則該表不記錄。

  • 注意:從MySQL 5.7.2開始,此表不再推薦使用,在未來的MySQL版本中刪除。改用Performance Schema;代替

  • 該表為Memory引擎臨時表

CHARACTER_SETS:

  • 提供查詢MySQL Server支援的可用字符集有哪些

  • 該表為Memory引擎臨時表

COLLATIONS:

  • 提供查詢MySQL Server支援的可用校對規則有哪些

  • 該表為Memory引擎臨時表

COLLATION_CHARACTER_SET_APPLICABILITY:

  • 提供查詢MySQL Server中哪種字符集適用於什麼校對規則。查詢結果集相當於從SHOW COLLATION獲得的結果集中的前兩個欄位值。該表目前並沒有發現有太大作用,為Memory引擎臨時表

COLUMN_PRIVILEGES:

  • 提供查詢關於列(欄位)的許可權資訊,表中的內容來自mysql.column_priv列許可權表(需要針對一個表的列單獨授權之後才會有內容)

  • 該表為Memory引擎臨時表

SCHEMA_PRIVILEGES:

  • 提供查詢關於庫級別的許可權資訊,每種型別的庫級別許可權記錄一行資訊,該表中的資訊來自mysql.db表

  • 該表為Memory引擎臨時表

TABLE_PRIVILEGES:

  • 提供查詢關於表級別許可權資訊,該表中的內容來自mysql.tables_priv

  • 該表為Memory引擎臨時表

USER_PRIVILEGES:

  • 提供查詢全域性許可權的資訊,該表中的資訊來自mysql.user表

  • 該表為Memory引擎臨時表

4. InnoDB 層系統字典表

INNODB_SYS_DATAFILES:

  • 提供查詢InnoDB file-per-table和常規表空間資料檔案的路徑資訊,等同於InnoDB資料字典中SYS_DATAFILES表中的資訊

  • 該表中的資訊包含InnoDB所有表空間型別的元資料,包括獨立表空間、常規表空間、系統表空間、臨時表空間和undo表空間(如果開啟了獨立表空間的話)

  • 該表為memory引擎臨時表,查詢該表的使用者需要有process許可權。

INNODB_SYS_VIRTUAL:

  • 提供查詢有關InnoDB虛擬生成列和與之關聯的列的元資料資訊,等同於InnoDB資料字典內部SYS_VIRTUAL表中的資訊。INNODB_SYS_VIRTUAL表中展示的行資訊是虛擬生成列相關聯列的每個列的資訊。

  • 該表為memory引擎臨時表,查詢該表的使用者需要有process許可權

INNODB_SYS_INDEXES:

  • 提供查詢有關InnoDB索引的元資料資訊,等同於InnoDB資料字典內部SYS_INDEXES表中的資訊

  • 該表為memory引擎臨時表,查詢該表的使用者需要具有process許可權

INNODB_SYS_TABLES:

  • 提供查詢有關InnoDB表的元資料,等同於InnoDB資料字典內部SYS_TABLES表的資訊。

  • 該表為memory引擎臨時表,查詢該表的使用者需要有process許可權

INNODB_SYS_FIELDS:

  • 提供查詢有關InnoDB索引鍵列(欄位)的元資料資訊,等同於InnoDB資料字典內部SYS_FIELDS表的資訊

  • 該表為memory引擎臨時表,查詢該表的使用者需要有process許可權

INNODB_SYS_TABLESPACES:

  • 提供查詢有關InnoDB獨立表空間和普通表空間的元資料資訊(也包含了全文索引表空間),等同於InnoDB資料字典內部SYS_TABLESPACES表中的資訊

  • 該表為memory引擎臨時表,查詢該表的使用者需要有process許可權

INNODB_SYS_FOREIGN_COLS:

  • 提供查詢有關InnoDB外來鍵列的狀態資訊,等同於InnoDB資料字典內部SYS_FOREIGN_COLS表的資訊

  • 該表為memory引擎臨時表,查詢該表的使用者需要有process許可權

INNODB_SYS_COLUMNS:

  • 提供查詢有關InnoDB表列的元資料資訊,等同於InnoDB資料字典內部SYS_COLUMNS表的資訊

  • 該表為memory引擎臨時表,查詢該表的使用者需要具有process許可權

INNODB_SYS_FOREIGN:

  • 提供查詢有關InnoDB外來鍵的元資料資訊,等同於InnoDB資料字典內部SYS_FOREIGN表的資訊

  • 該表為memory引擎臨時表,查詢該表的使用者需要有process許可權

INNODB_SYS_TABLESTATS:

  • 提供查詢有關InnoDB表的較低級別的狀態資訊檢視。 MySQL優化器會使用這些統計資訊資料來計算並確定在查詢InnoDB表時要使用哪個索引。這些資訊儲存在記憶體中的資料結構中,與儲存在磁碟上的資料無對應關係。InnoDB內部也無對應的系統表。

  • 該表為memory引擎臨時表,查詢該表的使用者需要有process許可權

5. InnoDB 層鎖、事務、統計資訊字典表

INNODB_LOCKS:

  • 提供查詢innodb引擎事務中正在請求的且並未獲得的且同時阻塞了其他事務的鎖資訊(即沒有發生不同事務之間的鎖等待的鎖資訊,在這裡是檢視不到的,例如,只有一個事務時,該事務所加的鎖資訊無法檢視到)。該表中的內容可以用於診斷高併發下的鎖爭用資訊。

  • 該表為memory引擎臨時表,訪問該表需要擁有具有process許可權

INNODB_TRX:

  • 提供查詢當前在InnoDB引擎中執行的每個事務(不包括只讀事務)的資訊,包括事務是否正在等待鎖、事務什麼時間點開始、以及事務正在執行的SQL語句文字資訊等(如果有SQL的話)。

  • 該表為memory引擎臨時表,查詢該表的使用者需要有process許可權

INNODB_BUFFER_PAGE_LRU:

  • 提供查詢緩衝池中的頁面資訊,與INNODB_BUFFER_PAGE表不同,INNODB_BUFFER_PAGE_LRU表儲存有關innodb buffer pool中的頁如何進入LRU連結串列以及在buffer pool不夠用時確定需要從緩衝池中逐出哪些頁

  • 該表為Memory引擎臨時表

INNODB_LOCK_WAITS:

  • 提供查詢關於每個被阻塞的InnoDB事務的鎖等待記錄,包括髮生鎖等帶事務所請求的鎖和阻止該鎖請求被授予的鎖

  • 該表為memory引擎表,訪問該表使用者需要有process許可權

INNODB_TEMP_TABLE_INFO:

  • 提供查詢有關在InnoDB例項中當前處於活動狀態的使用者(已建立連線的使用者,斷開的使用者連線對應的臨時表會被自動刪除)建立的InnoDB臨時表的資訊。 它不提供查詢優化器使用的內部InnoDB臨時表的資訊查詢。INNODB_TEMP_TABLE_INFO表在首次查詢時建立。

  • 該表為memory引擎臨時表,查詢該表的使用者需要有process許可權

INNODB_BUFFER_PAGE:

  • 提供查詢關於buffer pool中的頁相關的資訊

  • 查詢該表需要使用者具有PROCESS許可權,該表為Memory引擎臨時表

INNODB_METRICS:

  • 提供查詢InnoDB更為詳細細緻的效能資訊,是對InnoDB的PERFORMANCE_SCHEMA的補充。通過對該表的查詢,可用於檢查innodb的整體健康狀況。也可用於診斷效能瓶頸、資源短缺和應用程式的問題等。

  • 該表為memory引擎臨時表,查詢該表的使用者需要有process許可權

INNODB_BUFFER_POOL_STATS:

  • 提供查詢一些Innodb buffer pool中的狀態資訊,該表中記錄的資訊與SHOW ENGINE INNODB STATUS輸出的資訊類似相同,另外,innodb buffer pool的一些狀態變數也提供了部分相同的值

  • 檢視該表需要有process許可權,該表為Memory引擎臨時表

6. InnoDB 層全文索引字典表

INNODB_FT_CONFIG:

  • 提供查詢有關InnoDB表的FULLTEXT索引和關聯的元資料資訊。查詢此表之前,需要先設定innodb_ft_aux_table='db_name/tb_name',db_name/tb_name為包含全文索引的表名和庫名。

  • 查詢該表的賬戶需要有PROCESS許可權,該表為Memory引擎臨時表

INNODB_FT_BEING_DELETED:

  • 該表僅在OPTIMIZE TABLE語句執行維護操作期間作為INNODB_FT_DELETED表的快照資料存放使用。執行OPTIMIZE TABLE語句時,會先清空INNODB_FT_BEING_DELETED表中的資料,儲存INNODB_FT_DELETED表中的快照資料到INNODB_FT_BEING_DELETED表,並從INNODB_FT_DELETED表中刪除DOC_ID。由於INNODB_FT_BEING_DELETED表中的內容通常生命週期較短,因此該表中的資料對於監控或者除錯來說用處並不大。

  • 表中預設不記錄資料,需要設定系統配置引數innodb_ft_aux_table=string(string表示db_name.tb_name字串),並建立好全文索引,設定好停用詞等。

  • 查詢該表的賬戶需要有PROCESS許可權,該表為Memory引擎臨時表

INNODB_FT_DELETED:

  • 提供查詢從InnoDB表的FULLTEXT索引中刪除的行資訊。它的存在是為了避免在InnoDB FULLTEXT索引的DML操作期間進行昂貴的索引重組操作,新刪除的全文索引中單詞的資訊將單獨儲存在該表中,在執行文字搜尋時從中過濾出搜尋結果,該表中的資訊僅在執行OPTIMIZE TABLE語句時清空。

  • 該表中的資訊預設不記錄,需要使用innodb_ft_aux_table選項(該選項預設值為空串)指定需要記錄哪個innodb引擎表的資訊,例如:test/test。

  • 查詢該表的賬戶需要有PROCESS許可權,該表為Memory引擎臨時表

INNODB_FT_DEFAULT_STOPWORD:

  • 該表為預設的全文索引停用詞表,提供查詢停用詞列表值。啟用停用詞表需要開啟引數innodb_ft_enable_stopword=ON,該引數預設為ON,啟用停用詞功能之後,如果innodb_ft_user_stopword_table選項(針對指定的innodb引擎表中的全文索引生效)自定義了停用詞庫表名稱值,則停用詞功能使用innodb_ft_user_stopword_table選項指定的停用詞表,如果innodb_ft_user_stopword_table選項未指定,而innodb_ft_server_stopword_table選項(針對所有的innodb引擎表中的全文索引生效)自定義了停用詞庫表名稱值,則同停用詞功能使用innodb_ft_server_stopword_table選項指定的停用詞表,如果innodb_ft_server_stopword_table選項也未指定,則使用預設的停用詞表,即INNODB_FT_DEFAULT_STOPWORD表。

  • 查詢該表需要賬戶有PROCESS許可權,該表為Memory引擎臨時表

INNODB_FT_INDEX_TABLE:

  • 提供查詢關於innodb表全文索引中用於反向文字查詢的倒排索引的分詞資訊。

  • 查詢該表的賬戶需要有PROCESS許可權,該表為Memory引擎臨時表

INNODB_FT_INDEX_CACHE:

  • 提供查詢包含FULLTEXT索引的innodb儲存引擎表中新插入行的全文索引標記資訊。它存在的目的是為了避免在DML操作期間進行昂貴的索引重組,新插入的全文索引的單詞的資訊被單獨儲存在該表中,直到對錶執行OPTIMIZE TABLE語句時、或者關閉伺服器時、或者當快取記憶體中存放的資訊大小超過了innodb_ft_cache_size或innodb_ft_total_cache_size系統配置引數指定的大小才會執行清理。預設不記錄資料,需要使用innodb_ft_aux_table系統配置引數指定需要記錄哪個表中的新插入行的全文索引資料。

  • 查詢該表的賬戶需要有PROCESS許可權,該表為Memory引擎臨時表

7. InnoDB 層壓縮相關字典表

INNODB_CMP和INNODB_CMP_RESET:

  • 這兩個表中的資料包含了與壓縮的InnoDB表頁有關的操作的狀態資訊。表中記錄的資料為測量資料庫中的InnoDb表壓縮的有效性提供參考。

  • 查詢表的使用者必須具有PROCESS許可權,該表為Memory引擎臨時表

INNODB_CMP_PER_INDEX和INNODB_CMP_PER_INDEX_RESET:

  • 這兩個表中記錄著InnoDB壓縮表資料和索引相關的操作狀態資訊,對資料庫、表、索引的每個組合使用不同的統計資訊,以便為評估特定表的壓縮效能和實用性提供參考資料。

  • 對於InnoDB壓縮表,會對錶中的資料和所有二級索引都進行壓縮。此時表中的資料被視為另一個索引(包含所有資料列的聚集索引)。

  • 注意:由於為每個索引收集單獨的度量值會導致效能大幅度降低,因此預設情況下不收集INNODB_CMP_PER_INDEX和INNODB_CMP_PER_INDEX_RESET表統計資訊。如果確有需要,啟用系統配置引數innodb_cmp_per_index_enabled即可(該配置引數為動態變數,預設為OFF)。

  • 查詢該表的賬戶需要有PROCESS許可權,該表為Memory引擎臨時表

INNODB_CMPMEM和INNODB_CMPMEM_RESET:

  • 這兩個表中記錄著InnoDB緩衝池中壓縮頁上的狀態資訊,為測量資料庫中InnoDB表壓縮的有效性提供參考

  • 查詢該表的賬戶需要有PROCESS許可權,該表為Memory引擎臨時表

 

本期內容就介紹到這裡,本期內容參考連結如下:

  • https://dev.mysql.com/doc/refman/5.7/en/information-schema.html

 

| 作者簡介

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

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