Mysql文件存儲(chǔ)圖文詳解
什么是文件系統(tǒng)
我們知道像 InnoDB、MyIASM 這樣的存儲(chǔ)引擎都是把表存儲(chǔ)在磁盤上的(持久化)。當(dāng)我們想讀取數(shù)據(jù)的時(shí)候,這些存儲(chǔ)引擎會(huì)從文件系統(tǒng)中把數(shù)據(jù)讀出來(lái)返回給我們, 當(dāng)我們想寫入數(shù)據(jù)的時(shí)候,這些存儲(chǔ)引擎會(huì)把這些數(shù)據(jù)又寫回文件系統(tǒng)。
當(dāng)然,MySQL除了存儲(chǔ)實(shí)際的數(shù)據(jù),還存儲(chǔ)了一系列其他的日志,在這些也屬于文件系統(tǒng)。
存儲(chǔ)引擎的落盤文件地址
使用客戶端與服務(wù)器建立連接之后查看這個(gè)系統(tǒng)變量的值就可以了:
show variables like 'datadir';

當(dāng)然這個(gè)目錄可以通過(guò)配置文件進(jìn)行修改,由我們自己進(jìn)行指定。
磁盤文件中的內(nèi)容都是些什么
MySOL 在運(yùn)行過(guò)程中都會(huì)產(chǎn)生哪些數(shù)據(jù)呢?當(dāng)然會(huì)包含我們創(chuàng)建的數(shù)據(jù)庫(kù)、 表、視圖和觸發(fā)器等用戶數(shù)據(jù),除了這些用戶數(shù)據(jù),為了程序更好的運(yùn)行,MySQL也會(huì)創(chuàng)建一些其他的額外數(shù)據(jù)。
數(shù)據(jù)庫(kù)Date目錄下的表信息
每當(dāng)我們使用 CREATE DATABASE 語(yǔ)句創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)的時(shí)候,在文件系統(tǒng)上實(shí)際發(fā)生了什么呢?其實(shí)很簡(jiǎn)單,每個(gè)數(shù)據(jù)庫(kù)都對(duì)應(yīng)數(shù)據(jù)目錄下的一個(gè)子目錄, 或者說(shuō)對(duì)應(yīng)一個(gè)文件夾,我們每當(dāng)我們新建一個(gè)數(shù)據(jù)庫(kù)時(shí),MySQL 會(huì)幫我們做這兩件事兒:
- 在數(shù)據(jù)目錄下創(chuàng)建一個(gè)和數(shù)據(jù)庫(kù)名同名的子目錄(或者說(shuō)是文件夾)。
- 在該與數(shù)據(jù)庫(kù)名同名的子目錄下創(chuàng)建一個(gè)名為 db.opt 的文件,這個(gè)文件 中包含了該數(shù)據(jù)庫(kù)的各種屬性,比方說(shuō)該數(shù)據(jù)庫(kù)的字符集和比較規(guī)則是個(gè)啥。 比方說(shuō)我們查看一下在我的計(jì)算機(jī)上當(dāng)前有哪些數(shù)據(jù)庫(kù)︰

可以看到在當(dāng)前有 5 個(gè)數(shù)據(jù)庫(kù),其中 mysqladv 數(shù)據(jù)庫(kù)是我們自定義的,其余 4 個(gè)數(shù)據(jù)庫(kù)是屬于 MySQL 自帶的系統(tǒng)數(shù)據(jù)庫(kù)。我們?cè)倏匆幌聰?shù)據(jù)目錄下的內(nèi)容:

當(dāng)然這個(gè)數(shù)據(jù)目錄下的文件和子目錄比較多,但是如果仔細(xì)看的話,除了 information_schema 這個(gè)系統(tǒng)數(shù)據(jù)庫(kù)外,其他的數(shù)據(jù)庫(kù)在數(shù)居目錄下都有對(duì)應(yīng)的 子目錄。這個(gè) information_schema 比較特殊,我們后面再講它的作用。
InnoDB是如何存儲(chǔ)數(shù)據(jù)的
我們的InnoDB在添加一個(gè)數(shù)據(jù)庫(kù),就會(huì)在日志根目錄中添加一個(gè)文件夾。

