精通PostgreSQL:从基础到高级 - 第39课:数据库全面恢复

发表时间: 2023-12-21 16:46


PostgreSQL从小白到专家,是从入门逐渐能力提升的一个系列教程,内容包括对PG基础的认知、包括安装使用、包括角色权限、包括维护管理、、等内容,希望对热爱PG、学习PG的同学们有帮助,欢迎持续关注CUUG PG技术大讲堂。


第39讲:数据库完全恢复


PostgreSQL第39讲:12月23日(周六)19:30,钉钉群(35822460)& 视频号(数据库老陈)直播

内容1:描述介质恢复

内容2:执行非归档模式下恢复

内容3:执行归档模式下完全恢复

内容4:执行基于表空间的完全恢复

内容5:执行只读数据库恢复


介质恢复

用于恢复丢失或损坏的当前数据文件或控制文件

需要显式调用

操作如下:

从备份中恢复文件

恢复的文件会应用归档日志和在线重做日志进行数据重构


恢复步骤


执行数据文件转储和恢复

使用操作系统命令tar/cp转储数据文件

使用pg_ctl start对数据文件进行恢复


非归档模式恢复

在非归档模式下,必须恢复数据目录下所有的文件和目录:

所有$PGDATA目录下的子目录 base、global、pg_wal...

所有$PGDATA目录下的文件 postgresql.conf、pg_hba.conf...


非归档模式恢复优缺点

优势

易于执行,出错风险低

恢复时间是转储所有文件所需的时间

缺点

数据丢失,必须手动重新应用

整个数据库将恢复到上一次完整关闭备份的位置


非归档模式恢复


归档模式恢复

完全恢复

使用wal数据或增量备份

将数据库更新到最新的时间点

应用所有wal日志记录的更改

不完全恢复

使用备份和wal日志生成数据库的非当前版本


完全恢复

确认数据库关闭

恢复数据文件

如果是全库备份,哪怕是损坏了一个数据文件,也要转储备份的所有数据文件

如果是单独表空间(除了global)备份,哪怕损坏了表空间下的一个数据文件,也要转储备份的所有数据文件

修改postgresql.conf文件

生成recovery.signal空文件

启动数据库(recovery)


归档模式完全恢复优缺点

优势

将所有数据恢复到最新点(故障点)

恢复时间是转储数据文件和应用所有归档日志文件所需的时间

缺点

必须具有自您要从中恢复的备份以来的所有归档日志文件


执行一个基于数据库备份的完全恢复

示例(恢复前备份pg_wal目录下所有文件)

1、使用tar包进行恢复

tar -zvxf /backup/base.tar.gz -C $PGDATA

2、修改postgresql.conf文件

restore_command = 'cp /home/postgres/archives/%f %p'

recovery_target_timeline = 'latest'

3、生成recovery.signal空文件

touch recovery.signal

4、启动数据库

pg_ctl start


时间线和时间线历史文件

timelineId(时间线)

每当做了一次完全或者不完全恢复后,数据库的时间线就会发生变化,意味着从失败点后重新开始新的生命轨迹,同时用时间线历史文件来记录。


timelineId 和 wal文件名关系

时间线的改变导致wal名字发生变化

当完成对数据库的恢复后,会产生新的wal文件,其命名规则为在原来的段文件名字中用新的时间线替换原来的时间线,其它不变。


时间线和时间线历史文件

Timeline History File

历史文件会在pg_wal中生成,同时复制到归档目录下,命名规则如下所示:

“8-digit new timelineId”.history 比如:00000002.history

时间线历史记录文件至少包含一行,每行由以下三项组成:

timelineId –用于恢复的归档日志的timelineId。

LSN –发生WAL段切换的LSN位置

reason –人类可读的时间线为什么改变的解释。

比如:postgres> cat
/home/postgres/archivelogs/00000002.history

0/A000198before 2020-4-28 12:05:00.861324+00

注意上面1是行号,也代表数据库恢复过的次数。这个文件不要删除,否则会影响数据库恢复。


执行一个基于表空间备份的完全恢复

PG支持基于表空间(除了pg_global之外)级别的完全恢复,因为pg_global表空间比较特殊,其中包括控制文件,而控制文件不能使用备份的进行恢复。

1、转储备份的表空间目录到目标位置

cp -rf /backup/PG_12_201909212 /home/postgres/tblspc/

2、转储backup_lable文件到$PGDATA目录下

cp /backup/backup_lable $PGDATA

3、创建recovery.signal

4、修改postgresql.conf文件

restore_command = 'cp /home/postgres/archives/%f %p'

recovery_target_timeline = 'latest'

5、启动数据库,表空间所包含的表能够实现完全恢复

pg_ctl start


只读数据库的恢复



执行一个只读数据库的恢复

1、把数据库变成只读状态

ALTER DATABASE new_db1 SET default_transaction_read_only=on;

2、单独备份new_db1数据库目录

3、如果new_db1数据库目录损坏,关闭数据库,转储备份的目录到目标位置

4、打开数据库

*PG不支持单个数据库完全恢复。


CUUG PostgreSQL技术大讲堂系列公开课,往期视频及文档,请联系CUUG客服。