起因:远程的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 "数据库已备份."
|