目錄一.準備備份腳本並拷貝進容器二,在宿主機寫定時任務去執行容器內的備份腳本 一.準備備份腳本並拷貝進容器 vi backup.sh #內容如下 #!/bin/bash # PostgreSQL database credentials DB_NAME="<要備份的資料庫名>" DB_USER="< ...
目錄
一.準備備份腳本並拷貝進容器
vi backup.sh
#內容如下
#!/bin/bash
# PostgreSQL database credentials
DB_NAME="<要備份的資料庫名>"
DB_USER="<具有該資料庫導出許可權的用戶>"
DB_PASS="<用戶密碼>"
DB_HOST="localhost"
DB_PORT="5432"
# Backup directory
BACKUP_DIR="/var/lib/postgresql/backup"
# Export the PostgreSQL password
export PGPASSWORD=$DB_PASS
# Check if the backup file already exists and delete it if it does
if [[ -f "$BACKUP_DIR/$DB_NAME.tar" ]]; then
rm "$BACKUP_DIR/$DB_NAME.tar"
fi
# Create a backup file
pg_dump -h $DB_HOST -p $DB_PORT -U $DB_USER -F t -b -f "$BACKUP_DIR/$DB_NAME.tar" $DB_NAME
# Unset the PostgreSQL password
unset PGPASSWORD
保存後docker cp
到容器里的某一個文件夾內,這邊選擇的是/var/lib/postgresql
docker cp backup.sh <容器名>:/var/lib/postgresql
二,在宿主機寫定時任務去執行容器內的備份腳本
#!/bin/bash
DB_NAME="<要備份的資料庫名>"
remove_dir="/home/ngtl/backup/pgsql"
DATE=$(date +"%Y-%m-%d_%H-%M-%S")
#進入容器內部執行dump命令
docker exec -u 0 <容器名> bash -c "su - postgres -c 'cd /var/lib/postgresql; ./backup.sh'"
#拷貝備份文件
docker cp <容器名>:/var/lib/postgresql/backup/$DB_NAME.tar ./
# 使用時間戳重命名
mv "./$DB_NAME.tar" "./$DB_NAME_$DATE.tar"
# 只保留四天內的
find . -type f -name "$DB_NAME_*.tar" -mtime +4 -exec rm {} \;
#scp到其他服器,移動前清空目標路徑下的所以backup文件,與宿主機一致
ssh root@<備份機IP> "rm -f $remove_dir/$DB_NAME_*.tar"
scp ./gitea_*.tar root@<備份機IP>:/home/ngtl/backup/pgsql/
crontab -e
#添加如下內容
0 1 * * * <宿主機腳本地址>/backup.sh >> <宿主機腳本地址>/backup.log 2>&1