MySQL 物理組成-日志文件和數(shù)據(jù)文件
上一小節(jié),我們以一條查詢語句的執(zhí)行流程,系統(tǒng)了解了 MySQL 的邏輯架構。那么,MySQL 的物理組成是咋樣的呢?本文繼續(xù)從物理組成這個角度來介紹 MySQL,希望大家對 MySQL 的整體架構組成能有更全面的了解。
1.物理組成
上方是 MySQL 物理組成的簡單示意圖,MySQL 大致上可以分為日志文件和數(shù)據(jù)文件兩大部分。
日志文件包括二進制日志、InnoDB 在線 redo 日志、錯誤日志、慢查詢日志、一般查詢日志等。
數(shù)據(jù)文件主要指不同存儲引擎的物理文件,不同數(shù)據(jù)文件的擴展名是不一樣的,如 InnoDB 用 .ibd、MyISAM 用 .MYD。
除日志文件和數(shù)據(jù)文件外,還有配置文件 my.cnf、pid 文件 mysql.pid、socket 文件 mysql.sock。
1.1 日志文件
重要日志模塊:二進制日志-binlog
二進制日志,其實就是我們平常所說的 binlog,它是 MySQL 重要的日志模塊,在 Server 層實現(xiàn)。
binlog 以二進制形式,將所有修改數(shù)據(jù)的 query 記錄到日志文件中,包括 query 語句、執(zhí)行時間、相關事務信息等。
binlog 的開啟,通過在配置文件 my.cnf 中,顯式指定參數(shù) log-bin=file_name。如果未指定 file_name,則會記錄為 mysql-bin.******(* 代表 0~9 之間的某個數(shù)字,表示日志的序號)
log-bin = /mysql/log/mysql-bin # binlog的存儲路徑
下面為一條insert語句所生成的binlog內容:
root@localhost [tempdb]>insert into a values(1);
Query OK, 1 row affected (0.00 sec)
[root@mysql-test-1 log]# mysqlbinlog --base64-output=decode-rows -vv mysql-bin.000017
#200413 0:18:17 server id 1873306 end_log_pos 556 Write_rows: table id 280 flags: STMT_END_F
### INSERT INTO `tempdb`.`a`
### SET
### @1=1 /* INT meta=0 nullable=1 is_null=0 */
# at 556
#200413 0:18:17 server id 1873306 end_log_pos 583 Xid = 4713735
COMMIT/*!*/;
重要日志模塊:InnoDB redo log
redo log,是存儲引擎 InnoDB 生成的日志,主要為了保證數(shù)據(jù)的可靠性。redo log 記錄了 InnoDB 所做的所有物理變更和事務信息。
redo log 默認存放在數(shù)據(jù)目錄下面,可以通過修改 innodb_log_file_size 和 innodb_log_files_in_group 來配置 redo log 的文件數(shù)量和每個日志文件的大小。
innodb_log_file_size = 1000M # 每個redo log文件的大小
innodb_log_files_in_group = 3 # redo log文件數(shù)量
錯誤日志:error log
錯誤日志,記錄 MySQL 每次啟動關閉的詳細信息,以及運行過程中比較嚴重的警告和錯誤信息。
錯誤日志默認是關閉的,可以通過配置參數(shù) log-error 進行開啟,以及指定存儲路徑。
log-error = /mysql/log/mysql-error.log # 錯誤日志的存儲路徑
1.1.4 慢查詢日志:slow query log
慢查詢日志,記錄 MySQL 中執(zhí)行時間較長的 query,包括執(zhí)行時間、執(zhí)行時長、執(zhí)行用戶、主機等信息。
慢查詢日志默認是關閉的,可以通過配置 slow_query_log 進行開啟。慢查詢的閾值和存儲路徑,通過配置參數(shù) long_query_time 和 slow_query_log_file 實現(xiàn)。
slow_query_log = 1 #開啟慢查詢
long_query_time = 1 #設置慢查詢閾值為1s
slow_query_log_file = /mysql/log/mysql-slow.log #設置慢查詢日志存儲路徑
1.1.5 一般查詢日志:general query log
一般查詢日志,記錄 MySQL 中所有的 query。慢查詢記錄的是超過閾值的 query,而一般查詢日志記錄的是所有的 query。一般查詢日志的開啟需要慎重,因為開啟后對 MySQL 的性能有比較大的影響。
一般查詢日志默認是關閉的,可以通過配置參數(shù) general_log 進行開啟。存儲路徑可以通過配置參數(shù) general_log_file 來實現(xiàn)
general_log = OFF #默認是關閉的
general_log_file = /mysql/data/mysql-general.log #設置查詢日志存儲路徑
1.2 數(shù)據(jù)文件
.frm文件
.frm 文件存放表相關的元數(shù)據(jù),包括表結構信息等。
每張表都有一個對應的 .frm 文件,不管這張表使用哪種存儲引擎。
[root@mysql-test-1 tempdb]# ls -lrt *.frm
-rw-r----- 1 mysql mysql 8556 Apr 13 00:18 a.frm
InnoDB 引擎
.ibd 文件和 ibdata 文件都是 InnoDB 引擎的數(shù)據(jù)文件
- 如果是獨享表空間的存儲方式,則使用.idb文件來存放數(shù)據(jù),每張表都會有一個單獨的 .ibd 文件。
- 如果是共享表空間的存儲方式,則使用ibdata文件來存放數(shù)據(jù),所有表共用一個 ibdata 文件。
是否開啟獨享表空間,可以通過配置參數(shù) innodb_file_per_table 來實現(xiàn)。
innodb_file_per_table = 1 #1 為開啟獨享表空間
下面為InnoDB表的創(chuàng)建語句,及相應的數(shù)據(jù)文件:
root@localhost [tempdb]>create table a (id int) ENGINE = InnoDB;
Query OK, 0 rows affected (0.11 sec)
[root@mysql-test-1 tempdb]# ls -lrt a.*
-rw-r----- 1 mysql mysql 8556 Apr 13 01:57 a.frm
-rw-r----- 1 mysql mysql 98304 Apr 13 01:57 a.ibd
MyISAM引擎
MyISAM 引擎的數(shù)據(jù)文件包含 .MYD 文件和 .MYI 文件。
- .MYD 文件,存放 MyISAM 的數(shù)據(jù),每張表都有一個單獨的 .MYD 文件。
- .MYI 文件,存放 MyISAM 的索引相關信息,每張表都有一個單獨的 .MYI 文件,與 .MYD 文件的存儲路徑一致。
下面為 MyISAM 表的創(chuàng)建語句,及相應的數(shù)據(jù)文件:
root@localhost [tempdb]>create table a (id int) ENGINE = MyISAM;
Query OK, 0 rows affected (0.01 sec)
[root@mysql-test-1 tempdb]# ls -lrt a.*
-rw-r----- 1 mysql mysql 8556 Apr 13 02:01 a.frm
-rw-r----- 1 mysql mysql 1024 Apr 13 02:01 a.MYI
-rw-r----- 1 mysql mysql 0 Apr 13 02:01 a.MYD
2. 小結
本文,我們主要介紹了 MySQL 的物理組成:日志文件和數(shù)據(jù)文件。其中 binlog 和 redo log 是最為重要的日志模塊,大家可能會有疑問,這兩份日志,到底有啥區(qū)別?更新語句跟這兩份日志,又有啥關系呢?我們在下一節(jié),一起來尋找答案……