PostgreSQL之pg_basebackup命令详解

1. 简介

pg_basebackup被用于获得一个正在运行的PostgreSQL数据库集簇的基础备份。

获得这些备份不会影响连接到该数据库的其他客户端,并且可以被用于时间点恢复 以及用作一个日志传送或流复制后备服务器的开始点。

pg_basebackup建立数据库集簇文件的一份二进制副本,同时保证系统进入和退出备份模式。备份总是从整个数据库集簇获得,不可能备份单个数据库或数据库对象。

备份通过一个常规PostgreSQL连接制作,并且使用复制协议。该连接必须由一个超级用户或者一个具有REPLICATION权限的用户建立,并且pg_hba.conf必须显式地允许该复制连接。

该服务器还必须被配置,使 max_wal_senders 设置得足够高以留出至少一个会话用于备份,一个用于WAL流(如果使用)。

在同一时间可以有多个pg_basebackup运行,但是从性能的角度来说最好只做一个备份并且复制结果。

pg_basebackup不仅能从主控机也能从后备机创建一个基础备份。要从后备机获得一个备份,设置后备机让它能接受复制连接(也就是,设置max_wal_senders和hot_standby,并且配置基于主机的认证)。你将也需要在主控机上启用full_page_writes。

注意在来自后备机的在线备份中有一些限制:

  • 不会在被备份的数据库集簇中创建备份历史文件。

  • 如果正在使用-X none,不保证备份所需的所有 WAL 文件在备份结束时被归档。

  • 如果在在线备份期间后备机被提升为主控机,备份会失败。

  • 备份所需的所有 WAL 记录必须包含足够的全页写,这要求你在主控机上启用full_page_writes并且不使用一个类似pg_compresslog的工具以archive_command从 WAL 文件中移除全页写。

2. 选项

参数说明
-D

将输出写到哪个目录。如果必要,pg_basebackup将创建该目录及任何父目录。该目录可能已经存在,但是如果该目录已经存在并且非空就是一个错误。

当备份处于 tar 模式中并且目录被指定为-(破折号)时,tar 文件将被写到stdout

-F 

为输出选择格式。format可以是下列之一:

  • p/plain 默认格式,平面文件,使用和当前数据目录和表空间相同的布局。
  • t/tar    将输出写成目标目录中的 tar 文件。主数据目录将被写入到一个名为base.tar的文件中,并且其他表空间将被以其 OID 命名。
-r

从该服务器传输数据的最大传输率。值的单位是千字节每秒。加上一个后缀M表示兆字节每秒。

范围在32 千字节每秒到 1024 兆字节每秒之间。

-S

这个选项只能和-X stream一起使用。它导致 WAL 流使用指定的复制槽。

如果未指定此选项并且服务器支持临时复制插槽(版本10及更高版本), 则自动使用临时复制插槽进行WAL流式传输。

--no-slot此选项的主要目的是在服务器没有空闲复制插槽时允许进行基本备份。 使用复制插槽几乎总是首选,因为它可以防止备份期间服务器删除所需的WAL。
-T在备份期间将目录olddir中的表空间重定位到newdir中。为使之有效,olddir必须正好匹配表空间所在的路径(但如果备份中没有包含olddir中的表空间也不是错误)。
--waldir=waldir指定用于预写日志目录的位置。waldir必须是绝对路径。只有当备份是平面文件模式时才能指定预写日志目录。
-X

在备份中包括所需的预写日志文件(WAL 文件)。这将包括所有在备份期间产生的预写日志。 除非指定了方法none,可以在抽取出的目录中直接启动一个 postmaster,而不需要参考日志归档,因此使得这是一个完全独立的备份。

  • n/none  不要在备份中包含预写日志。
  • f/fetch   在备份末尾收集预写日志文件。
  • s/stream  默认值,在备份被创建时流传送预写日志。
-z启用对 tar 文件输出的 gzip 压缩,使用默认的压缩级别。只有使用 tar 格式时压缩才可用, 并且后缀.gz将自动添加到所有tar文件名。
-Z启用对 tar 文件输出的 gzip 压缩,并且制定压缩机别(0 到 9,0 是不压缩,9 是最佳压缩)。只有使用 tar 格式时压缩才可用, 并且后缀.gz将自动添加到所有tar文件名。
-c将检查点模式设置为 fast (立即)或 spread(默认)
-l为备份设置标签。如果没有指定,将使用一个默认值“pg_basebackup base backup”。

-n

--no-clean

默认情况下,当pg_basebackup中止并出现错误时, 它会在发现它无法完成作业(例如,数据目录和预写日志目录) 之前删除它可能创建的所有目录。该选项禁止整理,因此对于调试非常有用。

-P启用进度报告。启用这个选项将在备份期间发表一个大致的进度报告。

-N

--no-sync

默认情况下,pg_basebackup将等待所有文件安全写入磁盘。 

-v

--verbose

启用冗长模式。将在启动和关闭期间输出一些额外步骤,并且如果进度报告也被启用,还会显示当前正在被处理的确切文件名。

-V

--version

打印pg_basebackup版本并退出。

3. 操作步骤

3.1 创建备份目录

要创建服务器mydbserver的一个基础备份并将它存储在本地目录/usr/local/pgsql/data中:

pg_basebackup -h mydbserver -D /usr/local/pgsql/data
3.2 开始备份
//创建本地服务器的一个备份,为其中每一个表空间产生一个压缩过的 tar 文件,并且将它存储在目录backup中,在运行期间显示一个进度报告:
pg_basebackup -D backup -Ft -z -P

//创建一个单一表空间本地数据库的备份并且使用bzip2压缩它,如果在该数据库中有多个表空间,这个命令将失败
pg_basebackup -D - -Ft -X fetch | bzip2 > backup.tar.bz2

//创建一个本地数据库的备份,其中/opt/ts中的表空间被重定位到./backup/ts:
pg_basebackup -D backup/data -T /opt/ts=$(pwd)/backup/ts
3.3 全库恢复

注意:当系统崩溃掉时,使用此方案

检查表空间备份对应的恢复路径:

ll /pgdata/pg_tblspc/
或
select oid,* from pg_tablespace;

切换WAL日志

checkpoint;
select pg_switch_wal();

删除数据

// 停止服务
sudo systemctl stop postgresql-12
// 移除数据目录下所有数据库文件
cd /pgdata && rm -rf *
#解压基础备份到数据目录
tar -xvf /home/postgres/backup/base.tar.gz -C /pgdata

#解压表空间备份到对应的数据库表空间路径(如果有)
tar -xvf /home/postgres/backup/16386.tar.gz -C /pgdata/sekiro

#解压日志备份到WAL日志路径(如果有)
tar -xvf /home/postgres/backup/pg_wal.tar.gz -C /pgdata/pg_wal

$PGDATA路径下创建用于恢复的配置文件recovery.conf

cp /usr/local/pgsql/share/recovery.conf.sample /pgdata/recovery.conf
chmod 600 recovery.conf

recovery.conf中添加恢复命令,拷贝归档日志到数据库原始路径下;

echo "restore_command='cp /pg_arch/20231026/%f %p'" > /pgdata/recovery.conf
echo "recovery_target_timeline = 'latest'" >> /pgdata/recovery.conf

启动数据库,自动读取recovery.conf进入恢复恢复

sudo systemctl start postgresql-12

恢复完成后,recovery.conf会被重命名为recovery.done

  • 24
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值