使用脚本备份和还原 PostgreSQL 数据库
以下脚本可用于执行 PostgreSQL 数据库的备份。运行脚本时,不必停止数据库就可执行备份。
- postgresql_backup_pre.sh:此脚本将数据库置于备份模式。
- postgresql_snapshot_post.sh:此脚本将数据库置出备份模式。
- postgresql_settings:这是可能需要更新 PostgreSQL 变量的配置文件。
- postgresql_backup_post.sh:此脚本将更新有关备份状态的日志。
先决条件
开始备份之前,请确保执行以下操作:
- 将 WAL 级别设置为 archive(或 hot_standby)
- 将 archive_mode 设置为 on
- 要指定存档位置,必须设置 archive_command
注意:要应用设置,请在 postgresql 文件中配置这些设置后重新启动服务器。
以下命令用于在系统重新启动后检查存档模式的状态:
- show archive_mode
- show archive_command
- show WAL level
应用脚本
请按下列步骤操作:
- 解压缩 LinuxPostgres.zip,其包含以下四个文件:postgresql_backup_pre.sh、postgresql_snapshot_post.sh、postgresql_settings、postgresql_backup_post.sh
- 将文件从 pre/post backup/snapshot 复制到 Linux 备份服务器上的以下路径:/opt/Arcserve/d2dserver/usr/prepost。
- 将 postgresql_settings 复制到源路径 /root/backup。
- 请确保在 postgresql_settings 中检查为变量设置的所有值,并根据您的环境进行所需的任何更改。
- 从 UDP 控制台配置计划,并选择 PostgreSQL 节点作为源。
-
- 确认备份状态。要了解 PostgreSQL 备份的状态,请检查 arcserve_postgresql_backup_${DATE}.log 文件。该日志文件创建于由用户设置的目录下。有关配置目录的详细信息,请参阅 postgresql_settings 文件。
还原 PostgreSQL 数据库
请按下列步骤操作:
- 停止数据库服务器。
- 要还原原始位置,请执行以下操作:
- 从当前 /data 文件夹中删除文件和目录。
- 对整个 /data 文件夹执行还原。
- 从 /data 文件夹完成还原后,从以下文件夹删除文件:
- pg_dynshmem/
- pg_notify/
- pg_serial/
- pg_snapshots/
- pg_stat_tmp/
- pg_subtrans/
- pg_internal.init
- 转到为 WAL 存档配置的文件夹,并执行以下操作:
- 删除位于已还原 pg_wal 目录中的文件,该目录包含备份过程中执行的事务的相关信息。
- 现在,为了实现数据一致性和时间点恢复,将文件从用户定义的存档位置复制到 pg_wal 文件夹。
- 启动数据库服务器。
还原到同一服务器上的备用位置
- 停止数据库服务器。
- 运行 PGDATA,以将其配置为“new_data_directory_path”。
- 使用 `Initdb` 命令初始化新创建的数据库。
- 从当前 /data 文件夹中删除文件和目录。
- 对整个 /data 文件夹执行还原。
- 从 /data 文件夹完成还原后,从以下文件夹删除文件:
- pg_dynshmem/
- pg_notify/
- pg_serial/
- pg_snapshots/
- pg_stat_tmp/
- pg_subtrans/
- pg_internal.init
- 转到为 WAL 存档配置的文件夹,并执行以下操作:
- 删除位于已还原 pg_wal 目录中的文件,该目录包含备份过程中执行的事务的相关信息。
- 现在,为了实现数据一致性和时间点恢复,将文件从用户定义的存档位置复制到 pg_wal 文件夹。
- 启动数据库服务器。
- 注意:请确保在更新 PGDATA 的会话中执行数据库启动。
限制
如果为 PostgreSQL 数据库配置了非默认端口,上述脚本将无法用于执行备份。这些脚本仅适用于默认端口号 5432。
作为变通,请使用以下建议手动修改 postgresql_backup_pre.sh 和 postgresql_snapshot_post.sh 脚本:
- postgresql_backup_pre.sh:
- 原始:sudo -u ${USERNAME} -H -- psql -c "SELECT pg_start_backup('Arcserve UDP backup - ${DATE} $(timestamp)', true)" >> ${LOG} 2>&1
- 修改后: sudo -u ${USERNAME} -H -- psql -p 5432 -c "SELECT pg_start_backup('Arcserve UDP backup - ${DATE} $(timestamp)', true)" >> ${LOG} 2>&1
- postgresql_snapshot_post.sh:
- 原始: sudo -u ${USERNAME} -H -- psql -c "SELECT pg_stop_backup()" >> ${LOG} 2>&1
- 修改后: sudo -u ${USERNAME} -H -- psql -p 5432 -c "SELECT pg_stop_backup()" >> ${LOG} 2>&1