pg_basebackup — 对一个 PostgreSQL 集群进行一次基础备份
pg_basebackup [option...]
pg_basebackup 用于对一个正在运行的 PostgreSQL 数据库集群进行一次基础备份。进行备份不会影响数据库的其他客户端,并且备份既可以用于时间点恢复(参见 Section 25.3),也可以作为日志传送或流复制后备服务器的起点(参见 Section 26.2)。
pg_basebackup 可以对数据库进行一次完整或增量的基础备份。当用于进行完整备份时,它会对数据库集群的文件做一个精确的拷贝。当用于进行增量备份时,某些原本会成为完整备份一部分的文件可能会被替换为同一文件的增量版本,其中只包含自参考备份以来被修改过的那些块。增量备份不能直接使用;相反,必须首先使用 pg_combinebackup 把它与它所依赖的之前的备份组合起来。有关增量备份的更多信息请参见 Section 25.3.3,有关从备份中恢复的步骤请参见 Section 25.3.4。
在任何模式下,pg_basebackup 都会确保服务器被自动地置于备份模式并被带出备份模式。备份总是针对整个数据库集群进行的;无法只备份单个数据库或数据库对象。要进行选择性的备份,必须使用另一种工具,例如 pg_dump。
备份是通过一个使用复制协议的常规 PostgreSQL 连接进行的。建立连接所用的用户 ID 必须具有 REPLICATION 权限(参见 Section 21.2)或者是超级用户,并且 pg_hba.conf 必须允许复制连接。服务器还必须把 max_wal_senders 配置得足够高,以便为备份提供至少一个 walsender,再为 WAL 流传输(如果使用)提供一个。
可以同时运行多个 pg_basebackup,但从性能的角度来看,通常更好的做法是只进行一次备份,然后复制其结果。
pg_basebackup 不仅可以从一个主服务器进行基础备份,也可以从一台后备进行基础备份。要从后备进行备份,需要设置该后备使它能够接受复制连接(也就是说,设置 max_wal_senders 和 hot_standby,并恰当地配置其 pg_hba.conf)。你还需要在主服务器上启用 full_page_writes。
请注意,从一台后备进行备份存在一些限制:
备份历史文件不会在被备份的数据库集群中创建。
pg_basebackup 无法强制后备在备份结束时切换到一个新的 WAL 文件。当你使用 -X none 时,如果主服务器上的写活动很少,pg_basebackup 可能需要等待很长时间,直到备份所需的最后一个 WAL 文件被切换并归档。在这种情况下,在主服务器上运行 pg_switch_wal 来触发一次立即的 WAL 文件切换可能会有用。
如果后备在备份期间被提升为主,备份将失败。
备份所需的所有 WAL 记录必须包含足够的整页写,这要求你在主服务器上启用 full_page_writes。
只要 pg_basebackup 正在进行基础备份,服务器的 pg_stat_progress_basebackup 视图就会报告备份的进度。详情请参见 Section 27.4.6。
下列命令行选项控制输出的位置和格式:
-D directory--pgdata=directory设置用于写入输出的目标目录。如果该目录不存在,pg_basebackup 将创建它(以及任何缺失的父目录)。如果它已经存在,则必须为空。
当备份为 tar 格式时,目标目录可以被指定为 -(短横线),这会导致 tar 文件被写到 stdout。
此选项是必需的。
-F format--format=format
选择输出的格式。format 可以是以下几种之一:
pplain
把输出写成普通文件,其布局与源服务器的数据目录和表空间相同。当集群没有额外的表空间时,整个数据库将被放在目标目录中。如果集群包含额外的表空间,主数据目录将被放在目标目录中,但所有其他表空间将被放在与源服务器上相同的绝对路径中。(参见 --tablespace-mapping 来改变这一点。)
这是默认的格式。
ttar 把输出写成目标目录中的 tar 文件。主数据目录的内容将被写入一个名为 base.tar 的文件,而每个其他表空间将被写成一个以该表空间的 OID 命名的单独 tar 文件。
如果目标目录被指定为 -(短横线),tar 内容将被写到标准输出,适合用管道传给(例如)gzip。只有当集群没有额外的表空间并且没有使用 WAL 流传输时,才允许这样做。
-i old_manifest_file--incremental=old_manifest_file执行一次 incremental backup。必须提供参考备份的备份清单,它将被上传到服务器,服务器将以发送所请求的增量备份作为响应。
-R--write-recovery-conf 创建一个 standby.signal 文件,并把连接设置追加到目标目录中的 postgresql.auto.conf 文件(当使用 tar 格式时则追加到基础归档文件中)。这使得使用备份的结果建立一台后备服务器变得更加容易。
postgresql.auto.conf 文件将记录连接设置,以及(如果指定了的话)pg_basebackup 正在使用的复制槽,这样流复制和 logical replication slot synchronization 稍后将使用相同的设置。只有当在连接字符串或 environment variable 中显式指定了 dbname 时,dbname 才会被记录。
-t target--target=target 指示服务器把基础备份放在哪里。默认目标是 client,它指定备份应被发送到 pg_basebackup 所在的机器。如果目标被设置为 server:/some/path,备份将存储在服务器所在机器的 /some/path 目录中。把备份存储在服务器上需要超级用户特权或者 pg_write_server_files 角色的特权。如果目标被设置为 blackhole,内容将被丢弃而不会存储在任何地方。这只应用于测试目的,因为你最终不会得到一个真正的备份。
由于 WAL 流传输是由 pg_basebackup 而不是由服务器实现的,此选项不能与 -Xstream 一起使用。由于后者是默认值,在指定此选项时,你还必须指定 -Xfetch 或 -Xnone。
-T olddir=newdir--tablespace-mapping=olddir=newdir 在备份期间把位于目录 olddir 的表空间重定位到 newdir。要使其生效,olddir 必须与源服务器上所定义的该表空间的路径说明完全匹配。(但是,如果源服务器上 olddir 中没有表空间,也不是一个错误。)而 newdir 是接收主机文件系统中的一个目录。与主目标目录一样,newdir 不必事先存在,但如果它存在则必须为空。olddir 和 newdir 都必须是绝对路径。如果任一路径中需要包含等号(=),请在该等号前面加上一个反斜杠。对于多个表空间,可以多次指定此选项。
如果一个表空间以这种方式被重定位,主数据目录中的符号链接将被更新为指向新位置。这样新的数据目录就可以用于一个新的服务器实例,其中所有表空间都位于更新后的位置。
当前,此选项只对 plain 输出格式有效;如果选择了 tar 格式,它将被忽略。
--waldir=waldir 设置用于写入 WAL(预写式日志)文件的目录。默认情况下,WAL 文件会被放在目标目录的 pg_wal 子目录中,但可以使用此选项把它们放到别处。waldir 必须是一个绝对路径。与主目标目录一样,waldir 不必事先存在,但如果它存在则必须为空。只有当备份为 plain 格式时才能指定此选项。
-X method--wal-method=method 在备份中包含所需的 WAL(预写式日志)文件。这将包括备份期间生成的所有预写式日志。除非指定了 none 方法,否则可以在目标目录中直接启动一个 postmaster 而无需查阅 WAL 归档,从而使输出成为一个完全独立的备份。
支持下列用于收集预写式日志的 method 方法:
nnone不要在备份中包含预写式日志。
ffetch预写式日志文件在备份结束时收集。因此,源服务器的 wal_keep_size 参数必须被设置得足够高,以使所需的日志数据在备份结束之前不会被移除。如果所需的日志数据在应当传输它之前就被回收了,备份将失败并且不可用。
当使用 tar 格式时,预写式日志文件将被包含在 base.tar 文件中。
sstream在进行备份的同时以流的方式传输预写式日志数据。此方法会打开第二个到服务器的连接,并在运行备份的同时开始流式传输预写式日志。因此,它将需要两个复制连接而不仅仅是一个。只要客户端能跟上预写式日志数据的速度,使用此方法就不需要在源服务器上保存额外的预写式日志。
当使用 tar 格式时,预写式日志文件将被写入一个名为 pg_wal.tar 的单独文件(如果服务器版本早于 10,该文件将被命名为 pg_xlog.tar)。
该值是默认值。
-z--gzip 以默认压缩级别启用 tar 文件输出的 gzip 压缩。只有在使用 tar 格式时压缩才可用,并且后缀 .gz 将被自动加到所有 tar 文件名上。
-Z level-Z [{client|server}-]method[:detail]--compress=level--compress=[{client|server}-]method[:detail] 请求对备份进行压缩。如果包含 client 或 server,它指定在哪里执行压缩。在服务器上压缩会减少传输带宽,但会增加服务器的 CPU 消耗。默认值是 client,除非使用了 --target。在后一种情况下,备份不会被发送到客户端,因此只有服务器端压缩才是合理的。当使用默认的 -Xstream 时,服务器端压缩将不会应用于 WAL。要压缩 WAL,请使用客户端压缩,或者指定 -Xfetch。
压缩方法可以被设置为 gzip、lz4、zstd、表示不压缩的 none,或者一个整数(0 表示不压缩,大于 0 表示 gzip)。还可以选择指定一个压缩细节字符串。如果细节字符串是一个整数,它指定压缩级别。否则,它应当是一个以逗号分隔的列表,其中每一项的形式为 keyword 或 keyword=value。当前支持的关键词有 level、long 和 workers。当压缩方法被指定为一个普通整数时,不能使用细节字符串。
如果没有指定压缩级别,将使用默认的压缩级别。如果只指定了级别而没有提到算法,当级别大于 0 时将使用 gzip 压缩,当级别为 0 时不使用压缩。
当 tar 格式与 gzip、lz4 或 zstd 一起使用时,后缀 .gz、.lz4 或 .zst 将分别被自动加到所有 tar 文件名上。当使用 plain 格式时,不能指定客户端压缩,但仍然可以请求服务器端压缩。如果这样做了,服务器将为传输而压缩备份,客户端将把它解压并解开。
当此选项与 -Xstream 组合使用时,如果选择了客户端 gzip 压缩,pg_wal.tar 将使用 gzip 进行压缩;但如果选择了任何其他压缩算法,或者选择了服务器端压缩,它将不会被压缩。
下列命令行选项控制备份的生成和程序的调用:
-c {fast|spread}--checkpoint={fast|spread}将检查点模式设置为 fast(立即)或 spread(默认值)(参见 Section 25.3.6)。
-C--create-slot 指定应在开始备份之前创建由 --slot 选项指名的复制槽。如果该槽已经存在,将抛出一个错误。
-l label--label=label 设置备份的标签。如果没有指定,将使用默认值 “pg_basebackup base backup”。
-n--no-clean 默认情况下,当 pg_basebackup 因错误而中止时,它会移除在发现自己无法完成工作之前可能已经创建的所有目录(例如目标目录和预写式日志目录)。此选项会禁止这种清理,因此对调试很有用。
注意,无论哪种方式,表空间目录都不会被清理。
-N--no-sync 默认情况下,pg_basebackup 会等待所有文件被安全地写入磁盘。此选项会让 pg_basebackup 不等待就返回,这样更快,但意味着一次随后的操作系统崩溃可能会让基础备份损坏。一般来说,此选项对测试有用,但在创建生产安装时不应使用。
-P--progress 启用进度报告。开启此选项后,在备份期间会给出近似的进度报告。由于数据库在备份期间可能发生变化,这只是一个近似值,可能不会正好在 100% 结束。特别是,当 WAL 日志被包含在备份中时,数据的总量无法事先估计,在这种情况下,一旦估计的目标大小超过了不含 WAL 时的总估计值,它就会增加。
-r rate--max-rate=rate 设置从源服务器收集数据的最大传输速率。这可以用来限制 pg_basebackup 对服务器的影响。值以每秒千字节为单位。使用后缀 M 表示每秒兆字节。后缀 k 也被接受,但没有效果。有效值介于每秒 32 千字节和每秒 1024 兆字节之间。
此选项总是影响数据目录的传输。只有当收集方法是 fetch 时,才会影响 WAL 文件的传输。
-S slotname--slot=slotname 此选项只能与 -X stream 一起使用。它使 WAL 流传输使用指定的复制槽。如果基础备份打算被用作使用复制槽的流复制后备,那么该后备应当使用与 primary_slot_name 相同的复制槽名。这可以确保主服务器在基础备份结束与新后备上流复制开始之间的时间内不会移除任何必需的 WAL 数据。
指定的复制槽必须已经存在,除非还使用了 -C 选项。
如果没有指定此选项,并且服务器支持临时复制槽(版本 10 及更高版本),那么将自动使用一个临时复制槽来进行 WAL 流传输。
--sync-method=method 当被设置为 fsync(默认值)时,pg_basebackup 会递归地打开并同步备份目录中的所有文件。当使用 plain 格式时,对文件的搜索将跟随 WAL 目录和每个已配置表空间的符号链接。
在 Linux 上,可以改用 syncfs 来要求操作系统同步包含备份目录的整个文件系统。当使用 plain 格式时,pg_basebackup 还会同步包含 WAL 文件和每个表空间的文件系统。请参见 recovery_init_sync_method 以了解使用 syncfs 时需要注意的事项。
当使用 --no-sync 时,此选项没有效果。
-v--verbose启用冗长模式。将在启动和关闭期间输出一些额外的步骤,并且在同时启用了进度报告时显示当前正在处理的确切文件名。
--manifest-checksums=algorithm 指定应当对备份清单中包含的每个文件应用的校验和算法。当前可用的算法有 NONE、CRC32C、SHA224、SHA256、SHA384 和 SHA512。默认值是 CRC32C。
如果选择了 NONE,备份清单将不包含任何校验和。否则,它将使用指定的算法包含备份中每个文件的校验和。此外,清单将始终包含其自身内容的一个 SHA256 校验和。SHA 算法比 CRC32C 消耗的 CPU 资源明显更多,因此选择其中之一可能会增加完成备份所需的时间。
对于希望验证备份未被篡改的用户来说,使用 SHA 哈希函数可以提供每个文件在密码学上安全的摘要,而 CRC-32C 算法提供的校验和计算起来要快得多;它善于捕捉由意外改动造成的错误,但不能抵御恶意的修改。注意,为了对能够访问备份的攻击者有效,备份清单需要被安全地存储在别处,或者以其他方式验证其自备份完成以来未被修改过。
可以使用 pg_verifybackup 来根据备份清单检查备份的完整性。
--manifest-force-encode强制备份清单中的所有文件名都被十六进制编码。如果没有指定此选项,只有非 UTF8 的文件名会被十六进制编码。此选项主要用于测试读取备份清单文件的工具是否能正确处理这种情况。
--no-estimate-size 阻止服务器估计将被流式传输的备份数据总量,导致 backup_total 列(位于 pg_stat_progress_basebackup 视图中)总是为 NULL。
如果不使用此选项,备份将先枚举整个数据库的大小,然后再回过头来发送实际内容。这可能会让备份耗时略长,特别是在发送第一批数据之前会花费更长的时间。如果这种估计时间太长,此选项可用于避免它。
在使用 --progress 时不允许使用此选项。
--no-manifest禁用备份清单的生成。如果没有指定此选项,服务器将生成并发送一个备份清单,可以使用 pg_verifybackup 来验证它。清单是备份中存在的每个文件的列表,但可能包含的任何 WAL 文件除外。它还存储每个文件的大小、最后修改时间和一个可选的校验和。
--no-slot阻止为备份创建临时复制槽。
默认情况下,如果选择了日志流传输但没有通过 -S 选项给出槽名,则会创建一个临时复制槽(如果源服务器支持的话)。
此选项的主要目的是在服务器没有空闲复制槽时也能进行基础备份。几乎总是更推荐使用复制槽,因为它可以防止备份期间所需的 WAL 被服务器移除。
--no-verify-checksums如果在取出基础备份的服务器上启用了校验和,则禁用对校验和的验证。
默认情况下,会验证校验和,校验和失败将导致一个非零的退出状态。但是,在这种情况下基础备份不会被移除,就像使用了 --no-clean 选项一样。校验和验证失败也会在 pg_stat_database 视图中报告。
下列命令行选项控制与源服务器的连接:
-d connstr--dbname=connstr指定用于连接到服务器的参数,采用 connection string 的形式;这些参数将覆盖任何与之冲突的命令行选项。
为了与其他客户端应用保持一致,此选项被命名为 --dbname,但由于 pg_basebackup 不会连接到集群中的任何特定数据库,连接字符串中包含的任何数据库名都会被服务器忽略。不过,以这种方式提供的数据库名会覆盖默认数据库名(replication),以便在 ~/.pgpass 中查找复制连接的密码。类似地,用于连接 PostgreSQL 的中间件或代理可能会将该名称用于连接路由等目的。数据库名也可以被 logical replication slot synchronization 使用。
-h host--host=host 指定服务器所在机器的主机名。如果该值以斜杠开头,它将被用作 Unix 域套接字的目录。默认值取自 PGHOST 环境变量(如果设置了的话),否则将尝试进行 Unix 域套接字连接。
-p port--port=port 指定服务器监听连接所用的 TCP 端口或本地 Unix 域套接字文件扩展名。默认为 PGPORT 环境变量(如果设置了的话),或者编译时的默认值。
-s interval--status-interval=interval指定发回源服务器的状态包之间的秒数。较小的值允许从服务器更准确地监视备份进度。值为零会完全禁用周期性的状态更新,不过在服务器请求时仍会发送一次更新,以避免基于超时的断开。默认值是 10 秒。
-U username--username=username指定连接所用的用户名。
-w--no-password 阻止发出输入密码的提示。如果服务器要求密码认证,而密码无法通过其他方式(例如 .pgpass 文件)获得,连接尝试将失败。此选项在没有用户在场输入密码的批处理作业和脚本中很有用。
-W--password强制 pg_basebackup 在连接到源服务器之前提示输入密码。
此选项从来都不是必需的,因为如果服务器要求密码认证,pg_basebackup 会自动提示输入密码。不过,pg_basebackup 会浪费一次连接尝试来发现服务器需要密码。在某些情况下,键入 -W 可以避免这次额外的连接尝试,这样做是值得的。
此外还有一些其他选项可用:
-V--version打印 pg_basebackup 的版本并退出。
-?--help显示关于 pg_basebackup 命令行参数的帮助,然后退出。
与大多数其他 PostgreSQL 工具一样,此工具也使用 libpq 支持的环境变量(参见 Section 32.15)。
环境变量 PG_COLOR 指定是否在诊断消息中使用颜色。可能的值是 always、auto 和 never。
在备份开始时,需要在源服务器上执行一次检查点。这可能需要一些时间(尤其是在未使用 --checkpoint=fast 选项的情况下),在此期间 pg_basebackup 看起来会处于空闲状态。
备份将包括数据目录和表空间中的所有文件,包括配置文件以及第三方放在该目录中的任何额外文件,但由 PostgreSQL 管理的某些临时文件和操作系统文件除外。不过只会复制常规文件和目录,用于表空间的符号链接会被保留。指向 PostgreSQL 已知的某些目录的符号链接会被复制为空目录。其他符号链接和特殊设备文件会被跳过。确切的细节请参见 Section 54.4。
在 plain 格式中,表空间将被备份到它们在源服务器上的相同路径,除非使用了 --tablespace-mapping 选项。如果没有这个选项,在服务器所在的同一台主机上运行 plain 格式的基础备份时,如果正在使用表空间,备份将无法进行,因为备份将不得不被写到与原始表空间相同的目录位置。
当使用 tar 格式时,在启动使用这些数据的 PostgreSQL 服务器之前,解开每个 tar 文件是用户的责任。如果有额外的表空间,它们的 tar 文件需要被解到正确的位置。在这种情况下,这些表空间的符号链接将由服务器根据 tablespace_map 文件(包含在 base.tar 文件中)的内容来创建。
pg_basebackup 可以与相同或更旧主版本的服务器一起工作,最低到 9.1。但是,WAL 流传输模式(-X stream)只能与 9.3 及更高版本的服务器一起工作,tar 格式(--format=tar)只能与 9.5 及更高版本的服务器一起工作,而增量备份(--incremental)只能与 17 及更高版本的服务器一起工作。
如果源集群上启用了组权限,pg_basebackup 将保留数据文件的组权限。
要为位于 mydbserver 的服务器创建一个基础备份,并把它存储在本地目录 /usr/local/pgsql/data 中:
$pg_basebackup -h mydbserver -D /usr/local/pgsql/data
要为本地服务器创建一个备份,为每个表空间生成一个压缩的 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
要为本地服务器创建一个备份,为每个表空间生成一个以级别 9 用 gzip 压缩的 tar 文件,并存储在目录 backup 中:
$pg_basebackup -D backup -Ft --compress=gzip:9