docker内备份远程POSTGRES数据库

起因:远程的postgres数据库 无法直接连接登录服务器访问 只能远程访问 想要备份数据库 且数据量巨大 备份时间很长 所以想办法写了如下脚本
备份当天数据 处理昨天SQL文件压缩 以空间换时间 因为备份时间比较长

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#!/bin/bash
# 设置数据库连接参数
PG_HOST=""
PG_PORT=""
PG_DB_NAME=""
PG_USER=""
# 请替换为你的数据库密码
PG_PASSWORD="your_password_here"
PG_SCHEMA=""

# 容器内备份目录
CONTAINER_BACKUP_DIR="/app/postgres"
# 获取当前日期
CURRENT_DATE=$(date +"%Y-%m-%d")
# 容器内备份文件路径,使用当前日期作为文件名
CONTAINER_BACKUP_PATH="$CONTAINER_BACKUP_DIR/assistant_$CURRENT_DATE.sql"

# 获取昨天的日期
yesterday=$(date -d "yesterday" "+%Y-%m-%d")
# 获取昨天的容器内备份文件路径和外部备份目录路径
container_backup_file="/app/postgres/assistant_$yesterday.sql"
external_backup_dir="/app/postgres/pgdata"
external_backup_file="$external_backup_dir/assistant_$yesterday.sql"

# 检查昨天的备份文件是否存在并复制到外部目录
if docker cp postgres:$container_backup_file $external_backup_file; then
echo "昨天的备份文件已成功复制."
# 压缩备份文件
zip -j $external_backup_dir/assistant_$yesterday.zip $external_backup_file
echo "备份文件已压缩."
# 删除昨天以及昨天之前的.sql文件
find $external_backup_dir -name "assistant_*.sql" -type f -mtime +1 -delete
echo "昨天以及昨天之前的.sql文件已删除."
else
echo "昨天的备份文件未找到."
fi

# 删除容器内三天前的备份文件
three_days_ago=$(date -d "3 days ago" "+%Y-%m-%d")
docker exec -i postgres find /app/postgres -name "assistant_*" -type f -mtime +3 -delete
echo "删除容器内三天前的备份文件."

# 删除外部目录中15天前的备份文件
fifteen_days_ago=$(date -d "15 days ago" "+%Y-%m-%d")
find $external_backup_dir -name "assistant_*.zip" -type f -mtime +15 -delete
echo "删除外部目录中15天前的备份文件."

# 在容器内创建备份目录
echo "在容器内创建备份目录..."
docker exec -i postgres mkdir -p $CONTAINER_BACKUP_DIR
echo "备份目录已创建."

# 启动 expect 进程来处理密码输入并执行备份命令
echo "正在备份数据库..."
expect -c "
spawn docker exec -i postgres pg_dump -U $PG_USER -h $PG_HOST -p $PG_PORT -d $PG_DB_NAME -n $PG_SCHEMA -Fc -f $CONTAINER_BACKUP_PATH
expect \"Password:\"
send \"$PG_PASSWORD\r\"
expect eof
"
echo "数据库已备份."