第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

首頁 慕課教程 MySQL 進階教程 MySQL 進階教程 MySQL 物理組成-日志文件和數(shù)據(jù)文件

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é),一起來尋找答案……