每一個(gè)文件夾中又存儲(chǔ)對(duì)應(yīng)的所有表數(shù)據(jù)。每一個(gè)表的數(shù)據(jù)一般根據(jù)以下兩種規(guī)則進(jìn)行劃分:
表結(jié)構(gòu)的定義
我們以自己建立的study庫(kù)中的index_condition_pushdown表為例:


表結(jié)構(gòu)就是這些數(shù)據(jù),對(duì)應(yīng)存儲(chǔ)的文件名為:

表結(jié)構(gòu)就是該表的名稱是啥,表里邊有多少列,每個(gè)列的數(shù)據(jù)類型是啥,有啥約束條件和索引,用的是啥字符集和比較規(guī)則各種信息,這些信息都體現(xiàn)在了 我們的建表語(yǔ)句中了。為了保存這些信息,InnoDB 和 MyIASM 這兩種存儲(chǔ)引擎 都在數(shù)據(jù)目錄下對(duì)應(yīng)的數(shù)據(jù)庫(kù)子目錄下創(chuàng)建了一個(gè)專門用于描述表結(jié)構(gòu)的文件, 文件名是這樣:表名.frm
表中的數(shù)據(jù)
表所屬數(shù)據(jù)庫(kù)對(duì)應(yīng)的子目錄下創(chuàng)建一個(gè)表示該獨(dú)立表空間的文件,文件名和表名相同,只不過(guò)添加了一個(gè).ibd 的擴(kuò)展名而已,所以完整的文件名稱長(zhǎng)這樣:表名.ibd。

MyISAM是如何存儲(chǔ)表數(shù)據(jù)的
在 MyISAM 中的數(shù)據(jù)和索引是分開(kāi)存放的。所以在文件系統(tǒng)中也是使用不同的文件來(lái)存儲(chǔ)數(shù)據(jù)文件和索引文件。(相比于InnoDB中,ibd文件存儲(chǔ)了數(shù)據(jù)+索引,MyISAM再次進(jìn)行了拆分)。

如圖,我們更換存儲(chǔ)引擎。

文件目錄更換為了上圖。可以簡(jiǎn)單理解為將InnoDB的.ibd文件進(jìn)行了拆分,變?yōu)榱艘韵聝蓚€(gè)文件》
.MYD 代表表的數(shù)據(jù)文件。
.MYI 代表表的索引文件。
這里,也就總結(jié)除了InnoDB和MyISAM的一個(gè)重要區(qū)別。就是InnoDB的索引和數(shù)據(jù)都在一個(gè)文件夾中,而MyISAM則是將數(shù)據(jù)文件和索引文件分開(kāi)存放在兩個(gè)文件中的。
日志文件
在服務(wù)器運(yùn)行過(guò)程中,會(huì)產(chǎn)生各種各樣的日志,比如常規(guī)的查詢?nèi)罩?、錯(cuò)誤日志、binlog日志、redo 日志、Undo 日志等等,日志文件記錄了影響 MySQL 數(shù)據(jù)庫(kù)的各種類型活動(dòng)。 常見(jiàn)的日志文件有:錯(cuò)誤日志(error log)、慢查詢?nèi)罩荆╯low query log)、 查詢?nèi)罩荆╭uery log)、二進(jìn)制文件(bin log)。
錯(cuò)誤日志
錯(cuò)誤日志文件對(duì) MySQL 的啟動(dòng)、運(yùn)行、關(guān)閉過(guò)程進(jìn)行了記錄。遇到問(wèn)題時(shí) 應(yīng)該首先查看該文件以便定位問(wèn)題。該文件不僅記錄了所有的錯(cuò)誤信息,也記錄一些警告信息或正確的信息用戶可以通過(guò)下面命令來(lái)查看錯(cuò)誤日志文件的位置:
show variables like 'log_error'\G;

當(dāng) MySQL 不能正常啟動(dòng)時(shí),第一個(gè)必須查找的文件應(yīng)該就是錯(cuò)誤日志文件, 該文件記錄了錯(cuò)誤信息。
慢查詢?nèi)罩?/strong>
慢查詢?nèi)罩究梢詭椭ㄎ豢赡艽嬖趩?wèn)題的 SQL 語(yǔ)句,從而進(jìn)行 SQL 語(yǔ)句層面的優(yōu)化。
查詢?nèi)罩?/strong>
查詢?nèi)罩居涗浟怂袑?duì) MySQL 數(shù)據(jù)庫(kù)請(qǐng)求的信息,無(wú)論這些請(qǐng)求是否得到了正確的執(zhí)行。
默認(rèn)文件名:主機(jī)名.log

