丁奇老师《MySQL实战45讲》的学习小结
第二篇:运维管理
之前对数据库主要是使用,运维管理做得很少,主要是备份、备份、备份 ^_^
通过这门课,在运维管理这方面学到的知识最多,学习内容的整理也最吃力。
照例从问题入手。
要理解MySQL在运维方面的机制,首先要理解数据库运维面对的问题:
-
数据库服务崩溃,但存储器正常,如何恢复?
-
服务器损毁,服务器上数据损坏或丢失,如何恢复数据和服务?
-
误删数据,如何恢复?
-
系统压力超过单个数据库服务器的能力,如何分布到多个服务器?
-
数据库性能急剧下降,怎么办?
在处理这些问题之前,先理解MySQL的几个运行机制,再来梳理如何应对这些问题。
第一部分:运行机制
1. 日志和主备同步(第24讲,28讲)
主库和从库之间的数据同步过程,如下图所示:
从库上有两个线程。
io_thread负责向主库发起请求,建立长连接,然后接收主库发送的binlog,写入relay log。从库在发起请求时,可指定从哪个位置开始获取binlog。
sql_thread负责读取relay log,解析出日志里的命令,并执行。
从一个事务在主库上完成,到这个事务在从库上完成,时间差即为同步延迟。
如果主库掉电,事务已完成,但binlog尚未发送给备库,会导致数据丢失。
为了解决这个问题,可采用 semi-sync 模式。在主库上,事务需等待至少一个从库确认已收到日志,才能完成事务,向客户端发送response。
主库上有个dump_thread,负责监听来自从库的请求,并随时把binlog发送给从库。
一个主库可能要监听多个从库的请求,多个从库请求的binlog起始位置也可能不同。
因此一个主库不要带很多个从库,以免binlog的同步消耗太多资源。
2. 主备切换(第24讲,25讲,27讲)
主备服务器的配备,目前多采用对称结构,即主备服务器的硬件配置一致,各一台,都提供