PostgreSQL 备份数据库
备份 PostgreSQL 数据库可以通过以下几种方式实现,根据需求选择合适的方法:
1. 使用 pg_dump 工具
pg_dump 是 PostgreSQL 自带的工具,可以备份单个数据库。
命令:
pg_dump -U <用户名> -h <主机> -p <端口> <数据库名> > <备份文件名>.sql
示例:
pg_dump -U postgres -h localhost -p 5432 mydb > mydb_backup.sql
参数说明:
-U:指定 PostgreSQL 用户名。
-h:数据库服务器地址(如本地为 localhost)。
-p:端口号(默认 5432)。
<数据库名>:要备份的数据库名。
> <备份文件名>:将输出保存为 .sql 文件。
2. 使用 pg_dumpall 工具
如果需要备份整个 PostgreSQL 实例的所有数据库,可以使用 pg_dumpall。
命令:
pg_dumpall -U <用户名> -h <主机> -p <端口> > <备份文件名>.sql
示例:
pg_dumpall -U postgres -h localhost -p 5432 > all_databases_backup.sql
这会生成一个包含所有数据库的 SQL 文件。
3. 使用 pg_basebackup(物理备份)
pg_basebackup 是 PostgreSQL 提供的物理备份工具,适用于基于文件系统的备份(例如热备份)。
命令:
pg_basebackup -U <用户名> -h <主机> -D <备份目录> -Fp -Xs -P
示例:
pg_basebackup -U postgres -h localhost -D /backup/mydb -Fp -Xs -P
参数说明:
-D:指定备份存储目录。
-Fp:选择文件格式备份。
-Xs:包含 WAL 日志。
-P:显示备份进度。
4. 定时备份(使用脚本)
可以将备份命令加入脚本并通过 cron 定时任务定期备份。
示例脚本(备份单个数据库):
#!/bin/bash
# 配置变量
USER="postgres"
HOST="localhost"
PORT="5432"
DBNAME="mydb"
BACKUP_DIR="/backup"
DATE=$(date +%Y%m%d_%H%M%S)
# 备份文件路径
BACKUP_FILE="$BACKUP_DIR/${DBNAME}_backup_$DATE.sql"
# 执行备份
pg_dump -U $USER -h $HOST -p $PORT $DBNAME > $BACKUP_FILE
# 检查是否成功
if [ $? -eq 0 ]; then
echo "Backup successful: $BACKUP_FILE"
else
echo "Backup failed"
fi
定时任务添加:
crontab -e
添加任务(每天凌晨 2 点备份):
0 2 * * * /path/to/backup_script.sh
5. 还原备份
对于 pg_dump 的备份文件:
psql -U <用户名> -h <主机> -d <数据库名> -f <备份文件名>.sql
示例:
psql -U postgres -h localhost -d mydb -f mydb_backup.sql
对于 pg_dumpall 的备份文件:
psql -U <用户名> -h <主机> -f <备份文件名>.sql
选择方法时需要考虑数据库大小、备份频率和恢复需求。pg_dump 适合小型数据库,pg_basebackup 更适合大规模或高可用场景。
#!/bin/bash
# 设置环境变量
export DATABASE_URL="postgresql://postgres:your_password@postgres-host:5432/asciinema"
export PGPASSWORD=your_password
# 执行备份并将输出保存到容器内的文件
docker exec 8478bd10d721 bash -c "pg_dump \"$DATABASE_URL\" > /backup.sql"
# 将备份文件复制到主机
docker cp 8478bd10d721:/backup.sql ./backup.sql
或者直接备份在本地
#!/bin/bash
# 设置环境变量
export DATABASE_URL="postgresql://postgres:your_password@postgres-host:5432/asciinema"
export PGPASSWORD=your_password
# 执行备份并将输出保存到宿主机
docker exec 8478bd10d721 pg_dump "$DATABASE_URL" > ./backup.sql