当数据库正在使用时,这种方法可以完全一致地备份,不阻止其他用户访问数据库。它会产生一个脚本文件它包含备份开始时,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文件,将系统恢复到以前的状态。这种备份有明显的优势:
- 不需要完美一致的文件系统备份作为起点。日志重放将纠正备份中的任何内部不一致性。
- 可将无限长的WAL文件序列与重放相结合c;连续备份可以通过简单归档WAL文件来实现。
- WAL项直到最后才需要重放。任何时候都可以停止重放,并将数据库恢复到当时的一致状态。
- 一系列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);
该命令代表结束了非排他备份。
现在,基于时间点的恢复。
如果您的数据库出现故障,需要恢复到之前某个时刻的一致状态,基于时间点的恢复是必要的。
过程是:
如果服务器仍在运行停止它。
如果你有足够的空间,将整个集群数据目录和表空间复制到临时位置。最好是复制而不是移动。如果你没有足够的空间,至少要保存集群pg_xlog目录的内容,因为它可能包含在系统崩溃前未归档的日志中。
移除data 目录及其所有子文件和子目录。
从文件系统备份中恢复数据库文件。注意使用正确的用户恢复和使用正确的权限。如果你在使用表空间你应该验证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目录中的文件。(可选)
- 如果您在第二步中保存了未归档的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,确保数据库恢复后的一致性。
- pg_stop_backup()。
pg_stop_backup()函数原型如下:
pg_stop_backup([, exclusive boolean ]);
exclusive 表示备份是否是排他备份。
如果使用非排他备份,执行: