目录

一、安装pg_rman

可选附加配置

一、postgres的设置

二、备份路径配置

二、make可能存在的问题

一、找不到 -lgssapi_krb5

二、找不到 -ledit

三、警告

三、测试

测试全量备份

测试增量备份

查看备份的数据集

​编辑

恢复备份数据

全量备份恢复

增量备份恢复

四、实现应用

自动全量备份

自动增量备份

五、常用命令

六、补充Docker部署


一、安装pg_rman

1.更新包列表:使用以下命令更新 Ubuntu 包列表,确保系统处于最新状态。

sudo apt update

2.安装 PostgreSQL:如果您的系统中尚未安装 PostgreSQL,可以使用以下命令安装 PostgreSQL。

sudo apt install postgresql

3.安装依赖包:pg_rman 工具需要一些依赖包支持,可以使用以下命令安装这些依赖包。

sudo apt install build-essential libreadline-dev zlib1g-dev libssl-dev libpam0g-dev

4.下载并编译 pg_rman 工具:可以从 pg_rman 的官方 GitHub 仓库(https://github.com/ossc-db/pg_rman)下载 pg_rman 的源代码,然后编译并安装。

# 下载 pg_rman 源代码 新版本不兼容旧版本Ubuntugit clone https://github.com/ossc-db/pg_rman.git# 进入 pg_rman 目录cd pg_rman# 编译和安装 pg_rmanmake && sudo make install

5.配置 PostgreSQL:在 PostgreSQL 中启用 pg_rman 插件,可以编辑 PostgreSQL 的 postgresql.conf 配置文件,并添加以下配置:

shared_preload_libraries = 'pg_rman'

6.保存并关闭文件后,重新启动 PostgreSQL 以使配置生效。

sudo systemctl restart postgresql

7.验证 pg_rman 安装:可以使用以下命令验证 pg_rman 是否成功安装并可用。

pg_rman --version

可选附加配置

一、postgres的设置

设置pgsql的配置文件,使得:archive_command = ‘test ! -f /mnt/server/archivedir/%f && cp %p /mnt/server/archivedir/%f’

这个参数设置的是用来表示wal文件归档命令,会被pg_rman使用。命令中的“/mnt/server/archivedir”目录可以配置到任意自己想要的目录。

a.先寻找配置文件位置
locate postgresql.conf
b.使用vim进行配置文件编辑
vim ./postgresql.conf
c.使用“/”进行搜索archive_command
/archive_command

d.配置archive_command的值。这里可以自己把文件cp的路径改成自己喜欢的路径。
archive_command = ‘test ! -f /mnt/server/archivedir/%f && cp %p /mnt/server/archivedir/%f’
e.继续设置文档中的值wal_level和archive_mode
设置:

wal_level = replica
archive_mode = on

d.去建立该wal文件存储路径,并赋予权限
这一步非常重要,如果没有赋予wal文件存储路径给postgres权限的话,在postgres用户下的pgsql根本没有权限去写wal文件进入该文件夹。

mkdir -p /mnt/server/archivedir
chown postgres:postgres -R /mnt/server/archivedir
su postgres -c “chmod 700 -R /mnt/server/archivedir”

e.重启pgsql

service postgresql restart

解释

postgresql配置文件的archive_command什么作用

在使用 pg_rman 进行备份时,通常不需要对 pg_rman 工具本身进行修改。pg_rman 是一个独立的 PostgreSQL 备份和还原工具,它不需要对 PostgreSQL 数据库本身进行修改。

但是,在使用 pg_rman 进行备份时,您需要在 PostgreSQL 数据库中进行一些配置,例如设置合适的归档命令(archive_command)以将 WAL 日志归档到外部目录,以便 pg_rman 可以基于这些归档日志创建备份。具体而言,您需要确保以下配置项正确设置:

1.archive_command:设置归档命令,将 WAL 日志归档到指定的归档目录,例如:

archive_command = 'cp %p /path/to/archive/%f'

2.archive_mode:启用归档模式,以便 PostgreSQL 将 WAL 日志写入到归档目录中:

archive_mode = on

3.wal_level:设置 WAL 日志的记录级别,至少设置为 archive,以便将所有 WAL 日志记录到归档目录中:

wal_level = archive

这些配置项的设置可以确保 PostgreSQL 数据库将 WAL 日志记录到归档目录中,从而使 pg_rman 可以基于这些归档日志创建备份。一旦这些配置项正确设置,您可以使用 pg_rman 提供的备份命令来创建全量备份和增量备份,而不需要对 pg_rman 工具本身进行修改。

所以安装pg_rman为什么没用设置归档命令

pg_rman 工具本身并不需要配置归档命令,因为它是一个独立的备份和还原工具,并不依赖于 PostgreSQL 的归档日志。实际上,在使用 pg_rman 进行备份时,您不需要配置 PostgreSQL 的 archive_command

pg_rman 是基于 PostgreSQL 的物理备份工具,它直接备份数据库文件,而不是依赖于归档日志。您可以使用 pg_rman 提供的命令来创建全量备份和增量备份,而无需配置 PostgreSQL 的归档命令。pg_rman 会自动处理备份的一致性和完整性,并提供了一些高级功能,例如并行备份、压缩备份、增量备份等。

因此,在安装和配置 pg_rman 时,并不需要设置 archive_command。您只需要确保 pg_rman 工具已经正确安装,并根据您的需求使用 pg_rman 提供的命令进行备份和还原操作即可。当然,如果您需要使用 PostgreSQL 的归档日志功能来支持其他需求,例如数据恢复或流复制等,那么您仍然需要配置 archive_command 和其他相关的 PostgreSQL 配置项。但在使用 pg_rman 进行备份时,并不需要这样配置。

二、备份路径配置

a.进入数据库查看数据目录

show data_directory;

b.设置pg_rman配置

vim ./pgrman_data/pg_rman.ini

c.设置pg_rman的备份文件夹目录,我这里设置为/home/backup_home/pgsql/pgrman_data(自己随便创建)。设置pgsql的data文件夹路径为/var/lib/postgresql/10/main。

pg_rman init -B  -D 
ARCLOG_PATH='/mnt/server/archivedir' BACKUP_PATH='/home/backup_home/pgsql/pgrman_data' # 设置backup—path以后使用pg_rman不用-BPGDATA='/var/lib/postgresql/10/main' # 设置PGDATA以后使用pg_rman不用-Dcompress_data=yes # 数据压缩with-serverlog=yessmooth-checkpoint=yeskeep-data-days=30 # 时间窗口,备份需要保证数据库可以恢复到时间窗口内的任意时间点keep-arclog-days=30 # 保留几天内的归档文件keep-srvlog-days=30 # 保留几天内的数据库日志文件# keep-data-generations # 保留几代全备,如果设置为2,本次备份后不会删除上次备份# keep-arclog-files # 保留多少个归档文件# keep-srvlog-files # 保留几个数据库日志文件

d.开一下路径的权限:

root@VM-20-13-ubuntu: chown postgres:postgres -R /home/backup_home/pgsqlroot@VM-20-13-ubuntu: su postgres -c "chmod 777 -R /home/backup_home/pgsql"

可忽略不配置的原因

对于 pg_rman 工具,备份文件的路径是由其配置文件中的 backup_path 参数指定的。在安装 pg_rman 时,您不需要进行备份文件路径的配置,因为这个配置是在使用 pg_rman 进行备份时指定的。一般情况下,您可以在 pg_rman 的配置文件 /etc/pg_rman.conf 中设置 backup_path 参数,指定备份文件的存放路径。例如:

# /etc/pg_rman.confbackup_path = /path/to/backup_directory

这样,当您使用 pg_rman 进行备份时,备份文件会存放在指定的路径下。

如果您没有在安装 pg_rman 时进行备份文件路径的配置,可以通过编辑 /etc/pg_rman.conf 文件来进行配置,或者在使用 pg_rman 进行备份时使用 -B--backup-path 参数来指定备份文件的路径。例如:

pg_rman backup -B /path/to/backup_directory

这样,pg_rman 会将备份文件存放在指定的路径下。请注意,使用 pg_rman 进行备份时,需要确保备份文件的存放路径具有足够的磁盘空间,并且具有合适的权限供 pg_rman 访问和写入备份文件。

二、make可能存在的问题

一、找不到 -lgssapi_krb5

如果在安装 pg_rman 时出现找不到 -lgssapi_krb5 的错误,这可能是因为缺少 Kerberos 库的开发包。您可以尝试按照以下步骤解决此问题:

1.安装 Kerberos 开发包:在 Ubuntu 上,可以使用以下命令安装 Kerberos 开发包。

sudo apt install libkrb5-dev

2.重新编译 pg_rman:在安装了 Kerberos 开发包之后,您可以重新编译 pg_rman 工具,确保编译过程中可以找到 Kerberos 库。

# 进入 pg_rman 目录cd pg_rman# 清理之前的编译结果make clean# 编译和安装 pg_rmanmake && sudo make install

在重新编译 pg_rman 后,应该可以解决找不到 -lgssapi_krb5 的错误。如果问题仍然存在,可能需要检查 Kerberos 库的安装路径和 pg_rman 的编译参数,确保它们正确匹配。您可以参考 pg_rman 的官方文档和安装说明,以获取更详细的信息。

二、找不到 -ledit

如果在安装 pg_rman 时出现找不到 -ledit 的错误,这可能是因为缺少 editline 库的开发包。您可以尝试按照以下步骤解决此问题:

1.安装 editline 开发包:在 Ubuntu 上,可以使用以下命令安装 editline 开发包。

sudo apt install libedit-dev

2.重新编译 pg_rman:在安装了 editline 开发包之后,您可以重新编译 pg_rman 工具,确保编译过程中可以找到 editline 库。

# 进入 pg_rman 目录cd pg_rman# 清理之前的编译结果make clean# 编译和安装 pg_rmanmake && sudo make install

在重新编译 pg_rman 后,应该可以解决找不到 -ledit 的错误。如果问题仍然存在,可能需要检查 editline 库的安装路径和 pg_rman 的编译参数,确保它们正确匹配。您可以参考 pg_rman 的官方文档和安装说明,以获取更详细的信息。

三、警告

三、测试

测试全量备份

a、切换用户(最好非root)

#登录一下postgres:su postgressource /etc/profile

b、执行备份

pg_rman backup –backup-mode=full

命令指定备份文件存放路径:pg_rman backup –backup-path= –type=full

c、进行校验:

pg_rman validate

成功结果:

测试增量备份

增量备份之前必须有对应的全量备份。

pg_rman backup --backup-mode=incremental --progress

命令指定备份文件存放路径:pg_rman backup –backup-path= –type=incremental

成功结果:

进行校验

pg_rman validate

查看备份的数据集

我们可以用pg_rman show查看备份的数据集:

pg_rman show

成功结果:

未校验备份集 Status 显示为 DONE,校验完成为OK,上图显示全部校验完成。

引用:pg_rman安装与使用

恢复备份数据

全量备份恢复

前提:假设已经创建了一个 PostgreSQL 数据库,并使用 pg_rman 工具进行了全量备份。备份文件存放在 /backups 目录下,备份文件名为 20220422T010000。现在需要恢复到某个全量备份的状态。

1.停止 PostgreSQL 服务:

sudo service postgresql stop

2.使用 pg_rman 进行全量备份恢复:

sudo pg_rman restore –recovery-target=latest-full –backup-path=/backups

上面的命令使用 pg_rman restore 命令进行备份恢复操作。

--recovery-target=latest-full 参数指定恢复到最近的全量备份。

--backup-path=/backups 参数指定备份文件的路径。

3. 启动 PostgreSQL 服务:

sudo service postgresql start

注意:备份恢复操作可能会涉及到数据库的状态恢复、数据文件替换等高风险操作,应谨慎操作,并在操作前备份数据库以防止数据丢失。同时,恢复操作可能因数据库大小和备份文件数量等因素而耗时较长,需耐心等待操作完成。

增量备份恢复

前提:假设已经创建了一个 PostgreSQL 数据库,并使用 pg_rman 工具进行了增量备份。备份文件存放在 /backups 目录下,备份文件名为 20220423T010000。现在需要恢复到某个增量备份的状态。

1. 停止 PostgreSQL 服务 同全量

2.使用 pg_rman 进行增量备份恢复

sudo pg_rman restore –recovery-target=latest-incremental –backup-path=/backups

上面的命令使用 pg_rman restore 命令进行备份恢复操作。

--recovery-target=latest-incremental 参数指定恢复到最近的增量备份。

--backup-path=/backups 参数指定备份文件的路径。

3.启动PostgreSQL 命令同全量

四、实现应用

要求:每周一到周六凌晨一点自动增量备份

每周日凌晨一点自动全量备份

实现:使用pg_rman工具进行增量全量备份

使用cron任务进行定时执行任务

自动全量备份

1.创建全量备份脚本

创建备份脚本:在Ubuntu 系统中创建一个备份脚本,例如 pg_rman_full_backup.sh,并确保该脚本具有足够的权限来执行 pg_rman 备份操作,包括读取 PostgreSQL 数据库的权限、pg_rman 工具的权限以及备份存储路径的权限。以下是一个简单的示例备份脚本:

#!/bin/bash# 设置 PostgreSQL 数据库和 pg_rman 工具的环境变量export PGDATA=/path/to/your/postgresql/dataexport PATH=/path/to/your/pg_rman/bin:$PATH# 执行 pg_rman 全量备份命令pg_rman backup --backup-mode=full

2.设置脚本的执行权限:使用 chmod 命令为备份脚本设置执行权限,以确保 cron 用户可以执行该脚本。例如,使用以下命令设置备份脚本的执行权限:

chmod +x /path/to/your/pg_rman_full_backup.sh

3.编辑 cron 任务:使用 crontab 命令编辑 cron 任务。

crontab -e

4.添加定时任务:在 crontab 文件中添加一个定时任务,指定每周日凌晨1点执行备份脚本。例如,以下是一个每周日凌晨1点执行备份脚本的 cron 任务的示例:

0 1 * * 7 /path/to/your/pg_rman_full_backup.sh

其中,0 1 * * 7 是 cron 任务的时间设定,表示每周日凌晨1点执行备份脚本。

自动增量备份

1.创建增量备份脚本

在Ubuntu 系统中创建一个备份脚本,例如 pg_rman_incremental_backup.sh,并确保该脚本具有足够的权限来执行 pg_rman 备份操作,包括读取 PostgreSQL 数据库的权限、pg_rman 工具的权限以及备份存储路径的权限。以下是一个简单的示例备份脚本:

#!/bin/bash# 设置 PostgreSQL 数据库和 pg_rman 工具的环境变量export PGDATA=/path/to/your/postgresql/dataexport PATH=/path/to/your/pg_rman/bin:$PATH# 获取当前日期和时间CURRENT_DATE=$(date +%Y%m%d_%H%M%S)# 执行 pg_rman 增量备份命令,指定备份文件名中包含当前日期和时间pg_rman backup --backup-mode=incremental --backup-name=incr_${CURRENT_DATE}

2.设置脚本的执行权限:使用 chmod 命令为备份脚本设置执行权限,以确保 cron 用户可以执行该脚本。例如,使用以下命令设置备份脚本的执行权限:

chmod +x /path/to/your/pg_rman_incremental_backup.sh

3.编辑 cron 任务:使用 crontab 命令编辑 cron 任务。

crontab -e

4.添加定时任务:在 crontab 文件中添加一个定时任务,指定每周一到周六凌晨1点执行备份脚本。例如,以下是一个每周一到周六凌晨1点执行备份脚本的 cron 任务的示例:

0 1 * * 1-6 /path/to/your/pg_rman_incremental_backup.sh

五、常用命令

  • pg_rman backup:执行全量备份命令,创建一个 PostgreSQL 数据库的全量备份。
  • pg_rman backup -i:执行增量备份命令,创建一个 PostgreSQL 数据库的增量备份。
  • pg_rman validate:验证备份的完整性,检查备份文件是否存在、是否完整以及是否可以正常还原。
  • pg_rman show:显示备份信息,包括备份类型、备份的起始时间和结束时间、备份文件的路径等。
  • pg_rman delete:删除备份,可以根据备份的 ID 或时间范围来删除备份。
  • pg_rman restore:执行还原命令,将备份文件还原到指定的 PostgreSQL 数据库。
  • pg_rman archive-get:从归档中获取备份,用于将备份文件从归档中复制到备份目录中以进行恢复。
  • pg_rman show-config:显示 pg_rman 的配置信息,包括备份目录、归档目录、备份设置等。
  • pg_rman set-config:设置 pg_rman 的配置信息,如备份目录、归档目录、备份设置等。

以上是一些常用的 pg_rman 命令,您可以根据实际需求使用不同的命令来执行备份、还原和管理操作。更多关于 pg_rman 的详细命令和用法可以参考官方文档或运行 pg_rman --help 命令来获取帮助信息。

六、补充Docker部署

在 Docker 环境下,安装和配置 pg_rman 工具稍有不同于在传统的物理服务器上安装和配置。以下是在 Docker 环境下使用 pg_rman 进行备份的一般步骤:

创建 PostgreSQL 的 Docker 容器:首先,您需要创建一个运行 PostgreSQL 数据库的 Docker 容器。您可以使用 Docker Hub 上的官方 PostgreSQL 镜像,或者使用自定义的 PostgreSQL 镜像。在创建容器时,可以通过 -v 参数来指定容器内的文件卷,用于存放备份文件。例如:

docker run -d --name postgres -e POSTGRES_PASSWORD=mysecretpassword -v /path/to/backup_directory:/backups postgres:latest

上面的命令会创建一个名为 “postgres” 的 Docker 容器,使用官方的 PostgreSQL 镜像,并将容器内的 /backups 目录挂载到宿主机的 /path/to/backup_directory 目录,用于存放备份文件。

2.在容器内安装 pg_rman:在创建的 PostgreSQL 容器内,您需要安装 pg_rman 工具。可以通过以下步骤在容器内安装 pg_rman:

docker exec -it postgres bashapt updateapt install -y pg-rman

上面的命令会进入 PostgreSQL 容器,并在容器内使用 apt 包管理器安装 pg_rman 工具。

3.配置 pg_rman:在容器内安装完成 pg_rman 后,您需要进行 pg_rman 的配置。可以通过编辑 /etc/pg_rman.conf 文件来设置 backup_path 参数,指定备份文件的存放路径。例如:

# /etc/pg_rman.confbackup_path = /backups

这样,pg_rman 将备份文件存放在容器内的 /backups 目录下。

4.使用 pg_rman 进行备份:现在,您可以使用 pg_rman 进行备份操作了。可以使用 pg_rman 提供的命令,例如 pg_rman backup,来创建全量备份和增量备份,并将备份文件存放在配置的备份文件路径下。

需要注意的是,在 Docker 环境下使用 pg_rman 进行备份时,由于容器的隔离性,备份文件会存放在容器内的文件卷中。如果您希望将备份文件导出到宿主机或其他地方进行长期存储,可以使用 Docker 提供的 docker cp 命令将文件从容器复制到宿主机或其他目标位置。例如:

docker cp postgres:/backups /path/to/backup_directory

这样,您可以将备份文件从容器复制到宿主机上的 /path/to/backup_directory 目录下。

Docker完整版本

Docker安装pg_rman实现定时自动备份