pg_basebackup — 获得一个PostgreSQL集簇的一个基础备份
pg_basebackup
[option
...]
pg_basebackup被用于获得一个正在运行的PostgreSQL数据库集簇的基础备份。获得这些备份不会影响数据库的其他客户端,并且可以被用于时间点恢复(见第 26.3 节)以及用作一个日志传送或流复制后备服务器的开始点(见第 27.2 节)。
pg_basebackup对数据库群集的文件进行精确复制,同时确保服务器自动进入和退出备份模式。备份总是从整个数据库集簇获得,不可能备份单个数据库或数据库对象。关于选择性备份,必须使用一个像pg_dump的工具。
备份通过一个使用复制协议常规PostgreSQL连接制作。该连接必须由一个具有REPLICATION
权限(详见第 22.2 节)或者具有超级用户权限的用户ID建立,并且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
视图将报告备份的进度。有关详细信息,请参见第 28.4.5 节。
以下命令行选项控制输出的位置和格式:
-D directory
--pgdata=directory
设置要写入输出的目标目录。 pg_basebackup将创建此目录(以及任何缺失的父目录),如果它不存在的话。 如果它已经存在,它必须是空的。
当备份以tar格式保存时,目标目录可以指定为-
(破折号),导致tar文件被写入stdout
。
这个选项是必需的。
-F format
--format=format
选择输出的格式。format
可以是以下之一:
p
plain
将输出写成普通文件,布局与源服务器的数据目录和表空间相同。当集群没有额外的表空间时,整个数据库将放在目标目录中。
如果集群包含额外的表空间,则主数据目录将放在目标目录中,但所有其他表空间将放在与源服务器上相同的绝对路径中。
(参见--tablespace-mapping
以更改此设置。)
这是默认格式。
t
tar
将输出写成tar文件放在目标目录中。主数据目录的内容将被写入名为base.tar
的文件中,
每个其他表空间将被写入一个名为该表空间OID的单独的tar文件中。
如果目标目录被指定为-
(破折号),tar内容将被写入标准输出,适合用于管道传输(例如)gzip。
只有当集群没有额外的表空间且不使用WAL流时才允许这样做。
-R
--write-recovery-conf
创建一个standby.signal
文件,
并将连接设置附加到postgresql.auto.conf
文件中的目标目录(或在使用tar格式时在基本归档文件中)。这样可以使用备份的结果轻松设置一个备用服务器。
postgresql.auto.conf
文件将记录连接设置,以及如果指定的话,pg_basebackup正在使用的复制槽,
以便后续流复制将使用相同的设置。
-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
都必须是绝对路径。
如果任一路径需要包含等号(=
),请在等号前加上反斜杠。
可以多次指定此选项以备份多个表空间。
如果以这种方式重新定位表空间,则主数据目录中的符号链接将被更新,指向新位置。 因此,新数据目录已准备好用于具有所有表空间在更新位置的新服务器实例。
目前,此选项仅适用于普通输出格式;如果选择了tar格式,则会被忽略。
--waldir=waldir
设置写入WAL(预写式日志)文件的目录。
默认情况下,WAL文件将被放置在目标目录的pg_wal
子目录中,
但可以使用此选项将它们放置在其他位置。
waldir
必须是绝对路径。
与主目标目录一样,waldir
不必已经存在,
但如果存在,必须为空。
只有在备份为纯文本格式时才能指定此选项。
-X method
--wal-method=method
在备份中包括必需的WAL(预写式日志)文件。这将包括备份期间生成的所有预写式日志。
除非指定了方法none
,否则可以在目标目录中启动一个postmaster,而无需查阅日志归档,从而使输出成为一个完全独立的备份。
支持以下用于收集预写式日志的方法
:
n
none
不在备份中包含预写式日志。
f
fetch
在备份结束时收集预写式日志文件。因此,源服务器的 wal_keep_size参数需要设置得足够高, 以确保在备份结束前不会删除所需的日志数据。如果所需的日志数据 在传输之前被回收,备份将失败且无法使用。
当使用tar格式时,预写式日志文件将包含在base.tar
文件中。
s
stream
在进行备份时流式传输预写式日志数据。此方法将在服务器上打开第二个连接, 并在运行备份时并行流式传输预写式日志。因此,它将需要两个复制连接而不仅仅一个。 只要客户端能够跟上预写式日志数据,使用此方法不需要在源服务器上保存额外的预写式日志。
当使用tar格式时,预写式日志文件将被写入一个名为pg_wal.tar
的单独文件
(如果服务器版本早于10,则文件将被命名为pg_xlog.tar
)。
这个值是默认值。
-z
--gzip
启用tar文件输出的gzip压缩,默认压缩级别。仅在使用tar格式时才可用压缩,
并且所有tar文件名将自动添加后缀.gz
。
-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
以进行无压缩。
可以选择性地指定压缩详细信息字符串。如果详细信息字符串是一个整数,则它指定了压缩级别。
否则,它应该是一个逗号分隔的项目列表,每个项目的形式为keyword
或keyword=value
。
目前,支持的关键字是level
和workers
。
如果未指定压缩级别,则将使用默认压缩级别。如果只指定了级别而没有提及算法,
则如果级别大于0,将使用gzip
压缩,如果级别为0,则不使用压缩。
当使用gzip
、lz4
或zstd
格式时,
分别会自动将后缀.gz
、.lz4
或
.zst
添加到所有tar文件名中。当使用普通格式时,
客户端不可指定压缩,但仍可以请求服务器端压缩。如果这样做,
服务器将压缩备份以进行传输,客户端将解压缩并提取它。
当此选项与-Xstream
结合使用时,如果选择了客户端gzip压缩,
pg_wal.tar
将使用gzip
进行压缩,但如果选择了其他
压缩算法,或者选择了服务器端压缩,则不会进行压缩。
以下命令行选项控制备份的生成和程序的调用:
-c {fast|spread}
--checkpoint={fast|spread}
将检查点模式设置为快速(即时)或扩散(默认) (参见第 26.3.3 节)。
-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流式传输。
-v
--verbose
启用详细模式。在启动和关闭过程中输出一些额外步骤,以及在启用进度报告的情况下显示当前正在处理的确切文件名。
--manifest-checksums=algorithm
指定应用于备份清单中包含的每个文件的校验和算法。
目前,可用的算法有NONE
、CRC32C
、
SHA224
、SHA256
、
SHA384
和SHA512
。
默认值为CRC32C
。
如果选择NONE
,备份清单将不包含任何校验和。否则,它将包含使用指定算法对备份中每个文件的校验和。
此外,清单将始终包含自身内容的SHA256
校验和。SHA
算法比CRC32C
更耗费CPU资源,
因此选择其中之一可能会增加完成备份所需的时间。
使用SHA哈希函数为希望验证备份文件未被篡改的用户提供了每个文件的加密安全摘要, 而CRC32C算法提供了一个计算速度更快的校验和;它擅长捕捉由于意外更改而导致的错误, 但不抵抗恶意修改。请注意,为了对抗能够访问备份的对手,备份清单需要安全地存储在其他地方, 或者以其他方式验证自备份后未被修改。
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
指定用于连接到服务器的参数,比如连接字符串;这些将覆盖所有冲突的命令行选项。
为了和其他客户端应用一致,该选项被称为--dbname
。但是因为pg_basebackup并不连接到集簇中的任何特定数据库,连接字符串中的任何数据库名将被忽略。
-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(见第 34.15 节)支持的环境变量。
环境变量PG_COLOR
规定在诊断消息中是否使用颜色。可能的值为always
、auto
、never
。
在备份的开始时,需要在源服务器上执行检查点。这可能需要一点时间(尤其在没有使用选项--checkpoint=fast
时),在此期间pg_basebackup看起来处于闲置状态。
备份将包括数据目录和表空间中的所有文件,包括配置文件和由第三方放置在目录中的任何其他文件,但不包括由PostgreSQL和操作系统管理的某些临时文件和操作系统文件。但只有常规文件和目录会被复制,除非用于表空间的符号链接会被保留。指向PostgreSQL已知目录的符号链接会被复制为空目录。其他符号链接和特殊设备文件会被跳过。有关详细信息,请参见第 55.4 节。
在普通格式中,表空间将备份到源服务器上的相同路径,除非使用了--tablespace-mapping
选项。如果没有这个选项并且表空间正在使用,在同一台服务器上进行普通格式的基础备份将无法工作,因为备份必须要写入到与原始表空间相同的目录位置。
在使用 tar 格式时,用户应负责在启动使用数据的 PostgreSQL 服务器前解压每一个 tar 文件。如果有额外的表空间,用于它们的 tar 文件需要被解压到正确的位置。在这种情况下,服务器将根据包含在base.tar
文件中的tablespace_map
文件的内容为那些表空间创建符号链接。
pg_basebackup可以和具有相同或较低主版本的服务器一起工作,最低是 9.1。但是,WAL 流模式(-X 流
)只能和版本为 9.3 及以上版本的服务器一起工作。tar 格式(--format=tar
)只能用于版本 9.5 及以上的服务器。
如果在源集簇上启用了组权限,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
要创建一个本地服务器的备份,每个表空间一个tar文件,使用gzip在9级压缩,
存储在目录backup
中:
$
pg_basebackup -D backup -Ft --compress=gzip:9