MySQL數(shù)據(jù)庫(kù)物理文件架構(gòu)組成各種工具詳解

MySQL物理文件組成——日志文件——錯(cuò)誤日志(Error Log)

錯(cuò)誤日志記錄了MyQL服務(wù)器運(yùn)行過(guò)程中所有較為嚴(yán)重的警告和錯(cuò)誤信息,以及每次啟動(dòng)和關(guān)閉的詳細(xì)信息。
錯(cuò)誤日志記錄功能默認(rèn)是關(guān)閉的,錯(cuò)誤信息默認(rèn)被輸出到標(biāo)準(zhǔn)錯(cuò)誤輸出(stderr);
可以在啟動(dòng)時(shí)加上--log-error參數(shù),開啟系統(tǒng)記錄錯(cuò)誤日志的功能。

錯(cuò)誤日志默認(rèn)存放在數(shù)據(jù)目錄下,以hostname.err命名。
--log-error[=file_name]可以修改存放目錄和文件名。

MySQL的FLUSH LOGS命令會(huì)將錯(cuò)誤日志做備份并重新開始記錄,MySQL會(huì)備份舊日志文件并生成新的日志文件。備份文件名以“.old”結(jié)尾。

MySQL物理文件組成——日志文件——二進(jìn)制日志:Binary Log & Binary Log Index

--log-bin[=file_name]開啟二進(jìn)制日志記錄功能,MySQL會(huì)將所有修改數(shù)據(jù)庫(kù)數(shù)據(jù)的Query以二進(jìn)制形式記錄到日志文件中,還包括每一條Query所執(zhí)行的時(shí)間,所消耗的資源,以及相關(guān)的事務(wù)信息,binlog是事務(wù)安全的。

binlog記錄功能默認(rèn)是關(guān)閉的:

  • --log-bin:在數(shù)據(jù)目錄下生成為mysql-bin.******(*代表0~9之間的某一個(gè)數(shù)字,表示該日志的序號(hào))文件;
  • --log-bin[=file_name]

--max_binlog_size:設(shè)置binlog的最大存儲(chǔ)上限,當(dāng)日志達(dá)到該上限時(shí),MySQL會(huì)重新創(chuàng)建一個(gè)日志開始繼續(xù)記錄。
產(chǎn)生超出該設(shè)置的binlog的原因:在即將達(dá)到上限時(shí),產(chǎn)生一個(gè)較大的事務(wù),為了保證事務(wù)安全,MySQL不會(huì)將同一個(gè)事務(wù)分開記錄到兩個(gè)binlog中。
--binlog-do-db=db_name:須要對(duì)某個(gè)(db_name)數(shù)據(jù)庫(kù)記錄binlog,MySQL會(huì)忽略針對(duì)其他數(shù)據(jù)庫(kù),而僅僅記錄指定數(shù)據(jù)庫(kù)執(zhí)行的Query。
--binlog-ignore-db=db_name:與--binlog-do-db=db_name完全相反,它顯式指定忽略某個(gè)(db_name)數(shù)據(jù)庫(kù)的binlog記錄,在指定了這個(gè)參數(shù)之后,MySQL會(huì)記錄指定數(shù)據(jù)庫(kù)以外所有數(shù)據(jù)庫(kù)的binlog。

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

--binlog-ignore-db=db_name--binlog-do-db=db_name注意事項(xiàng)

參數(shù)中的db_name不是指Query語(yǔ)句更新的數(shù)據(jù)所在的數(shù)據(jù)庫(kù),而是執(zhí)行Query時(shí)所處的數(shù)據(jù)庫(kù)。
不論更新哪個(gè)數(shù)據(jù)庫(kù)的數(shù)據(jù),MySQL僅僅比較當(dāng)前連接所處的數(shù)據(jù)庫(kù)(通過(guò)use db_name切換后所在的數(shù)據(jù)庫(kù))與參數(shù)設(shè)置的數(shù)據(jù)庫(kù)名,而不會(huì)分析Query語(yǔ)句更新數(shù)據(jù)所在的數(shù)據(jù)庫(kù)。

MySQL物理文件組成——日志文件——更新日志(update log)

更新日志在較老版本上使用的,類似binlog,不過(guò)不是以二進(jìn)制格式來(lái)記錄,而是以簡(jiǎn)單的文本格式記錄內(nèi)容。
自從增加了binlog功能之后,就很少使用更新日志了。
從版本5.0開始,MySQL已經(jīng)不再支持更新日志。

MySQL物理文件組成——日志文件——查詢?nèi)罩?query log)

記錄所有的Query。
加上--log[=fina_name]參數(shù)開啟該功能。
記錄了所有的Query(包括所有的select),體積較大,開啟后對(duì)性能有較大影響,慎用該功能。
只在跟蹤某些特殊的Query性能問(wèn)題時(shí)才會(huì)短暫打開該功能。
默認(rèn)的查詢?nèi)罩疚募麨?code>hostname.log。

MySQL物理文件組成——日志文件——慢查詢?nèi)罩?slow query log)

記錄執(zhí)行時(shí)間較長(zhǎng)的Query(Slow Query)
--log-slow-queries[=file_name]開啟該功能,默認(rèn)文件名為hostname-slow.log,默認(rèn)目錄是數(shù)據(jù)目錄。

