目录
一、安装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实现定时自动备份