简介
本文介绍PostgreSQL数据库的在线物理备份和恢复。在开始本文的介绍前,需要已经安装好PostgreSQL数据库,可以参考PostgreSQL基于源码的安装。
所使用的环境为: 美团云主机:2CPU、2G内存、100G磁盘 OS:CentOS6.5 DB:PostgreSQL9.3.5 PGHOME:/opt/PostgreSQL/9.3.5 PGDATA:/opt/PostgreSQL/9.3.5/data 归档目录:/home/postgres/archive 基础备份目录:/home/postgres/base
当前把归档目录和基础备份目录都设置在postgres的根目录下,值得注意的是,生产环境中它们应该放在不同的分区上,或者存储上。
修改归档配置
修改PostgreSQL配置文件postgresql.conf中的以下条目。其中,在archive_command中,任何%p都被要归档文件的绝对路径代替,而任何%f只是被文件名代替。
wal_level=archive
archive_mode=on
archive_command='cp-i%p/home/postgres/archive/%f</dev/null'
建立归档目录和基础备份目录。
mkdir-p/home/postgres/archive/
chown-Rpostgres/home/postgres/archive
chmod-R700/home/postgres/archive/
mkdir-p/home/postgres/base
chown-Rpostgres/home/postgres/base
chmod-R700/home/postgres/base
重启数据库,使归档配置生效。
supostgres
pg_ctlrestart
执行如下命令查看PostgreSQL进程,确认有归档进程“postgres:archiverprocess”存在。
ps-ef|greppostgres:|grep-vgrep
添加测试数据
进入测试数据库testdb,创建表ta,并插入测试数据。
psql-dtested
createtableta(atimestamp);
insertintotavalues(now());
select*fromta;
\q
执行基础备份
备份data目录并压缩,其中排除了pg_xlog文件夹。
psqlpostgres-c"selectpg_start_backup('baseline');"
tar--exclude$PGDATA/pg_xlog-cvjpf/home/postgres/base/pgbackup.tar.bz2$PGDATA
psqlpostgres-c"selectpg_stop_backup();"
ls-alt/home/postgres/base
pgstartbackup会执行一个checkpoint的检查点,可能需要消耗一段时间。pgstopbackup命令会终止备份模式,并自动切换到下一个WAL文件,直到最后的WAL段文件被归档后pgstopbackup命令才会返回。
继续添加测试数据
psql-dtested
insertintotavalues(now());
insertintotavalues(now());
select*fromta;
\q
其中select语句的结果是:
testdb=#select*fromta;
a
----------------------------
2015-11-1617:15:20.879751
2015-11-1617:24:07.797534
2015-11-1617:26:09.059503
(3rows)
执行一次手动归档。
psqlpostgres-c"selectpg_switch_xlog();"
ls-alt/home/postgres/archive/
恢复数据库
首先,可以使用kill命令强制关闭PostgreSQL服务进程,模拟数据库崩溃。
[postgres@pg1data]$ps-ef|greppostgres
postgres161751017:12pts/000:00:00/opt/PostgreSQL/9.3.5/bin/postgres
postgres1617716175017:12?00:00:00postgres:checkpointerprocess
postgres1617816175017:12?00:00:00postgres:writerprocess
postgres1617916175017:12?00:00:00postgres:walwriterprocess
postgres1618016175017:12?00:00:00postgres:autovacuumlauncherprocess
postgres1618116175017:12?00:00:00postgres:archiverprocesslastwas000000010000000000000004
postgres1618216175017:12?00:00:00postgres:statscollectorprocess
postgres1654116155017:27pts/000:00:00ps-ef
postgres1654216155017:27pts/000:00:00greppostgres
[postgres@pg1data]$kill-916175
[postgres@pg1data]$ps-ef|greppostgres
postgres1654816155017:29pts/000:00:00greppostgres
移除数据目录。
su
cd/opt/PostgreSQL/9.3.5/
mvdatadata20151116
复制基础备份到指定的位置,并设置属主和权限。
cd/home/postgres/base
tar-xvfpgbackup.tar.bz2
cp-ropt/PostgreSQL/9.3.5/data//opt/PostgreSQL/9.3.5/
ls-alt/opt/PostgreSQL/9.3.5/
chown-Rpostgres/opt/PostgreSQL/9.3.5/data
chmod-R700/opt/PostgreSQL/9.3.5/data
备份的时候,postgresql.conf、pghba.conf和pgident.conf文件不会自动备份,需要手工备份。
在data目录中创建pg_xlog及其子目录。
mkdir-p/opt/PostgreSQL/9.3.5/data/pg_xlog
chown-Rpostgres/opt/PostgreSQL/9.3.5/data/pg_xlog
chmod-R700/opt/PostgreSQL/9.3.5/data/pg_xlog
mkdir-p/opt/PostgreSQL/9.3.5/data/pg_xlog/archive_status
chown-Rpostgres/opt/PostgreSQL/9.3.5/data/pg_xlog/archive_status/
chmod-R700/opt/PostgreSQL/9.3.5/data/pg_xlog/archive_status/
删除data下的postmaster.pid文件。
rm-rfpostmaster.pid
在$PGDATA目录中,创建恢复配置文件recovery.conf。
cp/opt/PostgreSQL/9.3.5/share/postgresql/recovery.conf.sample/opt/PostgreSQL/9.3.5/data/recovery.conf
chownpostgres/opt/PostgreSQL/9.3.5/data/recovery.conf
chmod700/opt/PostgreSQL/9.3.5/data/recovery.conf
在recovery.conf中添加两行。
restore_command='cp-i/home/postgres/archive/%f%p'
recovery_target_time='2015-11-1617:25:00'
如果不通过参数recoverytargettime指定恢复时间点,默认恢复到接收到的最后一个归档文件。
检查恢复情况
启动数据库服务。
supostgres
pg_ctlstart
进入数据库查看数据是否恢复。
psql-dtestdb
select*fromta;
\q
其中select语句的查询结果是:
testdb=#select*fromta;
a
----------------------------
2015-11-1617:15:20.879751
2015-11-1617:24:07.797534
(2rows)
可以看到ta表的数据已经成功恢复到指定时间点。
恢复完成后,recovery.conf会被自动重命名为recovery.done。
总结
本文介绍了PostgreSQL数据库的备份和恢复。当数据库崩溃,或者出现误操作时,我们需要将数据库回退到某个正常的状态时,就可以采用数据库的基础备份、归档文件进行数据库的恢复。