背景
数据库中的关键文件如果损坏或丢失将导致数据库无法正常工作。本文调研了PG16、openGauss、MySql、Oracle数据库保证关键文件一致性的方法。
总结
各数据库主要采用了以下方法保证文件的一致性。
方法
解释
数据库
Full page write
在日志中保存整页数据
KES PG Oracle openGauss
Double write
脏页先写到缓冲区文件,再写实际文件
MySQL openGauss
Rename
先写临时文件,再重命名临时文件
PG16
扇区写
限制文件大小为512字节
PG Oracle openGauss
- PG16
PG16
文件类型
pg_control
pg_filenode.map
XLOG
表文件
文件大小
8KB
524BYTE
默认16MB
大于512字节
写策略
文件中有效数据小于512字节,只读写前512字节(一个扇区)
先写临时文件,再改名
写失败触发Panic,数据库重启后Redo
写失败触发Error,事务回滚
恢复机制
从WAL日志恢复
从WAL日志恢复
从WAL日志恢复
在PG16以前的版本,通过限制文件(数据)大小为512字节的方法保证pg_filenode.map文件的一致性。PG16引入了新的方法保证pg_filenode.map文件的一致性:在进入临界区前先写临时文件,进入临界区后把临时文件改名为pg_filenode.map。
- openGauss
openGauss
文件类型
pg_control
pg_filenode.map
pg_filenode.map.backup
XLOG
表文件
文件大小
8KB
4KB
4KB
默认16MB
大于512字节
写策略
文件中有效数据小于512字节,只读写前512字节(一个扇区)
先写pg_filenode.map.backup文件,再写pg_filenode.map文件。任意文件写失败,触发Error
写失败触发Panic,数据库重启后Redo
写失败触发Error,事务回滚
恢复机制
从WAL日志恢复
从WAL日志恢复
从WAL日志恢复
- MYSQL
MySql
文件类型
Redo Log(InnoDB)
缓冲区文件
表文件
文件大小
大于512字节
2MB
大于512字节
写策略
写失败,触发数据库重启后Redo
写失败,触发数据库重启后Redo
写失败,触发事务回滚
恢复机制
从缓冲区文件恢复
InnoDB的页面大小为16KB,普通文件的数据写入磁盘时以页面为单位进行。当写数据时遭遇系统断电或操作系统崩溃等情况,可能导致页面被部分写入。为了解决该问题,InnoDB引入了double write。
Double write的原理是:将脏页首先写入到double write buffer,再将double write buffer的数据写入各个表空间文件。当发生了极端情况,数据库重启后可以从double write buffer中进行数据恢复。如下图所示。
- Oracle
Oracle
文件类型
控制文件
Redo log
参数文件
Undo文件
表文件
文件大小
数KB~数MB
数MB~数GB
数KB~数十KB
可配置
大于512字节
写策略
写失败,触发数据库重启后Redo
同时写入多个备份文件。如果所有文件写入失败,严重错误会导致数据库重启,一般错误(磁盘空间不足)
将导致数据库挂起,等待文件可写
不会频繁写入。每次参数更新前,自动备份原文件
严重错误会导致数据库重启,一般情况(磁盘空间不足)采取重试操作
写失败,触发事务回滚
恢复机制
从备份文件或Redo log恢复
从备份文件恢复
从Redo log恢复
从Redo log恢复
Oracle的Redo log和PG的XLOG类似,采取full page write的策略,当表文件页面损坏时可以通过Redo log恢复。




