携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第7天,点击查看活动详情
redolog
Mysql 中的 WAL(Write-Ahead-Logging) 技术,预写日志,是数据库系统中常见的一种手段,用于保证数据操作的原子性和持久性。
先写日志(redolog),再写磁盘。
-
redolog 是 InnoDB 引擎特有的日志。
-
当有数据要更新时,InnoDB 会先记录 redolog,同时更新内存,更新操作就结束了。等到合适的时候,再更新磁盘。
-
redolog 有固定大小,就像固定大小的粉板,写满就得回到开头循环写。
- write pos 是当前记录粉板的位置,一边写一边往后移。
- check point 是擦除的位置,擦除前会把更新记录到数据文件。
- redolog 保证了数据库异常重启时数据不丢失,这个能力被称为 crash-safe。
- 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,就可以恢复到任何时刻的数据状态。
再也不用担心误操作无法恢复了。