数据库需要经常的备份,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 6 56
gp 1 26
ar 2 27
...
xxxxx[xxxx@postgres]> drop database mytest;
DROP DATABASE
xxxxx[xxxx@postgres]> \q
[xxxx@drdb02 coordinator]$createdb -p 11951 -h localhost -T template0 mytest
[xxxx@drdb02 coordinator]$psql -p 11951 mytest < /ire_gp/xxxx/mytestbk
...
CREATE EXTENSION
COMMENT
SET
...
CREATE TABLE
...
ALTER TABLE
setval
--------
7
(1 row)
...
[xxxx@drdb02 coordinator]$
[xxxx@drdb02 coordinator]$psql -h localhost -p 11951 postgres
psql (xxxxx 2.1.0-9.2.4, based on PG 9.2.4 (xxxxx 2.1.0-9.2.4))
Type "help" for help.
xxxxx[xxxx@postgres]> select * from pg_database ;
tableoid | oid | datname | datdba | encoding | datcollate | datctype | datistemplate | datallo
wconn | datconnlimit | datlastsysoid | datfrozenxid | dattablespace | datacl
----------+-------+-----------+--------+----------+-------------+-------------+---------------+--------
------+--------------+---------------+--------------+---------------+----------------------------------
1262 | 1 | template1 | 10 | 6 | en_US.UTF-8 | en_US.UTF-8 | t | t
| -1 | 12970 | 2062 | 1663 | {=c/xxxx,xxxx=CTc/xxxx}
1262 | 12975 | postgres | 10 | 6 | en_US.UTF-8 | en_US.UTF-8 | f | t
| -1 | 12970 | 2151 | 1663 |
1262 | 16429 | mytest | 10 | 6 | en_US.UTF-8 | en_US.UTF-8 | f | t
| -1 | 12970 | 1973 | 1663 |
(3 rows)
通过以上的基本测试,备份和恢复过程基本完成啦。
所有数据库的备份和恢复
pg_dump只能针对对应的数据库进行备份,当个数据库的备份时非常麻烦的,因此提供了pg_dumpall的命令:
pg_dumpall > outfile
恢复的命令:
psql -f infile postgres
处理大数据的数据库
>>备份可以使用压缩的方式,加载使用解压缩
pg_dump -p port -h host dbname | gzip > filename.gz
gunzip -c filename.gz | psql -p port -h host dbname
实现的基本过程如下:
[xxxx@drdb02 coordinator]$pg_dump -p 11951 mytest | gzip > /ire_gp/xxxx/mytestbk.gz
[xxxx@drdb02 coordinator]$ll /ire_gp/xxxx/mytestbk*
-rw-r--r-- 1 xxxx ire_gp 1944 May 29 16:01 /ire_gp/xxxx/mytestbk
-rw-r--r-- 1 xxxx ire_gp 781 May 29 16:56 /ire_gp/xxxx/mytestbk.gz
[xxxx@drdb02 coordinator]$psql -p 11951 postgres
psql (xxxxx 2.1.0-9.2.4, based on PG 9.2.4 (xxxxx 2.1.0-9.2.4))
Type "help" for help.
xxxxx[xxxx@postgres]> drop database mytest;
DROP DATABASE
xxxxx[xxxx@postgres]> \q
[xxxx@drdb02 coordinator]$createdb -p 11951 -h localhost -T template0 mytest
[xxxx@drdb02 coordinator]$gunzip /ire_gp/xxxx/mytestbk.gz | psql -p 11951 mytest
[xxxx@drdb02 coordinator]$psql -p 11951 postgres
psql (xxxxx 2.1.0-9.2.4, based on PG 9.2.4 (xxxxx 2.1.0-9.2.4))
Type "help" for help.
xxxxx[xxxx@postgres]> select * from pg_database ;
tableoid | oid | datname | datdba | encoding | datcollate | datctype | datistemplate | datallo
wconn | datconnlimit | datlastsysoid | datfrozenxid | dattablespace | datacl
----------+-------+-----------+--------+----------+-------------+-------------+---------------+--------
------+--------------+---------------+--------------+---------------+----------------------------------
1262 | 1 | template1 | 10 | 6 | en_US.UTF-8 | en_US.UTF-8 | t | t
| -1 | 12970 | 2062 | 1663 | {=c/xxxx,xxxx=CTc/xxxx}
1262 | 12975 | postgres | 10 | 6 | en_US.UTF-8 | en_US.UTF-8 | f | t
| -1 | 12970 | 2151 | 1663 |
1262 | 16453 | mytest | 10 | 6 | en_US.UTF-8 | en_US.UTF-8 | f | t
| -1 | 12970 | 1973 | 1663 |
(3 rows)
xxxxx[xxxx@postgres]> \q
>> 采用split将文件分成很多块小的文件:
pg_dump dbname | split -b 1m - filename
加载时采用 cat filename* | psql dbname
测试过程:
[xxxx@drdb02 coordinator]$pg_dump -p 11951 mytest | split -b 1k - /ire_gp/xxxx/mysplitebk
[xxxx@drdb02 coordinator]$ll /ire_gp/xxxx/my*
-rw-r--r-- 1 xxxx ire_gp 729 May 29 17:05 /ire_gp/xxxx/mysplitebkaa
-rw-r--r-- 1 xxxx ire_gp 1944 May 29 16:56 /ire_gp/xxxx/mytestbk
[xxxx@drdb02 coordinator]$
[xxxx@drdb02 coordinator]$
[xxxx@drdb02 coordinator]$psql -p 11951 postgres
psql (xxxxx 2.1.0-9.2.4, based on PG 9.2.4 (xxxxx 2.1.0-9.2.4))
Type "help" for help.
xxxxx[xxxx@postgres]> drop database mytest;
DROP DATABASE
xxxxx[xxxx@postgres]> \q
[xxxx@drdb02 coordinator]$createdb -p 11951 -h localhost -T template0 mytest
[xxxx@drdb02 coordinator]$cat /ire_gp/xxxx/mysplitebkaa* | psql -p 11951 mytest
SET
SET
SET
SET
SET
CREATE EXTENSION
COMMENT
REVOKE
REVOKE
GRANT
GRANT
[xxxx@drdb02 coordinator]$psql -p 11951 postgres
psql (xxxxx 2.1.0-9.2.4, based on PG 9.2.4 (xxxxx 2.1.0-9.2.4))
Type "help" for help.
xxxxx[xxxx@postgres]> select * from pg_database ;
tableoid | oid | datname | datdba | encoding | datcollate | datctype | datistemplate | datallo
wconn | datconnlimit | datlastsysoid | datfrozenxid | dattablespace | datacl
----------+-------+-----------+--------+----------+-------------+-------------+---------------+--------
------+--------------+---------------+--------------+---------------+----------------------------------
1262 | 1 | template1 | 10 | 6 | en_US.UTF-8 | en_US.UTF-8 | t | t
| -1 | 12970 | 2062 | 1663 | {=c/xxxx,xxxx=CTc/xxxx}
1262 | 12975 | postgres | 10 | 6 | en_US.UTF-8 | en_US.UTF-8 | f | t
| -1 | 12970 | 2151 | 1663 |
1262 | 16454 | mytest | 10 | 6 | en_US.UTF-8 | en_US.UTF-8 | f | t
| -1 | 12970 | 1973 | 1663 |
(3 rows)
>> 还可以采用pg_dump的客户化格式,基于zlib压缩。
pg_dump -Fc dbname > filename
pg_restore -d dbname filename
[xxxx@drdb02 coordinator]$pg_dump -p 11951 -Fc mytest > /ire_gp/xxxx/myfcbk
[xxxx@drdb02 coordinator]$psql -p 11951 postgres
psql (xxxxx 2.1.0-9.2.4, based on PG 9.2.4 (xxxxx 2.1.0-9.2.4))
Type "help" for help.
xxxxx[xxxx@postgres]> drop database mytest;
DROP DATABASE
xxxxx[xxxx@postgres]> \q
[xxxx@drdb02 coordinator]$pg_restore -d mytest /ire_gp/xxxx/myfcbk
[xxxx@drdb02 coordinator]$createdb -p 11951 -h localhost -T template0 mytest
[xxxx@drdb02 coordinator]$pg_restore -p 11951 -d mytest /ire_gp/xxxx/myfcbk
文件系统级别备份
关于文件系统级别的备份只能针对每个协调器和数据节点,因此需要针对每个协调器和数据节点手动的进行数据备份。
实际上是直接拷贝PostgreSQL用于存储数据库数据的文件。因此只需要进行文件包的压缩操作。
tar -cf backup.tar postgresql/data
使用该方法存在两个限制,使得该方法有些不实际。相比pg_dump逊色不少。主要的限制如下:
>> 在备份过程中必须将数据库服务关闭,主要是因为无法获取到数据库的快照。因此在恢复数据的过程中也需要关闭服务器。
>> 不能从文件系统的相关信息备份部分的表或者数据库。
在线备份以及即时恢复
任何时候,PostgreSQL 都在集群的数据目录的 pg_xlog/ 子目录里维护着一套预写日志(WAL)。 这些日志记录着每一次对数据库数据文件的修改细节。这些日志存在主要是为了防止崩溃:如果系统崩溃, 数据库可以通过"重放"上次检查点以来的日志记录以恢复数据库的完整性。但可以结合文件系统备份和WAL文件进行数据库的备份。在进行备份时,基于文件系统进行备份,然后基于备份的WAL文件,将系统恢复到当前的状态。该方法的优势:
>> 在开始的时候不需要一个非常完美的一致的备份,任何备份内部的不一致都会被日志重放动作修改正确。因此不需要文件系统快照的功能。
>> 可以把无线长的WAL文件序列连接起来,可以简化为连续的对WAL文件归档实现。
>> 持续把WAL文件序列填充给其它装载了同样的基础备份文件的机器,就实现了一套热备份系统,在任何点都可以启动第二台机器,拥有近乎当前的数据库拷贝。
但这种备份方法只能支持整个数据库集群的恢复,而不是一个子集。由于需要大量的归档存储,基础备份量可能很大,在忙碌的系统中将产生大量的WAL流量,但仍然是高可靠性的备份技术。
阅读(8866) | 评论(0) | 转发(0) |