0
点赞
收藏
分享

微信扫一扫

GBase 8s 数据库系统管理(4)

ZGtheGreat 2022-01-15 阅读 126

1 快速恢复

数据库以正常方式从 online 模式切换到 offline 模式,都会自动执行一次 checkpoint,将内存的脏数据写回到磁盘,使磁盘和内存数据一致。然而,在一些异常情况下,内存数据没有及时写入到磁盘,磁盘和内存数据不一致。

在数据库重新启动时,都需要经过 Fast Recovery 的过程。如果数据库异常关闭,则 FastRecovery 需要使用物理日志(Physical log)和逻辑日志(Logical log)恢复到一致性状态。在介绍快速恢复过程之前,我们首先了解 GBase 8s 的物理日志和逻辑日志的相关知识。

数据库服务器每次启动时,都需要进行快速恢复(Fast recovery),使数据库服务器恢复到一致性状态。在最后一次 checkpoint 后,数据库运行了一些新的事务,这些事务中有些被逻辑提交(执行了 commit 语句),有些事务尚未结束。为了使数据库回到停机状态,需要将最后一次 checkpoint 后的这些已经结束的事务重做一遍,将那些尚未结束的事务回滚。我们将这个过程称为快速恢复。

快速恢复分成 2 个阶段:物理快速恢复和逻辑快速恢复。

1.1 物理恢复

快速恢复的第一个阶段为物理恢复,在物理日志上的所有前影数据页被复制到对应的磁盘地址上,先将物理日志读取到缓存中,经由缓存覆盖磁盘数据。为什么需要将物理日志中的数据覆盖磁盘上的数据呢?我们在前面介绍物理日志时也提到了原因,因为在正常运行情况下,在发生 checkpoint 后,由于内存中的脏数据可能在下一次 checkpoint 之前被写回到磁盘,这就是我们通常所讲的 LRU 写(后台写),所以磁盘上的数据在 checkpoint之后发生了变化,就不能用作逻辑恢复。逻辑恢复需要使用最后一次 checkpoint 时刻的数据,而只有物理日志中的前影信息才能作为逻辑日志恢复的起始数据。如图 1所示。

 图 1物理恢复过程

物理恢复后,磁盘数据恢复为最后一次 checkpoint 时刻的状态。

1.2 逻辑恢复

快速恢复的第二个阶段为逻辑恢复,在物理恢复的基础上,对从最后一次 checkpoint之后发生的事务进行前滚和回滚。该过程分成两步,第一步就是对已经提交的事务进行前滚(重做),第二步就是对尚未结束的事务进行回滚操作。通过前滚和回滚使数据库恢复到数据库出现故障的准确时间点状态,然后完成临时表删除、索引变更等操作,让数据库进入 Quiescent 模式。整个快速恢复就完成了。如图 2 所示。

图 2逻辑恢复

如下为一次 Fast recovery 过程的 online.log 消息:

22:12:01 GBase 8s Server Initialized --Shared Memory Initialized.

22:12:01 Physical Recovery Started at Page(1:795).

22:12:01 Physical Recovery Complete: 48 Pages Examined 48 PagesRestored.

22:12:01 Logical Recovery Started.

22:12:01 10 recovery worker threads will be started.

22:12:04 Logical Recovery has reached the transaction cleanup phase.

22:12:04 Logical Recovery Complete.1 Committed, 2 Rolled Back, 0 Open, 0 Bad Locks

22:19:07 Checkpoint Completed: duration was 0 seconds.

22:19:07 Checkpoint loguniq 3, logpos 0x12b018

22:19:07 Maximum server connections 0

22:19:07 On-Line Mode

1.3 快速恢复示例

为了更容易地理解快速恢复的过程,下面通过一个数据库发生故障后快速恢复的过程,来说明快速恢复的基本过程。

1.3.1故障场景描述

数据库 testdb(non-buffered logging database)有如下表和记录:

create table t1(c1 int, c2 int);

create index idx_t1 on t1(c1);

insert into t1(c1,c2) values(1,2);

insert into t1(c1,c2) values(2,3);

create table t2(c1 int, c2 varchar(100));

create index idx_t2 on t2(c1);

insert into t2(c1,c2) values(1,’xxx’);

insert into t2(c1,c2) values(2,’abc’);

数据库运行情况为:在创建 t1、t2 表,分别 insert 两条记录后,数据库发生一次checkpoint,之后有两个事务对 t1、t2 表记录进行更新,逻辑日志记录整个过程的相关操作。如图 3 所示。

 图 3 数据库运行时的数据状态示意图

对于第一个事务,GBase 8s 需要记录物理日志,如图 3 所示,物理日志实际需要整个数据页。在第一个事务结束后,数据库出现了一次 LRU 写,将事务 1 所更新的记录同步到磁盘,此时磁盘数据和最后一次 checkpoint 数据发生了变化。在第二个事务尚无结束前,数据库异常关闭,此时数据库磁盘数据和内存数据不一致。在数据库再次启动时,出现如下数据库快速恢复的过程。

1.3.2快速恢复过程

快速恢复过程如图 4 所示。

 图 4 一次快速恢复过程示意图

经过快速恢复后,数据恢复到异常宕机状态。

未完待续...

举报

相关推荐

0 条评论