一、为什么MySQL需要日志系统?
让我们从一个最基础的数据库操作说起:
// 用户消费100元
UPDATE account SET balance = balance - 100 WHERE id = 1;
这条简单的SQL语句,实际上给数据库带来了三大挑战:
- 可靠性问题:如果数据库突然宕机,这笔交易记录会不会丢失?
- 一致性问题:如果用户要求退款,如何安全地回滚这笔交易?
- 同步问题:如何确保其他数据库节点也正确记录了这笔交易?
为解决这些问题,MySQL设计了三种核心日志:
数据库操作 ──────────────────┐
↓
┌─── Redo Log(临时记事本)
│ 记录:"账户1减少100元"
│ 作用:确保交易记录不丢失
│
├─── Undo Log(原始凭证)
│ 记录:"账户1原有500元"
│ 作用:随时可以撤销交易
│
└─── Binlog(总账本)
记录:"完整交易记录"
作用:用于数据同步和备份