慢查詢?nèi)罩静捎煤?jiǎn)單的文本格式,可以通過(guò)文本編輯器查看內(nèi)容。
慢查詢?nèi)罩具€記錄了語(yǔ)句執(zhí)行的時(shí)刻,執(zhí)行所消耗的時(shí)間,執(zhí)行用戶,連接主機(jī)等信息。

MySQL提供了專門用來(lái)分析慢查詢?nèi)罩镜墓ぞ適ysqlslowdump。

MySQL物理文件組成——日志文件—— InnoDB的在線REDO日志(InnoDB REDO Log)

InnoDB是事務(wù)安全的存儲(chǔ)引擎,其事務(wù)安全性主要是通過(guò)在線REDO日志和記錄在表空間的UNDO信息來(lái)保證的。
REDO日志中記錄了InnoDB所做的所有物理變更和事務(wù)信息,通過(guò)REDO日志和UNDO信息,InnoDB保證了在任何情況下的事務(wù)安全性。
InnoDB的REDO日志默認(rèn)存放在數(shù)據(jù)目錄下,
innodb_log_group_home_dir可以更改日志的存放位置,
innodb_log_files_in_group可以設(shè)置日志的數(shù)量

MySQL物理文件組成——日志文件——數(shù)據(jù)文件

每一個(gè)數(shù)據(jù)庫(kù)都會(huì)在定義好(或默認(rèn))的數(shù)據(jù)目錄下存在一個(gè)以數(shù)據(jù)庫(kù)名字命名的文件夾,用來(lái)存放該數(shù)據(jù)庫(kù)中的各種表數(shù)據(jù)文件。
不同的存儲(chǔ)引擎有各自不同的數(shù)據(jù)文件,存放位置也有區(qū)別。
多數(shù)存儲(chǔ)引擎的數(shù)據(jù)文件都存放在和MyISAM數(shù)據(jù)文件位置相同的目錄下,但是每個(gè)數(shù)據(jù)文件的擴(kuò)展名卻各不一樣:MyISAM用“.MYD”作為擴(kuò)展名,InnoDB用“.ibd”,Archive用“.arc”,CSV用“.CSV”。

MySQL物理文件組成——數(shù)據(jù)文件——“.frm”文件

“.frm”文件保存表相關(guān)的元數(shù)據(jù)(meta)信息,包括表結(jié)構(gòu)的定義信息等。
不論是什么存儲(chǔ)引擎,每一個(gè)表都會(huì)有一個(gè)以表名命名的“.frm”文件。
所有的“.frm”文件都存放在所屬數(shù)據(jù)庫(kù)的文件夾下面。

MySQL物理文件組成——數(shù)據(jù)文件——“.MYD”文件(MyISAM存儲(chǔ)引擎)

“.MYD”文件存放MyISAM表的數(shù)據(jù)。
每一個(gè)MyISAM表都會(huì)有一個(gè)“.MYD”文件與之對(duì)應(yīng),它存放于所屬數(shù)據(jù)庫(kù)的文件夾下,和“.frm”文件在一起。

MySQL物理文件組成——數(shù)據(jù)文件——“.MYI”文件(MyISAM存儲(chǔ)引擎)

“.MYI”文件存放MyISAM表的索引信息。
對(duì)于MyISAM存儲(chǔ)來(lái)說(shuō),可以被緩存(cache)的內(nèi)容主要就是來(lái)源于“.MYI”文件中。
每一個(gè)MyISAM表對(duì)應(yīng)一個(gè)“.MYI”文件,其存放的位置和“.frm”及“.MYD”一樣。

MySQL物理文件組成——數(shù)據(jù)文件——“.ibd”文件和ibdata文件

存放InnoDB的數(shù)據(jù)(包括索引)。
InnoDB可以通過(guò)配置決定是使用共享表空間存放存儲(chǔ)數(shù)據(jù),還是用獨(dú)享表空間存放存儲(chǔ)數(shù)據(jù)。
獨(dú)享表空間存儲(chǔ)方式使用“.ibd”文件來(lái)存放數(shù)據(jù),且每個(gè)表一個(gè)“.ibd”文件,文件存放在和MyISAM數(shù)據(jù)相同的位置。
共享存儲(chǔ)表空間會(huì)使用ibdata文件,所有表共同使用一個(gè)(或者多個(gè),可自行配置)ibdata文件。
ibdata文件可以通過(guò)innodb_data_home_dirinnodb_data_file_path兩個(gè)參數(shù)共同配置組成,innodb_data_home_dir配置數(shù)據(jù)存放的總目錄,而innodb_data_file_path配置每一個(gè)文件的名稱。
也可以不配置innodb_data_home_dir,直接在innodb_data_file_path參數(shù)配置的時(shí)候使用絕對(duì)路徑來(lái)完成配置。
innodb_data_file_path可以一次配置多個(gè)ibdata文件。文件可以指定大小,也可以自動(dòng)擴(kuò)展的,但是InnoDB限制了只有最后一個(gè)ibdata文件能夠配置成自動(dòng)擴(kuò)展類型。
修改共享表空間配置須重啟MySQL。

修改獨(dú)享表空間配置,無(wú)需重啟MySQL。

個(gè)人更傾向于使用獨(dú)享表空間存儲(chǔ)方式。

MySQL物理文件組成——Replication相關(guān)文件——master.info文件

master.info文件存在于Slave端的數(shù)據(jù)目錄下,里面存放了該Slave的Master端的相關(guān)信息,包括Master的主機(jī)地址、連接用戶、連接密碼、連接端口、當(dāng)前日志位置、已經(jīng)讀取到的日志位置等。

