清华主页 - 清华新闻 - 综合时讯 - 正文

Postgresql的三种备份方式

当数据库正在使用时,这种方法可以完全一致地备份,不阻止其他用户访问数据库。它会产生一个脚本文件󿀌它包含备份开始时,SQL语句和每个表中的数据已经创建了各种数据库对象。pg_dumpall和数据库提供的工具可以使用pg_dump备份。pg_dump只备份数据库集群中某个数据库的数据,它不会导出与角色和表空间相关的信息,因为这些信息是由整个数据库集群共享的,不属于单独的数据库。pg_dumpall,将pg_dump调用到集群中的每个数据库中完成这项工作,并将转储到所有数据库公共的全球对象(pg_dump不保存这些对象)。 这包括适合所有数据库的用户和组、表空间和访问权限。

例如,在我的电脑上,可以使用以下命令备份dbname数据库:

pg_dump  –h 127.0.0.1  -p  5432  -U  postgres -c  -C –f  dbname.sql  dbname。

使用以下命令可以备份所有pg数据库。

pg_dumpall –h 127.0.0.1 –p 5432 -U postgres –c  -C –f db_bak.sql。

恢复方法很简单。执行恢复命令可以:

psql –h 127.0.0.1 -p 5432 -U postgres –f db_bak.sql。

3. 连续归档。

这种方法的策略是将文件系统级的全备份与WAL(预写日志)级的增量备份相结合。需要恢复时󿀌首先恢复文件系统级别的备份,然后重放备份WAL文件,将系统恢复到以前的状态。这种备份有明显的优势:

  1. 不需要完美一致的文件系统备份作为起点。日志重放将纠正备份中的任何内部不一致性。
  2. 可将无限长的WAL文件序列与重放࿰相结合c;连续备份可以通过简单归档WAL文件来实现。
  3. WAL项直到最后才需要重放。任何时候都可以停止重放,并将数据库恢复到当时的一致状态。
  4. 一系列WAL文件可以连续输送到另一台已经载入相同基本备份文件的机器,获得实时热备份系统。

如何连续归档?

下面的例子,windows操作系统 10,Postgresql的版本是9.6。

首先,postgresql需要修改.conf文件的几个参数修改如下:

wal_level = ‘replica’。

archive_mode = ‘on’。

archive_command = ‘copy  /y  “%p”  “D:\archive\%f”’。

archive_command执行时󿼌%将被要归档的文件路径所取代,而%f只会被文件名所取代。如果你需要在命令中嵌入一个真正的%字符,可使用%%。 “D:\archive替换为归档日志的存储路径,确保归档目录是存在的。

然后需要重启数据库,使配置生效。

接下来,我们需要做一个非排他的基本备份。Postgresql提供两种备份方式:排他备份和非排他备份c;建议使用非排他备份。

1. 作为一个有操作的人 pg_start_backup 连接到服务器(的权利用户;不在乎哪个数据库)发出命令:

Select pg_start_backup(‘backup_label’, false, false);

2. 文件系统级别备份数据库。将postgresql安装目录下的data目录及其内容复制到其他位置。

3. 同一连接,发出命令:

select * from pg_stop_backup(false);

该命令代表结束了非排他备份。

现在,基于时间点的恢复。

如果您的数据库出现故障,需要恢复到之前某个时刻的一致状态,基于时间点的恢复是必要的。

过程是:

  1. 如果服务器仍在运行󿀌停止它。

  2. 如果你有足够的空间,将整个集群数据目录和表空间复制到临时位置。最好是复制而不是移动。如果你没有足够的空间,至少要保存集群pg_xlog目录的内容,因为它可能包含在系统崩溃前未归档的日志中。

  3. 移除data 目录及其所有子文件和子目录。

  4. 从文件系统备份中恢复数据库文件。注意使用正确的用户恢复和使用正确的权限。如果你在使用表空间󿀌你应该验证pg___tblspc/中间的符号链接正确恢复。

