PostgreSQL的备份和恢复

文/Xie 2015-12-27 00:38:00

简介

本文介绍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数据库的备份和恢复。当数据库崩溃,或者出现误操作时,我们需要将数据库回退到某个正常的状态时,就可以采用数据库的基础备份、归档文件进行数据库的恢复。

知识共享许可协议
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。

最新文章 全部