数据库需要经常的备份,PostgreSQL也需要备份。备份PostgreSQL数据库由三种不同的方法。
>> SQL转储
>> 文件系统级别备份
>> 在线备份
SQL转储
该转储方法是创建一个文本文件保存SQL命令。当把该文件反馈给服务后,将重新创建数据库到转储时候的状态。提供了pg_dump命令来完成转储操作。
pg_dump -p port -h IP-address -U roleName dbName > outfile
pg_dump 是一个普通的 PostgreSQL 客户端应用,这就意味着可以从任何可以访问该数据库的远端主机上面进行备份。 但是请记住 pg_dump 不会以任何特殊权限运行,因此需要备份时的用户需要有所有备份表的读权限。
pg_dump的有两个较大的优势: (1) 可以较新的版本中使用就版本数据的备份文件。(2)pg_dump是唯一能够在不同机器架构间传递信息的。 pg_dump是实际上保存的是进程开始执行时的一个数据库快照,因此并不会挂起数据库的其他操作。
如果在数据库的表依赖OIDs,那么必须通告pg_dump同时备份这些OIDs。可以通过选项-o设定。
在Postgres-XL中pg_dump和pg_dumpall实际上是备份了协调器和数据节点的所有数据,其输出中额外包含了表的分布式信息。通常只能在协调器上进行备份,在数据节点上备份会出现失败。
恢复转储
使用pg_dump创建的文本文件可用于psql程序读,实现数据的恢复操作:
psql -p port -h IP-address dbname < infile
该命令并不会创建对应的dbname,在执行该命令之前必须用template0(原因是该数据库为纯净的模板)创建对应的dbname。基本的操作如下所示:
createdb -p port -h IP-address -T template0 dbname
同时在恢复SQL时,原来存在的用户信息必须存在,且授权相关的操作权限。通常情况下当psql失败是会继续执行,因此可以设置出错停止。如psql --set ON_ERROR_STOP=on dbname < infile
但这种方式会导致部分信息已经残余,因此可以将整个恢复过程当做当个事务处理,事务成功将提交失败将回滚,可以通过psql --single-transaction选项进行设置,将整个恢复作为单事务处理。
采用管道的方式可以实现将一台设备的数据备份到另外一台设备上。
pg_dump -p port -h host1 dbname | psql -p port -h host2 dbname
通常在恢复完成之后,直接进行ANALYZ,更新数据库的相关统计信息,便于数据库优化器进行执行计划的创建。
基本的备份测试如下所示:
[xxxx@drdb02 coordinator]$pg_dump -p 11951 mytest > /ire_gp/xxxx/mytestbk
[xxxx@drdb02 coordinator]$vi /ire_gp/xxxx/mytestbk
--
-- PostgreSQL database dump
--
...
--
-- Name: mytest; Type: TABLE; Schema: public; Owner: xxxx; Tablespace:
--
CREATE TABLE mytest (
name text,
code integer NOT NULL,
age integer
)
DISTRIBUTE BY HASH (name);
...
COPY mytest (name, code, age) FROM stdin;
ffp 3 37
bl 4 27
xyw 5 34
whd