MySQL 8.0新特性-資料字典
歡迎關注MySQL 8.0必知必會系列課程。
MySQL8.0必知必會-自動化部署 https://edu.51cto.com/course/16368.html
MySQL8.0必知必會之引數標準化配置 https://edu.51cto.com/course/16358.html
1 主要內容
• 資料字典表
• 元資料檔案
• INFORMATION_SCHEMA的變化
• Innodb的變化-SDI
• 使用資料字典後的變化
• 資料字典的侷限性
2 資料字典表
2.1 在MySQL 8.0 以前的版本中
• 字典資料儲存在元資料檔案和非事務系統表中
• 儲存引擎 MyISAM innodb csv
• SELECT TABLE_SCHEMA,TABLE_NAME,ENGINE FROM information_schema.TABLES a WHERE a.TABLE_SCHEMA in ('mysql') order by 1,3;
2.2 MySQL 8.0
• 事務資料字典,資料庫物件的資訊儲存在事務表中。
• 儲存引擎 innodb
• 資料字典表是不可見的
• 無法讀取
• 不會出現在輸出中SHOW TABLES
• 未列在INFORMATION_SCHEMA.TABLES 表中
• 在大多數情況下INFORMATION_SCHEMA,可以查詢相應的表(名稱相同)。
• 從概念上講,INFORMATION_SCHEMA提供了一個MySQL公開資料字典元資料的檢視
2.3 檢視隱藏的Data Dictionary表
1) cmake編譯時,必須使用-DWITH_DEBUG=1
2) 設定debug引數
SET SESSION debug='+d,skip_dd_table_access_check’;
3) 查詢mysql.tables字典表
SELECT name, schema_id, hidden, type FROM mysql.tables where schema_id=1 AND hidden='System’;
4) 訪問字典表
SHOW CREATE TABLE mysql.catalogs\G
l 隱藏的資料字典表
l 開啟debug
l 未開啟debug
l 資料字典表
catalogs |
目錄資訊。 |
character_sets |
有關可用字符集的資訊。 |
collations |
有關每個字符集的排序規則的資訊。 |
column_statistics |
列值的直方圖統計資訊。 |
column_type_elements |
有關列使用的型別的資訊。 |
columns |
有關表中列的資訊。 |
dd_properties |
標識資料字典屬性(例如其版本)的表。伺服器使用它來確定是否必須將資料字典升級到較新的版本。 |
events |
有關事件計劃程式事件的資訊。 |
foreign_keys, foreign_key_column_usage |
有關外來鍵的資訊。 |
index_column_usage |
有關索引使用的列的資訊。 |
index_partitions |
有關索引使用的分割槽的資訊。 |
index_stats |
用於儲存ANALYZE TABLE執行時生成的動態索引統計資訊。 |
indexes |
有關表索引的資訊。 |
innodb_ddl_log |
儲存DDL日誌以進行崩潰安全的DDL操作。 |
parameter_type_elements |
有關儲存過程和函式引數的資訊,以及有關儲存函式的返回值的資訊。 |
parameters |
有關儲存過程和函式的資訊。 |
resource_groups |
有關資源組的資訊。 |
routines |
有關儲存過程和函式的資訊。 |
schemata |
有關schemata的資訊。該表提供了有關資料庫的資訊。 |
st_spatial_reference_systems |
有關空間資料的可用空間參考系統的資訊。 |
table_partition_values |
有關表分割槽使用的值的資訊。 |
table_partitions |
有關表使用的分割槽的資訊。 |
table_stats |
有關ANALYZE TABLE執行時生成的動態表統計資訊的資訊。 |
tables |
有關資料庫中表的資訊。 |
tablespace_files |
有關表空間使用的檔案的資訊。 |
tablespaces |
有關活動表空間的資訊。 |
triggers |
有關觸發器的資訊。 |
view_routine_usage |
有關檢視與它們使用的儲存函式之間的依賴關係的資訊。 |
view_table_usage |
用於跟蹤檢視及其基礎表之間的依賴關係。 |
3 元資料儲存
• 先前儲存在元資料檔案中的資料現在儲存在資料字典表
• 被刪除的元資料檔案
• .frm:表元資料檔案。
• .par:分割槽定義檔案。
• .TRN :觸發名稱空間檔案。
• .TRG :觸發器引數檔案。
• .isl:InnoDB符號連結檔案,包含在資料目錄外部建立的每表文件表空間檔案的位置。
• db.opt:資料庫配置檔案。
l isl 檔案
• Mysql 5.7.22
• create table test(a int) DIRECTORY=‘/home/mysql/’ ENGINE= innodb;
• Mysql 8.0.11
• create table test1(a int) DIRECTORY=‘/home/mysql/’ ENGINE= innodb;
4 資料儲存
• 字典資料儲存在innodb表
• 資料字典表和非資料字典系統表都儲存在mysql資料庫
• mysql.ibd
• 位於datadir目錄中
• 儲存資料庫字典表
• 只用於MySQL 資料字典資料
• 檔名字禁止修改,不能被其他表空使用
• 具備事務的特性
• commit
• rollback
• crash-recovery
5 字典物件快取
• 共享的全域性快取
• 將先前訪問的資料字典物件儲存在記憶體中,便於重用物件,減少磁碟I / O
• 使用 LRU的策略刪除最近最少使用的物件
• tablespace定義快取分割槽
• 儲存資料字典表空間定義物件
• tablespace_definition_cache
• 可以儲存在字典物件快取記憶體中的表空間定義物件數(已使用和未使用)的數量。
• 預設值為256。
• 0,表示僅儲存使用的表空間定義物件
• 當在用的表空間定義物件數量小於tablespace_definition_cache的值時,可以儲存未使用的表空間定義物件
6 INFORMATION_SCHEMA
6.1 資料字典表的檢視
• datadir下沒有information_schema目錄
• 直接從資料字典表獲取資訊,查詢效率更高
• 改進點:
• 查詢INFORMATION_SCHEMA表時,不建立臨時表
• 直接通過資料字典表獲取資料,不在通過目錄掃描(show databases,show tables)或檔案開啟(從frm讀取資訊)獲取資料。
• 允許使用索引構建有效的執行計劃
• 快取STATISTICS和 TABLES中的表統計資訊
6.2 執行計劃
EXPLAIN SELECT COLLATION_NAME FROM INFORMATION_SCHEMA.COLLATION_CHARACTER_SET_APPLICABILITY WHERE CHARACTER_SET_NAME = 'utf8mb4';
7 統計資訊
7.1 INFORMATION_SCHEMA表包含提供表統計資訊的列:
• STATISTICS.CARDINALITY
• TABLES.AUTO_INCREMENT
• TABLES.AVG_ROW_LENGTH
• TABLES.CHECKSUM
• TABLES.CHECK_TIME
• TABLES.CREATE_TIME
• TABLES.DATA_FREE
• TABLES.DATA_LENGTH
• TABLES.INDEX_LENGTH
• TABLES.MAX_DATA_LENGTH
• TABLES.TABLE_ROWS
• TABLES.UPDATE_TIME
• 統計資訊來源於mysql.index_stats、mysql.table_stats
• 快取的統計資訊有過期時間
• 快取的統計資訊不可用或已過期時,MySQL將從儲存引擎中檢索最新的統計資訊,並更新mysql.index_stats和 mysql.table_stats字典表。
• 查詢優先檢索快取的統計資訊,直到快取的統計資訊過期
7.2 以下情況不更新統計資訊:
• 快取統計資訊尚未過期時。
• information_schema_stats_expiry 設定為0。
• 當伺服器開啟read_only, super_read_only, transaction_read_only,或 innodb_read_only模式。
• 當查詢還需要獲取Performance Schema資料時。
• 手工更新給定表的快取值,請使用 ANALYZE TABLE
7.3 information_schema_stats_expiry
• 定義快取統計資訊到期時間段
• 單位:秒
• 預設值為86400秒(24小時) ,但時間段可以延長至一年。
• 0:要始終直接從儲存引擎檢索最新統計資訊並繞過快取值
• 會話變數
• 每個客戶端會話都可以定義自己的到期值。
• 從儲存引擎檢索並由一個會話快取的統計資訊可供其他會話使用。
8 序列化字典資訊(SDI)
8.1 元資料儲存的兩種方式:
• 資料字典表
• 序列化字典資訊(SDI)
• 不同儲存引擎SDI的儲存方式:
• Innodb儲存引擎:儲存在其表空間檔案中
• 其他儲存引擎: 將SDI資料儲存在對應schema目錄下.sdi檔案中
• SDI資料以緊湊JSON格式儲存
8.2 innodb
• 儲存在除臨時表空間和撤消表空間檔案之外的所有表空間檔案中
• 僅記錄了表空間中包含的表和表空間物件的描述。
• 僅通過表空間中的表上的DDL操作進行更新
• 單獨使用一個16K的索引頁,以壓縮的方式儲存SDI 資訊
• 提供了元資料冗餘。例如,如果資料字典變得不可用,則可以InnoDB 使用ibd2sdi工具直接從表空間檔案中提取物件元資料
• /usr/local/mysql8/bin/ibd2sdi --dump-file=test.sdi /mysqldb/db_vastdata8/data/sakila/city.ibd
9 使用資料字典後的變化
9.1 innodb_read_only
• 阻止所有儲存引擎的建立和刪除表操作
• 任何儲存引擎的表建立和刪除操作都會修改mysql系統資料庫中的資料字典表
• ANALYZE TABLE 失敗,因為它更新了表統計資訊,這些統計資訊儲存在資料字典中。
• ALTER TABLE tbl_name ENGINE=engine_name 失敗,因為它更新了儲存在資料字典中的儲存引擎名稱。
9.2 CREATE TABLE dst_tbl LIKE src_tbl
• 要求它 src_tbl是一個基表,如果它是一個INFORMATION_SCHEMA 資料字典表檢視的表,則會失敗。
• create table t like information_schema.tables;
9.3 mysqldump 和mysqlpump
• 只匯出該資料庫中的非資料字典表
• proc and event表不在使用
• 匯出routines and events時,必須使用--all-databases --routines --events
• --routines 需要select on *.*許可權
• 匯出routine and event 時,無法匯出creation and modification timestamps
• stored routine 建立時,如果包括非法字元,會直接報錯。以前的版本只是丟擲warning
10 資料字典的侷限性
• MySQL伺服器無法識別手動建立的資料庫目錄。
• 不支援在資料目錄下手動建立資料庫目錄(例如,使用mkdir)
• DDL操作耗時變長
• 不是單純的修改.frm檔案
• 需要寫入redo log和undo log
• [[email protected] data]$ mkdir zhumh