MySQL物理文件組成——Replication相關(guān)文件——relay log和relay log index

mysql-relay-bin.xxxxxn文件用于存放Slave端的I/O線程從Master端所讀取的Binary Log信息,然后由Slave端的QL線程從該relay log中讀取并解析相應(yīng)的日志信息,轉(zhuǎn)化成Master所執(zhí)行的Query語(yǔ)句,接著在Slave端應(yīng)用。
mysql-relay-bin.index類似mysql-bin.index,記錄日志存放位置的絕對(duì)路徑,它所記錄Relay Log。

MySQL物理文件組成——Replication相關(guān)文件——relay-log.info文件

relay-log.info文件存放通過(guò)Slave的I/O線程寫入本地的relay log相關(guān)信息,以便Slave端的SQL線程及某些管理操作隨時(shí)能夠獲取當(dāng)前復(fù)制的相關(guān)信息。

MySQL物理文件組成——其他文件——system config file

MySQL系統(tǒng)配置文件是“my.cnf”,Unix/Linux下存放于“/etc”,Windows下存放于“c:/windows”。
“my.cnf”文件中包含多種參數(shù)選項(xiàng)組(group),每一種參數(shù)組都通過(guò)中括號(hào)給了固定的組名,如“[mysqld]”組中包括了mysqld服務(wù)啟動(dòng)時(shí)候的初始化參數(shù),“[client]”組中包含著客戶端工具程序可以讀取的參數(shù),此外還有其他針對(duì)各個(gè)客戶端軟件的特定參數(shù)組,如mysql程序使用的“[mysql]”,mysqlchk使用的“[mysqlchk]”。
如果編寫了某個(gè)客戶端程序,也可以設(shè)定一個(gè)參數(shù)組名,將相關(guān)參數(shù)配置在里面,然后調(diào)用mysql客戶端api程序中的參數(shù)讀取api相關(guān)參數(shù)。

MySQL物理文件組成——其他文件——pid文件

pid文件是mysqld在Unix/Linux下的一個(gè)進(jìn)程文件,存放著自己的進(jìn)程id。

MySQL物理文件組成——其他文件——Socket文件

Socket文件在Unix/Linux下才有的,Unix/Linux下的客戶端連接可以不通過(guò)TCP/IP網(wǎng)絡(luò)而直接使用Unix Socket來(lái)連接MySQL。

MySQL Server系統(tǒng)架構(gòu)——邏輯模塊組成

MySQL是兩層架構(gòu),第一層是SQL Layer,在MySQL數(shù)據(jù)庫(kù)系統(tǒng)處理底層數(shù)據(jù)之前的所有工作都是在這一層完成的,包括權(quán)限判斷、Query解析、執(zhí)行計(jì)劃優(yōu)化、query cache的處理等;
第二層是存儲(chǔ)引擎層(Storage Engine Layer),是底層數(shù)據(jù)存取操作實(shí)現(xiàn)部分,由多種存儲(chǔ)引擎共同組成。

MySQL Server系統(tǒng)架構(gòu)——SQL Layer子模塊——初始化模塊

初始化模塊在MySQL Server啟動(dòng)的時(shí)候,對(duì)整個(gè)系統(tǒng)做各種各樣的初始化操作,比如各種buffer、cache結(jié)構(gòu)的初始化和內(nèi)存空間的申請(qǐng),各種系統(tǒng)變量的初始化設(shè)定,各種存儲(chǔ)引擎的初始化設(shè)置。

MySQL Server系統(tǒng)架構(gòu)——SQL Layer子模塊——核心API

核心API模塊提供一些需要非常高效的底層操作功能的優(yōu)化實(shí)現(xiàn),包括各種底層數(shù)據(jù)結(jié)構(gòu)的實(shí)現(xiàn),特殊算法的實(shí)現(xiàn),字符串處理,數(shù)字處理,小文件I/O,格式化輸出,以及最重要的內(nèi)存管理部分。
核心API模塊的源代碼都在mysys和strings文件夾下。

MySQL Server系統(tǒng)架構(gòu)——SQL Layer子模塊——網(wǎng)絡(luò)交互模塊

底層網(wǎng)絡(luò)交互模塊抽象出底層網(wǎng)絡(luò)交互所使用的接口api,實(shí)現(xiàn)底層網(wǎng)絡(luò)數(shù)據(jù)的接收與發(fā)送,以方便其他各個(gè)模塊調(diào)用,以及對(duì)這一部分的維護(hù)。
所有源碼都在vio文件夾下。

MySQL Server系統(tǒng)架構(gòu)——SQL Layer子模塊——Client & Server交互協(xié)議模塊

任何C/S結(jié)構(gòu)的軟件系統(tǒng),都會(huì)有自己獨(dú)有的信息交互協(xié)議。
MySQL的Client & Server交互協(xié)議模塊,實(shí)現(xiàn)了客戶端與MySQL交互過(guò)程中的所有協(xié)議。
這些協(xié)議都是建立在現(xiàn)有的OS和網(wǎng)絡(luò)協(xié)議之上的,如TCP/IP及Unix Socket。

MySQL Server系統(tǒng)架構(gòu)——SQL Layer子模塊——用戶模塊

用戶的登錄連接權(quán)限控制、用戶的授權(quán)管理。

MySQL Server系統(tǒng)架構(gòu)——SQL Layer子模塊——訪問(wèn)控制模塊

