天天看點

MySQL深度探險(一)-- MySQL 實體檔案組成一 日志檔案二  資料檔案三 Replication 相關檔案四 其他檔案

一 日志檔案

1、錯誤日志:Error Log

錯誤日志記錄了MyQL Server運作過程中所有較為嚴重的警告和錯誤資訊,以及MySQL

Server 每次啟動和關閉的詳細資訊。在預設情況下,系統記錄錯誤日志的功能是關閉的, 錯誤資訊被輸出到标準錯誤輸出(stderr) ,如果要開啟系統記錄錯誤日志的功能,需要在 啟動時開啟-log-error 選項。錯誤日志的預設存放位置在資料目錄下,以hostname.err 命 名。但是可以使用指令:--log-error[=file_name],修改其存放目錄和檔案名。

為了友善維護需要, 有時候會希望将錯誤日志中的内容做備份并重新開始記錄, 這候時 就可以利用 MySQL 的 FLUSH LOGS 指令來告訴 MySQL 備份舊日志檔案并生成新的日志檔案。 備份檔案名以“.old”結尾。

2、二進制日志:Binary Log & Binary Log Index

二進制日志,也就是我們常說的 binlog,也是 MySQL Server 中最為重要的日志之一。

當我們通過“--log-bin[=file_name]”打開了記錄的功能之後,MySQL 會将所有修改資料 庫資料的 query 以二進制形式記錄到日志檔案中。 當然, 日志中并不僅限于query 語句這麼 簡單, 還包括每一條query 所執行的時間, 所消耗的資源, 以及相關的事務資訊,bi所nl以og 是事務安全的。

和錯誤日志一樣,binlog 記錄功能同樣需要“--log-bin[=file_name]”參數的顯式指 定才能開啟, 如果未指定file_name, 則會在資料目錄下記錄為mysql-bin.****** (*代表0~ 9 之間的某一個數字,來表示該日志的序号) 。

binlog 還有其他一些附加選項參數:

“--max_binlog_size”設定 binlog 的最大存儲上限,當日志達到該上限時,MySQL 會 重新建立一個日志開始繼續記錄。不過偶爾也有超出該設定的binlog 産生,一般都是因為 在即将達到上限時,産生了一個較大的事務,為了保證事務安全,MySQL 不會将同一個事務 分開記錄到兩個 binlog 中。

“--binlog-do-db=db_name”參數明确告訴 MySQL,需要對某個(db_name)資料庫記 錄 binlog,如果有了“--binlog-do-db=db_name”參數的顯式指定,MySQL 會忽略針對其他 資料庫執行的 query,而僅僅記錄針對指定資料庫執行的query。

“--binlog-ignore-db=db_name”與“--binlog-do-db=db_name”完全相反, 它顯式指 定忽略某個(db_name)資料庫的binlog 記錄,當指定了這個參數之後,MySQL 會記錄指定 資料庫以外所有的資料庫的 binlog。

“--binlog-ignore-db=db_name”與“--binlog-do-db=db_name”兩個參數有一個共同 的概念需要大家了解清楚,參數中的db_name 不是指 query 語句更新的資料所在的資料庫, 而是執行 query 的時候目前所處的資料庫。 不論更新哪個資料庫的資料,MySQL 僅僅比較當 前連接配接所處的資料庫(通過use db_name切換後所在的資料庫)與參數設定的資料庫名,而 不會分析 query 語句所更新資料所在的資料庫。

mysql-bin.index 檔案(binary log index)的功能是記錄所有Binary Log的絕對路 徑,保證 MySQL 各種線程能夠順利的根據它找到所有需要的Binary Log 檔案。

3、更新日志:update log

更新日志是 MySQL 在較老的版本上使用的,其功能和 binlog 基本類似,隻不過不是以

二進制格式來記錄而是以簡單的文本格式記錄内容。自從 MySQL增加了binlog功能之後, 就很少使用更新日志了。從版本5.0 開始,MySQL 已經不再支援更新日志了。

4、查詢日志:query log

