1、为解决备份时不需要输入数据库密码,首先我们需要在宿主机任意文件夹下新建.pgpass文件,文件内容如下:
ip:port:database:username:password
# 示例 localhost:5432:test:postgres:123456
然后将文件拷贝到容器的/root目录下
docker cp ./.pgpass 容器:/root/
2、进入容器内部,将.pgpass权限设置为600
docker exec -it postgres容器名 bash
chmod 600 /root/.pgpass
3、在宿主机上新建pg_backup.sh文件,内容如下:
#!/bin/bash
# 配置信息
CONTAINER_NAME="PostgreSQL" # PostgreSQL容器名称
BACKUP_DIR="/backup" # 宿主机备份目录
DB_NAME="test" # 数据库名称
DB_USER="postgres" # 数据库用户名
RETENTION_DAYS=7 # 备份保留天数
# 创建备份目录(如果不存在)
mkdir -p $BACKUP_DIR
# 生成备份文件名(包含日期时间)
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
BACKUP_FILE="$BACKUP_DIR/$DB_NAME-$TIMESTAMP.dump"
# 执行备份命令(通过环境变量传递密码)
echo "开始备份数据库 $DB_NAME 到 $BACKUP_FILE"
docker exec $CONTAINER_NAME sh -c "pg_dump -h localhost -p 5432 -E utf8 -U $DB_USER -d $DB_NAME -Ft -f /tmp/$DB_NAME-$TIMESTAMP.dump"
# 将备份文件从容器复制到宿主机
docker cp $CONTAINER_NAME:/tmp/$DB_NAME-$TIMESTAMP.dump $BACKUP_FILE
# 压缩备份文件
gzip $BACKUP_FILE
# 清理容器内的临时文件
docker exec $CONTAINER_NAME rm /tmp/$DB_NAME-$TIMESTAMP.dump
# 删除超过保留天数的备份文件
echo "清理 $RETENTION_DAYS 天前的备份文件"
find $BACKUP_DIR -name "$DB_NAME-*.dump.gz" -type f -mtime +$RETENTION_DAYS -delete
echo "备份完成"
chmod 777 pg_backup.sh
4、添加到linux的定时任务中
crontab -e
添加以下内容实现每天凌晨2点执行备份:
0 2 * * * /path/to/your/pg_backup.sh >> /var/log/pg_backup.log 2>&1