訪問(wèn)控制模塊實(shí)時(shí)監(jiān)控客戶端的每一個(gè)操作,給不同的客戶端不同的權(quán)限。
訪問(wèn)控制模塊:根據(jù)用戶模塊中各用戶的授權(quán)信息,以及數(shù)據(jù)庫(kù)自身特有的各種約束,來(lái)控制用戶對(duì)數(shù)據(jù)的訪問(wèn)。
用戶模塊和訪問(wèn)控制模塊兩者結(jié)合起來(lái),組成了MySQL整個(gè)數(shù)據(jù)庫(kù)系統(tǒng)的權(quán)限安全管理功能。

MySQL Server系統(tǒng)架構(gòu)——SQL Layer子模塊——連接管理、連接線程和線程管理

連接管理模塊負(fù)責(zé)監(jiān)聽對(duì)MySQL Server的各種請(qǐng)求,接收連接請(qǐng)求,轉(zhuǎn)發(fā)所有連接請(qǐng)求到線程管理模塊。
每一個(gè)連接上MySQL Server的客戶端請(qǐng)求都會(huì)被分配(或創(chuàng)建)一個(gè)連接線程為其單獨(dú)服務(wù)。
連接線程負(fù)責(zé)MySQL Server與客戶端的通信,接受客戶端的命令請(qǐng)求,傳遞Server端的結(jié)果信息等。
線程管理模塊負(fù)責(zé)管理維護(hù)這些連接線程,包括線程的創(chuàng)建,線程的緩存(cache)等。

MySQL Server系統(tǒng)架構(gòu)——SQL Layer子模塊——Query解析和轉(zhuǎn)發(fā)模塊

Client端發(fā)送給Server端的命令都稱為Query。
連接線程接收到客戶端的一個(gè)Query后,會(huì)直接將該Query傳遞給專門負(fù)責(zé)將各種Query進(jìn)行分類(Query解析),然后轉(zhuǎn)發(fā)給各個(gè)對(duì)應(yīng)的處理模塊(轉(zhuǎn)發(fā)模塊)。
將Query語(yǔ)句進(jìn)行語(yǔ)義和語(yǔ)法的分析,然后按照不同的操作類型進(jìn)行分類,接著做出針對(duì)性的轉(zhuǎn)發(fā)。

MySQL Server系統(tǒng)架構(gòu)——SQL Layer子模塊——Query Cache模塊

Query Cache模塊是一個(gè)非常重要的模塊,將客戶端提交給MySQL的Select類Query請(qǐng)求的返回結(jié)果集緩存(cache)到內(nèi)存中,與該Query的一個(gè)hash值做一個(gè)對(duì)應(yīng)。
在該Query所取數(shù)據(jù)的基表發(fā)生任何數(shù)據(jù)的變化之后,MySQL會(huì)自動(dòng)使該Query的緩存失效。
在讀寫比例非常高的應(yīng)用系統(tǒng)中,Query Cache對(duì)性能的提高是非常顯著的。
它對(duì)內(nèi)存的消耗也是非常大的。

MySQL Server系統(tǒng)架構(gòu)——SQL Layer子模塊——Query優(yōu)化器模塊

Query優(yōu)化器:優(yōu)化客戶端請(qǐng)求的Query,根據(jù)客戶端請(qǐng)求的Query語(yǔ)句和數(shù)據(jù)庫(kù)中的一些統(tǒng)計(jì)信息,在一系列算法的基礎(chǔ)上進(jìn)行分析,得出一個(gè)最優(yōu)的策略,告訴后面的程序如何取得這個(gè)Query語(yǔ)句的結(jié)果。

MySQL Server系統(tǒng)架構(gòu)——SQL Layer子模塊——表變更管理模塊

表變更管理模塊主要是負(fù)責(zé)完成一些DML和DDL的Query,如:update、delte、insert、create table、alter table等語(yǔ)句的處理。

MySQL Server系統(tǒng)架構(gòu)——SQL Layer子模塊——表維護(hù)模塊

表的狀態(tài)檢查,錯(cuò)誤修復(fù),以及優(yōu)化和分析等工作都是表維護(hù)模塊須要做的事情。

MySQL Server系統(tǒng)架構(gòu)——SQL Layer子模塊——系統(tǒng)狀態(tài)管理模塊

系統(tǒng)狀態(tài)管理模塊負(fù)責(zé)在客戶端請(qǐng)求系統(tǒng)狀態(tài)的時(shí)候,將各種狀態(tài)數(shù)據(jù)返回給用戶,像show status、show variables等。

MySQL Server系統(tǒng)架構(gòu)——SQL Layer子模塊——表管理器

這個(gè)模塊從名字上很容易和表變更和表維護(hù)模塊相混淆,但是其功能與變更及維護(hù)模塊完全不同。
每一個(gè)MySQL的表都有一個(gè)表的定義文件(*.frm文件)。
表管理器的工作主要就是維護(hù)這些文件,以及一個(gè)cache,該cache中的主要內(nèi)容是各個(gè)表的結(jié)構(gòu)信息。此外它還維護(hù)table級(jí)別的鎖管理。

MySQL Server系統(tǒng)架構(gòu)——SQL Layer子模塊——日志記錄模塊

日志記錄模塊主要負(fù)責(zé)整個(gè)系統(tǒng)級(jí)別的邏輯層的日志的記錄,包括error log、binary log、slow query log。

MySQL Server系統(tǒng)架構(gòu)——SQL Layer子模塊——復(fù)制模塊

