执行按期备份并有一整套恢复计划是一个DBA的重要工做之一,这也是数据库可用性和完整性的保障。咱们能够在多个机房之间部署流复制集群,以保证但节点故障,可是集群没法保证认为的意外DELETE或者DROP操做而备份能够。在这片文章中,咱们会讨论PostgreSQL的一些可用的备份选项。sql
一般有两种备份大类 - 逻辑备份和物理备份。在设计备份策略以前,首先须要认真理解这两种备份的不一样。固然,备份类型也决定了你须要使用哪一种特定的工具来实现。shell
逻辑备份的数据一般存储为平文件,以人类可读活着容易理解的形式存储。这中格式很是有用,若是须要,咱们设置能够从备份中找到单独的某行记录并恢复它。可是从另外一方面来看,回复整个逻辑备份是比较慢的,由于数据库不得不对全部的数据加载一一处理,这种经过数据库实例入库数据的方式比直接复制数据文件要慢不少。数据库
实际上,数据最终是一些磁盘文件的组合,物理备份就是将这些文件抓取出来。咱们能够在某一个给定的时间点将数据文件复制出来进行备份。真正操做起来的时候,它并不像执行一个简单的copy命令那么容易。由于在执行物理备份时,咱们须要时刻清醒的意识到,此时可能正在发生数据库修改。为了确保物理备份的可用性,任何物理备份必须保持持续一致。ubuntu
物理备份对恢复整个数据库十分有效,速度仅仅受限于磁盘活着网络等硬件。c#
PostgreSQL,与大多数其余关系型数据库同样,支持物理备份和逻辑备份。下面让咱们一块儿来看一下如何进行操做:网络
PostgreSQL数据库逻辑备份经过工具pg_dump来实现,它支持导出多种格式:默认存储为平文件,咱们也能够经过参数控制生成结果为tar文件活着其余压缩格式。这种备份能够经过pg_restore命令恢复,咱们能够很容易的手动解压出SQL内容。下面具体来看一下如何用pg_dump建立一个备份:工具
首先,备份为SQL平文件:post
root@vagrant-ubuntu-trusty-64:~/c# pg_dump -d pgbench -U psql -h 10.0.0.101 > pgbench.sql Password:
查看备份文件,能够看到以下内容:vagrant
COPY pgbench_accounts (aid, bid, abalance, filler) FROM stdin; 1 1 0 2 1 0 3 1 0 4 1 0 5 1 0 6 1 0 7 1 0 8 1 0 9 1 0 10 1 0 11 1 0 12 1 0 13 1 0 14 1 0
若是你想输出特定的备份格式,须要定义以下:设计
root@vagrant-ubuntu-trusty-64:~# pg_dump -d pgbench -U psql -h 10.0.0.101 --format c -f /root/c/pgdump.c Password:
恢复数据十分简单。若是备份是默认平文件格式,咱们能够直接用psql工具将该SQL语句加载到数据库中。若是使用的是另外格式,能够用pg_restore格式加载。若是容许丢弃部分新数据,那能够将整个在线数据库删除后恢复整个备份(若是不进行删除操纵,那么恢复完后会存在双份数据的问题)。例如:
postgres=# drop database pgbench; DROP DATABASE postgres=# create database pgbench; CREATE DATABASE root@vagrant-ubuntu-trusty-64:~# pg_restore --format c /root/c/pgdump.c -d pgbench -U psql -W -h 10.0.0.101 Password:
最后须要注意一点,pg_dump生成的持续备份是在一个单一的食物里面完成的,这个特性说明PostgreSQL依赖于MVCC机制来保证当前的备份不被后来的事务影响。
物理备份只要备份就是全备份,因此恢复的时候也是全库恢复。物理备份最大的问题是持续备份。固然,最简单的办法就是将PostgreSQL数据库停掉,而后使用相似cp、scp活着rsync等工具直接备份。可是实际生产环境中,停掉数据库基本是不可能的,因此咱们须要经过其余的方式来实现。步骤大概以下:
这些操做能够经过工具pg_basebackup来实现:
root@vagrant-ubuntu-trusty-64:~# pg_basebackup -U psql -h 10.0.0.101 -x -D /pgbase/
若是后面你须要实现基于检查点的恢复,此刻须要开启WAL归档设置:
wal_level = archive archive_mode = on
咱们也能够经过设置archive_command参数将WAL段复制到一个单独的位置存储。
恢复物理备份也比较简单,只须要将备份数据复制到一个干净的PostgreSQL数据目录下便可。恢复完成后,一旦启动PostgreSQL实例进程,数据库便会自动恢复到备份的时间点。若是要基于时间点恢复,此时须要使用归档日志:首先恢复基础备份,而后建立一个recovery.conf文件定义一个恢复命令,这个命令用来告诉PostgreSQL如何重放WAL日志。
Ends~