postgres backup
基础指令:
在容器运行的 postgres 数据库,但是同样可以使用宿主机来备份,如果是直接运行在宿主机中的数据库同样适用,只需去掉 docker 相关的部分即可. 以下的命令是基础操作命令,实际操作的命令使用的格式和方式稍有不同,本质一样,如果要用此处的命令可以直接替换即可。
# 创建备份文件夹
mkdir -p ~/pgsql_backup
# 根据数据库备份
docker exec pgsql pg_dump -U postgres mydb | gzip > ~/pgsql_backup/mydb_$(date +%F_%H-%M-%S).sql.gz
# 恢复备份的数据库
gunzip -c mydb_2026-07-09_11-03-16.sql.gz | docker exec -i pgsql psql -U postgres mydb实际操作
- 制作备份脚本: 脚本一定要记得 chmod +x pgsql_backup.sh
#!/usr/bin/env bash
set -Eeuo pipefail
#############################################
# 配置
#############################################
# Docker 容器名称
CONTAINER="pgsql"
# PostgreSQL 用户
PGUSER="postgres"
# 备份保存目录(宿主机)
BACKUP_DIR="$HOME/data/backup"
# 保留天数
KEEP_DAYS=3
# 需要备份的数据库
DATABASES=(
"mydb"
)
#############################################
mkdir -p "$BACKUP_DIR"
DATE=$(date +"%Y-%m-%d_%H-%M-%S")
echo "========== $(date) Backup Started =========="
for DB in "${DATABASES[@]}"; do
FILE="${BACKUP_DIR}/${DB}_${DATE}.dump"
echo "Backing up ${DB}..."
if docker exec "${CONTAINER}" \
pg_dump \
-U "${PGUSER}" \
-Fc \
"${DB}" > "${FILE}"
then
echo "✔ ${DB} backup success"
else
echo "✘ ${DB} backup failed"
rm -f "${FILE}"
fi
done
echo "Cleaning old backups..."
find "${BACKUP_DIR}" \
-name "*.dump" \
-mtime +${KEEP_DAYS} \
-delete
echo "========== $(date) Backup Finished =========="- 加入定时任务:
# 每天凌晨 3 点定时执行,并选择日志存放位置
0 3 * * * /usr/local/bin/postgres_backup.sh >> /var/log/postgres_backup.log 2>&1- 恢复数据库:
docker exec pgsql createdb -U postgres mydb
docker exec -i pgsql \
pg_restore \
-U postgres \
-d mydb \
< /data/postgresql/backup/mydb_2026-07-09_03-00-00.dump覆盖恢复 aYywvc7QbMfS2FB
docker exec -i pgsql \
pg_restore \
--clean \
--if-exists \
-U postgres \
-d mydb \
< /data/postgresql/backup/mydb_2026-07-09_03-00-00.dump