MySQL8.0移除傳統(tǒng)的.frm文件原因及解讀
MySQL 8.0 移除傳統(tǒng)的 .frm
文件是為了解決舊架構(gòu)的局限性,并引入更高效、可靠的事務(wù)性數(shù)據(jù)字典。以下是主要原因和影響:
1. 數(shù)據(jù)一致性與事務(wù)性支持
- 舊問(wèn)題:
.frm
文件以文件形式存儲(chǔ)表結(jié)構(gòu),而 InnoDB 引擎的元數(shù)據(jù)存儲(chǔ)在系統(tǒng)表中(如INFORMATION_SCHEMA
)。這種分離可能導(dǎo)致元數(shù)據(jù)不一致(例如崩潰恢復(fù)時(shí))。 - 新方案:MySQL 8.0 將元數(shù)據(jù)統(tǒng)一存儲(chǔ)在 事務(wù)型數(shù)據(jù)字典(基于 InnoDB 表)中,確保元數(shù)據(jù)操作的原子性。DDL 操作(如
ALTER TABLE
)可完全支持事務(wù),失敗后自動(dòng)回滾,避免“中間狀態(tài)”問(wèn)題。
2. 性能優(yōu)化
- 舊問(wèn)題:每次訪問(wèn)表結(jié)構(gòu)需解析
.frm
文件(二進(jìn)制格式),涉及文件 I/O 和解析開(kāi)銷。 - 新方案:數(shù)據(jù)字典直接通過(guò) InnoDB 表(如
mysql.innodb_ddl_log
)存儲(chǔ)元數(shù)據(jù),利用 InnoDB 緩存(Buffer Pool)提高訪問(wèn)速度,減少文件系統(tǒng)操作。
3. 架構(gòu)簡(jiǎn)化與維護(hù)性
- 舊問(wèn)題:
.frm
文件獨(dú)立于存儲(chǔ)引擎,導(dǎo)致代碼復(fù)雜(如不同引擎需兼容.frm
解析)。 - 新方案:統(tǒng)一的數(shù)據(jù)字典簡(jiǎn)化了 MySQL 內(nèi)核與存儲(chǔ)引擎的交互,降低了代碼維護(hù)成本,支持更靈活的插件化架構(gòu)。
4. 增強(qiáng)的功能支持
- 原子 DDL:DDL 操作(如創(chuàng)建/刪除表)成為原子操作,崩潰后自動(dòng)恢復(fù),避免元數(shù)據(jù)殘留或損壞。
- 在線 DDL 改進(jìn):結(jié)合數(shù)據(jù)字典的事務(wù)特性,支持更復(fù)雜的在線表結(jié)構(gòu)變更,減少鎖爭(zhēng)用。
- 安全性增強(qiáng):元數(shù)據(jù)存儲(chǔ)在系統(tǒng)表空間,受 InnoDB 的 ACID 保護(hù),避免文件被誤刪或篡改。
5. 兼容性與升級(jí)
- 兼容性處理:MySQL 8.0 自動(dòng)將舊版
.frm
文件遷移到新數(shù)據(jù)字典,用戶無(wú)感知。 - 遺留問(wèn)題解決:舊版本中
.frm
文件與存儲(chǔ)引擎元數(shù)據(jù)不同步的問(wèn)題(如手動(dòng)復(fù)制表文件導(dǎo)致的錯(cuò)誤)得到根治。
對(duì)用戶的影響
- 正向影響:更高的可靠性(崩潰安全)、更快的元數(shù)據(jù)訪問(wèn)、更簡(jiǎn)單的維護(hù)。
- 注意事項(xiàng):直接操作文件系統(tǒng)(如手動(dòng)復(fù)制表文件)不再可靠,需通過(guò)標(biāo)準(zhǔn) SQL 接口管理元數(shù)據(jù)。
總結(jié)
移除 .frm
文件是 MySQL 向數(shù)據(jù)庫(kù)架構(gòu)演進(jìn)的關(guān)鍵一步,通過(guò)統(tǒng)一事務(wù)型數(shù)據(jù)字典解決了長(zhǎng)期存在的元數(shù)據(jù)管理痛點(diǎn),為后續(xù)功能(如即時(shí) DDL、多線程復(fù)制優(yōu)化)奠定了基礎(chǔ)。
這一變化提升了 MySQL 在云原生和高可用場(chǎng)景下的競(jìng)爭(zhēng)力。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- mysql通過(guò)frm和ibd文件恢復(fù)表_mysql5.7根據(jù).frm和.ibd文件恢復(fù)表結(jié)構(gòu)和數(shù)據(jù)
- MySQL InnoDB引擎ibdata文件損壞/刪除后使用frm和ibd文件恢復(fù)數(shù)據(jù)
- MySQL利用frm文件和ibd文件恢復(fù)表結(jié)構(gòu)和表數(shù)據(jù)
- 利用frm和ibd文件恢復(fù)mysql表數(shù)據(jù)的詳細(xì)過(guò)程
- mysql數(shù)據(jù)損壞,如何通過(guò)ibd和frm文件批量恢復(fù)數(shù)據(jù)庫(kù)數(shù)據(jù)
相關(guān)文章
在MySQL數(shù)據(jù)庫(kù)中使用C執(zhí)行SQL語(yǔ)句的方法
與PostgreSQL相似,可使用許多不同的語(yǔ)言來(lái)訪問(wèn)MySQL,包括C、C++、Java和Perl。從Professional Linux Programming中第5章有關(guān)MySQL的下列章節(jié)中,Neil Matthew和Richard Stones使用詳盡的MySQL C接口向我們介紹了如何在MySQL數(shù)據(jù)庫(kù)中執(zhí)行SQL語(yǔ)句。2012-10-10MySQL Innodb表導(dǎo)致死鎖日志情況分析與歸納
發(fā)現(xiàn)當(dāng)備份表格的sql語(yǔ)句與刪除該表部分?jǐn)?shù)據(jù)的sql語(yǔ)句同時(shí)運(yùn)行時(shí),mysql會(huì)檢測(cè)出死鎖,并打印出日志2012-12-12mysql利用group_concat()合并多行數(shù)據(jù)到一行
把查詢name字段得到的多行記錄進(jìn)行合并,可以通過(guò)程序?qū)崿F(xiàn),但也可直接在sql層完成,需要的朋友可以參考下2014-07-07mysql?使用join進(jìn)行多表關(guān)聯(lián)查詢的操作方法
在一些報(bào)表統(tǒng)計(jì)或數(shù)據(jù)展示時(shí)候需要提取的數(shù)據(jù)分布在多個(gè)表中,這個(gè)時(shí)候需要進(jìn)行join連表操作,join將兩個(gè)或多個(gè)表當(dāng)成不同的數(shù)據(jù)集合,然后進(jìn)行集合取交集運(yùn)算,這篇文章主要介紹了mysql?使用join進(jìn)行多表關(guān)聯(lián)查詢的操作方法,需要的朋友可以參考下2024-02-02MySQL子查詢中order by不生效問(wèn)題的解決方法
ORDER BY 語(yǔ)句用于根據(jù)指定的列對(duì)結(jié)果集進(jìn)行排序,在日常工作中經(jīng)常會(huì)用到,這篇文章主要給大家介紹了關(guān)于MySQL子查詢中order by不生效問(wèn)題的解決方法,需要的朋友可以參考下2021-07-07Mysql中的concat函數(shù)(拼接函數(shù))詳解
很多時(shí)候,我們需要將不同地方獲得的字符串拼接在一起,此時(shí)就需要使用CONCAT和CONCAT_WS函數(shù),這篇文章主要介紹了Mysql中的concat函數(shù)(拼接函數(shù)),需要的朋友可以參考下2023-02-02