PostgreSQL在CentOS上的备份主要分为逻辑备份(基于SQL语句或自定义格式)和物理备份(基于数据目录)两类,以下是具体操作:
逻辑备份通过pg_dump工具实现,将数据库结构和数据导出为SQL脚本或自定义格式文件,适用于跨版本迁移或部分数据恢复。
su - postgres -c "pg_dump -U postgres -d 数据库名 -f /path/to/backup/backup_file.sql"
su - postgres -c "pg_dump -U postgres -d 数据库名 -F c -b -v -f /path/to/backup/backup_file.dump"
su - postgres -c "pg_dumpall -U postgres -f /path/to/backup/all_databases.sql"
su - postgres -c "pg_dump -U postgres -d 数据库名 | gzip > /path/to/backup/backup_file.sql.gz"
--jobs指定并行任务数):su - postgres -c "pg_dump -U postgres -d 数据库名 --jobs 4 -f /path/to/backup/backup_file.dump"
物理备份通过pg_basebackup工具复制整个数据目录(包括WAL日志),适用于需要精确恢复到某一时间点的场景(如灾难恢复)。
-F t表示tar格式,-P显示进度,-X stream流式传输WAL日志):su - postgres -c "pg_basebackup -U postgres -D /path/to/backup -F t -P -X stream -f backup.tar"
通过cron定时任务定期执行备份脚本,确保数据定期保存。
/path/to/backup_postgresql.sh):#!/bin/bash
USER="postgres"
DB_NAME="数据库名"
BACKUP_DIR="/path/to/backups"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="$BACKUP_DIR/${DB_NAME}_${DATE}.dump"
# 执行备份
su - postgres -c "pg_dump -U $USER -d $DB_NAME -F c -b -v -f $BACKUP_FILE"
# 删除7天前的备份(可选)
find $BACKUP_DIR -type f -name "${DB_NAME}_*.dump" -mtime +7 -exec rm {} \;
crontab -e
添加以下内容:
0 2 * * * /path/to/backup_postgresql.sh
恢复流程需根据备份类型选择对应工具,以下是具体操作:
ls -lh查看)。sudo systemctl stop postgresql
su - postgres -c "createdb -U postgres 目标数据库名"
逻辑恢复通过psql(SQL格式)或pg_restore(自定义格式)工具将备份数据导入数据库。
su - postgres -c "psql -U postgres -d 目标数据库名 -f /path/to/backup/backup_file.sql"
su - postgres -c "pg_restore -U postgres -d 目标数据库名 -v /path/to/backup/backup_file.dump"
pg_dumpall生成的备份):su - postgres -c "psql -U postgres -f /path/to/backup/all_databases.sql"
物理恢复通过pg_basebackup工具覆盖现有数据目录(需停止服务),适用于灾难恢复。
-R自动配置WAL日志回放):su - postgres -c "pg_basebackup -U postgres -D /var/lib/pgsql/data -F t -P -X stream -R -f /path/to/backup/backup.tar"
注:
/var/lib/pgsql/data为PostgreSQL默认数据目录,需根据实际路径修改。
若备份后生成了WAL日志(如物理备份后有新数据),需通过pg_waldump查看日志并重放,实现时间点恢复(PITR)。
su - postgres -c "pg_waldump /path/to/wal_file > wal_log.txt"
su - postgres -c "pg_basebackup -U postgres -D /var/lib/pgsql/data -F t -P -X stream -R --replay /path/to/wal_file"
sudo systemctl start postgresql
su - postgres -c "psql -U postgres -d 目标数据库名 -c '\l'" # 列出所有表
su - postgres -c "psql -U postgres -d 目标数据库名 -c 'SELECT COUNT(*) FROM 表名;'" # 检查数据行数
postgres用户或root用户执行,避免权限不足。