從 MySQL 5.1 開(kāi)始,可以將查詢?nèi)罩镜挠涗浄湃?mysql 架構(gòu)下的 general_log表

二進(jìn)制日志(binlog)

二進(jìn)制日志記錄了對(duì) MySQL 數(shù)據(jù)庫(kù)執(zhí)行更改的所有操作,若操作本身沒(méi)有 導(dǎo)致數(shù)據(jù)庫(kù)發(fā)生變化,該操作可能也會(huì)寫入二進(jìn)制文件。但是不包括 select 和 show 這類操作(因?yàn)檫@些操作對(duì)數(shù)據(jù)本身不會(huì)進(jìn)行修改)
binlog幾種作用
恢復(fù)(recovery)
某些數(shù)據(jù)的恢復(fù)需要二進(jìn)制日志。
復(fù)制
其原理與恢復(fù)類似,通過(guò)復(fù)制和執(zhí)行二進(jìn)制日志使一 臺(tái)遠(yuǎn)程的 MySQL 數(shù)據(jù)庫(kù)(一般稱為 slave 或 standby)與一臺(tái) MySQL 數(shù)據(jù)庫(kù)(一 般稱為 master 或 primary)進(jìn)行實(shí)時(shí)同步。
審計(jì)(有點(diǎn)冷門,db負(fù)責(zé))
用戶可以通過(guò)二進(jìn)制日志中的信息來(lái)進(jìn)行審計(jì),判斷是否有對(duì)數(shù)據(jù)庫(kù)進(jìn)行注入的攻擊。
總結(jié)
到此這篇關(guān)于Mysql文件存儲(chǔ)的文章就介紹到這了,更多相關(guān)Mysql文件存儲(chǔ)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mysql kill進(jìn)程后出現(xiàn)killed死鎖問(wèn)題及解決
這篇文章主要介紹了mysql kill進(jìn)程后出現(xiàn)killed死鎖問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01
數(shù)據(jù)庫(kù)SQL SELECT查詢的工作原理
今天小編就為大家分享一篇關(guān)于數(shù)據(jù)庫(kù)SQL SELECT查詢的工作原理,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-03-03
mysql數(shù)據(jù)庫(kù)卡頓問(wèn)題排查過(guò)程
介紹了四種排查數(shù)據(jù)庫(kù)問(wèn)題的方法,包括查看SQL運(yùn)行情況、庫(kù)和表信息、數(shù)據(jù)庫(kù)配置情況以及重啟數(shù)據(jù)庫(kù),每種方法都有具體的操作步驟和注意事項(xiàng),旨在幫助讀者解決數(shù)據(jù)庫(kù)資源不足、死鎖等問(wèn)題2025-02-02
Linux服務(wù)器中MySQL遠(yuǎn)程連接的開(kāi)啟方法
今天在Linux服務(wù)器上安裝了msyql數(shù)據(jù)庫(kù),在本地訪問(wèn)的時(shí)候可以訪問(wèn),但是我想通過(guò)遠(yuǎn)程的方式訪問(wèn)的時(shí)候就不能訪問(wèn)了,查詢資料后發(fā)現(xiàn),Linux下MySQL默認(rèn)安裝完成后只有本地訪問(wèn)的權(quán)限,沒(méi)有遠(yuǎn)程訪問(wèn)的權(quán)限,需要你給指定用戶設(shè)置訪問(wèn)權(quán)限才能遠(yuǎn)程訪問(wèn)該數(shù)據(jù)庫(kù)2017-06-06
mysql 操作數(shù)據(jù)庫(kù)基礎(chǔ)詳解
這篇文章主要介紹了mysql 操作數(shù)據(jù)庫(kù)基礎(chǔ)詳解,MySQL是一種關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),關(guān)系數(shù)據(jù)庫(kù)將數(shù)據(jù)保存在不同的表中,而不是將所有數(shù)據(jù)放在一個(gè)大倉(cāng)庫(kù)內(nèi),這樣就增加了速度并提高了靈活性2022-08-08

