docker postgresql 备份数据库,并拷贝到宿主机

59 阅读1分钟

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