什么是文件系統(tǒng)
我們知道像 InnoDB、MyIASM 這樣的存儲引擎都是把表存儲在磁盤上的(持久化)。當我們想讀取數(shù)據(jù)的時候,這些存儲引擎會從文件系統(tǒng)中把數(shù)據(jù)讀出來返回給我們, 當我們想寫入數(shù)據(jù)的時候,這些存儲引擎會把這些數(shù)據(jù)又寫回文件系統(tǒng)。
當然,MySQL除了存儲實際的數(shù)據(jù),還存儲了一系列其他的日志,在這些也屬于文件系統(tǒng)。
存儲引擎的落盤文件地址
使用客戶端與服務(wù)器建立連接之后查看這個系統(tǒng)變量的值就可以了:
show variables like 'datadir';
當然這個目錄可以通過配置文件進行修改,由我們自己進行指定。
磁盤文件中的內(nèi)容都是些什么
MySOL 在運行過程中都會產(chǎn)生哪些數(shù)據(jù)呢?當然會包含我們創(chuàng)建的數(shù)據(jù)庫、 表、視圖和觸發(fā)器等用戶數(shù)據(jù),除了這些用戶數(shù)據(jù),為了程序更好的運行,MySQL也會創(chuàng)建一些其他的額外數(shù)據(jù)。
數(shù)據(jù)庫Date目錄下的表信息
每當我們使用 CREATE DATABASE 語句創(chuàng)建一個數(shù)據(jù)庫的時候,在文件系統(tǒng)上實際發(fā)生了什么呢?其實很簡單,每個數(shù)據(jù)庫都對應(yīng)數(shù)據(jù)目錄下的一個子目錄, 或者說對應(yīng)一個文件夾,我們每當我們新建一個數(shù)據(jù)庫時,MySQL 會幫我們做這兩件事兒:
- 在數(shù)據(jù)目錄下創(chuàng)建一個和數(shù)據(jù)庫名同名的子目錄(或者說是文件夾)。
- 在該與數(shù)據(jù)庫名同名的子目錄下創(chuàng)建一個名為 db.opt 的文件,這個文件 中包含了該數(shù)據(jù)庫的各種屬性,比方說該數(shù)據(jù)庫的字符集和比較規(guī)則是個啥。 比方說我們查看一下在我的計算機上當前有哪些數(shù)據(jù)庫︰
可以看到在當前有 5 個數(shù)據(jù)庫,其中 mysqladv 數(shù)據(jù)庫是我們自定義的,其余 4 個數(shù)據(jù)庫是屬于 MySQL 自帶的系統(tǒng)數(shù)據(jù)庫。我們再看一下數(shù)據(jù)目錄下的內(nèi)容:
當然這個數(shù)據(jù)目錄下的文件和子目錄比較多,但是如果仔細看的話,除了 information_schema 這個系統(tǒng)數(shù)據(jù)庫外,其他的數(shù)據(jù)庫在數(shù)居目錄下都有對應(yīng)的 子目錄。這個 information_schema 比較特殊,我們后面再講它的作用。
InnoDB是如何存儲數(shù)據(jù)的
我們的InnoDB在添加一個數(shù)據(jù)庫,就會在日志根目錄中添加一個文件夾。
每一個文件夾中又存儲對應(yīng)的所有表數(shù)據(jù)。每一個表的數(shù)據(jù)一般根據(jù)以下兩種規(guī)則進行劃分:
表結(jié)構(gòu)的定義
我們以自己建立的study庫中的index_condition_pushdown表為例:
表結(jié)構(gòu)就是這些數(shù)據(jù),對應(yīng)存儲的文件名為:
表結(jié)構(gòu)就是該表的名稱是啥,表里邊有多少列,每個列的數(shù)據(jù)類型是啥,有啥約束條件和索引,用的是啥字符集和比較規(guī)則各種信息,這些信息都體現(xiàn)在了 我們的建表語句中了。為了保存這些信息,InnoDB 和 MyIASM 這兩種存儲引擎 都在數(shù)據(jù)目錄下對應(yīng)的數(shù)據(jù)庫子目錄下創(chuàng)建了一個專門用于描述表結(jié)構(gòu)的文件, 文件名是這樣:表名.frm
表中的數(shù)據(jù)
表所屬數(shù)據(jù)庫對應(yīng)的子目錄下創(chuàng)建一個表示該獨立表空間的文件,文件名和表名相同,只不過添加了一個.ibd 的擴展名而已,所以完整的文件名稱長這樣:表名.ibd。
MyISAM是如何存儲表數(shù)據(jù)的
在 MyISAM 中的數(shù)據(jù)和索引是分開存放的。所以在文件系統(tǒng)中也是使用不同的文件來存儲數(shù)據(jù)文件和索引文件。(相比于InnoDB中,ibd文件存儲了數(shù)據(jù)+索引,MyISAM再次進行了拆分)。
如圖,我們更換存儲引擎。
文件目錄更換為了上圖??梢院唵卫斫鉃閷nnoDB的.ibd文件進行了拆分,變?yōu)榱艘韵聝蓚€文件》
.MYD 代表表的數(shù)據(jù)文件。
.MYI 代表表的索引文件。
這里,也就總結(jié)除了InnoDB和MyISAM的一個重要區(qū)別。就是InnoDB的索引和數(shù)據(jù)都在一個文件夾中,而MyISAM則是將數(shù)據(jù)文件和索引文件分開存放在兩個文件中的。
日志文件
在服務(wù)器運行過程中,會產(chǎn)生各種各樣的日志,比如常規(guī)的查詢?nèi)罩尽㈠e誤日志、binlog日志、redo 日志、Undo 日志等等,日志文件記錄了影響 MySQL 數(shù)據(jù)庫的各種類型活動。 常見的日志文件有:錯誤日志(error log)、慢查詢?nèi)罩荆╯low query log)、 查詢?nèi)罩荆╭uery log)、二進制文件(bin log)。
錯誤日志
錯誤日志文件對 MySQL 的啟動、運行、關(guān)閉過程進行了記錄。遇到問題時 應(yīng)該首先查看該文件以便定位問題。該文件不僅記錄了所有的錯誤信息,也記錄一些警告信息或正確的信息用戶可以通過下面命令來查看錯誤日志文件的位置:
show variables like 'log_error'\G;
當 MySQL 不能正常啟動時,第一個必須查找的文件應(yīng)該就是錯誤日志文件, 該文件記錄了錯誤信息。
慢查詢?nèi)罩?/strong>
慢查詢?nèi)罩究梢詭椭ㄎ豢赡艽嬖趩栴}的 SQL 語句,從而進行 SQL 語句層面的優(yōu)化。
查詢?nèi)罩?/strong>
查詢?nèi)罩居涗浟怂袑?MySQL 數(shù)據(jù)庫請求的信息,無論這些請求是否得到了正確的執(zhí)行。
默認文件名:主機名.log
從 MySQL 5.1 開始,可以將查詢?nèi)罩镜挠涗浄湃?mysql 架構(gòu)下的 general_log表
二進制日志(binlog)
二進制日志記錄了對 MySQL 數(shù)據(jù)庫執(zhí)行更改的所有操作,若操作本身沒有 導(dǎo)致數(shù)據(jù)庫發(fā)生變化,該操作可能也會寫入二進制文件。但是不包括 select 和 show 這類操作(因為這些操作對數(shù)據(jù)本身不會進行修改)
binlog幾種作用
恢復(fù)(recovery)
某些數(shù)據(jù)的恢復(fù)需要二進制日志。
復(fù)制
其原理與恢復(fù)類似,通過復(fù)制和執(zhí)行二進制日志使一 臺遠程的 MySQL 數(shù)據(jù)庫(一般稱為 slave 或 standby)與一臺 MySQL 數(shù)據(jù)庫(一 般稱為 master 或 primary)進行實時同步。
審計(有點冷門,db負責)
用戶可以通過二進制日志中的信息來進行審計,判斷是否有對數(shù)據(jù)庫進行注入的攻擊。
總結(jié)
到此這篇關(guān)于Mysql文件存儲的文章就介紹到這了,更多相關(guān)Mysql文件存儲內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:- MySQL數(shù)據(jù)文件存儲位置的查看方法