环境说明
操作系统:redhat 7.9
数据库版本:pg 13
第一部分 备份工具介绍
自postgresql8.0之后才开始提供在线的全量物理备份。和oracle rman的原理一样,通过一个基础备份,追加日志,到达恢复至基础备份后任意一时间点的目的。
pg_basebackup被用于获得一个正在运行的PostgreSQL数据库集簇的基础备份。获得这些备份不会影响连接到该数据库的其他客户端,并且可以被用于时间点恢复以及用作一个日志传送或流复制后备服务器的开始点。
第二部分 备份参数
参数选项 | 解释说明 |
---|---|
-D, --pgdata=DIRECTORY | 接收基本备份的目录 |
-F, --format=p|t | 输出的文件类型(默认是plain) |
-r, --max-rate=RATE | 最大的传输速度(in kB/s, or use suffix "k" or "M") |
-R, --write-recovery-conf | 备份结束后生成恢复的文件(recovery.conf,在12后被合并到postgres.conf) |
-T,--tablespace-mapping=OLDDIR=NEWDIR | 将旧的表空间目录定位到新的表空间目录 |
--waldir=WALDIR | wal日志目录的存储位置 |
-X,--wal-method=none|fetch|stream | 指定备份wal的模式,none:在备份中不包括wal日志,fetch:在备份最后收集wal日志,stream:在备份被创建流传输wal日志。 |
-z, --gzip | 压缩成tar文件输出 |
-Z, --compress=0-9 | 压缩的等级 |
通用选项:
参数选项 | 解释说明 |
---|---|
-c, --checkpoint=fast|spread | 选择checkpoint的模式 |
-C, --create-slot | 创建复制槽 |
-l, --label=LABEL | 设置备份标签 |
-n, --no-clean | 在出现error时不清理 |
-N, --no-sync | 不等待改变被安全的写入磁盘 |
-P, --progress | 显示进程信息,备份信息 |
-S, --slot=SLOTNAME | 指定要使用的复制槽 |
-v, --verbose | 输出详细信息 |
-V, --version | 输出版本信息后退出 |
--manifest-hecksums=SHA{224,256,384,512}|CRC32C|NONE | 对清单进行校验并指定算法 |
--manifest-force-encode | 十六进制编码的所有文件名称清单 |
--no-estimate-size | 不顾及服务端备份的大小 |
--no-manifest | 精致生成备份清单 |
--no-slot | 不创建临时复制槽 |
--no-verify-checksums | 不验证校验和 |
-?, --help | 帮助 |
连接参数:
参数选项 | 解释说明 |
---|---|
-d, --dbname=CONNSTR | 连接的数据库命 |
-h, --host=HOSTNAME | 备份的数据库IP |
-p, --port=PORT | 数据库服务的端口号 |
-s,--status-interval=INTERVAL | 状态数据包发送到服务器之间的时间(以秒为单位) |
-U, --username=NAME | 连接的用户名 |
-w, --no-password | 不使用密码 |
-W, --password | 强制指定密码 |
第三部分 备份开始
3.1 创建基础备份
shell
pg_basebackup -Ft -Pv -Xs -z -Z5 -p5432 -D /home/postgres/pgbak
3.2 插入测试数据
创建测试表,插入数据(带有时间信息的数据)。
shell
postgres=# CREATE TABLE test(id SERIAL PRIMARY KEY, time TIMESTAMPTZ NOT NULL DEFAULT now());
postgres=# INSERT INTO test values(default,default); #执行4次
删除测试表中的数据
shell
postgres=# delete from test;
DELETE 4
postgres=# select * from test;
id | time
----+------
(0 rows)
postgres=# insert into test values (default,default); #再次插入,让测试表处于非空状态
3.2 关停原库
将老的库关掉,移除$PGDATA目录。
shell
$ pg_ctl -D stop $PGDATA
$ mv /home/postgres/data /home/postgres/data.bak
$ mv /home/postgres/pgbak $PGDATA
第四部分 恢复开始
4.1 解压备份文件
解压base.tar.gz,和pg_wal.tar。和其他的tar文件,解压到对应表空间路径(如果有的话,先解压base然后启动,因为是recovery模式,可以查看表空间位置)。
4.2 配置 recover.conf文件
shell
# vi /$PGDATA/recover.conf
restore_command = ' cp /home/postgres/archivebak/%f %p '
recovery_target_time = '2020-02-26 22:34:00.211243+08' #时间点可以自选
4.3 基于时间点恢复
启动数据库,开始追日志。
shell
$ pg_ctl start database -D $PGDATA
4.4 更改为可读写
恢复完成后,数据库处于read-only模式,对于数据库的操作会出现以下报错。
shell
postgres=# delete from test;
ERROR: cannot execute DELETE in a read-only transaction
执行以下函数,将只读库更改为可读写。
shell
postgres=# select pg_wal_replay_resume();