mysql架构组成_第 2 章 MySQL 架构组成
麻雀雖小,五臟俱全。MySQL 雖然以簡(jiǎn)單著稱,但其內(nèi)部結(jié)構(gòu)并不簡(jiǎn)單。本章從MySQL物理組成、邏輯組成,以及相關(guān)工具幾個(gè)角度來介紹 MySQL 的整體架構(gòu)組成,希望能夠讓讀者對(duì) MySQL 有一個(gè)更全面深入的了解。
2.1 MySQL物理文件組成
2.1.1 日志文件
1、錯(cuò)誤日志:Error Log
錯(cuò)誤日志記錄了MyQL Server運(yùn)行過程中所有較為嚴(yán)重的警告和錯(cuò)誤信息,以及MySQL Server每次啟動(dòng)和關(guān)閉的詳細(xì)信息。在默認(rèn)情況下,系統(tǒng)記錄錯(cuò)誤日志的功能是關(guān)閉的,錯(cuò)誤信息被輸出到標(biāo)準(zhǔn)錯(cuò)誤輸出(stderr),如果要開啟系統(tǒng)記錄錯(cuò)誤日志的功能,需要在啟動(dòng)時(shí)開啟-log-error選項(xiàng)。錯(cuò)誤日志的默認(rèn)存放位置在數(shù)據(jù)目錄下,以hostname.err命名。但是可以使用命令:--log-error[=file_name],修改其存放目錄和文件名。
為了方便維護(hù)需要,有時(shí)候會(huì)希望將錯(cuò)誤日志中的內(nèi)容做備份并重新開始記錄,這時(shí)候就可以利用MySQL的FLUSH LOGS命令來告訴MySQL備份舊日志文件并生成新的日志文件。備份文件名以“.old”結(jié)尾。
2、二進(jìn)制日志:Binary Log & Binary Log Index
二進(jìn)制日志,也就是我們常說的binlog,也是MySQL Server中最為重要的日志之一。當(dāng)我們通過“--log-bin[=file_name]”打開了記錄的功能之后,MySQL會(huì)將所有修改數(shù)據(jù)庫數(shù)據(jù)的query以二進(jìn)制形式記錄到日志文件中。當(dāng)然,日志中并不僅限于query語句這么簡(jiǎn)單,還包括每一條query所執(zhí)行的時(shí)間,所消耗的資源,以及相關(guān)的事務(wù)信息,所以binlog是事務(wù)安全的。
和錯(cuò)誤日志一樣,binlog記錄功能同樣需要“--log-bin[=file_name]”參數(shù)的顯式指定才能開啟,如果未指定file_name,則會(huì)在數(shù)據(jù)目錄下記錄為mysql-bin.******(*代表0~9之間的某一個(gè)數(shù)字,來表示該日志的序號(hào))。
binlog還有其他一些附加選項(xiàng)參數(shù):
“--max_binlog_size”設(shè)置binlog的最大存儲(chǔ)上限,當(dāng)日志達(dá)到該上限時(shí),MySQL會(huì)重新創(chuàng)建一個(gè)日志開始繼續(xù)記錄。不過偶爾也有超出該設(shè)置的binlog產(chǎn)生,一般都是因?yàn)樵诩磳⑦_(dá)到上限時(shí),產(chǎn)生了一個(gè)較大的事務(wù),為了保證事務(wù)安全,MySQL不會(huì)將同一個(gè)事務(wù)分開記錄到兩個(gè)binlog中。
“--binlog-do-db=db_name”參數(shù)明確告訴MySQL,需要對(duì)某個(gè)(db_name)數(shù)據(jù)庫記錄binlog,如果有了“--binlog-do-db=db_name”參數(shù)的顯式指定,MySQL會(huì)忽略針對(duì)其他數(shù)據(jù)庫執(zhí)行的query,而僅僅記錄針對(duì)指定數(shù)據(jù)庫執(zhí)行的query。
“--binlog-ignore-db=db_name”與“--binlog-do-db=db_name”完全相反,它顯式指定忽略某個(gè)(db_name)數(shù)據(jù)庫的binlog記錄,當(dāng)指定了這個(gè)參數(shù)之后,MySQL會(huì)記錄指定數(shù)據(jù)庫以外所有的數(shù)據(jù)庫的binlog。
“--binlog-ignore-db=db_name”與“--binlog-do-db=db_name”兩個(gè)參數(shù)有一個(gè)共同的概念需要大家理解清楚,參數(shù)中的db_name不是指query語句更新的數(shù)據(jù)所在的數(shù)據(jù)庫,而是執(zhí)行query的時(shí)候當(dāng)前所處的數(shù)據(jù)庫。不論更新哪個(gè)數(shù)據(jù)庫的數(shù)據(jù),MySQL僅僅比較當(dāng)前連接所處的數(shù)據(jù)庫(通過use db_name切換后所在的數(shù)據(jù)庫)與參數(shù)設(shè)置的數(shù)據(jù)庫名,而不會(huì)分析query語句所更新數(shù)據(jù)所在的數(shù)據(jù)庫。
mysql-bin.index 文件(binary log index)的功能是記錄所有Binary Log的絕對(duì)路徑,保證 MySQL 各種線程能夠順利的根據(jù)它找到所有需要的Binary Log文件。
3、更新日志:update log
更新日志是MySQL在較老的版本上使用的,其功能和binlog基本類似,只不過不是以二進(jìn)制格式來記錄而是以簡(jiǎn)單的文本格式記錄內(nèi)容。自從MySQL增加了binlog功能之后,就很少使用更新日志了。從版本5.0開始,MySQL已經(jīng)不再支持更新日志了。
4、查詢?nèi)罩?#xff1a;query log
查詢?nèi)罩居涗汳ySQL中所有的query,通過“--log[=fina_name]”來打開該功能。由于記錄了所有的query,包括所有的select,體積比較大,開啟后對(duì)性能也有較大的影響,所以請(qǐng)大家慎用該功能。一般只用于跟蹤某些特殊的sql性能問題才會(huì)短暫打開該功能。默認(rèn)的查詢?nèi)罩疚募麨閔ostname.log。
5、慢查詢?nèi)罩?#xff1a;slow query log
顧名思義,慢查詢?nèi)罩局杏涗浀氖菆?zhí)行時(shí)間較長的query,也就是我們常說的slow query,通過設(shè)--log-slow-queries[=file_name]來打開該功能并設(shè)置記錄位置和文件名,默認(rèn)文件名為hostname-slow.log,默認(rèn)目錄也是數(shù)據(jù)目錄。
慢查詢?nèi)罩静捎玫氖呛?jiǎn)單的文本格式,可以通過各種文本編輯器查看其中的內(nèi)容。其中記錄了語句執(zhí)行的時(shí)刻,執(zhí)行所消耗的時(shí)間,執(zhí)行用戶,連接主機(jī)等相關(guān)信息。MySQL還提供了專門用來分析滿查詢?nèi)罩镜墓ぞ叱绦騧ysqlslowdump,用來幫助數(shù)據(jù)庫管理人員解決可能存在的性能問題。
6、Innodb的在線redo日志:innodb redo log
Innodb是一個(gè)事務(wù)安全的存儲(chǔ)引擎,其事務(wù)安全性主要就是通過在線redo日志和記錄在表空間中的undo信息來保證的。redo日志中記錄了Innodb所做的所有物理變更和事務(wù)信息,通過redo日志和undo信息,Innodb保證了在任何情況下的事務(wù)安全性。Innodb的redo日志同樣默認(rèn)存放在數(shù)據(jù)目錄下,可以通過innodb_log_group_home_dir來更改設(shè)置日志的存放位置,通過innodb_log_files_in_group設(shè)置日志的數(shù)量。
2.1.2 數(shù)據(jù)文件
在MySQL中每一個(gè)數(shù)據(jù)庫都會(huì)在定義好(或者默認(rèn))的數(shù)據(jù)目錄下存在一個(gè)以數(shù)據(jù)庫名字命名的文件夾,用來存放該數(shù)據(jù)庫中各種表數(shù)據(jù)文件。不同的MySQL存儲(chǔ)引擎有各自不同的數(shù)據(jù)文件,存放位置也有區(qū)別。多數(shù)存儲(chǔ)引擎的數(shù)據(jù)文件都存放在和MyISAM數(shù)據(jù)文件位置相同的目錄下,但是每個(gè)數(shù)據(jù)文件的擴(kuò)展名卻各不一樣。如MyISAM用“.MYD”作為擴(kuò)展名,Innodb用“.ibd”,Archive用“.arc”,CSV用“.csv”,等等。
1、“.frm”文件
與表相關(guān)的元數(shù)據(jù)(meta)信息都存放在“.frm”文件中,包括表結(jié)構(gòu)的定義信息等。不論是什么存儲(chǔ)引擎,每一個(gè)表都會(huì)有一個(gè)以表名命名的“.frm”文件。所有的“.frm”文件都存放在所屬數(shù)據(jù)庫的文件夾下面。
2、“.MYD”文件
“.MYD”文件是MyISAM存儲(chǔ)引擎專用,存放MyISAM表的數(shù)據(jù)。每一個(gè)MyISAM表都會(huì)有一個(gè)“.MYD”文件與之對(duì)應(yīng),同樣存放于所屬數(shù)據(jù)庫的文件夾下,和“.frm”文件在一起。
3、“.MYI”文件
“.MYI”文件也是專屬于MyISAM存儲(chǔ)引擎的,主要存放MyISAM表的索引相關(guān)信息。對(duì)于MyISAM存儲(chǔ)來說,可以被cache的內(nèi)容主要就是來源于“.MYI”文件中。每一個(gè)MyISAM表對(duì)應(yīng)一個(gè)“.MYI”文件,存放于位置和“.frm”以及“.MYD”一樣。
4、“.ibd”文件和ibdata文件
這兩種文件都是存放Innodb數(shù)據(jù)的文件,之所以有兩種文件來存放Innodb的數(shù)據(jù)(包括索引),是因?yàn)镮nnodb的數(shù)據(jù)存儲(chǔ)方式能夠通過配置來決定是使用共享表空間存放存儲(chǔ)數(shù)據(jù),還是獨(dú)享表空間存放存儲(chǔ)數(shù)據(jù)。獨(dú)享表空間存儲(chǔ)方式使用“.ibd”文件來存放數(shù)據(jù),且每個(gè)表一個(gè)“.ibd”文件,文件存放在和MyISAM數(shù)據(jù)相同的位置。如果選用共享存儲(chǔ)表空間來存放數(shù)據(jù),則會(huì)使用ibdata文件來存放,所有表共同使用一個(gè)(或者多個(gè),可自行配置)ibdata文件。ibdata文件可以通過innodb_data_home_dir和innodb_data_file_path兩個(gè)參數(shù)共同配置組成,innodb_data_home_dir配置數(shù)據(jù)存放的總目錄,而innodb_data_file_path配置每一個(gè)文件的名稱。當(dāng)然,也可以不配置innodb_data_home_dir而直接在innodb_data_file_path參數(shù)配置的時(shí)候使用絕對(duì)路徑來完成配置。innodb_data_file_path中可以一次配置多個(gè)ibdata文件。文件可以是指定大小,也可以是自動(dòng)擴(kuò)展的,但是Innodb限制了僅僅只有最后一個(gè)ibdata文件能夠配置成自動(dòng)擴(kuò)展類型。當(dāng)我們需要添加新的ibdata文件的時(shí)候,只能添加在innodb_data_file_path配置的最后,而且必須重啟MySQL才能完成ibdata的添加工作。不過如果我們使用獨(dú)享表空間存儲(chǔ)方式的話,就不會(huì)有這樣的問題,但是如果要使用裸設(shè)備的話,每個(gè)表一個(gè)裸設(shè)備,可能造成裸設(shè)備數(shù)量非常大,而且不太容易控制大小,實(shí)現(xiàn)比較困難,而共享表空間卻不會(huì)有這個(gè)問題,容易控制裸設(shè)備數(shù)量。我個(gè)人還是更傾向于使用獨(dú)享表空間存儲(chǔ)方式。當(dāng)然,兩種方式各有利弊,看大家各自應(yīng)用環(huán)境的側(cè)重點(diǎn)在那里了。
上面僅僅介紹了兩種最常用存儲(chǔ)引擎的數(shù)據(jù)文件,此外其他各種存儲(chǔ)引擎都有各自的數(shù)據(jù)文件,讀者朋友可以自行創(chuàng)建某個(gè)存儲(chǔ)引擎的表做一個(gè)簡(jiǎn)單的測(cè)試,做更多的了解。
2.1.3 Replication相關(guān)文件:
1、master.info文件:
master.info文件存在于Slave端的數(shù)據(jù)目錄下,里面存放了該Slave的Master端的相關(guān)信息,包括Master的主機(jī)地址,連接用戶,連接密碼,連接端口,當(dāng)前日志位置,已經(jīng)讀取到的日志位置等信息。
2、relay log 和relay log index
mysql-relay-bin.xxxxxn 文件用于存放 Slave 端的I/O線程從 Master 端所讀取到的 Binary Log 信息,然后由 Slave 端的 SQL 線程從該 relay log 中讀取并解析相應(yīng)的日志信息,轉(zhuǎn)化成 Master 所執(zhí)行的 SQL 語句,然后在 Slave 端應(yīng)用。
mysql-relay-bin.index 文件的功能類似于 mysql-bin.index ,同樣是記錄日志的存放位置的絕對(duì)路徑,只不過他所記錄的不是 Binary Log,而是 Relay Log。
3、relay-log.info文件:
類似于master.info,它存放通過Slave的I/O線程寫入到本地的relay log的相關(guān)信息。供 Slave 端的 SQL 線程以及某些管理操作隨時(shí)能夠獲取當(dāng)前復(fù)制的相關(guān)信息。
2.1.4 其他文件:
1、system config file
MySQL的系統(tǒng)配置文件一般都是“my.cnf”,Unix/Linux下默認(rèn)存放在"/etc"目錄下,Windows環(huán)境一般存放在“c:/windows”目錄下面。“my.cnf”文件中包含多種參數(shù)選項(xiàng)組(group),每一種參數(shù)組都通過中括號(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ù)。
2、pid file
pid file是mysqld應(yīng)用程序在Unix/Linux環(huán)境下的一個(gè)進(jìn)程文件,和許多其他Unix/Linux服務(wù)端程序一樣,存放著自己的進(jìn)程id。
3、socket file
socket文件也是在Unix/Linux環(huán)境下才有的,用戶在Unix/Linux環(huán)境下客戶端連接可以不通過TCP/IP網(wǎng)絡(luò)而直接使用Unix Socket來連接MySQL。
2.2 MySQL Server 系統(tǒng)架構(gòu)
2.2.1 邏輯模塊組成
總的來說,MySQL可以看成是二層架構(gòu),第一層我們通常叫做SQL Layer,在MySQL數(shù)據(jù)庫系統(tǒng)處理底層數(shù)據(jù)之前的所有工作都是在這一層完成的,包括權(quán)限判斷,sql解析,執(zhí)行計(jì)劃優(yōu)化,query cache的處理等等;第二層就是存儲(chǔ)引擎層,我們通常叫做Storage Engine Layer,也就是底層數(shù)據(jù)存取操作實(shí)現(xiàn)部分,由多種存儲(chǔ)引擎共同組成。所以,可以用如下一張最簡(jiǎn)單的架構(gòu)示意圖來表示MySQL的基本架構(gòu),如圖2-1所示:
圖 2-1
雖然從上圖看起來MySQL架構(gòu)非常的簡(jiǎn)單,就是簡(jiǎn)單的兩部分而已,但實(shí)際上每一層中都含有各自的很多小模塊,尤其是第一層 SQL Layer,結(jié)構(gòu)相當(dāng)復(fù)雜的。下面我們就分別針對(duì)SQL Layer和Storage Engine Layer做一個(gè)簡(jiǎn)單的分析。
SQL Layer中包含了多個(gè)子模塊,下面我將逐個(gè)做一下簡(jiǎn)單的介紹:
1、初始化模塊
顧名思議,初始化模塊就是在MySQL Server啟動(dòng)的時(shí)候,對(duì)整個(gè)系統(tǒng)做各種各樣的初始化操作,比如各種buffer,cache結(jié)構(gòu)的初始化和內(nèi)存空間的申請(qǐng),各種系統(tǒng)變量的初始化設(shè)定,各種存儲(chǔ)引擎的初始化設(shè)置,等等。
2、核心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文件夾下面,有興趣的讀者可以研究研究。
3、網(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文件夾下面。
4、Client & Server 交互協(xié)議模塊
任何C/S結(jié)構(gòu)的軟件系統(tǒng),都肯定會(huì)有自己獨(dú)有的信息交互協(xié)議,MySQL也不例外。MySQL的Client & Server 交互協(xié)議模塊部分,實(shí)現(xiàn)了客戶端與MySQL交互過程中的所有協(xié)議。當(dāng)然這些協(xié)議都是建立在現(xiàn)有的OS和網(wǎng)絡(luò)協(xié)議之上的,如TCP/IP以及Unix Socket。
5、用戶模塊
用戶模塊所實(shí)現(xiàn)的功能,主要包括用戶的登錄連接權(quán)限控制和用戶的授權(quán)管理。他就像MySQL的大門守衛(wèi)一樣,決定是否給來訪者“開門”。
6、訪問控制模塊
造訪客人進(jìn)門了就可以想干嘛就干嘛么?為了安全考慮,肯定不能如此隨意。這時(shí)候就需要訪問控制模塊實(shí)時(shí)監(jiān)控客人的每一個(gè)動(dòng)作,給不同的客人以不同的權(quán)限。訪問控制模塊實(shí)現(xiàn)的功能就是根據(jù)用戶模塊中各用戶的授權(quán)信息,以及數(shù)據(jù)庫自身特有的各種約束,來控制用戶對(duì)數(shù)據(jù)的訪問。用戶模塊和訪問控制模塊兩者結(jié)合起來,組成了MySQL整個(gè)數(shù)據(jù)庫系統(tǒng)的權(quán)限安全管理的功能。
7、連接管理、連接線程和線程管理
連接管理模塊負(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等。
8、Query解析和轉(zhuǎn)發(fā)模塊
在MySQL中我們習(xí)慣將所有Client端發(fā)送給Server端的命令都稱為query,在MySQL Server里面,連接線程接收到客戶端的一個(gè)Query后,會(huì)直接將該query傳遞給專門負(fù)責(zé)將各種Query進(jìn)行分類然后轉(zhuǎn)發(fā)給各個(gè)對(duì)應(yīng)的處理模塊,這個(gè)模塊就是query解析和轉(zhuǎn)發(fā)模塊。其主要工作就是將query語句進(jìn)行語義和語法的分析,然后按照不同的操作類型進(jìn)行分類,然后做出針對(duì)性的轉(zhuǎn)發(fā)。
9、Query Cache模塊
Query Cache模塊在MySQL中是一個(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的Cache失效。在讀寫比例非常高的應(yīng)用系統(tǒng)中,Query Cache對(duì)性能的提高是非常顯著的。當(dāng)然它對(duì)內(nèi)存的消耗也是非常大的。
10、Query優(yōu)化器模塊
Query優(yōu)化器,顧名思義,就是優(yōu)化客戶端請(qǐng)求的query,根據(jù)客戶端請(qǐng)求的query語句,和數(shù)據(jù)庫中的一些統(tǒng)計(jì)信息,在一系列算法的基礎(chǔ)上進(jìn)行分析,得出一個(gè)最優(yōu)的策略,告訴后面的程序如何取得這個(gè)query語句的結(jié)果。
11、表變更管理模塊
表變更管理模塊主要是負(fù)責(zé)完成一些DML和DDL的query,如:update,delte,insert,create table,alter table等語句的處理。
12、表維護(hù)模塊
表的狀態(tài)檢查,錯(cuò)誤修復(fù),以及優(yōu)化和分析等工作都是表維護(hù)模塊需要做的事情。
13、系統(tǒng)狀態(tài)管理模塊
系統(tǒng)狀態(tài)管理模塊負(fù)責(zé)在客戶端請(qǐng)求系統(tǒng)狀態(tài)的時(shí)候,將各種狀態(tài)數(shù)據(jù)返回給用戶,像DBA常用的各種show status命令,show variables命令等,所得到的結(jié)果都是由這個(gè)模塊返回的。
14、表管理器
這個(gè)模塊從名字上看來很容易和上面的表變更和表維護(hù)模塊相混淆,但是其功能與變更及維護(hù)模塊卻完全不同。大家知道,每一個(gè)MySQL的表都有一個(gè)表的定義文件,也就是*.frm文件。表管理器的工作主要就是維護(hù)這些文件,以及一個(gè)cache,該cache中的主要內(nèi)容是各個(gè)表的結(jié)構(gòu)信息。此外它還維護(hù)table級(jí)別的鎖管理。
15、日志記錄模塊
日志記錄模塊主要負(fù)責(zé)整個(gè)系統(tǒng)級(jí)別的邏輯層的日志的記錄,包括error log,binary log,slow query log等。
16、復(fù)制模塊
復(fù)制模塊又可分為Master模塊和Slave模塊兩部分,Master模塊主要負(fù)責(zé)在Replication環(huán)境中讀取Master端的binary日志,以及與Slave端的I/O線程交互等工作。Slave模塊比Master模塊所要做的事情稍多一些,在系統(tǒng)中主要體現(xiàn)在兩個(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線程。
17、存儲(chǔ)引擎接口模塊
存儲(chǔ)引擎接口模塊可以說是MySQL數(shù)據(jù)庫中最有特色的一點(diǎn)了。目前各種數(shù)據(jù)庫產(chǎn)品中,基本上只有MySQL可以實(shí)現(xiàn)其底層數(shù)據(jù)存儲(chǔ)引擎的插件式管理。這個(gè)模塊實(shí)際上只是一個(gè)抽象類,但正是因?yàn)樗晒Φ貙⒏鞣N數(shù)據(jù)處理高度抽象化,才成就了今天MySQL可插拔存儲(chǔ)引擎的特色。
2.2.2 各模塊工作配合
在了解了MySQL的各個(gè)模塊之后,我們?cè)倏纯碝ySQL各個(gè)模塊間是如何相互協(xié)同工作的。接下來,我們通過啟動(dòng)MySQL,客戶端連接,請(qǐng)求query,得到返回結(jié)果,最后退出,這樣一整個(gè)過程來進(jìn)行分析。
當(dāng)我們執(zhí)行啟動(dòng)MySQL命令之后,MySQL的初始化模塊就從系統(tǒng)配置文件中讀取系統(tǒng)參數(shù)和命令行參數(shù),并按照參數(shù)來初始化整個(gè)系統(tǒng),如申請(qǐng)并分配buffer,初始化全局變量,以及各種結(jié)構(gòu)等。同時(shí)各個(gè)存儲(chǔ)引擎也被啟動(dòng),并進(jìn)行各自的初始化工作。當(dāng)整個(gè)系統(tǒng)初始化結(jié)束后,由連接管理模塊接手。連接管理模塊會(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)功能),雙方通過Client & Server 交互協(xié)議模塊所定義的協(xié)議“寒暄”幾句之后,連接管理模塊就會(huì)將連接請(qǐng)求轉(zhuǎn)發(fā)給線程管理模塊,去請(qǐng)求一個(gè)連接線程。
線程管理模塊馬上又會(huì)將控制交給連接線程模塊,告訴連接線程模塊:現(xiàn)在我這邊有連接請(qǐng)求過來了,需要建立連接,你趕快處理一下。連接線程模塊在接到連接請(qǐng)求后,首先會(huì)檢查當(dāng)前連接線程池中是否有被cache的空閑連接線程,如果有,就取出一個(gè)和客戶端請(qǐng)求連接上,如果沒有空閑的連接線程,則建立一個(gè)新的連接線程與客戶端請(qǐng)求連接。當(dāng)然,連接線程模塊并不是在收到連接請(qǐng)求后馬上就會(huì)取出一個(gè)連接線程連和客戶端連接,而是首先通過調(diào)用用戶模塊進(jìn)行授權(quán)檢查,只有客戶端請(qǐng)求通過了授權(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)求計(jì)入日志,不管是一個(gè)Query類型的請(qǐng)求還是一個(gè)command類型的請(qǐng)求,都會(huì)被記錄進(jìn)入日志,所以出于性能考慮,一般很少打開Full Query Logging的功能。
當(dāng)客戶端請(qǐng)求和連接線程“互換暗號(hào)(互通協(xié)議)”接上頭之后,連接線程就開始處理客戶端請(qǐng)求發(fā)送過來的各種命令(或者query),接受相關(guān)請(qǐng)求。它將收到的query語句轉(zhuǎn)給Query解析和轉(zhuǎn)發(fā)模塊,Query解析器先對(duì)Query進(jìn)行基本的語義和語法解析,然后根據(jù)命令類型的不同,有些會(huì)直接處理,有些會(huì)分發(fā)給其他模塊來處理。
如果是一個(gè)Query類型的請(qǐng)求,會(huì)將控制權(quán)交給Query解析器。Query解析器首先分析看是不是一個(gè)select類型的query,如果是,則調(diào)用查詢緩存模塊,讓它檢查該query在query cache中是否已經(jīng)存在。如果有,則直接將cache中的數(shù)據(jù)返回給連接線程模塊,然后通過與客戶端的連接的線程將數(shù)據(jù)傳輸給客戶端。如果不是一個(gè)可以被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語句,則會(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處理器這些小模塊來負(fù)責(zé)不同的DML和DDL的。
在各個(gè)模塊收到Query解析與分發(fā)模塊分發(fā)過來的請(qǐng)求后,首先會(huì)通過訪問控制模塊檢查連接用戶是否有訪問目標(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中,則需要再打開表文件獲取鎖,然后將打開的表交給表變更管理模塊。
當(dāng)表變更管理模塊“獲取”打開的表之后,就會(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)處理。
不過,對(duì)于表變更管理模塊來說,可見的僅是存儲(chǔ)引擎接口模塊所提供的一系列“標(biāo)準(zhǔn)”接口,底層存儲(chǔ)引擎實(shí)現(xiàn)模塊的具體實(shí)現(xiàn),對(duì)于表變更管理模塊來說是透明的。他只需要調(diào)用對(duì)應(yīng)的接口,并指明表類型,接口模塊會(huì)根據(jù)表類型調(diào)用正確的存儲(chǔ)引擎來進(jìn)行相應(yīng)的處理。
當(dāng)一條query或者一個(gè)command處理完成(成功或者失敗)之后,控制權(quán)都會(huì)交還給連接線程模塊。如果處理成功,則將處理結(jié)果(可能是一個(gè)Result set,也可能是成功或者失敗的標(biāo)識(shí))通過連接線程反饋給客戶端。如果處理過程中發(fā)生錯(cuò)誤,也會(huì)將相應(yīng)的錯(cuò)誤信息發(fā)送給客戶端,然后連接線程模塊會(huì)進(jìn)行相應(yīng)的清理工作,并繼續(xù)等待后面的請(qǐng)求,重復(fù)上面提到的過程,或者完成客戶端斷開連接的請(qǐng)求。
如果在上面的過程中,相關(guān)模塊使數(shù)據(jù)庫中的數(shù)據(jù)發(fā)生了變化,而且MySQL打開了bin-log功能,則對(duì)應(yīng)的處理模塊還會(huì)調(diào)用日志處理模塊將相應(yīng)的變更語句以更新事件的形式記錄到相關(guān)參數(shù)指定的二進(jìn)制日志文件中。
在上面各個(gè)模塊的處理過程中,各自的核心運(yùn)算處理功能部分都會(huì)高度依賴整個(gè)MySQL的核心API模塊,比如內(nèi)存管理,文件I/O,數(shù)字和字符串處理等等。
了解到整個(gè)處理過程之后,我們可以將以上各個(gè)模塊畫成如圖2-2的關(guān)系圖:
圖 2-2
2.3 MySQL 自帶工具使用介紹
MySQL數(shù)據(jù)庫不僅提供了數(shù)據(jù)庫的服務(wù)器端應(yīng)用程序,同時(shí)還提供了大量的客戶端工具程序,如mysql,mysqladmin,mysqldump等等,都是大家所熟悉的。雖然有些人對(duì)這些工具的功能都已經(jīng)比較了解了,但是真正能將這些工具程序物盡其用的人可能并不是太多,或者知道的不全,也可能并不完全了解其中的某種特性。所以在這里我也簡(jiǎn)單地做一個(gè)介紹。
1、mysql
相信在所有MySQL客戶端工具中,讀者了解最多的就是mysql了,用的最多的應(yīng)該也非他莫屬。mysql的功能和Oracle的sqlplus一樣,為用戶提供一個(gè)命令行接口來操作管理MySQL服務(wù)器。其基本的使用語法這里就不介紹了,大家只要運(yùn)行一下“mysql --help”就會(huì)得到如下相應(yīng)的基本使用幫助信息:
sky@sky:~$ mysql --help
mysql? Ver 14.14 Distrib 5.1.26-rc, for pc-linux-gnu (i686) using? EditLine wrapper
Copyright (C) 2000-2008 MySQL AB
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to modify and redistribute it under the GPL license
Usage: mysql [OPTIONS] [database]
-?, --help????????? Display this help and exit.
... ...
-e, --execute=name? Execute command and quit. (Disables --force and history
file)
-E, --vertical????? Print the output of a query (rows) vertically.
... ...
-H, --html????????? Produce HTML output.
-X, --xml?? ????????Produce XML output
... ...
--prompt=name?????? Set the mysql prompt to this value.
... ...
--tee=name????????? Append everything into outfile. See interactive help (\h)
also. Does not work in batch mode. Disable with
--disable-tee. This option is disabled by default.
... ...
-U, --safe-updates? Only allow UPDATE and DELETE that uses keys.
--select_limit=#??? Automatic limit for SELECT when using --safe-updates
--max_join_size=#?? Automatic limit for rows in a join when using
--safe-updates
... ...
--show-warnings???? Show warnings after every statement.
... ...
上面的內(nèi)容僅僅只是輸出的一部分,省略去掉了大家最常用的一些參數(shù)(因?yàn)榇蠹覒?yīng)該已經(jīng)很熟悉了),留下了部分個(gè)人認(rèn)為可能不是太經(jīng)常用到,但是在有些情況下卻能給我們帶來意料之外的驚喜的一些參數(shù)選項(xiàng)。
首先看看“-e, --execute=name”參數(shù),這個(gè)參數(shù)是告訴mysql,我只要執(zhí)行“-e”后面的某個(gè)命令,而不是要通過mysql連接登錄到MySQL Server上面。此參數(shù)在我們寫一些基本的MySQL檢查和監(jiān)控的腳本中非常有用,我個(gè)人就經(jīng)常在腳本中使用到他。
如果在連接時(shí)候使用了“-E, --vertical”參數(shù),登入之后的所有查詢結(jié)果都將以縱列顯示,效果和我們?cè)谝粭lquery之后以“\G”結(jié)尾一樣,這個(gè)參數(shù)的使用場(chǎng)景可能不是特別多。
“-H, --html”與“-X, --xml”這兩個(gè)參數(shù)很有意思的,在啟用這兩個(gè)參數(shù)之后,select出來的所有結(jié)果都會(huì)按照“Html”與“Xml”格式來輸出,在有些場(chǎng)合之下,比如希望Xml或者Html文件格式導(dǎo)出某些報(bào)表文件的時(shí)候,是非常方便的。
“--prompt=name”參數(shù)對(duì)于做運(yùn)維的人來說是一個(gè)非常重要的參數(shù)選項(xiàng),其主要功能是定制自己的mysql提示符的顯示內(nèi)容。在默認(rèn)情況下,我們通過mysql登入到數(shù)據(jù)庫之后,mysql的提示符只是一個(gè)很簡(jiǎn)單的內(nèi)容”mysql>“,沒有其他任何附加信息。非常幸運(yùn)的是mysql通過“--prompt=name”參數(shù)給我們提供了自定義提示信息的辦法,可以通過配置顯示登入的主機(jī)地址,登錄用戶名,當(dāng)前時(shí)間,當(dāng)前數(shù)據(jù)庫schema,MySQL Server的一些信息等等。我個(gè)人強(qiáng)烈建議將登錄主機(jī)名,登錄用戶名和所在的schema這三項(xiàng)加入提示內(nèi)容,因?yàn)楫?dāng)大家手邊管理的MySQL越來越多,操作越來越頻繁的時(shí)候,非常容易因?yàn)椴僮鞯臅r(shí)候沒有太在意自己當(dāng)前所處的環(huán)境而造成在錯(cuò)誤的環(huán)境執(zhí)行了錯(cuò)誤的命令并造成嚴(yán)重后果的情況。如果我們?cè)谔崾緝?nèi)容中加入了這幾項(xiàng)之后,至少可以更方便的提醒自己當(dāng)前所處環(huán)境,以盡量減少犯錯(cuò)誤的概率。
我個(gè)人的提示符定義: "\\u@\\h : \\d \\r:\\m:\\s> ",顯示效果:
“sky@localhost : test 04:25:45>”
“--tee=name”參數(shù)也是對(duì)運(yùn)維人員非常有用的參數(shù)選項(xiàng),用來告訴mysql,將所有輸入和輸出內(nèi)容都記錄進(jìn)文件。在我們一些較大維護(hù)變更的時(shí)候,為了方便被查,最好是將整個(gè)操作過程的所有輸入和輸出內(nèi)容都保存下來。有了“--tee=name”參數(shù),就再也不用通過copy屏幕來保存操作過程了。
“-U, --safe-updates”,“--select_limit=#”和“--max_join_size=#”三個(gè)參數(shù)都是出于性能相關(guān)考慮的參數(shù)。使用“-U, --safe-updates”參數(shù)之后,將禁止所有不能使用索引的update和delete操作的請(qǐng)求,“--select_limit=#”的使用前提是有“-U, --safe-updates”參數(shù),功能是限制查詢記錄的條數(shù),“--max_join_size=#”也需要與“-U, --safe-updates”一起使用,限制參與join的最大記錄數(shù)。
“--show-warnings”參數(shù)作用是在執(zhí)行完每一條query之后都會(huì)自動(dòng)執(zhí)行一次“show warnings”,顯示出最后一次warning的內(nèi)容。
上面僅僅介紹了部分不是太常使用但是很有特點(diǎn)的少數(shù)幾個(gè)參數(shù)選項(xiàng),實(shí)際上mysql程序支持非常多的參數(shù)選項(xiàng),有其自身的參數(shù),也有提交給MySQL Server的。mysql的所有參數(shù)選項(xiàng)都可以寫在MySQL Server啟動(dòng)參數(shù)文件(my.cnf)的[mysql]參數(shù)group中,還有部分連接選項(xiàng)參數(shù)會(huì)從[client]參數(shù)group中讀取,這樣很多參數(shù)就可以不用在每次執(zhí)行mysql的時(shí)候都手工輸入,而由mysql程序自己自動(dòng)從my.cnf文件load這些參數(shù)。
如果讀者朋友希望對(duì)mysql其他參數(shù)選項(xiàng)或者mysql的其他更國有圖有更深入的了解,可以通過MySQL官方參考手冊(cè)查閱,也可以通過執(zhí)行“mysql --help”得到幫助信息之后通過自行實(shí)驗(yàn)來做進(jìn)一步的深刻認(rèn)識(shí)。當(dāng)然如果您是一位基本能看懂c語言的朋友,那么您完全可以通過mysql程序的源代碼來發(fā)現(xiàn)其更多有趣的內(nèi)容。
2、mysqladmin
Usage: mysqladmin [OPTIONS] command command ...
mysqadmin,顧名思義,提供的功能都是與MySQL管理相關(guān)的各種功能。如MySQL Server狀態(tài)檢查,各種統(tǒng)計(jì)信息的flush,創(chuàng)建/刪除數(shù)據(jù)庫,關(guān)閉MySQL Server等等。mysqladmin所能做的事情,雖然大部分都可以通過mysql連接登錄上MySQL Server之后來完成,但是大部分通過mysqladmin來完成操作會(huì)更簡(jiǎn)單更方便。這里我將介紹一下自己經(jīng)常使用到的幾個(gè)常用功能:
ping命令可以很容易檢測(cè)MySQL Server是否還能正常提供服務(wù)
sky@sky:~# mysqladmin -u sky -ppwd -h localhost ping
mysqld is alive
status命令可以獲取當(dāng)前MySQL Server的幾個(gè)基本的狀態(tài)值:
sky@sky:~# 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
processlist獲取當(dāng)前數(shù)據(jù)庫的連接線程信息:
sky@sky:~# mysqladmin -u sky -ppwd -h localhost processlist
+----+------+-----------+----+---------+------+-------+------------------+
| Id | User | Host????? | db | Command | Time | State | Info???????????? |
+----+------+-----------+----+---------+------+-------+------------------+
| 48 | sky? | localhost |??? | Query?? | 0??? |?????? | show processlist |
+----+------+-----------+----+---------+------+-------+------------------+
上面的這三個(gè)功能是我在自己的一些簡(jiǎn)單監(jiān)控腳本中經(jīng)常使用到的,雖然得到的信息還是比較有限,但是對(duì)于完成一些比較基本的監(jiān)控來說,已經(jīng)足夠勝任了。此外,還可以通過mysqladmin來start slave和stop slave,kill某個(gè)連接到MySQL Server的線程等等。
3、mysqldump
Usage: mysqldump [OPTIONS] database [tables]
OR???? mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]
OR???? mysqldump [OPTIONS] --all-databases [OPTIONS]
mysqldump這個(gè)工具我想大部分讀者可能都比較熟悉了,其功能就是將MySQL Server中的數(shù)據(jù)以SQL語句的形式從數(shù)據(jù)庫中dump成文本文件。雖然mysqldump是做為MySQL的一種邏輯備份工具為大家所認(rèn)識(shí),但我個(gè)人覺得稱他為SQL生成導(dǎo)出工具更合適一點(diǎn),因?yàn)橥ㄟ^mysqldump所生成的文件,全部是SQL語句,包括數(shù)據(jù)庫和表的創(chuàng)建語句。當(dāng)然,通過給mysqldump程序加“-T”選項(xiàng)參數(shù)之后,可以生成非SQL形式的指定給是的文本文件。這個(gè)功能實(shí)際上是調(diào)用了MySQL中的“select * into OUTFILE from ...”語句而實(shí)現(xiàn)。也可以通過“-d,--no-data”僅僅生成結(jié)構(gòu)創(chuàng)建的語句。在聲稱SQL語句的時(shí)候,字符集設(shè)置這一項(xiàng)也是比較關(guān)鍵的,建議每次執(zhí)行mysqldump程序的時(shí)候都通過盡量做到“--default-character-set=name”顯式指定字符集內(nèi)容,以防止以錯(cuò)誤的字符集生成不可用的內(nèi)容。mysqldump所生成的SQL文件可以通過mysql工具執(zhí)行。
4、mysqlimport
Usage: mysqlimport [OPTIONS] database textfile ...
mysqlimport程序是一個(gè)將以特定格式存放的文本數(shù)據(jù)(如通過“select * into OUTFILE from ...”所生成的數(shù)據(jù)文件)導(dǎo)入到指定的MySQL Server中的工具程序,比如將一個(gè)標(biāo)準(zhǔn)的csv文件導(dǎo)入到某指定數(shù)據(jù)庫的指定表中。mysqlimport工具實(shí)際上也只是“l(fā)oad data infile”命令的一個(gè)包裝實(shí)現(xiàn)。
5、mysqlbinlog
Usage: mysqlbinlog [OPTIONS] log-files
mysqlbinlog程序的主要功能就是分析MySQL Server所產(chǎn)生的二進(jìn)制日志(也就是大家所熟知的binlog)。當(dāng)我們希望通過之前備份的binlog做一些指定時(shí)間之類的恢復(fù)的時(shí)候,mysqlbinlog就可以幫助我們找到恢復(fù)操作需要做哪些事情。通過mysqlbinlog,我們可以解析出binlog中指定時(shí)間段或者指定日志起始和結(jié)束位置的內(nèi)容解析成SQL語句,并導(dǎo)出到指定的文件中,在解析過程中,還可以通過指定數(shù)據(jù)庫名稱來過濾輸出內(nèi)容。
6、mysqlcheck
Usage: mysqlcheck [OPTIONS] database [tables]
OR???? mysqlcheck [OPTIONS] --databases DB1 [DB2 DB3...]
OR???? mysqlcheck [OPTIONS] --all-databases
mysqlcheck工具程序可以檢查(check),修復(fù)(repair),分析(analyze)和優(yōu)化(optimize)MySQL Server中的表,但并不是所有的存儲(chǔ)引擎都支持這里所有的四個(gè)功能,像Innodb就不支持修復(fù)功能。實(shí)際上,mysqlcheck程序的這四個(gè)功能都可以通過mysql連接登錄到MySQL Server之后來執(zhí)行相應(yīng)命令完成完全相同的任務(wù)。
7、myisamchk
Usage: myisamchk [OPTIONS] tables[.MYI]
功能有點(diǎn)類似“mysqlcheck -c/-r”,對(duì)檢查和修復(fù)MyISAM存儲(chǔ)引擎的表,但只能對(duì)MyISAM存儲(chǔ)引擎的索引文件有效,而且不用登錄連接上MySQL Server即可完成操作。
8、myisampack
Usage: myisampack [OPTIONS] filename ...
對(duì)MyISAM表進(jìn)行壓縮處理,以縮減占用存儲(chǔ)空間,一般主要用在歸檔備份的場(chǎng)景下,而且壓縮后的MyISAM表會(huì)變成只讀,不能進(jìn)行任何修改操作。當(dāng)我們希望歸檔備份某些歷史數(shù)據(jù)表,而又希望該表能夠提供較為高效的查詢服務(wù)的時(shí)候,就可以通過myisampack工具程序來對(duì)該MyISAM表進(jìn)行壓縮,因?yàn)榧词闺m然更換成archive存儲(chǔ)引擎也能夠?qū)⒈碜兂芍蛔x的壓縮表,但是archive表是沒有索引支持的,而通過壓縮后的MyISAM表仍然可以使用其索引。
9、mysqlhotcopy
Usage: mysqlhotcopy db_name[./table_regex/] [new_db_name | directory]
mysqlhotcopy和其他的客戶端工具程序不太一樣的是他不是c(或者c++)程序編寫的,而是一個(gè)perl腳本程序,僅能在Unix/Linux環(huán)境下使用。他的主要功能就是對(duì)MySQL 中的MyISAM存儲(chǔ)引擎的表進(jìn)行在線備份操作,其備份操作實(shí)際上就是通過對(duì)數(shù)據(jù)庫中的表進(jìn)行加鎖,然后復(fù)制其結(jié)構(gòu),數(shù)據(jù)和索引文件來完成備份操作,當(dāng)然,也可以通過指定“--noindices”告訴mysqlhotcopy不需要備份索引文件。
10、其他工具
除了上面介紹的這些工具程序之外,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語句的mysql_find_rows,更改MyIsam存儲(chǔ)引擎表后綴名的mysql_fix_extensions,修復(fù)系統(tǒng)表的mysql_fix_privilege_tables,查看數(shù)據(jù)庫相關(guān)對(duì)象結(jié)構(gòu)的mysqlshow,MySQL升級(jí)工具mysql_upgrade,通過給定匹配模式來kill客戶端連接線程的mysql_zap,查看錯(cuò)誤號(hào)信息的perror,文本替換工具replace,等等一系列工具程序可供我們使用。如果您希望在MySQL源代碼的基礎(chǔ)上做一些自己的修改,如修改MyISAM存儲(chǔ)引擎的時(shí)候,可以利用myisamlog來進(jìn)行跟蹤分析MyISAM的log。
2.4 小結(jié)
總結(jié)
以上是生活随笔為你收集整理的mysql架构组成_第 2 章 MySQL 架构组成的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 俩台电脑怎么设置同一局域网_方法 | 把
- 下一篇: JAVA服务器没回应_Java如何面对无