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 模式中并且目录被指定为 |
-F | 为输出选择格式。
|
-r | 从该服务器传输数据的最大传输率。值的单位是千字节每秒。加上一个后缀 范围在32 千字节每秒到 1024 兆字节每秒之间。 |
-S | 这个选项只能和 如果未指定此选项并且服务器支持临时复制插槽(版本10及更高版本), 则自动使用临时复制插槽进行WAL流式传输。 |
--no-slot | 此选项的主要目的是在服务器没有空闲复制插槽时允许进行基本备份。 使用复制插槽几乎总是首选,因为它可以防止备份期间服务器删除所需的WAL。 |
-T | 在备份期间将目录olddir 中的表空间重定位到newdir 中。为使之有效,olddir 必须正好匹配表空间所在的路径(但如果备份中没有包含olddir 中的表空间也不是错误)。 |
--waldir=waldir | 指定用于预写日志目录的位置。waldir 必须是绝对路径。只有当备份是平面文件模式时才能指定预写日志目录。 |
-X | 在备份中包括所需的预写日志文件(WAL 文件)。这将包括所有在备份期间产生的预写日志。 除非指定了方法
|
-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 | 默认情况下,当 |
-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。