查詢日志記錄 MySQL 中所有的 query,通過“--log[=fina_name]”來打開該功能。由

于記錄了所有的 query,包括所有的 select,體積比較大,開啟後對性能也有較大的影響, 是以請大家慎用該功能。 一般隻用于跟蹤某些特殊的sql 性能問題才會短暫打開該功能。默 認的查詢日志檔案名為 hostname.log。

5、慢查詢日志:slow query log

顧名思義,慢查詢日志中記錄的是執行時間較長的 query,也就是我們常說的 slow

query,通過設 --log-slow-queries[=file_name]來打開該功能并設定記錄位置和檔案名, 預設檔案名為 hostname-slow.log,預設目錄也是資料目錄。

慢查詢日志采用的是簡單的文本格式, 可以通過各種文本編輯器檢視其中的内容。中其 記錄了語句執行的時刻,執行所消耗的時間,執行使用者,連接配接主機等相關資訊。MySQL 還提 供了專門用來分析滿查詢日志的工具程式mysqlslowdump, 用來幫助資料庫管理人員解決可 能存在的性能問題。

6、Innodb 的線上 redo 日志:innodb redo log

Innodb 是一個事務安全的存儲引擎, 其事務安全性主要就是通過線上redo 日志和記錄

在表空間中的 undo 資訊來保證的。redo 日志中記錄了 Innodb 所做的所有實體變更和事務 資訊, 通過redo 日志和 undo 資訊, Innodb 保證了在任何情況下的事務安全性。Innodb 的redo 日志同樣預設存放在資料目錄下, 可以通過innodb_log_group_home_dir來更改設定日志的 存放位置,通過 innodb_log_files_in_group 設定日志的數量。

二  資料檔案

在 MySQL 中每一個資料庫都會在定義好 (或者預設) 的資料目錄下存在一個以資料名庫 字命名的檔案夾, 用來存放該資料庫中各種表資料檔案。 不同的MySQL 存儲引擎有各自不同 的資料檔案,存放位置也有差別。多數存儲引擎的資料檔案都存放在和MyISAM 資料檔案位 置相同的目錄下,但是每個資料檔案的擴充名卻各不一樣。如MyISAM 用“.MYD”作為擴充 名,Innodb 用“.ibd”,Archive 用“.arc”,CSV 用“.csv”,等等。

1、“.frm”檔案 與表相關的中繼資料(meta)資訊都存放在“.frm”檔案中,包括表結構的定義資訊等。

不論是什麼存儲引擎, 每一個表都會有一個以表名命名的“.frm”檔案。 所有的“.frm”文 件都存放在所屬資料庫的檔案夾下面。

2、“.MYD”檔案

“.MYD”檔案是 MyISAM 存儲引擎專用,存放 MyISAM 表的資料。每一個 MyISAM 表都會 有一個“.MYD”檔案與之對應, 同樣存放于所屬資料庫的檔案夾下,“和.frm”檔案在一起。

3、“.MYI”檔案

“.MYI”檔案也是專屬于 MyISAM 存儲引擎的, 主要存放MyISAM 表的索引相關資訊。對

于 MyISAM 存儲來說,可以被cache 的内容主要就是來源于“.MYI”檔案中。每一個MyISAM 表對應一個“.MYI”檔案,存放于位置和“.frm”以及“.MYD”一樣。

4、“.ibd”檔案和 ibdata 檔案

這兩種檔案都是存放 Innodb 資料的檔案, 之是以有兩種檔案來存放Innodb 的資料 (包

括索引) , 是因為Innodb 的資料存儲方式能夠通過配置來決定是使用共享表空間存放存儲數 據, 還是獨享表空間存放存儲資料。 獨享表空間存儲方式使用“.ibd”檔案來存放資料,且 每個表一個“.ibd”檔案,檔案存放在和 MyISAM 資料相同的位置。如果選用共享存儲表空 間來存放資料,則會使用 ibdata 檔案來存放,所有表共同使用一個(或者多個,可自行配 置)ibdata 檔案。ibdata 檔案可以通過 innodb_data_home_dir 和 innodb_data_file_path 兩個參數共同配置組成, innodb_data_home_dir 配置資料存放的總目錄,而 innodb_data_file_path 配置每一個檔案的名稱。當然,也可以不配置

