简单谈谈我对MySQL的两个日志文件

121 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第7天,点击查看活动详情

redolog

Mysql 中的 WAL(Write-Ahead-Logging)  技术,预写日志,是数据库系统中常见的一种手段,用于保证数据操作的原子性和持久性。

先写日志(redolog),再写磁盘。

  • redolog 是 InnoDB 引擎特有的日志。

  • 当有数据要更新时,InnoDB 会先记录 redolog,同时更新内存,更新操作就结束了。等到合适的时候,再更新磁盘。

  • redolog 有固定大小,就像固定大小的粉板,写满就得回到开头循环写。

    • write pos 是当前记录粉板的位置,一边写一边往后移。
    • check point 是擦除的位置,擦除前会把更新记录到数据文件。
    • redolog 保证了数据库异常重启时数据不丢失,这个能力被称为 crash-safe

image

  • redolog 默认在 Mysql 的 data 目录下,ib_logfile0、ib_logfile。。。
mysql> show variables like "innodb_log_group_home_dir";
+---------------------------+-------+
| Variable_name             | Value |
+---------------------------+-------+
| innodb_log_group_home_dir | ./    |
+---------------------------+-------+
1 row in set (0.00 sec)
  • 设置 redolog 文件大小及个数,默认 2 个文件(innodb_log_files_in_group),每个文件 32M(innodb_log_file_size)
mysql> show variables like "innodb_log_file%";
+---------------------------+----------+
| Variable_name             | Value    |
+---------------------------+----------+
| innodb_log_file_size      | 33554432 |
| innodb_log_files_in_group | 2        |
+---------------------------+----------+
2 rows in set (0.00 sec)
  • 设置 redolog 实时直接持久化到磁盘上,保证重启后数据不丢失。
mysql> show variables like "innodb_flush_log_at_trx_commit";
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 1     |
+--------------------------------+-------+
1 row in set (0.00 sec)

binlog

  • binlog 是 Server 层的日志,叫归档日志。不同于 redolog 只有 InnoDB 有,binlog 任何引擎都可以使用。
  • binlog 是逻辑日志,记录语句的原始逻辑;redolog 是物理日志,记录数据页的修改内容。
  • binlog 不会循环写,一个写完后切换到写一个;redolog 有固定的大小。
  • binlog 在 data 目录下,mysql-bin.xxxxxx。
  • 设置 binlog 每次事务直接持久化到磁盘上,保证重启后数据不丢失。
mysql> show variables like "sync_binlog";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| sync_binlog   | 1     |
+---------------+-------+
1 row in set (0.00 sec)

数据恢复

既然记录了 log,那么当数据误操作后,就可以根据数据库定期备份,加上记录的 log 方便的恢复到误操作之前的状态。

  • 先根据备份恢复到临时表
  • 根据 binlog 找到备份后到误操作前的记录。
  • 把恢复好的临时库按需要同步到正式库中。

只要有 log,就可以恢复到任何时刻的数据状态。

再也不用担心误操作无法恢复了。