內容簡介
本書以MySQL 8.0為主,全面系統地闡述了MySQL日常使用及管理過程中的一些常用知識點:安裝、複製、binlog、備份、監控、DDL、執行緒池、中間件、常用工具、組複製、InnoDB Cluster、JSON、MySQL 8.0的新特性。
本書定位於實戰,目的是讓讀者拿來即用,快速上手MySQL。除了實戰,本書還花費了大量的篇幅來講解MySQL中一些常見操作、常用工具的實現原理。
組複製是MySQL官方推薦的高可用方案,本書會從源碼角度分析組複製的一些核心模組的實現細節,包括分散式恢復、衝突檢測、事務一致性以及流量控制機制等。
作者簡介
陳臣
甲骨文(Oracle)公司首席工程師,前vivo網際網路資料庫專家,有超過10年的資料庫管理和架構經驗,擅長MySQL資料庫日常操作的原理剖析。公眾號“MySQL實戰”作者,部落格園推薦部落格博主iVictor,部落格全網閱讀量超300萬。
圖書目錄
第 1章 MySQL入門、安裝與服務的管理1
1.1 MySQL的歷史1
1.2 MySQL的安裝2
1.2.1 下載MySQL3
1.2.2 基於二進制包的安裝8
1.2.3 基於源碼包的安裝14
1.2.4 配置檔案的讀取順序19
1.3 MySQL服務的管理21
1.3.1 使用 etc init.d mysqld管理MySQL服務22
1.3.2 使用systemd管理MySQL服務27
1.4 本章總結33
第 2章 複製34
2.1 複製的原理及搭建35
2.1.1 複製的搭建36
2.1.2 參考資料41
2.2 GTID複製41
2.2.1 GTID出現的背景41
2.2.2 GTID的搭建42
2.2.3 GTID的原理42
2.2.4 GTID的相關參數44
2.2.5 GTID的相關函式50
2.2.6 線上修改複製模式51
2.2.7 設定@@GLOBAL.GTID_PURGED時的注意事項54
2.2.8 參考資料55
2.3 半同步複製55
2.3.1 事務的兩階段提交協定56
2.3.2 半同步複製的原理57
2.3.3 半同步複製的安裝58
2.3.4 半同步複製的注意事項60
2.3.5 半同步複製的常用參數60
2.4 並行複製63
2.4.1 並行複製方案63
2.4.2 如何開啟並行複製71
2.4.3 參考資料71
2.5 多源複製72
2.5.1 多源複製的搭建72
2.5.2 多源複製搭建過程中的注意事項73
2.5.3 多源複製的管理74
2.6 延遲複製74
2.6.1 如何開啟延遲複製75
2.6.2 如何使用延遲複製恢復誤刪的表75
2.6.3 延遲複製的總結77
2.7 本章總結77
第3章 深入解析binlog79
3.1 binlog的格式79
3.1.1 STATEMENT79
3.1.2 ROW80
3.1.3 MIXED81
3.2 如何解讀binlog的內容82
3.2.1 解析STATEMENT格式的二進制日誌82
3.2.2 解析ROW格式的二進制日誌88
3.3 如何解讀 relay log 的內容92
3.4 binlog 中的事件類型94
3.5 基於 python-mysql-replication 打造一個 binlog解析器101
3.6 本章總結109
第4章 深入MySQL的複製管理110
4.1 常見的管理操作110
4.1.1 查看主庫的狀態110
4.1.2 查看從庫複製的狀態111
4.1.3 搭建複製113
4.1.4 開啟複製115
4.1.5 停止複製117
4.1.6 在主庫上查看從庫IP和連線埠信息117
4.1.7 查看實例當前擁有的binlog118
4.1.8 刪除binlog118
4.1.9 查看binlog的內容118
4.1.10 RESET MASTER、RESET SLAVE和RESET SLAVE ALL的區別119
4.1.11 跳過指定事務120
4.1.12 操作不寫入binlog121
4.1.13 判斷主庫的某個操作是否已經在從庫上執行121
4.1.14 線上設定複製的過濾規則122
4.2 複製的監控123
4.2.1 連線123
4.2.2 事務重放125
4.2.3 多執行緒複製126
4.2.4 過濾規則128
4.2.5 組複製129
4.3 主從延遲129
4.3.1 如何分析主從延遲129
4.3.2 主從延遲的常見原因及解決方法132
4.3.3 如何解讀Seconds_Behind_Master134
4.3.4 參考資料142
4.4 複製中的常見問題及解決方法142
4.4.1 I O執行緒連線不上主庫142
4.4.2 server_id重複143
4.4.3 包的大小超過slave_max_allowed_packet的限制143
4.4.4 從庫需要的binlog在主庫上不存在144
4.4.5 從庫的GTID多於主庫的147
4.4.6 在執行插入操作時,提示唯一鍵衝突149
4.4.7 在執行刪除或更新操作時,提示記錄不存在150
4.4.8 主從數據不一致150
4.5 本章總結150
第5章 備份152
5.1 mysqldump155
5.1.1 mysqldump的實現原理155
5.1.2 mysqldump的常用選項160
5.1.3 mysqldump的常見用法165
5.1.4 總結166
5.2 mydumper166
5.2.1 mydumper的安裝167
5.2.2 mydumper的實現原理167
5.2.3 mydumper的參數解析170
5.2.4 myloader的參數解析177
5.2.5 mydumper和myloader的常見用法179
5.2.6 總結180
5.3 XtraBackup180
5.3.1 XtraBackup的安裝181
5.3.2 基於源碼分析XtraBackup的實現原理182
5.3.3 XtraBackup的常見用法192
5.3.4 Xtrabackup的重要參數205
5.3.5 XtraBackup的注意事項206
5.3.6 備份用戶需要的許可權207
5.3.7 參考資料208
5.4 克隆外掛程式208
5.4.1 克隆外掛程式的安裝209
5.4.2 克隆外掛程式的使用209
5.4.3 查看克隆操作的進度212
5.4.4 基於克隆數據搭建從庫214
5.4.5 克隆外掛程式的實現細節214
5.4.6 克隆外掛程式的限制215
5.4.7 克隆外掛程式與XtraBackup的異同216
5.4.8 克隆外掛程式的參數解析216
5.4.9 參考資料217
5.5 MySQL Shell Dump & Load217
5.5.1 MySQL Shell Dump & Load的用法218
5.5.2 MySQL Shell Dump & Load的關鍵特性221
5.5.3 util.dumpInstance的實現原理221
5.5.4 util.dumpInstance的參數解析222
5.5.5 util.loadDump的參數解析224
5.5.6 MySQL Shell Dump & Load的注意事項226
5.5.7 參考資料226
5.6 使用XtraBackup搭建從庫226
5.6.1 使用XtraBackup搭建從庫的基本步驟227
5.6.2 基於從庫備份搭建從庫的注意事項230
5.6.3 設定GTID_PURGED的注意事項230
5.6.4 使用XtraBackup 8.0搭建從庫的注意事項231
5.6.5 總結233
5.7 指定時間點(位置點)的恢復234
5.8 搭建binlog server236
5.8.1 基於mysqlbinlog搭建binlog server236
5.8.2 參考資料238
5.9 檢測備份的有效性238
5.10 本章總結239
第6章 監控241
6.1 Zabbix242
6.1.1 安裝Zabbix Server242
6.1.2 安裝Zabbix Agent250
6.2 安裝MySQL監控外掛程式PMP251
6.3 深入理解PMP256
6.3.1 ss_get_mysql_stats.php源碼分析258
6.3.2 基於ss_get_mysql_stats.php自定義監控項263
6.4 Zabbix常見問題定位及性能最佳化266
6.4.1 定位監控項的狀態Not supported266
6.4.2 分區表268
6.4.3 Zabbix Server的參數最佳化270
6.4.4 Zabbix API273
6.4.5 參考資料278
6.5 PMM278
6.5.1 PMM的體系架構279
6.5.2 安裝PMM Server280
6.5.3 安裝PMM Client283
6.5.4 添加MySQL服務288
6.5.5 Query Analytics290
6.5.6 深入理解PMM Server292
6.5.7 設定告警297
6.5.8 PMM的常見問題299
6.5.9 參考資料305
6.6 MySQL中常用的監控指標306
6.6.1 連線相關306
6.6.2 Com相關307
6.6.3 Handler相關308
6.6.4 臨時表相關309
6.6.5 Table Cache相關310
6.6.6 檔案相關311
6.6.7 主從複製相關312
6.6.8 緩衝池相關312
6.6.9 redo log相關313
6.6.10 鎖相關314
6.6.11 排序相關315
6.6.12 查詢相關316
6.6.13 其他重要指標316
6.7 本章總結317
第7章 DDL318
7.1 Online DDL319
7.1.1 Online DDL的分類320
7.1.2 Online DDL的實現原理324
7.1.3 如何檢查DDL的進度325
7.1.4 MySQL 8.0.12引入的秒級加列特性327
7.1.5 Online DDL的優缺點329
7.1.6 Online DDL的注意事項329
7.1.7 參考資料331
7.2 pt-online-schema-change331
7.2.1 pt-online-schema-change的實現原理331
7.2.2 pt-online-schema-change的參數解析337
7.2.3 pt-online-schema-change的優缺點345
7.2.4 pt-online-schema-change的注意事項345
7.3 gh-ost346
7.3.1 gh-ost的實現原理346
7.3.2 gh-ost的參數解析354
7.3.3 與gh-ost進行互動358
7.3.4 gh-ost的優缺點359
7.4 元數據鎖360
7.4.1 元數據鎖引入的背景360
7.4.2 元數據鎖的基本概念362
7.4.3 在MySQL 5.7和8.0中如何定位DDL被阻塞的問題363
7.4.4 在MySQL 5.6中如何定位DDL被阻塞的問題365
7.5 本章總結367
第8章 連線池和執行緒池369
8.1 連線池369
8.1.1 連線池的運行原理369
8.1.2 常用的JDBC連線池370
8.1.3 c3p0連線池371
8.1.4 DBCP連線池374
8.1.5 參考配置377
8.1.6 總結378
8.2 MySQL執行緒池378
8.2.1 執行緒池的實現原理379
8.2.2 如何開啟執行緒池功能380
8.2.3 MySQL企業版執行緒池參數解析380
8.2.4 Percona Server執行緒池參數解析381
8.2.5 MySQL企業版執行緒池和Percona Server執行緒池的對比382
8.2.6 執行緒池的適用場景384
8.2.7 執行緒池的壓測結果384
8.2.8 執行緒池的監控385
8.2.9 參考資料389
8.3 MySQL server has gone away深度解析389
8.3.1 出現MySQL server has gone away錯誤的常見原因389
8.3.2 interactive_timeout和wait_timeout的區別390
8.3.3 wait_timeout設定為多大比較合適393
8.4 本章總結395
第9章 MySQL的常用工具396
9.1 sysbench398
9.1.1 安裝sysbench398
9.1.2 sysbench用法講解399
9.1.3 對MySQL進行基準測試的基本步驟399
9.1.4 如何分析MySQL的基準測試結果401
9.1.5 如何使用sysbench對伺服器性能進行測試402
9.1.6 MySQL常見的測試場景及對應的SQL語句404
9.1.7 如何自定義sysbench測試腳本407
9.1.8 總結411
9.2 pt-archiver411
9.2.1 安裝411
9.2.2 實現原理411
9.2.3 常見用法413
9.2.4 常用參數416
9.2.5 總結418
9.3 pt-config-diff418
9.4 pt-ioprofile419
9.5 pt-kill420
9.5.1 實現原理420
9.5.2 過濾邏輯422
9.5.3 常見用法424
9.6 pt-pmp425
9.7 pt-query-digest426
9.7.1 常見用法426
9.7.2 常用參數429
9.8 pt-show-grants430
9.9 pt-slave-restart431
9.10 pt-stalk433
9.11 pt-table-checksum435
9.11.1 實現原理435
9.11.2 常見用法440
9.11.3 常用參數440
9.12 pt-table-sync443
9.12.1 實現原理443
9.12.2 常見用法446
9.12.3 常用參數446
9.13 pt-upgrade448
9.14 本章總結453
第 10章 中間件455
10.1 ProxySQL的安裝458
10.2 ProxySQL入門458
10.3 多層配置系統460
10.4 讀寫分離463
10.5 深入理解ProxySQL表470
10.6 ProxySQL的高級特性475
10.6.1 定時器475
10.6.2 SQL審計476
10.6.3 查詢重寫477
10.6.4 mirroring479
10.6.5 SQL黑名單481
10.7 ProxySQL連線池482
10.8 ProxySQL Cluster490
10.8.1 搭建ProxySQL Cluster491
10.8.2 添加一個新的節點493
10.9 ProxySQL的常見參數494
10.9.1 管理參數495
10.9.2 監控參數496
10.9.3 MySQL參數498
10.9.4 如何修改參數501
10.10 ProxySQL中的常見問題501
10.10.1 如何自定義ProxySQL的數據目錄501
10.10.2 通過USE DBNAME切換資料庫502
10.10.3 ProxySQL的高可用性502
10.11 本章總結502
第 11章 組複製504
11.1 部署組複製506
11.1.1 準備安裝環境506
11.1.2 初始化MySQL實例507
11.1.3 啟動組複製510
11.1.4 添加節點511
11.2 單主模式和多主模式512
11.2.1 單主模式和多主模式的區別512
11.2.2 單主模式和多主模式的線上切換515
11.3 監控組複製516
11.3.1 replication_group_members516
11.3.2 replication_group_member_stats517
11.4 組複製的要求和限制518
11.5 組複製的常見管理操作521
11.5.1 強制組成員的重新配置521
11.5.2 如何設定IP白名單523
11.5.3 如何查找單主模式下的Primary節點524
11.5.4 新主選舉算法524
11.5.5 如何查看Secondary節點的延遲情況529
11.5.6 大事務530
11.5.7 查看組複製的記憶體使用531
11.6 組複製的實現原理533
11.6.1 資料庫狀態機533
11.6.2 事務在組複製中的處理流程533
11.6.3 參考資料535
11.7 組複製的實現細節536
11.8 組複製的分散式恢復545
11.8.1 分散式恢復的實現原理545
11.8.2 分散式恢復的相關參數552
11.9 組複製的衝突檢測553
11.9.1 write_set553
11.9.2 衝突檢測資料庫556
11.9.3 衝突檢測的實現細節557
11.9.4 衝突檢測資料庫的清理邏輯560
11.10 組複製的故障檢測562
11.10.1 模擬網路分區562
11.10.2 故障檢測流程566
11.10.3 XCom Cache567
11.10.4 注意事項569
11.10.5 參考資料569
11.11 組複製的事務一致性569
11.11.1 group_replication_consistency570
11.11.2 總結573
11.11.3 參考資料573
11.12 組複製的流量控制機制573
11.12.1 觸發流控的條件574
11.12.2 配額的計算邏輯576
11.12.3 配額的作用時機581
11.12.4 流控的相關參數583
11.12.5 總結584
11.12.6 參考資料585
11.13 組複製的重點參數585
11.14 本章總結588
第 12章 InnoDB Cluster590
12.1 MySQL Shell591
12.1.1 MySQL Shell的安裝592
12.1.2 MySQL Shell的使用592
12.1.3 X DevAPI的關鍵特性595
12.1.4 MySQL Shell工具集598
12.1.5 MySQL Shell的使用技巧605
12.2 MySQL Router605
12.2.1 MySQL Router的安裝606
12.2.2 MySQL Router的使用606
12.2.3 啟動MySQL Router612
12.2.4 測試MySQL Router612
12.2.5 MySQL Router的注意事項613
12.3 InnoDB Cluster的搭建614
12.3.1 準備安裝環境614
12.3.2 初始化MySQL實例614
12.3.3 創建超級管理員賬號616
12.3.4 配置實例616
12.3.5 創建InnoDB Cluster618
12.3.6 添加節點619
12.3.7 查看集群的狀態622
12.3.8 部署MySQL Router623
12.4 InnoDB Cluster的管理操作624
12.4.1 dba對象支持的操作624
12.4.2 cluster對象支持的操作630
12.5 本章總結643
附錄A JSON645
附錄B MySQL 8.0的新特性672