歡迎關注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
• 數據字典表是不可見的
• 無法讀取 SELECT
• 不會出現在輸出中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
• [mysql@localhost data]$ mkdir zhumh