使用已啟用資料字典的 MySQL 伺服器,與沒有資料字典的伺服器相比,會有一些操作上的差異
先前,啟用
innodb_read_only系統變數只會阻止InnoDB儲存引擎建立和刪除表格。從 MySQL 8.4 開始,啟用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 8.4 開始,資料字典表格是不可見的,且無法直接修改或查詢。但是,在大多數情況下,都有相對應的INFORMATION_SCHEMA表格可以替代查詢。這使得底層的資料字典表格可以在伺服器開發過程中進行變更,同時維持一個穩定的INFORMATION_SCHEMA介面供應用程式使用。MySQL 8.4 中的
INFORMATION_SCHEMA表格與資料字典緊密連結,導致了一些使用上的差異先前,針對
STATISTICS和TABLES表格的INFORMATION_SCHEMA查詢直接從儲存引擎擷取統計資料。從 MySQL 8.4 開始,預設使用快取的表格統計資料。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 8.4 開始,這些標頭會以大寫字母表示;先前的查詢會產生一個標頭為
TABLE_NAME的結果集。如有必要,可以使用欄位別名來達到不同的大小寫。例如SELECT table_name AS 'table_name' FROM INFORMATION_SCHEMA.TABLES;
資料目錄會影響 mysqldump 從
mysql系統資料庫轉儲資訊的方式mysqldump 只會轉儲該資料庫中非資料字典的表格,而先前可以轉儲
mysql系統資料庫中的所有表格。先前,當使用
--all-databases選項時,不需要--routines和--events選項來包含儲存的常式和事件:轉儲包含mysql系統資料庫,因此也包含包含儲存的常式和事件定義的proc和event表格。從 MySQL 8.4 開始,不再使用event和proc表格。相對應物件的定義儲存在資料字典表格中,但這些表格不會被轉儲。若要將使用--all-databases進行的轉儲中包含儲存的常式和事件,請明確使用--routines和--events選項。先前,
--routines選項需要proc表格的SELECT權限。從 MySQL 8.4 開始,不再使用該表格;--routines需要全域SELECT權限來代替。先前,可以透過轉儲
proc和event表格來轉儲儲存的常式和事件定義及其建立和修改時間戳記。從 MySQL 8.4 開始,不再使用這些表格,因此無法轉儲時間戳記。
先前,建立包含非法字元的儲存常式會產生警告。從 MySQL 8.4 開始,這會是一個錯誤。