復(fù)制模塊分為Master模塊和Slave模塊兩部分,Master模塊主要負(fù)責(zé)在Replication環(huán)境中讀取Master端的binary日志,以及與Slave端的I/O線程交互等工作。
Slave模塊有兩個(gè)線程。一個(gè)是負(fù)責(zé)從Master請(qǐng)求和接受binary日志,并寫入本地relay log中的I/O線程。另外一個(gè)是負(fù)責(zé)從relay log中讀取相關(guān)日志事件,然后將其解析成可以在Slave端正確執(zhí)行并得到和Master端完全相同結(jié)果的命令,再交給Slave執(zhí)行的SQL線程。

MySQL Server系統(tǒng)架構(gòu)——SQL Layer子模塊——存儲(chǔ)引擎接口模塊

目前各種數(shù)據(jù)庫(kù)產(chǎn)品中,只有MySQL實(shí)現(xiàn)了底層數(shù)據(jù)存儲(chǔ)引擎的插件式管理。
這個(gè)模塊實(shí)際上只是一個(gè)抽象類,但正是它成功地將各種數(shù)據(jù)處理高度抽象化,成就了MySQL可插拔存儲(chǔ)引擎的特色。

各模塊工作配合

在啟動(dòng)MySQL命令之后,MySQL的初始化模塊從系統(tǒng)配置文件中讀取系統(tǒng)參數(shù)和命令行參數(shù),并按照參數(shù)來(lái)初始化整個(gè)系統(tǒng),如申請(qǐng)并分配buffer,初始化全局變量,以及各種結(jié)構(gòu)等。同時(shí)各個(gè)存儲(chǔ)引擎也被啟動(dòng),并進(jìn)行各自的初始化工作。在整個(gè)系統(tǒng)初始化結(jié)束后,會(huì)由連接管理模塊接手。連接管理模塊會(huì)啟動(dòng)處理客戶端連接請(qǐng)求的監(jiān)聽程序,包括TCP/IP的網(wǎng)絡(luò)監(jiān)聽,還有Unix的Socket。這時(shí)候,MySQL Server就基本完成啟動(dòng),準(zhǔn)備好接受客戶端請(qǐng)求了。

