ITPub博客

首页 > > > PostgreSQL的备份和恢复

PostgreSQL的备份和恢复

作者:浪花小雨滴 时间:2020-06-17 16:50:05 0 删除 编辑

简介

本文介绍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

pg_start_backup会执行一个checkpoint的检查点,可能需要消耗一段时间。pg_stop_backup命令会终止备份模式,并自动切换到下一个WAL文件,直到最后的WAL段文件被归档后pg_stop_backup命令才会返回。

继续添加测试数据

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、pg_hba.conf和pg_ident.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'

如果不通过参数recovery_target_time指定恢复时间点,默认恢复到接收到的最后一个归档文件。

检查恢复情况

启动数据库服务。

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

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31537575/viewspace-3148222/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2018-05-16

  • 博文量
    4259
  • 访问量
    39958