本書(shū)全面介紹MySQL數(shù)據(jù)庫(kù)的管理、監(jiān)控、備份恢復(fù)和高可用等方面的知識(shí),并在此基礎(chǔ)上討論如何優(yōu)化MySQL的實(shí)例和SQL語(yǔ)句,書(shū)中還包括大量的實(shí)戰(zhàn)案例。 全書(shū)分五部分: 部分(第1~4章)為管理部分,包括安裝和運(yùn)行、賬號(hào)和權(quán)限、日志和安全等內(nèi)容; 第二部分(第5~7章)為監(jiān)控部分,介紹通過(guò)MySQL自帶的3個(gè)系統(tǒng)數(shù)據(jù)進(jìn)行監(jiān)控的方法; 第三部分(第8~11章)為備份恢復(fù)部分,介紹常用的邏輯備份和物理備份工具,還介紹在沒(méi)有備份的情況下如何進(jìn)行數(shù)據(jù)救援; 第四部分(第12~14章)為高可用部分,包括MySQL Shell、復(fù)制和InnoDB集群; 第五部分(第15~18章)為優(yōu)化部分,介紹基準(zhǔn)測(cè)試工具和優(yōu)化MySQL實(shí)例和SQL方法。 本書(shū)適合具有一定IT基礎(chǔ)知識(shí)的MySQL數(shù)據(jù)庫(kù)愛(ài)好者閱讀,也可以作為準(zhǔn)備MySQL OCP考試的備考書(shū)。
寫(xiě)這本書(shū)的原因
MySQL是世界上排名的開(kāi)源數(shù)據(jù)庫(kù),實(shí)際上,MySQL加上其分支已經(jīng)超過(guò)了Oracle數(shù)據(jù)庫(kù)的排名,成了事實(shí)上的業(yè)界王者。自從2009年Oracle公司通過(guò)收購(gòu)SUN公司將MySQL置于旗下后,MySQL數(shù)據(jù)庫(kù)的發(fā)展更加迅猛,特別是MySQL 8.0版本的推出,使MySQL數(shù)據(jù)庫(kù)和其他開(kāi)源數(shù)據(jù)庫(kù)的差距進(jìn)一步拉大。在開(kāi)源數(shù)據(jù)庫(kù)越來(lái)越流行的今天,學(xué)習(xí)MySQL數(shù)據(jù)庫(kù)成了很多數(shù)據(jù)庫(kù)愛(ài)好者的。
我從21世紀(jì)初開(kāi)始使用MySQL數(shù)據(jù)庫(kù),剛開(kāi)始做開(kāi)發(fā),后來(lái)做運(yùn)維。和很多MySQL的愛(ài)好者一樣,我在遇到問(wèn)題時(shí)喜歡從網(wǎng)上搜索答案,但這樣得到的知識(shí)是碎片化的,要想真正精通MySQL必須進(jìn)行系統(tǒng)、全面的學(xué)習(xí)。我學(xué)習(xí)MySQL的資料來(lái)源主要有兩個(gè): 個(gè)來(lái)源是MySQL的官方文檔,但MySQL數(shù)據(jù)庫(kù)的官方文檔和Oracle數(shù)據(jù)庫(kù)的官方文檔比起來(lái)相當(dāng)簡(jiǎn)陋,很難讓人相信是出自同一家公司之手; 第二個(gè)資料來(lái)源是MySQL方面的書(shū)籍,我基本上把國(guó)內(nèi)所有的Oracle和MySQL的書(shū)籍都看過(guò)了。感覺(jué)MySQL方面的中文書(shū)還是太少,特別是涉及MySQL 8.0新特性和優(yōu)化方面的書(shū)籍更少。于是我在學(xué)習(xí)過(guò)程中就萌生了一個(gè)想法,要自己寫(xiě)本MySQL方面的書(shū),為開(kāi)源數(shù)據(jù)庫(kù)在中國(guó)的推廣做點(diǎn)貢獻(xiàn)。
這些年來(lái),我不斷地把自己實(shí)際工作中積累的經(jīng)驗(yàn)整理成對(duì)外的博客和對(duì)內(nèi)的工作筆記。隨著自己博客和工作筆記的積累,再加上在廣州鼎甲公司和互聯(lián)網(wǎng)上的授課,輸出一本MySQL的書(shū)就成為水到渠成的事情了。
這本書(shū)中的很多內(nèi)容是我工作經(jīng)驗(yàn)的總結(jié),例如,我在工作中處理多的故障是MySQL無(wú)法啟動(dòng),針對(duì)MySQL系統(tǒng)參數(shù)設(shè)置錯(cuò)誤而造成的無(wú)法啟動(dòng),我總結(jié)了一種排除法找出阻止MySQL啟動(dòng)的錯(cuò)誤系統(tǒng)參數(shù),又總結(jié)了SELinux和AppArmor阻止MySQL啟動(dòng)的解決辦法,還總結(jié)了MySQL無(wú)法啟動(dòng)時(shí)進(jìn)行數(shù)據(jù)救援的方法。如果只是采用平鋪直敘的方式把技術(shù)要點(diǎn)描述清楚,這樣的書(shū)市面上很多,我的目標(biāo)是要寫(xiě)出自己的東西、自己的特色、自己對(duì)技術(shù)的理解和應(yīng)用,這樣便增加了寫(xiě)書(shū)的難度和出錯(cuò)的可能,但這樣做才更有意義,至于做得如何就交給讀者來(lái)評(píng)價(jià)吧。
學(xué)習(xí)數(shù)據(jù)庫(kù)的方法
因?yàn)楣ぷ鞯年P(guān)系,我對(duì)目前所有流行的數(shù)據(jù)庫(kù)都有所研究,特別是Oracle和MySQL數(shù)據(jù)庫(kù),很多朋友問(wèn)我是如何學(xué)好數(shù)據(jù)庫(kù)的,這里和大家做一個(gè)交流。
要學(xué)好任何一門(mén)技術(shù)都要有一種靜下心來(lái)做學(xué)問(wèn)的態(tài)度,數(shù)據(jù)庫(kù)的技術(shù)相對(duì)比較復(fù)雜,短期內(nèi)無(wú)法速成,只有經(jīng)過(guò)長(zhǎng)時(shí)間的鉆研才能精通這門(mén)技術(shù)。我把學(xué)習(xí)數(shù)據(jù)庫(kù)技術(shù)的過(guò)程大致分為如下三步。
步是理論學(xué)習(xí),主要是閱讀官方文檔。 在理論學(xué)習(xí)過(guò)程中,首先要掌握概念和原理,因此我學(xué)習(xí)Oracle的時(shí)候,看得多的文檔是Database Concepts,后來(lái)我把這個(gè)文檔的電子版發(fā)給淘寶的賣(mài)家,他們幫忙打印和裝訂成兩冊(cè),大約花了70元錢(qián),我看了很多遍,所有的概念和原理搞得爛熟。不光是數(shù)據(jù)庫(kù)技術(shù),所有的IT技術(shù)都要先把理論搞清楚再動(dòng)手操作,所有的理工科的學(xué)習(xí)都是這樣,理論清楚了再談操作。繞過(guò)理論學(xué)習(xí)操作并不是走捷徑,因?yàn)椴痪镁桶l(fā)現(xiàn)實(shí)際上是在走彎路。廣州鼎甲公司有一萬(wàn)多個(gè)客戶(hù),我在日常的工作中處理了很多數(shù)據(jù)庫(kù)的疑難雜癥,這些故障表面上看起來(lái)各不相同,但實(shí)際上只要理論清楚,所有的故障都能解決。
順便說(shuō)到,如果要掌握高端的IT技術(shù),必須具備相當(dāng)?shù)挠⑽拈喿x能力,雖然我經(jīng)過(guò)專(zhuān)門(mén)的英語(yǔ)學(xué)習(xí),托業(yè)考試成績(jī)是890分,但并不建議IT從業(yè)人員專(zhuān)門(mén)學(xué)習(xí)英語(yǔ),因?yàn)殚喿x自己專(zhuān)業(yè)的英文文檔既能學(xué)習(xí)英語(yǔ),又能學(xué)習(xí)技術(shù)。一些初學(xué)者畏懼英文文檔,想繞開(kāi)走,實(shí)際上只要硬著頭皮去啃,一兩年的時(shí)間就能翻過(guò)這個(gè)坎。
第二步是動(dòng)手實(shí)驗(yàn)。做實(shí)驗(yàn)是提高自己動(dòng)手能力的有效的方法。我曾經(jīng)花了兩年的時(shí)間準(zhǔn)備Oracle 10g的OCM考試,那個(gè)時(shí)候沒(méi)有培訓(xùn)班,我就是依據(jù)考試大綱閱讀Oracle的官方文檔,然后猜測(cè)考試時(shí)會(huì)遇到什么樣的場(chǎng)景,自己設(shè)計(jì)了數(shù)百個(gè)實(shí)驗(yàn)題,反復(fù)練習(xí),把理論知識(shí)練成了直覺(jué)。業(yè)界的一個(gè)常見(jiàn)現(xiàn)象是某位技術(shù)大咖被提拔成了領(lǐng)導(dǎo),減少了親自動(dòng)手操作的機(jī)會(huì),越不動(dòng)手,越不自信,就越不敢動(dòng)手,形成了一個(gè)惡性循環(huán),后退化成了光說(shuō)不練的領(lǐng)導(dǎo),很可惜!
第三步是在生產(chǎn)系統(tǒng)的運(yùn)維中磨煉提高。實(shí)驗(yàn)做得再熟,和在生產(chǎn)系統(tǒng)上操作還是有差距的,因?yàn)閿?shù)據(jù)量和業(yè)務(wù)量的關(guān)系,一些在開(kāi)發(fā)、測(cè)試環(huán)境執(zhí)行得很順暢的命令到生產(chǎn)系統(tǒng)上卻會(huì)遇到各種問(wèn)題。我在生產(chǎn)上進(jìn)行實(shí)施或故障排除中有兩個(gè)原則: 一是對(duì)生產(chǎn)系統(tǒng)要有敬畏之心,在我的職業(yè)生涯中只闖了一次大禍,卻永遠(yuǎn)銘記,每次進(jìn)行生產(chǎn)變更都小心翼翼。業(yè)界有一種人是無(wú)知無(wú)畏,實(shí)際上越是水平高的人,在生產(chǎn)系統(tǒng)上進(jìn)行變更時(shí)越謹(jǐn)慎,畢竟80%的生產(chǎn)事故是由變更引起的; 二是思路要清楚,其實(shí)不光是解決技術(shù)問(wèn)題,人生中的所有事情都要基于這個(gè)原則,你要知道你的目標(biāo)是什么,怎么達(dá)到你的目標(biāo),你采取每個(gè)步驟的后果是什么。
這三步是一個(gè)多次循環(huán)的過(guò)程,理論知識(shí)的欠缺會(huì)導(dǎo)致操作的錯(cuò)誤,操作中的出錯(cuò)也可以反映出對(duì)理論知識(shí)的掌握不足,只有從理論到實(shí)踐的多次反復(fù)才能磨礪出一個(gè)真正的數(shù)據(jù)庫(kù)專(zhuān)家。
本書(shū)的主要內(nèi)容
本書(shū)的內(nèi)容基于MySQL 8.0的版本,全書(shū)分為18章。
第1章介紹MySQL的安裝、升級(jí)和啟動(dòng)過(guò)程中的排錯(cuò)。
第2章介紹賬號(hào)、權(quán)限、密碼、角色等內(nèi)容,還介紹如何解決忘記root密碼的問(wèn)題。
第3章介紹MySQL的4種日志: 錯(cuò)誤日志、通用查詢(xún)?nèi)罩、慢查?xún)?nèi)罩竞投M(jìn)制日志。
第4章介紹安全方面的內(nèi)容,包括賬號(hào)和密碼的安全、數(shù)據(jù)加密和審計(jì)等。
第5~7章介紹3個(gè)MySQL的系統(tǒng)數(shù)據(jù)庫(kù): information_schema、performance_schema和sys。
第8章介紹邏輯備份,包括4種常見(jiàn)的邏輯備份工具及其對(duì)比,還討論了備份集的一致性和加快數(shù)據(jù)導(dǎo)入速度的問(wèn)題。
第9、10章分別介紹常用的物理備份工具: XtraBackup和MySQL Enterprise Backup。
第11章介紹在沒(méi)有備份而且MySQL無(wú)法啟動(dòng)時(shí)如何進(jìn)行數(shù)據(jù)恢復(fù)。
第12章介紹MySQL的新客戶(hù)端工具M(jìn)ySQL Shell。
第13、14章分別介紹MySQL的兩個(gè)高可用解決方案: 復(fù)制和InnoDB集群。
第15章介紹3種基準(zhǔn)測(cè)試工具。
第16章介紹數(shù)據(jù)庫(kù)優(yōu)化的重要性和實(shí)例優(yōu)化的方法。
第17章介紹SQL優(yōu)化的基礎(chǔ)知識(shí)。
第18章從實(shí)戰(zhàn)角度介紹如何進(jìn)行SQL優(yōu)化。
本書(shū)講述的MySQL,除非有特別說(shuō)明,默認(rèn)都是Linux環(huán)境的MySQL 8.0,存儲(chǔ)引擎默認(rèn)是InnoDB。本書(shū)適合具有一定IT基礎(chǔ)知識(shí)的MySQL數(shù)據(jù)庫(kù)愛(ài)好者學(xué)習(xí),也可以作為準(zhǔn)備MySQL OCP考試的備考書(shū)。
本書(shū)的配套資源
我針對(duì)書(shū)中的重點(diǎn)和難點(diǎn)設(shè)計(jì)了30多個(gè)實(shí)驗(yàn),并錄制了實(shí)驗(yàn)的操作視頻,讀者可以通過(guò)掃描書(shū)中的二維碼在線觀看。讀者還可以通過(guò)掃描下方二維碼下載本書(shū)的全部腳本。
腳本
致謝
感謝我的父母、妻子、妹妹和兩個(gè)小寶貝雯雯和咚咚對(duì)我永遠(yuǎn)的支持,你們的支持是我寫(xiě)書(shū)的動(dòng)力,這本書(shū)同時(shí)也是獻(xiàn)給你們的禮物。
感謝廣州鼎甲公司的創(chuàng)始人和總裁王子駿教授,這里我想引用阿達(dá)在2020年年會(huì)上的話(huà)對(duì)王總表示感謝: 感謝王總創(chuàng)立了鼎甲,使我們有了一個(gè)施展自己才能的平臺(tái)。
感謝廣州鼎甲的領(lǐng)導(dǎo)和同事: 馬總、樊總、呂總、湯總、大俠、阿達(dá)、冷工、武總、常馨、水仙、婷娟、肖廷楷、范華,以及全體鼎甲的同仁,感謝你們?cè)诠ぷ魃蠈?duì)我的幫助,每天和你們這些業(yè)界精英在一起工作對(duì)自己技術(shù)水平的提高大有裨益,這本書(shū)也是和你們思想碰撞的產(chǎn)物。廣州鼎甲成為國(guó)內(nèi)容災(zāi)行業(yè)龍頭的歷史同時(shí)也是你們這些技術(shù)精英的成長(zhǎng)史。
感謝各位數(shù)據(jù)庫(kù)領(lǐng)域的朋友,每天瀏覽你們的博客和朋友圈學(xué)到了很多東西,不僅限于技術(shù)方面。
由于自己水平有限,書(shū)中不當(dāng)之處在所難免,歡迎廣大同行和讀者批評(píng)指正。
姚遠(yuǎn)
2021年8月
部分管理
第1章安裝和運(yùn)行
1.1MySQL 8.0社區(qū)版的安裝
1.2Percona Server for MySQL的安裝
1.3安裝Sakila示例數(shù)據(jù)庫(kù)
1.4檢查MySQL服務(wù)
1.5升級(jí)到MySQL 8.0
1.6Linux對(duì)MySQL的強(qiáng)制訪問(wèn)控制
1.7啟動(dòng)排錯(cuò)
1.8實(shí)驗(yàn)
第2章賬號(hào)和權(quán)限
2.1賬號(hào)
2.2權(quán)限
2.3訪問(wèn)控制
2.4角色
2.5代理用戶(hù)
2.6無(wú)密碼登錄
2.7重置root用戶(hù)密碼
2.8實(shí)驗(yàn)
第3章日志
3.1錯(cuò)誤日志
3.2通用查詢(xún)?nèi)罩?/p>
3.3慢查詢(xún)?nèi)罩?/p>
3.4二進(jìn)制日志
3.5實(shí)驗(yàn)
第4章安全
4.1密碼驗(yàn)證組件
4.2連接控制插件
4.3連接加密
4.4數(shù)據(jù)加密
4.5審計(jì)插件
4.6實(shí)驗(yàn)
第二部分監(jiān)控
第5章information_schema數(shù)據(jù)庫(kù)
5.1數(shù)據(jù)組成
5.2MySQL 8.0中的優(yōu)化
5.3權(quán)限
5.4視圖說(shuō)明
5.5實(shí)驗(yàn)
第6章performance_schema數(shù)據(jù)庫(kù)
6.1作用和特點(diǎn)
6.2配置
6.3性能計(jì)量配置
6.4消費(fèi)者配置
6.5執(zhí)行者配置
6.6對(duì)象配置
6.7典型用例
6.8實(shí)驗(yàn)
第7章sys數(shù)據(jù)庫(kù)
7.1簡(jiǎn)介
7.2配置參數(shù)
7.3存儲(chǔ)過(guò)程
7.4函數(shù)
7.5視圖
7.6實(shí)驗(yàn)
第三部分備份恢復(fù)
第8章邏輯備份
8.1邏輯備份和物理備份的區(qū)別
8.2mysqldump
8.3mysqlpump
8.4mydumper
8.5MySQL Shell中的備份恢復(fù)工具
8.6四種邏輯備份工具的對(duì)比
8.7備份集的一致性
8.8提高恢復(fù)的速度
8.9實(shí)驗(yàn)
第9章XtraBackup
9.1特點(diǎn)介紹
9.2安裝
9.3工作原理
9.4典型用例
9.5高級(jí)功能
9.6實(shí)驗(yàn)
第10章MySQL Enterprise Backup
10.1簡(jiǎn)介
10.2工作原理
10.3典型用例
10.4高級(jí)功能
10.5實(shí)驗(yàn)
第11章數(shù)據(jù)救援
11.1InnoDB強(qiáng)制恢復(fù)
11.2遷移MyISAM表
11.3只有表空間文件時(shí)批量恢復(fù)InnoDB表
11.4使用ibd2sdi恢復(fù)表結(jié)構(gòu)
11.5TwinDB數(shù)據(jù)恢復(fù)工具
11.6實(shí)驗(yàn)
第四部分高可用
第12章MySQL Shell
12.1簡(jiǎn)介
12.2通用命令
12.3客戶(hù)化MySQL Shell
12.4全局對(duì)象
12.5報(bào)告架構(gòu)
12.6實(shí)驗(yàn)
第13章復(fù)制
13.1簡(jiǎn)介
13.2克隆插件
13.3配置復(fù)制
13.4GTID
13.5排錯(cuò)
13.6使用MySQL Shell的AdminAPI管理InnoDB復(fù)制
13.7實(shí)驗(yàn)
第14章InnoDB集群
14.1架構(gòu)
14.2組復(fù)制
14.3MySQL Router
14.4管理InnoDB集群
14.5實(shí)驗(yàn)
第五部分優(yōu)化
第15章基準(zhǔn)測(cè)試工具
15.1mysqlslap
15.2Sysbench
15.3TPCCMySQL
15.4實(shí)驗(yàn)
第16章實(shí)例優(yōu)化
16.1數(shù)據(jù)庫(kù)優(yōu)化的重要性
16.2系統(tǒng)參數(shù)的修改
16.3內(nèi)存的分配
16.4InnoDB日志
16.5硬盤(pán)讀寫(xiě)參數(shù)
16.6資源組
16.7實(shí)驗(yàn)
第17章SQL優(yōu)化基礎(chǔ)
17.1SQL語(yǔ)句的執(zhí)行計(jì)劃
17.2優(yōu)化器
17.3索引
17.4表連接
17.5統(tǒng)計(jì)信息
17.6直方圖
17.7CTE
17.8實(shí)驗(yàn)
第18章SQL優(yōu)化實(shí)戰(zhàn)
18.1找出需要優(yōu)化的SQL
18.2優(yōu)化方法
18.3優(yōu)化索引
18.4準(zhǔn)確的統(tǒng)計(jì)信息
18.5直方圖的使用
18.6連接優(yōu)化
18.7優(yōu)化排序
18.8表空間碎片整理
18.9實(shí)驗(yàn)
參考文獻(xiàn)