當(dāng)連接管理模塊監(jiān)聽到客戶端的連接請(qǐng)求(借助網(wǎng)絡(luò)交互模塊的相關(guān)功能)時(shí),雙方通過(guò)Client & Server交互協(xié)議模塊所定義的協(xié)議“寒暄”幾句之后,連接管理模塊就會(huì)將連接請(qǐng)求轉(zhuǎn)發(fā)給線程管理模塊,去請(qǐng)求一個(gè)連接線程。
線程管理模塊馬上又會(huì)將控制交給連接線程模塊,告訴連接線程模塊:現(xiàn)在有連接請(qǐng)求過(guò)來(lái)了,須要建立連接。連接線程模塊在接到連接請(qǐng)求后,首先會(huì)檢查當(dāng)前連接線程池中是否有被緩存(cache)的空閑連接線程,如果有,就取出一個(gè)和客戶端請(qǐng)求連接上,如果沒有空閑的連接線程,則建立一個(gè)新的連接線程向客戶端請(qǐng)求連接。
連接線程模塊并不是在收到連接請(qǐng)求后馬上就會(huì)取出一個(gè)連接線程和客戶端連接,而是首先通過(guò)調(diào)用用戶模塊進(jìn)行授權(quán)檢查,只有客戶端請(qǐng)求通過(guò)了授權(quán)檢查后,它才會(huì)將客戶端請(qǐng)求和負(fù)責(zé)請(qǐng)求的連接線程連上。
在MySQL中,將客戶端請(qǐng)求分為了兩種類型:一種是Query,須要調(diào)用Parser也就是Query解析和轉(zhuǎn)發(fā)模塊的解析才能夠執(zhí)行的請(qǐng)求;一種是command,不須要調(diào)用Parser就可以直接執(zhí)行的請(qǐng)求。
如果初始化配置中打開了Full Query Logging的功能,那么Query解析與轉(zhuǎn)發(fā)模塊會(huì)調(diào)用日志記錄模塊將請(qǐng)求記入日志,不管是一個(gè)Query類型的請(qǐng)求還是一個(gè)command類型的請(qǐng)求,都會(huì)被記入日志,出于性能考慮,很少打開Full Query Logging的功能。
在客戶端請(qǐng)求和連接線程“互換暗號(hào)(互通協(xié)議)”接上頭之后,連接線程就開始處理客戶端請(qǐng)求發(fā)送過(guò)來(lái)的各種命令(或者Query),并接受相關(guān)請(qǐng)求。它將收到的Query語(yǔ)句轉(zhuǎn)給Query解析器和轉(zhuǎn)發(fā)模塊,Query解析器先對(duì)Query進(jìn)行基本的語(yǔ)義和語(yǔ)法解析,然后根據(jù)命令類型的不同,有些會(huì)直接處理,有些會(huì)分發(fā)給其他模塊處理。
如果是一個(gè)Query類型的請(qǐng)求,它將控制權(quán)交給Query解析器。Query解析器首先分析是不是一個(gè)select類型的Query,如果是,則調(diào)用查詢緩存模塊,讓它檢查該Query在Query cache中是否已經(jīng)存在。如果有,則直接將cache中的數(shù)據(jù)返回給連接線程模塊,然后通過(guò)與客戶端的連接線程將數(shù)據(jù)傳輸給客戶端。如果是一個(gè)不能被緩存(cache)的Query類型,或者cache中沒有該Query的數(shù)據(jù),那么Query將被繼續(xù)傳回Query解析器,讓Query解析器進(jìn)行相應(yīng)處理,再通過(guò)Query分發(fā)器分發(fā)給相關(guān)處理模塊。
如果解析器的解析結(jié)果是一條未被緩存(cache)的SELECT語(yǔ)句,則它會(huì)將控制權(quán)交給Optimizer(Query優(yōu)化器模塊),如果是DML或是DDL語(yǔ)句,則會(huì)交給表變更管理模塊,如果是一些更新統(tǒng)計(jì)信息、檢測(cè)、修復(fù)和整理類的Query,則會(huì)交給表維護(hù)模塊去處理,若是與復(fù)制相關(guān)的Query則轉(zhuǎn)交給復(fù)制模塊去進(jìn)行相應(yīng)的處理,請(qǐng)求狀態(tài)的Query則轉(zhuǎn)交給了狀態(tài)收集報(bào)告模塊。實(shí)際上表變更管理模塊根據(jù)所對(duì)應(yīng)的處理請(qǐng)求的不同,分別由insert處理器、delete處理器、update處理器、create處理器,以及alter處理器這些小模塊來(lái)負(fù)責(zé)不同的DML和DDL。
在各個(gè)模塊收到Query解析與分發(fā)模塊分發(fā)過(guò)來(lái)的請(qǐng)求后,首先會(huì)通過(guò)訪問(wèn)控制模塊檢查連接用戶是否有訪問(wèn)目標(biāo)表及目標(biāo)字段的權(quán)限。如果有,就會(huì)調(diào)用表管理模塊請(qǐng)求相應(yīng)的表,并獲取對(duì)應(yīng)的鎖。表管理模塊首先會(huì)查看該表是否已經(jīng)存在于table cache中,如果已經(jīng)打開則直接進(jìn)行鎖相關(guān)的處理,如果沒有在cache中,則須要再打開表文件獲取鎖,然后將打開的表交給表變更管理模塊。
在表變更管理模塊“獲取”打開的表之后,就會(huì)根據(jù)該表的相關(guān)meta信息,判斷表的存儲(chǔ)引擎類型和其他相關(guān)信息。根據(jù)表的存儲(chǔ)引擎類型,提交請(qǐng)求給存儲(chǔ)引擎接口模塊,調(diào)用對(duì)應(yīng)的存儲(chǔ)引擎實(shí)現(xiàn)模塊,進(jìn)行相應(yīng)處理。
不過(guò),對(duì)于表變更管理模塊來(lái)說(shuō),可見的僅是存儲(chǔ)引擎接口模塊所提供的一系列“標(biāo)準(zhǔn)”接口,底層存儲(chǔ)引擎實(shí)現(xiàn)模塊的具體實(shí)現(xiàn),對(duì)于表變更管理模塊來(lái)說(shuō)是透明的。他只須要調(diào)用對(duì)應(yīng)的接口,并指明表類型,接口模塊就會(huì)根據(jù)表類型調(diào)用正確的存儲(chǔ)引擎來(lái)進(jìn)行相應(yīng)的處理。
在一條Query或一個(gè)command處理完成(成功或者失?。┲?,控制權(quán)都會(huì)交還給連接線程模塊。如果處理成功,則將處理結(jié)果(可能是一個(gè)Result set,也可能是成功或失敗的標(biāo)識(shí))通過(guò)連接線程反饋給客戶端。如果處理過(guò)程中發(fā)生錯(cuò)誤,也會(huì)將相應(yīng)的錯(cuò)誤信息發(fā)送給客戶端,然后連接線程模塊會(huì)進(jìn)行相應(yīng)的清理工作,并繼續(xù)等待后面的請(qǐng)求,重復(fù)上面的過(guò)程,或者完成客戶端斷開連接的請(qǐng)求。
如果在上面的過(guò)程中,相關(guān)模塊使數(shù)據(jù)庫(kù)中的數(shù)據(jù)發(fā)生了變化,而且MySQL打開了bin-log功能,則對(duì)應(yīng)的處理模塊還會(huì)調(diào)用日志處理模塊,將相應(yīng)的變更語(yǔ)句以更新事件的形式記錄到相關(guān)參數(shù)指定的二進(jìn)制日志文件中。
在上面各個(gè)模塊的處理過(guò)程中,各模塊的核心運(yùn)算處理功能部分都會(huì)高度依賴整個(gè)MySQL的核心API模塊,比如內(nèi)存管理、文件I/O、數(shù)字和字符串處理等。

MySQL自帶工具——mysql

mysql類似Oracle的sqlplus,為用戶提供一個(gè)命令行接口來(lái)操作管理MySQL服務(wù)器。

mysql --help

MySQL自帶工具——mysql——-e, --execute=name

只要執(zhí)行“-e”后面的某個(gè)命令,而不是要通過(guò)mysql連接登錄到MySQL Server上面。
此參數(shù)在寫一些基本的MySQL檢查和監(jiān)控的腳本中非常有用。

MySQL自帶工具——mysql——-E, --vertical

登入之后的所有查詢結(jié)果都將以縱列顯示,效果和在一條query之后以“\G”結(jié)尾一樣。

MySQL自帶工具——mysql——-H, --html-X, --xml

在啟用這兩個(gè)參數(shù)之后,select出來(lái)的所有結(jié)果都會(huì)按照“Html”與“Xml”格式輸出。

MySQL自帶工具——mysql——--prompt=name

定制mysql提示符。
在默認(rèn)情況下,通過(guò)mysql登入數(shù)據(jù)庫(kù)之后,mysql的提示符——“mysql>”,沒有其他任何附加信息。
可以通過(guò)配置顯示登入的主機(jī)地址、登錄用戶名、當(dāng)前時(shí)間、當(dāng)前數(shù)據(jù)庫(kù)schema、MySQL Server等信息。
--prompt='\\u@\\h : \\d \\r:\\m:\\s>':

“sky@localhost : test 04:25:45>”

MySQL自帶工具——mysql——--tee=name

將所有輸入和輸出內(nèi)容都記錄到文件里。

MySQL自帶工具——mysql——-U, --safe-updates、--select_limit=#、--max_join_size=#

與性能相關(guān)的參數(shù)。
-U, --safe-updates:將禁止所有不能使用索引UPDATE和DELETE操作的請(qǐng)求,
--select_limit=#:使用前提是有“-U, --safe-updates”參數(shù),限制查詢記錄的條數(shù),
--max_join_size=#:與“-U, --safe-updates一起使用,限制參與join的最大記錄數(shù)。

MySQL自帶工具——mysql——--show-warnings

在執(zhí)行完每一條query之后自動(dòng)執(zhí)行一次“show warnings”,顯示出最后一次warning的內(nèi)容。

MySQL自帶工具——mysql——總結(jié)

mysql支持非常多的參數(shù)選項(xiàng),有其自身的參數(shù),也有提交給MySQL Server的。
mysql的所有參數(shù)選項(xiàng)都可以寫在my.cnf[mysql]參數(shù)group中,還有部分連接選項(xiàng)參數(shù)會(huì)從[client]參數(shù)group中讀取。

MySQL自帶工具—— mysqladmin

Usage: mysqladmin [OPTIONS] command command ...

mysqadmin提供與MySQL管理相關(guān)的各種功能。如MySQL Server狀態(tài)檢查,各種統(tǒng)計(jì)信息的flush,創(chuàng)建/刪除數(shù)據(jù)庫(kù),關(guān)閉MySQL Server。
mysqladmin能做的事情,大部分都可以通過(guò)mysql連接登錄MySQL Server之后來(lái)完成,但是通過(guò)mysqladmin來(lái)完成操作會(huì)更簡(jiǎn)單更方便。

MySQL自帶工具—— mysqladmin——ping命令

檢測(cè)MySQL Server是否還能正常提供服務(wù)

mysqladmin -u sky -ppwd -h localhost ping
mysqld is alive

MySQL自帶工具—— mysqladmin——status命令

獲取當(dāng)前MySQL Server的基本狀態(tài)值:

mysqladmin -u sky -ppwd -h localhost status
Uptime: 20960  Threads: 1  Questions: 75  Slow queries: 0  Opens: 15  Flush tables:
1  Open tables: 9  Queries per second avg: 0.3

MySQL自帶工具—— mysqladmin——processlist

獲取當(dāng)前數(shù)據(jù)庫(kù)的連接線程信息:

mysqladmin -u sky -ppwd -h localhost processlist
+----+------+-----------+----+---------+------+-------+------------------+
| Id | User | Host      | db | Command | Time | State | Info             |
+----+------+-----------+----+---------+------+-------+------------------+
| 48 | sky  | localhost |    | Query   | 0    |       | show processlist |
+----+------+-----------+----+---------+------+-------+------------------+

MySQL自帶工具—— mysqldump

Usage: mysqldump [OPTIONS] database [tables]
OR      mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]
OR      mysqldump [OPTIONS] --all-databases [OPTIONS]