innodb_data_home_dir 而直接在 innodb_data_file_path 參數配置的時候使用絕對路徑來 完成配置。innodb_data_file_path 中可以一次配置多個 ibdata 檔案。檔案可以是指定大 小, 也可以是自動擴充的, 但是Innodb 限制了僅僅隻有最後一個 ibdata 檔案能夠配置成自 動擴充類型。 當我們需要添加新的ibdata 檔案的時候, 隻能添加在innodb_data_file_path 配置的最後,而且必須重新開機 MySQL 才能完成 ibdata 的添加工作。不過如果我們使用獨享表 空間存儲方式的話, 就不會有這樣的問題, 但是如果要使用裸裝置的話, 每個表一個備裸,設 可能造成裸裝置數量非常大, 而且不太容易控制大小, 實作比較困難, 而共享表空間卻會不 有這個問題,容易控制裸裝置數量。我個人還是更傾向于使用獨享表空間存儲方式。當然, 兩種方式各有利弊,看大家各自應用環境的側重點在那裡了。

上面僅僅介紹了兩種最常用存儲引擎的資料檔案, 此外其他各種存儲引擎都有各自數的 據檔案,讀者朋友可以自行建立某個存儲引擎的表做一個簡單的測試,做更多的了解。

三 Replication 相關檔案

1、master.info 檔案:

master.info 檔案存在于 Slave 端的資料目錄下,裡面存放了該 Slave 的 Master 端的

相關資訊,包括 Master 的主機位址,連接配接使用者,連接配接密碼,連接配接端口,目前日志位置,已 經讀取到的日志位置等資訊。

2、relay log 和 relay log index

mysql-relay-bin.xxxxxn 檔案用于存放 Slave 端的 I/O 線程從 Master 端所讀取到

的 Binary Log 資訊,然後由 Slave 端的 SQL 線程從該 relay log 中讀取并解析相應的 日志資訊,轉化成 Master 所執行的 SQL 語句,然後在 Slave 端應用。

mysql-relay-bin.index 檔案的功能類似于 mysql-bin.index ,同樣是記錄日志的存

放位置的絕對路徑,隻不過他所記錄的不是 Binary Log,而是 Relay Log。

3、relay-log.info 檔案:

類似于 master.info, 它存放通過Slave 的 I/O 線程寫入到本地的 relay log 的相關信

息。供 Slave 端的 SQL 線程以及某些管理操作随時能夠擷取目前複制的相關資訊。

四 其他檔案

1、system config file

MySQL 的系統配置檔案一般都是“my.cnf”,Unix/Linux 下預設存放在"/etc"目錄下, Windows 環境一般存放在“c:/windows”目錄下面。 “my.cnf”檔案中包含多種參數選項組 (group) , 每一種參數組都通過中括号給定了固定的組名, 如 “[mysqld]”組中包括了 mysqld

服務啟動時候的初始化參數,“[client]”組中包含着用戶端工具程式可以讀取的參數,此 外還有其他針對于各個用戶端軟體的特定參數組, 如mysql 程式使用的 “[mysql]”,mysqlchk 使用的“[mysqlchk]”,等等。如果讀者朋友自己編寫了某個用戶端程式,也可以自己設定 一個參數組名, 将相關參數配置在裡面, 然後調用mysql 用戶端 api 程式中的參數讀取 api 讀取相關參數。

2、pid file

pid file 是 mysqld 應用程式 在 Unix/Linux 環境下的一個程序檔案,和許多其他

Unix/Linux 服務端程式一樣,存放着自己的程序id。

3、socket file

socket 檔案也是在 Unix/Linux 環境下才有的,使用者在 Unix/Linux 環境下用戶端連接配接

可以不通過TCP/IP網絡而直接使用Unix Socket來連接配接MySQL。