與不使用資料字典的伺服器相比,啟用資料字典的 MySQL 伺服器會產生一些操作上的差異。
先前,啟用
innodb_read_only系統變數只會防止InnoDB儲存引擎建立和刪除資料表。從 MySQL 9.0 開始,啟用innodb_read_only會防止所有儲存引擎執行這些操作。任何儲存引擎的資料表建立和刪除操作都會修改mysql系統資料庫中的資料字典資料表,但這些資料表使用InnoDB儲存引擎,而且在啟用innodb_read_only時無法修改。相同的原則適用於需要修改資料字典資料表的其他資料表操作。範例:ANALYZE TABLE失敗,因為它會更新資料表統計資料,這些資料儲存在資料字典中。ALTER TABLE失敗,因為它會更新儲存引擎指定,該指定儲存在資料字典中。tbl_nameENGINE=engine_name
注意啟用
innodb_read_only對於mysql系統資料庫中非資料字典資料表也有重要的影響。如需詳細資訊,請參閱innodb_read_only在 第 17.14 節,「InnoDB 啟動選項與系統變數」 中的描述。先前,
mysql系統資料庫中的資料表對於 DML 和 DDL 陳述式是可見的。從 MySQL 9.0 開始,資料字典資料表是不可見的,且無法直接修改或查詢。但是,在大多數情況下,有對應的INFORMATION_SCHEMA資料表可供查詢。這使得在伺服器開發進行時可以變更基礎的資料字典資料表,同時維持應用程式使用的穩定INFORMATION_SCHEMA介面。MySQL 9.0 中的
INFORMATION_SCHEMA資料表與資料字典密切相關,導致一些使用上的差異:先前,
INFORMATION_SCHEMA查詢STATISTICS和TABLES資料表中的資料表統計資料會直接從儲存引擎擷取統計資料。從 MySQL 9.0 開始,預設會使用快取的資料表統計資料。information_schema_stats_expiry系統變數定義快取的資料表統計資料過期前的時間段。預設值為 86400 秒(24 小時)。(若要隨時更新指定資料表的快取值,請使用ANALYZE TABLE。)如果沒有快取的統計資料或統計資料已過期,則在查詢資料表統計資料欄時,會從儲存引擎擷取統計資料。若要始終直接從儲存引擎擷取最新的統計資料,請將information_schema_stats_expiry設定為0。如需更多資訊,請參閱 第 10.2.3 節,「最佳化 INFORMATION_SCHEMA 查詢」。幾個
INFORMATION_SCHEMA資料表是資料字典資料表的檢視表,這使得最佳化工具可以使用這些基礎資料表上的索引。因此,根據最佳化工具的選擇,INFORMATION_SCHEMA查詢的結果列順序可能與先前的結果不同。如果查詢結果必須具有特定的列排序特性,請包含ORDER BY子句。查詢
INFORMATION_SCHEMA資料表可能會以與先前 MySQL 系列不同的字母大小寫傳回欄名稱。應用程式應以不區分大小寫的方式測試結果集欄名稱。如果這不可行,一個變通方法是在選取清單中使用欄別名,以傳回所需字母大小寫的欄名稱。例如:SELECT TABLE_SCHEMA AS table_schema, TABLE_NAME AS table_name FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'users';mysqldump 不再傾印
INFORMATION_SCHEMA資料庫,即使在命令列上明確指定也是如此。CREATE TABLE要求dst_tblLIKEsrc_tblsrc_tbl必須是基本資料表,如果它是資料字典資料表檢視表上的INFORMATION_SCHEMA資料表,則會失敗。先前,從
INFORMATION_SCHEMA資料表選取的欄的結果集標頭使用查詢中指定的大小寫。此查詢會產生一個標頭為table_name的結果集。SELECT table_name FROM INFORMATION_SCHEMA.TABLES;從 MySQL 9.0 開始,這些標頭會大寫;前面的查詢會產生一個標頭為
TABLE_NAME的結果集。如有必要,可以使用欄別名來達成不同的大小寫。例如:SELECT table_name AS 'table_name' FROM INFORMATION_SCHEMA.TABLES;
資料目錄會影響 mysqldump 如何從
mysql系統資料庫傾印資訊:mysqldump 只會傾印該資料庫中非資料字典資料表,而先前可以傾印
mysql系統資料庫中的所有資料表。先前,使用
--all-databases選項時,不需要--routines和--events選項來包含預存程序和事件:傾印會包含mysql系統資料庫,因此也包含包含預存程序和事件定義的proc和event資料表。從 MySQL 9.0 開始,不使用event和proc資料表。對應物件的定義儲存在資料字典資料表中,但這些資料表不會傾印。若要在使用--all-databases進行的傾印中包含預存程序和事件,請明確使用--routines和--events選項。先前,
--routines選項需要proc資料表的SELECT權限。從 MySQL 9.0 開始,不使用該資料表;--routines需要全域SELECT權限。先前,可以透過傾印
proc和event資料表,將預存程序和事件定義及其建立和修改時間戳記一起傾印。從 MySQL 9.0 開始,不使用這些資料表,因此無法傾印時間戳記。
先前,建立包含非法字元的預存程序會產生警告。從 MySQL 9.0 開始,這是一個錯誤。