將MySQL Server中的數(shù)據(jù)以Query語(yǔ)句的形式導(dǎo)出(dump)成文本文件。MySQL的邏輯備份工具,Query生成導(dǎo)出工具
通過(guò)mysqldump所生成的文件,全部是Query語(yǔ)句,包括數(shù)據(jù)庫(kù)和表的創(chuàng)建語(yǔ)句。
通過(guò)給mysqldump程序加“-T”選項(xiàng)參數(shù),可以生成其他指定格式的文本文件。
這項(xiàng)功能實(shí)際上是調(diào)用MySQL中的“select * into OUTFILE from ...”語(yǔ)句實(shí)現(xiàn)的。
-d,--no-data”僅僅生成結(jié)構(gòu)創(chuàng)建的語(yǔ)句。
當(dāng)生成Query語(yǔ)句的時(shí)候,字符集設(shè)置這一項(xiàng)比較關(guān)鍵,建議每次執(zhí)行mysqldump程序的時(shí)候都通過(guò)盡量做到“--default-character-set=name”顯式指定字符集內(nèi)容,防止以錯(cuò)誤的字符集生成不可用的內(nèi)容。
mysqldump所生成的SQL文件可以通過(guò)mysql工具執(zhí)行。

MySQL自帶工具——mysqlimport

Usage: mysqlimport [OPTIONS] database textfile ...

