一. PostgreSQL热备份的过程一般为:
- 数据库中执行:pg_start_backup() ;
- 然后使用操作系统的tar或 cp命令拷贝 PostgreSQL数据文件。
- 数据库中执行:pg_stop_backup() ;
1. 配置归档模式
配置归档需要编辑postgresql.conf文件;
# vi postgresql.conf
archive_mode = on archive_command = 'cp -i %p /home/postgres/archive/%f' wal_level = archive
修改完之后;重启下数据库。
2. 创建备份
postgres=# select pg_start_backup('hot_back'); pg_start_backup ----------------- / ( row)
3. 复制数据文件
# tar -zcvf $HOME/backup/hotback.tar.gz data/
4. 停止备份
postgres=# select pg_stop_backup(); NOTICE: pg_stop_backup complete, all required WAL segments have been archived pg_stop_backup ---------------- /30000C0 ( row)
在这里;备份过程已经完成了。
其中pg_start_backup() 操作的作用类似于oracle的“alter database begin backup”
实际上pg_start_backup()主要做了以下两个工作:
- 置写日志标志为:XLogCtl->Insert.forcePageWrites = true,也就是把这个标志设置为true后,数据库会把变化的整个数据块都记录到数据库中,而不仅仅是块中记录的变化。
- 强制发生一次checkpoint点。
最后奉上备份脚本
##=========================================================== ## pg_hot_back.sh ## created by lottu ## // ## usage: pg_hot_back.sh ##============================================================ #!/bin/bash DATE=`date +%Y%m%d`; PG_ARCHIVE=/home/postgres/archive/ PG_DATA=/home/postgres/data/ PG_HOME=/home/postgres BACK_LOG=/home/postgres/log/hot_${DATE}.log #START BACKUP echo "START BACKUP..............." > $BACK_LOG psql postgres -c "select pg_start_backup('hot_back')" >> $BACK_LOGcd $PG_HOME tar -zcvf ${PG_HOME}/backup/pg_back_${DATA}.tar.gz data/ >> $BACK_LOG psql postgres -c "select pg_stop_backup()" >> $BACK_LOG psql postgres -c "select pg_switch_xlog()" >> $BACK_LOG psql postgres -c "select pg_current_xlog_location()" >> $BACK_LOG echo "BACKUP END" > $BACK_LOG
二. postgresql 恢复操作
postgresql恢复操作同样很简单
1. 停掉数据库
# pg_stop;
2. 删除/data/
# rm –r /home/postgres/data/ #数据文件是放在/home/postgres/data/
#若这个时候启动数据pg_start; 启动是成功的;不会报错!这个跟oracle是不同的;启动日志也不会出现error的错误提示;
3. 恢复备份
# cp backup/hotback.tar.gz ./
# tar -zxvf hotback.tar.gz
4. 删除pg_xlog文件夹并重建
# rm -rf pg_xlog
# mkdir -p pg_xlog/archive_status
5. 拷贝recovery.conf文件并修改
# vi /data/pgdata/recovery.conf
--新增内容,指定恢复文件和路径,%f,%p见上面说明
restore_command = 'cp /home/postgres/archive/%f "%p"'
6. 启动数据库
#pg_start;