每架飞机都有黑匣子,每个聪明的数据库也会留下各种各样的"记录",以防万一发生"事故"...MySQL 的日志系统就像一个尽职的记录员,记录着数据库的点点滴滴...
MySQL 日志系统是数据库内置的一系列记录机制,用来跟踪数据库中发生的各种操作和变更。简单来说:这是 MySQL 的"黑匣子",记录着数据库的生活日记,无论是灾难发生前的最后一刻,还是平时的琐碎变更。
场景:监控中心
监控员:"所有操作都要被记录!一个细节都不能放过!"
数据库:"明白!我会记录每一个改变数据的操作,无论成功还是失败!"
DBA:"有了这个,我就能知道数据库里发生过什么了!"
特点:
mysql-bin.000001
、mysql-bin.000002
...应用场景:
场景一:主从复制
"我的每一个动作,克隆人们都要模仿!" - Binary Log的口号
场景二:数据恢复
DBA:"天哪,生产数据库被删库了!"
同事:"别担心,查查二进制日志,我们可以恢复到被删前的状态!"
场景:飞机驾驶舱
飞行员:"引擎出现故障,我要紧急着陆!"
副驾驶:"先别管,赶紧记录应急措施!就算飞机坠毁了,也能让后人知道我们的处理步骤!"
特点:
为什么需要它:
场景:突然断电
系统管理员:"数据库服务器突然断电了!"
InnoDB:"别担心,断电前我已经把操作记录在Redo Log里了!"
系统重启后...
InnoDB:"让我看看Redo Log里都记了啥...好,恢复完成!"
工作原理:
内存(Buffer Pool):我要把第5页的x改为y
Redo Log:[记录] 第5页x→y的变更
磁盘:改完再说,先让Redo Log记着
[系统崩溃]
重启恢复:Redo Log说第5页要把x改为y,我照做就是
场景:时间旅行电影
博士:"糟了,我们改变了历史,必须恢复原样!"
助手:"别担心,我们有时间旅行记录仪,可以知道原来的样子!"
特点:
应用场景:
场景一:事务回滚
用户:"我刚才的操作是错的,能撤销吗?"
MySQL:"ROLLBACK!"
[内部处理]
Undo Log:"别担心,我记得原来的样子,看,恢复了!"
场景二:读取历史版本(MVCC)
事务A:"我需要看看这条数据!"
事务B:"我正在修改这条数据!"
InnoDB:"不冲突!A可以看Undo Log中的旧版本,B继续修改当前版本。"
场景:公司效率审查
效率专家:"这个员工工作太慢了,记录下来!"
秒表:"这个SQL执行超过2秒,记录在案!"
特点:
long_query_time
的 SQL怎么用它:
场景一:主从复制
"我的每一个动作,克隆人们都要模仿!" - Binary Log的口号
0
场景一:主从复制
"我的每一个动作,克隆人们都要模仿!" - Binary Log的口号
1
场景一:主从复制
"我的每一个动作,克隆人们都要模仿!" - Binary Log的口号
2
特点:
为什么重要:
场景一:主从复制
"我的每一个动作,克隆人们都要模仿!" - Binary Log的口号
3
场景一:主从复制
"我的每一个动作,克隆人们都要模仿!" - Binary Log的口号
4
场景一:主从复制
"我的每一个动作,克隆人们都要模仿!" - Binary Log的口号
5
核心思想:内存中的更改同时记入 Redo Log,定期刷回磁盘,解决随机写入慢的问题
场景一:主从复制
"我的每一个动作,克隆人们都要模仿!" - Binary Log的口号
6
作用:实现"快照读",提高并发性
场景一:主从复制
"我的每一个动作,克隆人们都要模仿!" - Binary Log的口号
7
解决方法:
expire_logs_days
PURGE BINARY LOGS TO 'mysql-bin.000100'
max_binlog_size
场景一:主从复制
"我的每一个动作,克隆人们都要模仿!" - Binary Log的口号
8
优化方法:
场景一:主从复制
"我的每一个动作,克隆人们都要模仿!" - Binary Log的口号
9
三种模式对比:
binlog_format=STATEMENT
: 基于 SQL 语句,占用空间小,可能不准确binlog_format=ROW
: 基于行变化,准确但占空间大binlog_format=MIXED
: 默认用 STATEMENT,必要时切换到 ROW场景二:数据恢复
DBA:"天哪,生产数据库被删库了!"
同事:"别担心,查查二进制日志,我们可以恢复到被删前的状态!"
0
关键参数:
场景二:数据恢复
DBA:"天哪,生产数据库被删库了!"
同事:"别担心,查查二进制日志,我们可以恢复到被删前的状态!"
1
场景二:数据恢复
DBA:"天哪,生产数据库被删库了!"
同事:"别担心,查查二进制日志,我们可以恢复到被删前的状态!"
2
场景二:数据恢复
DBA:"天哪,生产数据库被删库了!"
同事:"别担心,查查二进制日志,我们可以恢复到被删前的状态!"
3
场景二:数据恢复
DBA:"天哪,生产数据库被删库了!"
同事:"别担心,查查二进制日志,我们可以恢复到被删前的状态!"
4
"如果数据库是一家银行,那么日志系统就是保险库的监控录像和账本。它们不是银行的主营业务,但却是银行安全和可靠运营的根本保障。"
—— 匿名数据库专家
下次面试官问你 MySQL 日志系统,淡定回答:那不过是数据库的"黑匣子",记录着过去、保障着未来!