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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

慢查詢?nèi)罩静捎煤唵蔚奈谋靖袷剑梢酝ㄟ^文本編輯器查看內(nèi)容。
慢查詢?nèi)罩具€記錄了語句執(zhí)行的時刻,執(zhí)行所消耗的時間,執(zhí)行用戶,連接主機(jī)等信息。

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

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

InnoDB是事務(wù)安全的存儲引擎,其事務(wù)安全性主要是通過在線REDO日志和記錄在表空間的UNDO信息來保證的。
REDO日志中記錄了InnoDB所做的所有物理變更和事務(wù)信息,通過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ù)文件

每一個數(shù)據(jù)庫都會在定義好(或默認(rèn))的數(shù)據(jù)目錄下存在一個以數(shù)據(jù)庫名字命名的文件夾,用來存放該數(shù)據(jù)庫中的各種表數(shù)據(jù)文件。
不同的存儲引擎有各自不同的數(shù)據(jù)文件,存放位置也有區(qū)別。
多數(shù)存儲引擎的數(shù)據(jù)文件都存放在和MyISAM數(shù)據(jù)文件位置相同的目錄下,但是每個數(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)的定義信息等。
不論是什么存儲引擎,每一個表都會有一個以表名命名的“.frm”文件。
所有的“.frm”文件都存放在所屬數(shù)據(jù)庫的文件夾下面。

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

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

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

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

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

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

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

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

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語句,接著在Slave端應(yīng)用。
mysql-relay-bin.index類似mysql-bin.index,記錄日志存放位置的絕對路徑,它所記錄Relay Log。

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

relay-log.info文件存放通過Slave的I/O線程寫入本地的relay log相關(guān)信息,以便Slave端的SQL線程及某些管理操作隨時能夠獲取當(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ù)組都通過中括號給了固定的組名,如“[mysqld]”組中包括了mysqld服務(wù)啟動時候的初始化參數(shù),“[client]”組中包含著客戶端工具程序可以讀取的參數(shù),此外還有其他針對各個客戶端軟件的特定參數(shù)組,如mysql程序使用的“[mysql]”,mysqlchk使用的“[mysqlchk]”。
如果編寫了某個客戶端程序,也可以設(shè)定一個參數(shù)組名,將相關(guān)參數(shù)配置在里面,然后調(diào)用mysql客戶端api程序中的參數(shù)讀取api相關(guān)參數(shù)。

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

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

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

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

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

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

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

初始化模塊在MySQL Server啟動的時候,對整個系統(tǒng)做各種各樣的初始化操作,比如各種buffer、cache結(jié)構(gòu)的初始化和內(nèi)存空間的申請,各種系統(tǒng)變量的初始化設(shè)定,各種存儲引擎的初始化設(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ā)送,以方便其他各個模塊調(diào)用,以及對這一部分的維護(hù)。
所有源碼都在vio文件夾下。

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

任何C/S結(jié)構(gòu)的軟件系統(tǒng),都會有自己獨(dú)有的信息交互協(xié)議。
MySQL的Client & Server交互協(xié)議模塊,實(shí)現(xiàn)了客戶端與MySQL交互過程中的所有協(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子模塊——訪問控制模塊

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

日志記錄模塊主要負(fù)責(zé)整個系統(tǒng)級別的邏輯層的日志的記錄,包括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模塊有兩個線程。一個是負(fù)責(zé)從Master請求和接受binary日志,并寫入本地relay log中的I/O線程。另外一個是負(fù)責(zé)從relay log中讀取相關(guān)日志事件,然后將其解析成可以在Slave端正確執(zhí)行并得到和Master端完全相同結(jié)果的命令,再交給Slave執(zhí)行的SQL線程。

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

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

各模塊工作配合

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

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

MySQL自帶工具——mysql

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

mysql --help

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

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

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

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

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

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

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

定制mysql提示符。
在默認(rèn)情況下,通過mysql登入數(shù)據(jù)庫之后,mysql的提示符——“mysql>”,沒有其他任何附加信息。
可以通過配置顯示登入的主機(jī)地址、登錄用戶名、當(dāng)前時間、當(dāng)前數(shù)據(jù)庫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操作的請求,
--select_limit=#:使用前提是有“-U, --safe-updates”參數(shù),限制查詢記錄的條數(shù),
--max_join_size=#:與“-U, --safe-updates一起使用,限制參與join的最大記錄數(shù)。

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

在執(zhí)行完每一條query之后自動執(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ù)會從[client]參數(shù)group中讀取。

MySQL自帶工具—— mysqladmin

Usage: mysqladmin [OPTIONS] command command ...

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

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

檢測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ù)庫的連接線程信息:

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

MySQL自帶工具——mysqlimport

Usage: mysqlimport [OPTIONS] database textfile ...

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

MySQL自帶工具——mysqlbinlog

Usage: mysqlbinlog [OPTIONS] log-files

分析MySQL Server產(chǎn)生的二進(jìn)制日志。
通過之前備份的binlog做一些指定時間之類的恢復(fù)時,mysqlbinlog可以幫助找出恢復(fù)操作須要做哪些事情。
通過mysqlbinlog,可以把binlog中指定時間段或指定日志起始和結(jié)束位置的內(nèi)容解析成Query語句,并導(dǎo)出到指定的文件中,在解析過程中,還可以通過指定數(shù)據(jù)庫名稱來過濾輸出內(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中的表,但并不是所有的存儲引擎都支持這4項(xiàng)功能,像InnoDB就不支持修復(fù)功能。
mysqlcheck程序的這4項(xiàng)功能都可以通過mysql連接登錄到MySQL Server之后來實(shí)現(xiàn)。

MySQL自帶工具——myisamchk

Usage: myisamchk [OPTIONS] tables[.MYI]

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

MySQL自帶工具——myisampack

Usage: myisampack [OPTIONS] filename ...

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

MySQL自帶工具——mysqlhotcopy

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

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

MySQL自帶工具——其他工具

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

小結(jié)

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容