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 添加定时任务

  1. 打开控制面板→系统和安全→计划任务

    当然,其他版本的可能长这样

  2. 创建基本任务

  3. 查看已经建好的任务

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
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