暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

如何保证关键数据库文件的一致性(PG16、openGauss、MySql、Oracle)

数巨小码人 2024-11-13
444

背景
数据库中的关键文件如果损坏或丢失将导致数据库无法正常工作。本文调研了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。

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

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

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

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论