MySQL日志
MySQL 日志文件有哪些
- 慢查询日志:sql 性能分析
- 错误日志:问题诊断
- general log:用于记录所有的 sql 语句
- binlog:记录所有修改数据库状态的 SQL 语句,以及每个语句的执行时间,用于主从复制和数据恢复
- redo log:保证事务持久性,记录对于 innodb 的每个写操作,用户崩溃恢复
- undo log:事务回滚
介绍一下 binlog
binlog 是一种二进制日志,在磁盘上记录数据库的所有修改操作
如果误删了数据,就可以使用 binlog 进行回退到误删之前的状态。
如果要搭建主从复制,就可以让从库定时读取主库的 binlog
MySQL 提供了三种格式的 binlog:Statement、Row 和 Mixed,分别对应 SQL 语句级别、行级别和混合级别,默认为行级别
从后缀名上来看,binlog 文件分为两类:以 .index 结尾的索引文件,以 .00000* 结尾的二进制日志文件
有了 binlog 为什么还要 undolog redolog?
binlog 会记录整个 SQL 或行变化;redo log 是为了恢复「已提交但未刷盘」的数据,undo log 是为了撤销未提交的事务。
以一次事务更新为例:
sql
# 开启事务
BEGIN;
# 更新数据
UPDATE users SET age = age + 1 WHERE id = 1;
# 提交事务
COMMIT;事务开始的时候会生成 undo log,记录更新前的数据,比如原值是 18:
sql
undo log: id=1, age=18修改数据的时候,会将数据写入到 redo log。
比如数据页 page_id=123 上,id=1 的用户被更新为 age=26:
sql
redo log (prepare):
page_id=123, offset=0x40, before=18, after=26等事务提交的时候,redo log 刷盘,binlog 刷盘。
binlog 写完之后,redo log 的状态会变为 commit:
sql
redo log (commit):
page_id=123, offset=0x40, before=18, after=26binlog 如果是 Statement 格式,会记录一条 SQL 语句:
sql
UPDATE users SET age = age + 1 WHERE id = 1;binlog 如果是 Row 格式,会记录:
sql
表:users
before: id=1, age=18
after: id=1, age=26随后,后台线程会将 redo log 中的变更异步刷新到磁盘。