mysqlimport程序?qū)⒁蕴囟ǜ袷酱娣诺奈谋緮?shù)據(jù)(如“SELECT * INTO OUTFILE FROM ...”所生成的數(shù)據(jù)文件)導(dǎo)入指定的MySQL Server中,比如將一個(gè)標(biāo)準(zhǔn)的csv文件導(dǎo)入指定數(shù)據(jù)庫(kù)的指定表中。
mysqlimport工具實(shí)際上只是“LOAD DATA INFILE”命令的一個(gè)包裝實(shí)現(xiàn)。

MySQL自帶工具——mysqlbinlog

Usage: mysqlbinlog [OPTIONS] log-files

分析MySQL Server產(chǎn)生的二進(jìn)制日志。
通過(guò)之前備份的binlog做一些指定時(shí)間之類的恢復(fù)時(shí),mysqlbinlog可以幫助找出恢復(fù)操作須要做哪些事情。
通過(guò)mysqlbinlog,可以把binlog中指定時(shí)間段或指定日志起始和結(jié)束位置的內(nèi)容解析成Query語(yǔ)句,并導(dǎo)出到指定的文件中,在解析過(guò)程中,還可以通過(guò)指定數(shù)據(jù)庫(kù)名稱來(lái)過(guò)濾輸出內(nèi)容。

MySQL自帶工具——mysqlcheck

Usage: mysqlcheck [OPTIONS] database [tables]
OR      mysqlcheck [OPTIONS] --databases DB1 [DB2 DB3...]
OR      mysqlcheck [OPTIONS] --all-databases

可以檢查(check)、修復(fù)(repair)、分析(analyze)和優(yōu)化(optimize)MySQL Server中的表,但并不是所有的存儲(chǔ)引擎都支持這4項(xiàng)功能,像InnoDB就不支持修復(fù)功能。
mysqlcheck程序的這4項(xiàng)功能都可以通過(guò)mysql連接登錄到MySQL Server之后來(lái)實(shí)現(xiàn)。

MySQL自帶工具——myisamchk

Usage: myisamchk [OPTIONS] tables[.MYI]

Myisamchk的功能類似“mysqlcheck -c/-r”,可以檢查和修復(fù)MyISAM存儲(chǔ)引擎的表,但只對(duì)MyISAM存儲(chǔ)引擎的索引文件有效,不用登錄連接MySQL Server即可完成操作。

MySQL自帶工具——myisampack

Usage: myisampack [OPTIONS] filename ...

對(duì)MyISAM表進(jìn)行壓縮處理,以縮減占用的存儲(chǔ)空間,主要用在歸檔備份的場(chǎng)景下,而且壓縮后的MyISAM表會(huì)變成只讀,不能進(jìn)行任何修改操作。
當(dāng)歸檔備份某些歷史數(shù)據(jù)表,希望該表能夠提供高效的查詢服務(wù)時(shí),就可以通過(guò)myisampack工具對(duì)MyISAM表進(jìn)行壓縮。
雖然更換成archive存儲(chǔ)引擎也能夠?qū)⒈碜兂芍蛔x的壓縮表,但是archive表是不支持索引的,而壓縮后的MyISAM表仍然可以使用其索引。

MySQL自帶工具——mysqlhotcopy

Usage: mysqlhotcopy db_name[./table_regex/] [new_db_name | directory]

mysqlhotcopy和其他的客戶端工具程序不太一樣的地方是,它不是C(或者C++)程序編寫的,而是一個(gè)perl腳本程序,僅能在Unix/Linux下使用。
對(duì)MySQL 中的MyISAM存儲(chǔ)引擎的表進(jìn)行在線備份操作,其備份操作實(shí)際上就是通過(guò)對(duì)數(shù)據(jù)庫(kù)中的表進(jìn)行加鎖,然后復(fù)制其結(jié)構(gòu)、數(shù)據(jù)和索引文件來(lái)完成的。
指定“--noindices”告訴mysqlhotcopy不須要備份索引文件。

MySQL自帶工具——其他工具

針對(duì)離線InnoDB文件做checksum的innochecksum,轉(zhuǎn)換mSQL C API函數(shù)的msql2mysql,dumpMyISAM全文索引的myisam_ftdump,分析處理slowlog的mysqldumpslow,查詢MySQL相關(guān)開發(fā)包位置和include文件位置的mysql_config,向MySQL AB報(bào)告bug的mysqlbug,測(cè)試套件mysqltest和mysql_client_test,批量修改表存儲(chǔ)引擎類型的mysql_convert_table_format,從更新日志中提取給定匹配規(guī)則的query語(yǔ)句的mysql_find_rows,更改MyIsam存儲(chǔ)引擎表后綴名的mysql_fix_extensions,修復(fù)系統(tǒng)表的mysql_fix_privilege_tables,查看數(shù)據(jù)庫(kù)相關(guān)對(duì)象結(jié)構(gòu)的mysqlshow,MySQL升級(jí)工具mysql_upgrade,通過(guò)給定匹配模式來(lái)中止客戶端連接線程的mysql_zap,查看錯(cuò)誤信息的perror,文本替換工具replace等一系列工具程序可供我們使用。
如果希望在MySQL源代碼的基礎(chǔ)上做一些自己的修改,如修改MyISAM存儲(chǔ)引擎的時(shí)候,可以利用myisamlog來(lái)進(jìn)行跟蹤分析MyISAM的log。

小結(jié)

為什么MySQL實(shí)現(xiàn)不了在線DDL功能,可能很大程度上是因?yàn)镾QL邏輯層與存儲(chǔ)引擎實(shí)現(xiàn)層的過(guò)度解偶,造成很多信息在二者之間的傳遞存在一定的難度。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容