MySQL1-2018年11月11日
MySQL物理檔案組成:日誌檔案
錯誤日誌 error log
錯誤日誌記錄MySQL Server啟動資訊、執行中較為嚴重的警告和錯誤資訊、關閉資訊。預設情況下該功能是關閉的,僅僅輸出到標準錯誤輸出stderr。如果開啟該功能,則需要在啟動時開啟-log-error 選項。日誌預設存放位置是在資料目錄下以hostname.err 命名。但可以使用--log-error[=file_name]來修改其存放目錄和檔名。
為了方便維護,可以利用MySQL 的FLUSH LOGS 命令來備份舊日誌檔案並生成新的日誌檔案。備份檔名以“.old”結尾。
二進位制日誌 binary log & binary log index
二進位制日誌也就是我們常說的binlog,預設關閉的。
當我們通過“--log-bin[=file_name]”開啟記錄功能後,MySQL 會將所有修改資料庫資料的SQL以二進位制形式記錄到日誌檔案中。並且還包括每一條SQL所執行的時間、所消耗的資源、相關的事務資訊,所以binlog是事務安全的。如果未指定file_name,MySQL則會在資料目錄下記錄為mysql-bin.******(*代表0~9 之間的某一個數字來表示該日誌的序號)。
“--max_binlog_size”設定binlog 最大儲存上限,當日志達到該上限時MySQL會重新建立一個日誌開始繼續記錄。不過也有超出該設定的binlog 產生,一般都是因為在即將達到上限時產生了一個較大的事務,為了保證事務安全MySQL不會將同一個事務分開記錄到兩個binlog中。
“--binlog-do-db=db_name”設定對某個具體資料庫(db_name)記錄binlog,其他資料庫binlog則不被記錄。
“--binlog-ignore-db=db_name”與“--binlog-do-db=db_name”完全相反,指定忽略某個資料庫(db_name)的binlog 記錄,其他資料庫會記錄其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的絕對路徑,保證MySQL各種執行緒能夠順利的根據它找到所有需要的Binary Log檔案。
更新日誌 update log
更新日誌是MySQL在較老的版本上使用的,其功能和binlog 基本類似,只不過是以簡單的文字格式記錄內容。自從增加binlog功能之後就很少使用了。從版本5.0開始不支援該日誌。
查詢日誌 query log
查詢日誌記錄MySQL中所有的SQL,包括所有的select。通過“--log[=fina_name]”來開啟。由於記錄了所有的SQL,開啟後對效能有較大的影響,慎用該功能。預設的查詢日誌檔名為hostname.log。
慢查詢日誌 slow query log
慢查詢日誌中記錄的是執行時間較長的SQL。通過設--log-slow-queries[=file_name]來開啟該功能並設定記錄位置和檔名,預設檔名為hostname-slow.log,預設目錄也是資料目錄。
慢查詢日誌採用的是簡單的文字格式,可以通過各種文字編輯器檢視其中的內容。MySQL 還提供了專門用來分析滿查詢日誌的工具程式mysqlslowdump來解決可能存在的效能問題。
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 中每一個數據庫都會在定義好(或者預設)的資料目錄下存在一個以資料庫名字命名的資料夾,用來存放該資料庫中各種表資料檔案。不同的MySQL 儲存引擎有各自不同的資料檔案,存放位置也有區別。多數儲存引擎的資料檔案都存放在和MyISAM 資料檔案位置相同的目錄下。
“.frm”檔案
與表相關的元資料(meta)資訊都存放在“.frm”檔案中,包括表結構的定義資訊等。不論是什麼儲存引擎,每一個表都會有一個以表名命名的“.frm”檔案。所有的“.frm”檔案都存放在所屬資料庫的資料夾下面。
“.MYD”檔案
“.MYD”檔案是MyISAM 儲存引擎專用,存放MyISAM 表的資料。每一個MyISAM 表都會有一個“.MYD”檔案與之對應,同樣存放於所屬資料庫的資料夾下,和“.frm”檔案在一起。
“.MYI”檔案
“.MYI”檔案也是專屬於MyISAM 儲存引擎的,主要存放MyISAM 表的索引相關資訊。對於MyISAM 儲存來說,可以被cache 的內容主要就是來源於“.MYI”檔案中。每一個MyISAM表對應一個“.MYI”檔案,存放於位置和“.frm”以及“.MYD”一樣。
“.ibd”檔案和ibdata 檔案
這兩種檔案都是存放Innodb 資料的檔案,存放Innodb 資料和索引,獨享表空間儲存方式使用“.ibd”檔案來存放資料,每個表一個“.ibd”檔案,檔案存放在和MyISAM 資料相同的位置。共享儲存表空間使用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 的新增工作。如果我們使用獨享表空間儲存方式的話,就不會有這樣的問題,但是如果要使用裸裝置的話,每個表一個裸裝置,可能造成裸裝置數量非常大,而且不太容易控制大小,實現比較困難,而共享表空間卻不會有這個問題,容易控制裸裝置數量。
MySQL物理檔案組成:其他檔案
system config file
MySQL 的系統配置檔案一般都是“my.cnf”,Unix/Linux 下預設存放在"/etc"目錄下,Windows 環境一般存放在“c:/windows”目錄下面。“my.cnf”檔案中包含多種引數選項組(group),每一種引數組都通過中括號給定了固定的組名,如“[mysqld]”組中包括了mysqld服務啟動時候的初始化引數,也可以自定義一個引數組名,將相關引數配置在裡面,然後呼叫mysql 客戶端api 程式中的引數讀取api讀取相關引數。
pid file
pid file 是mysqld 應用程式在Unix/Linux 環境下的一個程序檔案,和許多其他Unix/Linux 服務端程式一樣,存放著自己的程序id。
socket file
socket 檔案也是在Unix/Linux 環境下才有的,使用者在Unix/Linux 環境下客戶端連線可以不通過TCP/IP 網路而直接使用Unix Socket 來連線MySQL。
MySQL Server系統架構:邏輯模組組成
MySQL 可以看成是二層架構,第一層我們通常叫做SQL Layer,在MySQL 資料庫系統處理底層資料之前的所有工作都是在這一層完成的,包括許可權判斷,sql 解析,執行計劃優化,query cache 的處理等等;第二層就是儲存引擎層,我們通常叫做Storage Engine Layer,也就是底層資料存取操作實現部分,由多種儲存引擎共同組成。
MySQL自帶工具
mysql
mysql 的功能為使用者提供一個命令列介面來操作管理MySQL 伺服器。
mysqladmin
提供的功能都是與MySQL 管理相關的各種功能,雖然大部分都可以通過mysql 連線登入上MySQL Server 之後來完成,但是大部分通過mysqladmin 來完成操作會更簡單更方便。
mysqldump
功能就是將MySQL Server中的資料以SQL 語句的形式從資料庫中dump 成文字檔案,包括資料、資料庫和表的建立語句。通過“-T”引數可以生成非SQL 形式的指定文字檔案,其原理就是MySQL的“select * into OUTFILE from ...”。也可以通過“-d,--no-data”僅僅生成結構建立的語句。在聲稱SQL 語句時建議每次執行mysqldump 程式的時候都通過儘量做到“--defaultcharacter-set=name”顯式指定字符集內容,以防止以錯誤的字符集生成不可用的內容。
mysqlimport
mysqlimport是特定格式存放的文字資料(如通過“select * into OUTFILE from ...”所生成的資料檔案)匯入到指定的MySQL Server 中的工具程式,mysqlimport 工具實際上也只是“load data infile”命令的一個包裝實現。
mysqlbinlog
mysqlbinlog 程式的主要功能就是分析MySQL Server 所產生的二進位制日誌(即binlog)。當我們希望通過之前備份的binlog 做一些指定時間之類的恢復的時,mysqlbinlog 就可以找到恢復操作需要做哪些事情。通過mysqlbinlog,我們可以解析出binlog 中指定時間段或者指定日誌起始和結束位置的內容解析成SQL 語句,並匯出到指定的檔案中,在解析過程中,還可以通過指定資料庫名稱來過濾輸出內容。
mysqlcheck
mysqlcheck工具程式可以檢查(check),修復(repair),分析(analyze)和優化(optimize)MySQL Server 中的表,但並不是所有的儲存引擎都支援這裡所有的四個功能。實際上,mysqlcheck 程式的這四個功能都可以通過mysql 連線登入到MySQL Server 之後來執行相應命令完成完全相同的任務。
myisamchk
功能有點類似“mysqlcheck -c/-r”,對檢查和修復MyISAM 儲存引擎的表,但只能對MyISAM 儲存引擎的索引檔案有效,而且不用登入連線上MySQL Server 即可完成操作。
myisampack
對MyISAM 表進行壓縮處理,以縮減佔用儲存空間,一般主要用在歸檔備份的場景下,而且壓縮後的MyISAM 表會變成只讀,不能進行任何修改操作。當我們希望歸檔備份某些歷史資料表,而又希望該表能夠提供較為高效的查詢服務的時候,就可以通過myisampack 工具程式來對該MyISAM 表進行壓縮,因為壓縮後的MyISAM 表仍然可以使用其索引。
mysqlhotcopy
mysqlhotcopy 和其他的客戶端工具程式不太一樣的是他不是c(或者c++)程式編寫的,而是一個perl 指令碼程式,僅能在Unix/Linux 環境下使用。他的主要功能就是對MySQL 中的MyISAM 儲存引擎的表進行線上備份操作,其備份操作實際上就是通過對資料庫中的表進行加鎖,然後複製其結構,資料和索引檔案來完成備份操作,當然,也可以通過指定“--noindices”告訴mysqlhotcopy 不需要備份索引檔案。
其他工具
MySQL還有自帶了其他大量的工具程式,如針對離線Innodb檔案做checksum的innochecksum,轉換mSQL-C-API 函式的msql2mysql,dumpMyISAM全文索引的myisam_ftdump,分析處理slowlog的mysqldumpslow,查詢mysql相關開發包位置和include檔案位置的mysql_config,向MySQL AB報告bug的mysqlbug,測試套件mysqltest和mysql_client_test,批量修改表儲存引擎型別的mysql_convert_table_format,能從更新日誌中提取給定匹配規則的query語句的mysql_find_rows,更改MyIsam 儲存引擎表字尾名的mysql_fix_extensions,修復系統表的mysql_fix_privilege_tables,檢視資料庫相關物件結構的mysqlshow,MySQL升級工具mysql_upgrade,通過給定匹配模式來kill客戶端連線執行緒的mysql_zap,檢視錯誤號資訊的perror,文字替換工具replace等等一系列工具程式可供我們使用。如果您希望在MySQL原始碼的基礎上做一些自己的修改,如修改MyISAM 儲存引擎的時候,可以利用myisamlog來進行跟蹤分析MyISAM 的log。