5.整个数据目录࿰已从备份中恢复c;接下来,您需要在数据目录中部分或全部删除以下文件,如果存在:

(1) postmaster.pid;(必须)

(2) pg_xlog中的文件;(必须)

(3) pgsql_tmp开头的临时文件;(可选)

(4) postgresql.auto.conf.tmp;(可选)

(5) pg_replslot目录中的文件;(可选)

(6) pg_stat_tmp目录中的文件。(可选)

  1. 如果您在第二步中保存了未归档的WAL段文件,将它们复制到pg__xlog/中或WAL日志归档目录。

在集群数据目录中创建恢复命令文件recovery.conf。如果你想恢复到最近的一致状态,在recovery.conf写入以下两行:

restore_command = ‘copy /y D:\archive \%f\%p’。

recovery_target_timeline = ‘latest’。

其中,restore_command的内容表示将归档日志文件夹中的内容复制到pg_xlog,其参数的含义与上述archive_command的参数完全相同b;recovery_target_timeline = ‘latest’ 意味着恢复到最近的时间点。

7. 如果防止普通用户在成功恢复前连接,请修改pg__hba.conf。

8. 启动服务器。根据需要,服务器将进入恢复模式并读取归档WAL文件。由于外部错误,恢复可能会终止,服务器࿰可以简单地重新启动c;因此,它将继续恢复。恢复过程结束后༌Recovery服务器.conf重命名为recovery.done(为防止未来意外重新进入恢复模式),并开始正常的数据库操作。

9. 检查数据库的内容,以确保您已经恢复到预期状态。如果没有�回到第一步。如果一切正常󿀌恢复pg_通过恢复pg_hba.通常情况下,conf允许用户连接。

这样就完成了文件系统级别的全部备份,并实现了WAL文件级别的增量备份。

**附:**。pg_start_backup()。和。**pg_stop_backup()**。做什么?

1. pg_start_backup()。

pg_start_backup() 函数原型如下:

pg_start_backup(label text [, fast boolean [, exclusive boolean ]])。

label是唯一用来识别备份操作的任何字符串,fast 表示是否立即执行强制检查点,exclusive 表示备份是否是排他备份。

当使用此函数时󰀌建议将exclusive设置为false,即非排他备份。

执行以下命令:

Select pg_start_backup(‘backup_label’, false, false);

这个命令将产生三个动作:

1. 在缓冲区创建两个变量:label_file和tblspc_map_file。前者包括WAL的起始位置、检查点的起始位置、备份方法、备份模式、备份开始时间和备份标签的名称(࿰在本例中c;名称为“backup_label")等信息;后者包含 “pg_tblspc中表空间符号链接信息,假如它们存在。

2. 强制发生检查点。将检查点开始前提交的事务刷新到磁盘。

3. 编写日志标志:XLogCtl->Insert.forcePageWrites = true。将此标志设置为true后,如果备份期间有其他事务修改数据库,然后系统会在修改前将修改后的数据页面的完整页面记录在WAL࿰中c;而不仅仅是记录页面中的变化。

为什么要在WAL中记录完整的页面࿱?f;

原因是在备份过程中,其他事务修改数据库,备份后的数据可能会混合新旧数据,即使是同一个数据页面也会出现这种情况。如果WAL日志只记录变化的内容,数据库无法恢复到上次备份结束时的状态。因此,修改后的完整页面应写入WAL,确保数据库恢复后的一致性。

  1. pg_stop_backup()。

pg_stop_backup()函数原型如下:

pg_stop_backup([, exclusive boolean ]);

exclusive 表示备份是否是排他备份。

如果使用非排他备份,执行:

2025-06-24 11:43:32

相关新闻

清华大学新闻中心版权所有,清华大学新闻网编辑部维护,电子信箱: news@tsinghua.edu.cn
Copyright 2001-2020 news.tsinghua.edu.cn. All rights reserved.