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