
Windows/Linux 定时备份 pg 数据库,定时删除
日常贴
·
1. 写个备份脚本
备份数据库脚本:
pgBacks.bat
@ECHO OFF
:: 用于启用扩展功能。在使用enableextensions选项后,批处理脚本可以使用扩展命令和特性
@setlocal enableextensions
:: 移动到脚本文件当前目录
@cd /d "%~dp0"
:: 设置数据库密码,设置后会在下文自动引用
set PGPASSWORD=myDataBasePass
:: 数据库安装位置,一定用双引号括起来,不然不生效。
SET PGPATH="D:\java\pg\bin\"
:: 备份位置
SET SVPATH="D:\java\pgBackData\"
:: 需要备份的数据库名
SET PRJDB=MyDataBaseName
:: 登录的数据库用户名
SET DBUSR=postgres
:: ('DATE /T')得到当前日期,并通过'/'为分隔符分成三部分分别赋值给后面的i,j, k。然后用'd'这个变量去接收
FOR /F "TOKENS=1,2,3 DELIMS=/ " %%i IN ('DATE /T') DO SET d=%%i-%%j-%%k
:: 用'DBDUMP'这个变量存储即将命名的备份文件名字。
SET DBDUMP=%PRJDB%_%d%.bak
@ECHO OFF
:: 设置日志文件路径和名称
SET LOGFILE=%SVPATH%backup_log_%d%.txt
:: 记录开始时间到日志
echo [%date% %time%] Backup started >> %LOGFILE%
:: 用pg_dump这个工具进行备份到变量指定的路径,以及命名
call %PGPATH%pg_dump -h localhost -p 5432 -U %DBUSR% -d %PRJDB% > "%SVPATH%%DBDUMP%"
:: 检查备份是否成功,并记录到日志
if %ERRORLEVEL% EQU 0 (
echo [%date% %time%] Backup successful: %SVPATH%%DBDUMP% >> %LOGFILE%
echo Backup Taken Complete %SVPATH%%DBDUMP%
) else (
echo [%date% %time%] Backup failed >> %LOGFILE%
echo Backup Failed
)
:: 删除15天之前的以'.bak'结尾的备份数据,路径不能使用双引号
SET SVPATH=D:\java\pgBackData
set DaysAgo=15
:: 记录删除操作开始到日志
echo [%date% %time%] Deleting old backups >> %LOGFILE%
forfiles -p %SVPATH% -s -m *.bak -d -%DaysAgo% -c "cmd /c del -f -q -a @path"
:: 记录删除操作完成到日志
echo [%date% %time%] Old backups deleted >> %LOGFILE%
:: 记录完成时间到日志
echo [%date% %time%] Backup process completed >> %LOGFILE%
:: 恢复环境
@endlocal
2. Windows 添加定时任务
-
打开控制面板→系统和安全→计划任务
当然,其他版本的可能长这样
-
创建基本任务
-
查看已经建好的任务
3. 使用备份的 SQL 还原数据
跑下面的指令:
-- psql -h 服务器IP -U 用户名 -d 数据库名 < 备份文件位置
psql -h localhost -U postgres -d postgres < D:\Java\pgBak\postgres_2023-10-13.bak
4. 补充:Linux备份pg数据库脚本
#!/bin/bash
# 定义日志文件路径
LOG_FILE="/var/log/pg_backup.log"
# 函数:记录日志
log_message() {
local now_time
now_time=$(date +"%F %T")
echo "[$now_time] $1" >> "$LOG_FILE"
}
# 开始执行备份,并记录日志
log_message "开始执行 PostgreSql 数据库备份!"
log_message "备份中 -------------------"
NOWTIME=$(date +%F)
DB_IP="127.0.0.1"
DB_PORT="5432"
DB_USER="postgres"
DB_NAME="test"
DB_ROLE="postgres"
BK_FILE="/u01/pgBacksData"
KEEP_DAYS="15"
export PGPASSWORD="123456"
set timeout 500
/pgsql/postgresql/bin/pg_dump --file "$BK_FILE/test_$NOWTIME.backup" --host $DB_IP --port $DB_PORT --username $DB_USER --dbname $DB_NAME --verbose --role $DB_ROLE --format=c --blobs --encoding "UTF8"
log_message "数据库备份结束!"
# 删除超过指定天数的备份文件
log_message "查找符合条件的旧备份文件..."
find "$BK_FILE" -type f -name "hipay_*.backup" -mtime +$KEEP_DAYS >> "$LOG_FILE" 2>&1
log_message "开始清理超过 $KEEP_DAYS 天的旧备份文件..."
find "$BK_FILE" -type f -name "hipay_*.backup" -mtime +$KEEP_DAYS -exec rm -v {} \; >> "$LOG_FILE" 2>&1
log_message "删除操作完成。"
exit;
备份出来的文件取名格式:/test_2024-05-30.backup
要做定时备份,就在cron中添加指令就行:
[root@localhost pgBacksData]# crontab -e
# 在打开的文件中添加下列指令(分钟 小时 月 天 星期),保存退出
0 3 * * 6 /u01/pgBacksData/pgbacknew.sh
[root@localhost pgBacksData]# crontab -l
0 3 * * 6 /u01/pgBacksData/pgbacknew.sh
更多推荐
所有评论(0)