Mysql文件存儲(chǔ)圖文詳解
什么是文件系統(tǒng)
我們知道像 InnoDB、MyIASM 這樣的存儲(chǔ)引擎都是把表存儲(chǔ)在磁盤上的(持久化)。當(dāng)我們想讀取數(shù)據(jù)的時(shí)候,這些存儲(chǔ)引擎會(huì)從文件系統(tǒng)中把數(shù)據(jù)讀出來返回給我們, 當(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è)目錄可以通過配置文件進(jìn)行修改,由我們自己進(jìn)行指定。
磁盤文件中的內(nèi)容都是些什么
MySOL 在運(yùn)行過程中都會(huì)產(chǎn)生哪些數(shù)據(jù)呢?當(dāng)然會(huì)包含我們創(chuàng)建的數(shù)據(jù)庫、 表、視圖和觸發(fā)器等用戶數(shù)據(jù),除了這些用戶數(shù)據(jù),為了程序更好的運(yùn)行,MySQL也會(huì)創(chuàng)建一些其他的額外數(shù)據(jù)。
數(shù)據(jù)庫Date目錄下的表信息
每當(dāng)我們使用 CREATE DATABASE 語句創(chuàng)建一個(gè)數(shù)據(jù)庫的時(shí)候,在文件系統(tǒng)上實(shí)際發(fā)生了什么呢?其實(shí)很簡(jiǎn)單,每個(gè)數(shù)據(jù)庫都對(duì)應(yīng)數(shù)據(jù)目錄下的一個(gè)子目錄, 或者說對(duì)應(yīng)一個(gè)文件夾,我們每當(dāng)我們新建一個(gè)數(shù)據(jù)庫時(shí),MySQL 會(huì)幫我們做這兩件事兒:
- 在數(shù)據(jù)目錄下創(chuàng)建一個(gè)和數(shù)據(jù)庫名同名的子目錄(或者說是文件夾)。
- 在該與數(shù)據(jù)庫名同名的子目錄下創(chuàng)建一個(gè)名為 db.opt 的文件,這個(gè)文件 中包含了該數(shù)據(jù)庫的各種屬性,比方說該數(shù)據(jù)庫的字符集和比較規(guī)則是個(gè)啥。 比方說我們查看一下在我的計(jì)算機(jī)上當(dāng)前有哪些數(shù)據(jù)庫︰
可以看到在當(dāng)前有 5 個(gè)數(shù)據(jù)庫,其中 mysqladv 數(shù)據(jù)庫是我們自定義的,其余 4 個(gè)數(shù)據(jù)庫是屬于 MySQL 自帶的系統(tǒng)數(shù)據(jù)庫。我們?cè)倏匆幌聰?shù)據(jù)目錄下的內(nèi)容:
當(dāng)然這個(gè)數(shù)據(jù)目錄下的文件和子目錄比較多,但是如果仔細(xì)看的話,除了 information_schema 這個(gè)系統(tǒng)數(shù)據(jù)庫外,其他的數(shù)據(jù)庫在數(shù)居目錄下都有對(duì)應(yīng)的 子目錄。這個(gè) information_schema 比較特殊,我們后面再講它的作用。
InnoDB是如何存儲(chǔ)數(shù)據(jù)的
我們的InnoDB在添加一個(gè)數(shù)據(jù)庫,就會(huì)在日志根目錄中添加一個(gè)文件夾。
每一個(gè)文件夾中又存儲(chǔ)對(duì)應(yīng)的所有表數(shù)據(jù)。每一個(gè)表的數(shù)據(jù)一般根據(jù)以下兩種規(guī)則進(jìn)行劃分:
表結(jié)構(gòu)的定義
我們以自己建立的study庫中的index_condition_pushdown表為例:
表結(jié)構(gòu)就是這些數(shù)據(jù),對(duì)應(yīng)存儲(chǔ)的文件名為:
表結(jié)構(gòu)就是該表的名稱是啥,表里邊有多少列,每個(gè)列的數(shù)據(jù)類型是啥,有啥約束條件和索引,用的是啥字符集和比較規(guī)則各種信息,這些信息都體現(xiàn)在了 我們的建表語句中了。為了保存這些信息,InnoDB 和 MyIASM 這兩種存儲(chǔ)引擎 都在數(shù)據(jù)目錄下對(duì)應(yīng)的數(shù)據(jù)庫子目錄下創(chuàng)建了一個(gè)專門用于描述表結(jié)構(gòu)的文件, 文件名是這樣:表名.frm
表中的數(shù)據(jù)
表所屬數(shù)據(jù)庫對(duì)應(yīng)的子目錄下創(chuàng)建一個(gè)表示該獨(dú)立表空間的文件,文件名和表名相同,只不過添加了一個(gè).ibd 的擴(kuò)展名而已,所以完整的文件名稱長這樣:表名.ibd。
MyISAM是如何存儲(chǔ)表數(shù)據(jù)的
在 MyISAM 中的數(shù)據(jù)和索引是分開存放的。所以在文件系統(tǒng)中也是使用不同的文件來存儲(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ù)文件和索引文件分開存放在兩個(gè)文件中的。
日志文件
在服務(wù)器運(yùn)行過程中,會(huì)產(chǎn)生各種各樣的日志,比如常規(guī)的查詢?nèi)罩?、錯(cuò)誤日志、binlog日志、redo 日志、Undo 日志等等,日志文件記錄了影響 MySQL 數(shù)據(jù)庫的各種類型活動(dòng)。 常見的日志文件有:錯(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)閉過程進(jìn)行了記錄。遇到問題時(shí) 應(yīng)該首先查看該文件以便定位問題。該文件不僅記錄了所有的錯(cuò)誤信息,也記錄一些警告信息或正確的信息用戶可以通過下面命令來查看錯(cuò)誤日志文件的位置:
show variables like 'log_error'\G;
當(dāng) MySQL 不能正常啟動(dòng)時(shí),第一個(gè)必須查找的文件應(yīng)該就是錯(cuò)誤日志文件, 該文件記錄了錯(cuò)誤信息。
慢查詢?nèi)罩?/strong>
慢查詢?nèi)罩究梢詭椭ㄎ豢赡艽嬖趩栴}的 SQL 語句,從而進(jìn)行 SQL 語句層面的優(yōu)化。
查詢?nèi)罩?/strong>
查詢?nèi)罩居涗浟怂袑?duì) MySQL 數(shù)據(jù)庫請(qǐng)求的信息,無論這些請(qǐng)求是否得到了正確的執(zhí)行。
默認(rèn)文件名:主機(jī)名.log
從 MySQL 5.1 開始,可以將查詢?nèi)罩镜挠涗浄湃?mysql 架構(gòu)下的 general_log表
二進(jìn)制日志(binlog)
二進(jìn)制日志記錄了對(duì) MySQL 數(shù)據(jù)庫執(zhí)行更改的所有操作,若操作本身沒有 導(dǎo)致數(shù)據(jù)庫發(fā)生變化,該操作可能也會(huì)寫入二進(jìn)制文件。但是不包括 select 和 show 這類操作(因?yàn)檫@些操作對(duì)數(shù)據(jù)本身不會(huì)進(jìn)行修改)
binlog幾種作用
恢復(fù)(recovery)
某些數(shù)據(jù)的恢復(fù)需要二進(jìn)制日志。
復(fù)制
其原理與恢復(fù)類似,通過復(fù)制和執(zhí)行二進(jìn)制日志使一 臺(tái)遠(yuǎn)程的 MySQL 數(shù)據(jù)庫(一般稱為 slave 或 standby)與一臺(tái) MySQL 數(shù)據(jù)庫(一 般稱為 master 或 primary)進(jìn)行實(shí)時(shí)同步。
審計(jì)(有點(diǎn)冷門,db負(fù)責(zé))
用戶可以通過二進(jìn)制日志中的信息來進(jìn)行審計(jì),判斷是否有對(duì)數(shù)據(jù)庫進(jìn)行注入的攻擊。
總結(jié)
到此這篇關(guān)于Mysql文件存儲(chǔ)的文章就介紹到這了,更多相關(guān)Mysql文件存儲(chǔ)內(nèi)容請(qǐng)搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。