ubuntu20.04PostgreSQL自动备份数据库,脚本疑问


    #!/bin/bash
    # Configuration
    BACKUP_DIR="/path/to/backup/directory"
    DB_USER="postgres"
    DB_NAME="mydatabase"
     
    # Generate filename
    NOW=$(date +"%Y-%m-%d_%H-%M-%S")
    FILE="$BACKUP_DIR/$NOW.sql"
     
    # Backup database
    pg_dump -U $DB_USER -d $DB_NAME -f $FILE
     
    # Delete backups older than 7 days
    find $BACKUP_DIR -type f -mtime +7 -exec rm {} \;

这段脚本报错。
我的需求是:自动备份pg的数据库,并且是以压缩形式备份的,而不是后缀是sql文件,尽量减少文件体积。

img

img

img

不知道你解决了没有?如果没有解决,我们可以聊聊。

没看到你的报错日志呢?
ubuntu和pg搭配,主要考虑的是权限多一点,你着重在这一块即可。

优化了一下脚本,添加了容错判断,错误就会立即退出,添加了日志输出,增加了压缩备份文件,增加了文件权限设置

#!/bin/bash

# Configuration
BACKUP_DIR="/path/to/backup/directory"
DB_USER="postgres"
DB_NAME="mydatabase"
LOG_FILE="/path/to/logfile"

# Error handling
set -e
if [ ! -d "$BACKUP_DIR" ]; then
    echo "Error: Backup directory $BACKUP_DIR does not exist."
    exit 1
fi

# Redirect output to log file
exec >> "$LOG_FILE" 2>&1

# Generate filename
NOW=$(date +"%Y-%m-%d_%H-%M-%S")
FILE="$BACKUP_DIR/$NOW.sql.gz"

# Backup database
pg_dump -U $DB_USER -d $DB_NAME | gzip > "$FILE"

# Set file permissions
chmod 600 "$FILE"

# Delete backups older than 7 days
find $BACKUP_DIR -type f -mtime +7 -exec rm {} \;

该回答引用GPTᴼᴾᴱᴺᴬᴵ
您可以使用以下脚本来备份 PostgreSQL 数据库并以压缩形式保存:

#!/bin/bash

# Configuration
BACKUP_DIR="/path/to/backup/directory"
DB_USER="postgres"
DB_NAME="mydatabase"

# Generate filename
NOW=$(date +"%Y-%m-%d_%H-%M-%S")
FILE="$BACKUP_DIR/$NOW.sql.gz"

# Backup database
pg_dump -U $DB_USER -d $DB_NAME | gzip > $FILE

# Delete backups older than 7 days
find $BACKUP_DIR -type f -mtime +7 -name "*.sql.gz" -exec rm {} \;

此脚本将使用 pg_dump 命令备份 PostgreSQL 数据库,并使用 gzip 压缩命令将备份文件压缩为 .gz 格式。备份文件将保存在 $BACKUP_DIR 目录中,文件名格式为 YYYY-MM-DD_HH-MM-SS.sql.gz。脚本还包括删除 7 天前的备份文件。

请确保您将脚本中的 $BACKUP_DIR、$DB_USER 和 $DB_NAME 替换为您自己的值,并使用具有足够权限的用户运行脚本。

参考GPT和自己的思路,报错的原因可能是,
没有设置正确的权限:如果备份目录没有足够的权限进行写入,那么备份脚本就会失败。请确保您正在使用正确的用户权限来运行备份脚本,并且备份目录具有写入权限。
PostgreSQL 凭据不正确:如果您没有正确地设置 DB_USER 和 DB_NAME 变量,那么备份脚本将无法连接到 PostgreSQL 数据库并进行备份。
备份目录不存在:如果您尝试备份到一个不存在的目录,备份脚本将会失败。请确保您已经创建了备份目录,并且将目录的路径正确地设置为 BACKUP_DIR 变量。
其他错误:还有许多其他可能导致脚本运行失败的问题,包括系统故障、缺少依赖项、语法错误等等。如果您能提供更多的信息和错误消息,我将更容易地确定导致脚本失败的原因。
如果您希望将备份文件压缩,可以在备份数据库之后使用 gzip 命令压缩备份文件,如下所示:

#!/bin/bash
# Configuration
BACKUP_DIR="/path/to/backup/directory"
DB_USER="postgres"
DB_NAME="mydatabase"

# Generate filename
NOW=$(date +"%Y-%m-%d_%H-%M-%S")
FILE="$BACKUP_DIR/$NOW.sql"

# Backup database and compress the backup file
pg_dump -U $DB_USER -d $DB_NAME | gzip > $FILE.gz

# Delete backups older than 7 days
find $BACKUP_DIR -type f -mtime +7 -exec rm {} \;

在这个脚本中,我们使用了管道将 pg_dump 的输出发送到 gzip 命令中,然后将压缩文件保存到文件 $FILE.gz 中。在删除七天前的备份文件时,由于备份文件已经被压缩,您需要相应地更改 find 命令以匹配压缩文件的文件名后缀,如下所示:

find $BACKUP_DIR -type f -name "*.gz" -mtime +7 -exec rm {} \;

这样就会删除七天前的所有压缩备份文件,而保留其他类型的文件(如日志文件等)不受影响。
如果对您有帮助,请给与采纳,谢谢。

以下答案基于ChatGPT与GISer Liu编写:

你可以使用 pg_dump 命令的 -F 参数指定备份格式,-F 后面接的参数有 pctd,分别代表以 plaincustomtardirectory 格式备份。你可以选择使用 custom 格式,并且将备份数据进行压缩,压缩方式可以使用 gzip 或者 bzip2。以下是修改后的备份脚本:

bash

#!/bin/bash
# Configuration
BACKUP_DIR="/path/to/backup/directory"
DB_USER="postgres"
DB_NAME="mydatabase"
 
# Generate filename
NOW=$(date +"%Y-%m-%d_%H-%M-%S")
FILE="$BACKUP_DIR/$NOW.dump"
 
# Backup database
pg_dump -U $DB_USER -F c -b -v -f $FILE $DB_NAME | gzip
 
# Delete backups older than 7 days
find $BACKUP_DIR -type f -name "*.dump.gz" -mtime +7 -exec rm {} \;

这个脚本会使用 pg_dump 命令以 custom 格式备份数据库,并将备份数据通过管道传递给 gzip 命令进行压缩,生成的备份文件名称以 .dump.gz 结尾。在备份完成后,脚本会删除所有扩展名为 .dump.gz 的备份文件,且文件最后修改时间超过 7 天。


修改后的脚本:

#!/bin/bash

# Configuration
BACKUP_DIR="/path/to/backup/directory"
DB_USER="postgres"
DB_NAME="mydatabase"

# Generate filename
NOW=$(date +"%Y-%m-%d_%H-%M-%S")
FILE="$BACKUP_DIR/$NOW.sql.gz"

# Backup database and compress
pg_dump -U $DB_USER -d $DB_NAME | gzip > $FILE

# Delete backups older than 7 days
find $BACKUP_DIR -type f -mtime +7 -name "*.sql.gz" -delete

该回答引用CHatGPT 哦

您可以使用cron定时任务来实现自动备份PostgreSQL数据库,具体步骤如下:
1. 创建备份脚本,例如:
#!/bin/bash
pg_dump -U postgres -Fc mydb > /path/to/backup/mydb_$(date +%!Y(MISSING)%!m(MISSING)%!d(MISSING)).dump
2. 使用crontab -e命令编辑定时任务,例如:
0 0 * * * /path/to/backup/backup.sh
3. 保存并退出,即可实现自动备份PostgreSQL数据库的功能。