第1章 MySQL发展和技术选型 1
1.1 如何看待MySQL 1
1.1.1 MySQL始出 1
1.1.2 MySQL学习周期和难度 1
1.1.3 解读DB-Engines的正确姿势 2
1.1.4 MySQL主要的一些分支 3
1.1.5 如何看待MySQL的技术发展 3
1.2 如何看待MySQL存储引擎 5
1.2.1 InnoDB发展时间线 6
1.2.2 存储引擎之战 7
1.2.3 存储引擎矩阵图 7
1.3 MySQL软件和版本选型 8
1.3.1 选择官方版的原因 9
1.3.2 Percona分支的优劣对比 9
1.3.3 选择MariaDB的原因 10
1.3.4 MySQL版本选型 10
1.3.5 分支选择的参考和标准 11
1.3.6 初步结论 13
1.4 MySQL常用工具选择和建议 13
1.4.1 运维管理类工具 14
1.主流运维管理工具 14
2.数据备份恢复工具 14
3.MySQL审计插件 15
1.4.2 应用工具 15
1.客户端工具 15
2.数据库版本管理工具 15
1.4.3 监控管理类工具 16
1.操作系统监控 16
2.性能监控工具 16
1.4.4 诊断和优化工具 16
1.诊断工具 16
2.性能测试工具 18
3.慢日志分析工具 18
1.4.5 初步结论 18
1.5 MySQL安装 19
1.5.1 常见的三种安装方式 19
1.5.2 MySQL安装规范 20
1.5.3 MySQL 5.7安装部署实践与总结 20
1.5.4 搭建从库 23
案例1-1:MySQL频繁停库的问题分析 25
第2章 理解MySQL体系结构 29
2.1 通过文件来了解MySQL体系结构 29
2.1.1 从例子来理解MySQL存储结构 32
2.1.2 慢日志诊断 32
案例2-1:MySQL日志故障的处理和分析 35
2.2 玩转MySQL数据字典 38
2.2.1 MySQL巡检模块:Sys Schema的设计 39
2.2.2 解惑:MySQL关于数据字典的一个疑问 47
2.3 InnoDB体系结构 50
2.3.1 InnoDB体系结构图 51
2.3.2 查看InnoDB状态的小技巧 52
2.3.3 InnoDB的多线程技术 53
2.3.4 InnoDB的缓存池管理技术 55
2.3.5 InnoDB中的脏页管理 58
2.3.6 InnoDB的日志管理 60
2.3.7 InnoDB中的检查机制 62
2.3.8 MySQL是如何保证数据完整性的 63
2.4 换个角度看MySQL 66
2.4.1 MySQL里的一些极限值 66
案例2-2:关于MySQL中的一些极限值的初步验证纠错 67
2.4.2 mysql.service启动脚本浅析 68
2.4.3 MySQL待改进的一些问题 71
2.5 MySQL参数解析 72
2.5.1 MySQL参数变化分析 73
2.5.2 MySQL 5.7参数解析 74
第3章 MySQL基础运维面面观 76
3.1 环境部署和构建 76
3.1.1 源码安装MySQL 76
3.1.2 在eclipse中配置MySQL源码环境 80
3.1.3 分分钟搭建MySQL一主多从环境 87
3.2 MySQL服务管理 88
3.2.1 Socket连接 88
3.2.2 TCP/IP连接 89
3.2.3 MySQL访问模式的演进 89
3.2.4 无密码登录 90
案例3-1:通过shell脚本检测MySQL服务信息 91
案例3-2:MySQL密码加密认证的简单脚本 93
案例3-3:MySQL中如何得到权限信息 94
方法1:重新导出导入整个数据库 94
方法2:导出mysql的权限配置 94
方法3:pt工具导出 95
3.3 MySQL备份恢复 97
3.3.1 数据安全警示录 97
3.3.2 常规备份方案 98
备份工具1:mysqldump 99
备份工具2:xtrabackup工具 101
备份工具3:mysqlpump 102
备份工具4:mysqlbackup 104
备份工具5:binlog备份工具 105
数据导出小技巧 105
数据导入小技巧 106
3.3.3 MySQL数据恢复 106
恢复方法1:使用xtrabackup进行数据全量恢复 107
恢复方法2:使用xtrabackup进行数据增量恢复 109
恢复方法3:使用mysqlbinlog手工恢复 112
恢复方法4:使用开源工具恢复数据binlog2sql 115
恢复方法5:使用参数innodb_force_recovery 117
恢复方法6:基于逻辑的数据恢复 117
恢复方法7:基于冷热数据分离的恢复思路 118
恢复方法8:基于句柄的无备份恢复 119
恢复方法9:直接恢复物理文件 121
3.4 MySQL安全审计 122
3.4.1 常用方法 122
3.4.2 性能测试结果 123
3.4.3 测试小结 123
第4章 SQL开发规范和基础 124
4.1 数据库开发规范 124
4.1.1 配置规范 124
4.1.2 建表规范 125
4.1.3 命名规范 125
4.1.4 索引规范 125
4.1.5 应用规范 126
4.1.6 分表规范 127
4.1.7 存储过程规范 127
4.1.8 安全规范 127
4.1.9 数据安全规范 128
案例4-1:MySQL无法创建表的问题分析 131
4.2 解读MySQL数据类型 135
4.2.1 MySQL整数类型 135
案例4-2:数值类型在binlog中需要注意的细节 136
4.2.2 MySQL小数类型 138
4.2.3 MySQL字符串类型 139
案例4-3:MySQL中需要注意的字段长度 140
4.2.4 MySQL日期类型 142
案例4-4:MySQL多版本的时间类型问题 143
4.2.5 JSON类型 144
4.3 MySQL特有的SQL 146
4.3.1 新增类 146
4.3.2 删除类 147
4.3.3 修改类 148
专题4-1:解读Replace into语句 148
4.3.4 查询类 153
4.4 MySQL常用函数 153
4.4.1 数学函数 154
案例4-5:MySQL字符串中抽取数值的方法 155
案例4-6:order by的妙用 156
4.4.2 字符串函数 157
案例4-7:MySQL字符函数的压力测试 160
案例4-8:字符串动态匹配 162
4.4.3 条件控制函数 162
4.4.4 日期和时间函数 163
案例4-9:Now()和sysdate()的差别 166
4.4.5 系统信息函数 169
4.4.6 其他常用的MySQL函数 169
第5章 MySQL运维管理实践 171
5.1 数据变更管理 171
5.1.1 MySQL脚本部署的四种策略 171
案例5-1:实战对比四种脚本部署策略的优劣 172
5.1.2 通过对比来了解online DDL 175
案例5-2:MySQL 5.5版本原生的DDL代价测试 176
案例5-3:MySQL 5.7版本原生的DDL代价测试 176
5.1.3 Online DDL的两种算法 177
案例5-4:对比测试online DDL的两种算法(copy和inplace) 177
5.1.4 pt-osc的原理和实现 181
案例5-5:源码分析pt-osc的实现原理 181
案例5-6:平滑删除数据的小技巧 184
5.2 MySQL复制管理 186
5.2.1 MySQL复制的四种类型 186
5.2.2 MySQL半同步复制 187
案例5-7:简单测试半同步复制 190
5.2.3 GTID的管理模式 191
案例5-8:修复GTID复制失败的分析 195
5.2.4 如何看待主从延迟 200
案例5-9:MySQL 5.6.5.7版本并行复制测试 203
5.2.5 主从数据不一致的分析 209
案例5-10:经典的自增列问题测试 210
案例5-11:主从不一致的修复过程 212
第6章 MySQL查询优化 215
6.1 MySQL优化基础 215
6.1.1 MySQL索引解析 216
6.1.2 推理SQL的解析过程 221
案例6-1:group by问题浅析 224
6.1.3 读懂执行计划 227
6.1.4 使用MySQL Profile定位性能瓶颈 234
案例6-2:合理评估新特性的使用 238
6.2 SQL查询优化 240
6.2.1 MySQL中的派生表 240
6.2.2 MySQL中的半连接 243
6.2.3 MySQL反连接 247
6.2.4 行值表达式优化 250
6.3 MySQL优化技巧 251
6.3.1 MySQL分页逻辑优化 251
6.3.2 数据隐式转换 254
案例6-3:一条update语句引发的“血案” 256
第7章 MySQL事务和锁 263
7.1 MySQL并发控制 263
7.1.1 为什么需要事务 263
7.1.2 MySQL并发控制技术方案 265
7.1.3 MySQL中的MVCC 266
7.2 事务隔离级别 269
7.2.1 MySQL中的隔离级别RR和RC 270
7.2.2 RR隔离级别下的unique失效 272
7.2.3 RR隔离级别下的更新冲突 274
7.3 MySQL锁机制 275
7.3.1 MySQL锁的类型 275
7.3.2 索引加锁过程的差异 278
7.3.3 这样分析一个死锁问题 280
7.4 经典的死锁案例集 283
场景1:3条insert语句导致的死锁问题 283
场景2:事务回滚导致的死锁 285
场景3:自增列导致的死锁 287
场景4:事务提交导致的死锁问题 288
场景5:delete和insert混合的死锁 291
场景6:2条delete语句导致的死锁问题 293
7.5 事务降维 294
降维策略1:存储过程调用转换为透明的SQL调用 295
降维策略2:Drop操作转换为可逆的DDL操作 295
降维策略3:Truncate操作转换为安全的DDL操作 295
降维策略4:DDL操作转换为DML操作 296
降维策略5:Delete操作转换为高效操作 296
降维策略6:Update操作转换为Insert操作 296
第8章 MySQL集群和高可用设计 297
8.1 MySQL高可用方案 297
8.1.1 MySQL高可用方案概览 298
8.1.2 MySQL高可用方案的建议 298
8.1.3 MySQL高可用的迭代方案思考 299
8.2 MySQL高可用方案之MHA 300
8.2.1 MHA原理和架构 300
8.2.2 如何系统的测试MHA 303
8.2.3 快速测试MHA的步骤 304
8.2.4 从代码关系图理清MHA的脉络 308
8.2.5 我们可能不知道的MHA逻辑 312
8.2.6 MHA的缺点和局限性 313
8.2.7 MHA的补充和改进 314
8.3 MySQL高可用方案之InnoDB Cluster 315
8.3.1 InnoDB Cluster三大件 316
8.3.2 快速入手InnoDB Cluster的建议 317
8.3.3 使用sandbox快速部署InnoDB Cluster 318
8.3.4 InnoDb Cluster核心组件:MGR 323
8.3.5 部署MGR的几种姿势 324
方法1:分分钟搭建MGR单主/多主测试环境 324
方法2:线上环境规范部署 325
8.3.6 常见的MGR问题 327
问题1:单主模式加入节点失败 328
问题2:模式配置错误导致无法启动集群 328
问题3:节点配置不统一导致集群无法启动 328
问题4:数据写入失败修复 329
问题5:模拟灾难 329
问题6:如何判断一个复制组中的主节点 330
8.3.7 迁移到MGR需要思考的问题 331
案例8-1:切换到MGR的参考步骤 332
案例8-2:大事务导致的运维系统无法访问 336
8.4 基于consul的高可用扩展方案 339
8.4.1 基于consul服务的高可用方案 339
8.4.2 基于MHA+Consul的MySQL高可用设计 340
8.4.3 MySQL高可用方案:MGR+consul组合测试 341
第9章 MySQL性能测试 344
9.1 sysbench压测MySQL 344
9.1.1 压测MySQL——环境部署和硬件压测 344
9.1.2 压测MySQL起步 348
9.1.3 压测MySQL——提高吞吐量测试 351
9.1.4 压测MySQL——定位压测瓶颈 356
9.1.5 定制sysbench的Lua模板 360
9.2 批量初始化数据性能测试 363
9.2.1 批量初始化数据初步想法 363
9.2.2 批量初始化数据的方案 363
方案1:存储过程导入 363
方案2:使用内存表 364
方案3:使用程序/脚本生成数据,批量导入 365
方案4:使用内存表和外部文件导入混合 365
方案5:存储过程显式事务提交 365
方案6:批量生成insert语句使用管道导入 366
方案7:批量生成insert语句显式事务提交 366
方案8:sysbench工具生成 366
方案9:Oracle的极简方案 367
第10章 基于业务的数据库架构设计 368
10.1 MySQL中间件方案 368
10.1.1 MySQL中间件方案盘点 369
10.1.2 分片设计思路 370
10.1.3 Mycat读写分离配置 372
10.1.4 sysbench压测Mycat 376
10.1.5 Mycat中的DDL 381
10.1.6 分布式架构扩缩容 382
10.2 基于业务场景的新架构方案 385
10.2.1 密集型写入的场景选型:TokuDB 385
10.2.2 基于OLAP的场景选型:Infobright 387
案例10-1:业务库百倍负载的优化方案 388
10.2.3 兼容MySQL的HTAP选型:TiDB 396
10.3 迁移到MySQL需要考虑的事情 397
10.3.1 我对迁移缘由的理解 397
10.3.2 为什么要迁移到MySQL 398
10.3.3 从Oracle迁移到MySQL需要考虑的事情 399
10.4 迁移到MySQL的业务架构演进实战经验 400
10.4.1 架构改造背景和演进策略 400
10.4.2 功能设计阶段 402
策略1:功能平移 402
10.4.3 系统架构演进阶段 403
策略2:系统架构拆分 403
策略3:写入水平扩展 403
策略4:读写分离扩展 404
10.4.4 业务架构演进阶段 405
策略5:业务拆分 405
策略6:事务降维 405
策略7:业务分布式架构改造 406
10.4.5 性能优化阶段 408
策略8:业务分片逻辑改造 408
10.4.6 架构里程碑和补充:基于分布式架构的水平扩展方案 409
补充要点1:充分利用硬件性能和容量评估 411
补充要点2:需要考虑的服务器部署架构 412
第11章 运维开发基础 414
11.1 运维开发是DBA新的挑战 414
11.1.1 运维开发和DBA技术栈的演进 415
11.1.2 运维开发常见的六个问题 416
11.2 运维开发基本功:Shell基础 419
11.2.1 Shell脚本心得 419
11.2.2 如何快速建立服务器之间的ssh互信 422
11.2.3 通过Shell脚本抽取MySQL实例信息 422
11.2.4 使用Shell脚本抽取MySQL表属性信息 424
11.3 运维开发必修技:Python开发 425
11.3.1 Python基础和数据结构 425
11.3.2 Python字符串遇上MySQL 430
11.3.3 Python实现快速排序 435
案例11-1:使用递归实现快速排序的小例子 435
11.4 运维开发短板:Web开发技术 437
11.4.1 如何理解Python Web开发技术 437
11.4.2 Web开发技术栈 440
11.4.3 从零开始串联Python前后端技术 440
第12章 自动化运维架构设计和规划 448
12.1 自动化运维意义和价值 448
12.1.1 运维问题梳理 448
12.1.2 运维系统的目标怎么定 449
12.2 以一持万:运维系统架构设计 450
12.3 纲举目张:运维系统的关键技术 451
12.3.1 执行路径统一规划 451
12.3.2 运维流程深度梳理 452
12.3.3 开源深度定制 454
12.3.4 SQL审核 454
12.3.5 工单处理引擎 455
12.4 画龙点睛:创新设计 457
12.4.1 前后端分离开发模式 458
12.4.2 任务调度系统 459
12.5 落地生花:自动化运维该如何落地 460
12.5.1 设身处地的功能设计 460
12.5.2 切实可行的实施规划 460
第13章 MySQL运维基础架构设计 463
13.1 元数据建设 463
13.1.1 元数据维度设计 464
13.1.2 元数据关系梳理 465
13.1.3 元数据通用查询设计 466
13.1.4 元数据流程管理 469
13.1.5 如何玩转MySQL实例信息管理 470
13.1.6 数据库元数据稽核实践 473
13.2 通用模块设计 475
13.2.1 运维系统中的脚本管理 475
13.2.2 运维系统中的工具管理 478
13.2.3 运维系统中的API管理 479
案例13-1:运维平台API优化实践 480
13.2.4 运维系统中的标签管理 483
13.3 任务调度 484
13.3.1 任务调度的整体设计和规划 484
13.3.2 Celery技术快速入门 486
案例13-2:配置一个简单的Celery任务 487
13.3.3 平滑对接Crontab和Celery的方案 489
13.3.4 通用Crontab接入任务调度的思考 491
第14章 MySQL运维管理模块设计 493
14.1 自动化部署 493
14.1.1 安装部署的步骤梳理 493
14.1.2 安装步骤中常见的问题 494
14.1.3 运维侧的安装部署设计 494
14.2 数据库权限管理 496
14.2.1 数据库权限管理的流程 496
14.2.2 数据权限管理的设计方案 497
14.3 系统权限管理 499
14.3.1 系统权限管理的痛点 499
14.3.2 系统权限管理的设计方案 500
14.3.3 设计一个权限管理总线 502
14.4 密码管理的三种套路 503
套路1:通过第三方加密解耦合 503
套路2:通过密码拆分解耦合 503
套路3:通过密码加解密保安全 504
14.5 基于磁盘空间故障自愈的设计方案 506
14.6 备份恢复 508
14.6.1 备份恢复全景图 508
14.6.2 备份恢复的自动化设计 509
14.6.3 DML闪回 514
14.6.4 备份恢复深度优化计划 514
14.6.5 通过调度优化备份效率 516
14.7 高可用管理 518
14.7.1 MySQL高可用模块设计 518
14.7.2 高可用切换流程设计 520
14.7.3 基于MHA平台化管理规划 520
14.8 分布式管理 522
14.8.1 MySQL分布式管理设计 522
14.8.2 数据生命周期管理 524
14.9 MySQL慢日志模块设计 529
1.慢日志切分 530
2.慢日志转储 530
3.慢日志分析 531
4.慢日志SQL管理 531
5.慢日志性能报警 531
6.慢日志报告提取 531
第15章 运维自助化服务 534
15.1 SQL自助审核 534
15.1.1 SQL审核的意义 534
15.1.2 SQL审核的核心 535
15.1.3 SQL审核的维度设计 535
15.1.4 SQL审核的亮点 536
15.1.5 怎么设计SQL审核的流程 538
15.1.6 落地SQL审核的正确姿势 541
15.1.7 SQL审核的质量跟踪 542
15.1.8 SQL审核的后续规划 543
15.2 SQL自动化上线 543
15.2.1 自动化上线流程设计 543
15.2.2 自动化上线策略设计 545
15.3 业务自助巡检 547
15.3.1 业务巡检应该关注什么 547
15.3.2 MySQL业务巡检的维度设计 548
15.3.3 系统巡检该怎么做 550
15.3.4 业务巡检整体设计 552
15.3.5 我眼中的业务巡检设计 553
15.3.6 MySQL业务巡检方案 555
方案1:通过数据建模梳理数据库业务 557
方案2:通过可视化解读数据库对象分布 558
方案3:巡检,监控,报警三位一体的集成建设 560
15.4 工单管理 561
15.4.1 数据库工单类型划分 562
15.4.2 工单管理模块建设思路 563
15.4.3 数据库工单接入流程设计 567
方案1:数据库资源申请自助化设计 568
方案2:用工单数据反哺运维平台建设 569
方案3:工单数据可视化分析 570