如何保证关键数据库文件的一致性(PG16、openGauss、MySql、Oracle)
在PG16以前的版本,通过限制文件(数据)大小为512字节的方法保证pg_filenode.map文件的一致性。PG16引入了新的方法保证pg_filenode.map文件的一致性:在进入临界区前先写临时文件,进入临界区后把临时文件改名为pg_filenode.map。Oracle的Redo log和PG的XLOG类似,采取full page write的策略,当表文件页面损坏时可以通过Redo
背景
数据库中的关键文件如果损坏或丢失将导致数据库无法正常工作。本文调研了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恢复。
鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。
更多推荐


所有评论(0)