背景

数据库中的关键文件如果损坏或丢失将导致数据库无法正常工作。本文调研了PG16、openGauss、MySql、Oracle数据库保证关键文件一致性的方法。

总结

各数据库主要采用了以下方法保证文件的一致性。

方法

解释

数据库

Full page write

在日志中保存整页数据

KES PG Oracle openGauss

Double write

脏页先写到缓冲区文件,再写实际文件

MySQL openGauss

Rename

先写临时文件,再重命名临时文件

PG16

扇区写

限制文件大小为512字节

PG Oracle openGauss

1. 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。

2. 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日志恢复

3. 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中进行数据恢复。如下图所示

4. 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恢复。

Logo

鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。

更多推荐