Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1891575
  • 博文数量: 152
  • 博客积分: 3730
  • 博客等级: 上尉
  • 技术积分: 3710
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-02 14:36
个人简介

减肥,运动,学习,进步...

文章分类

全部博文(152)

文章存档

2016年(14)

2015年(17)

2014年(16)

2013年(4)

2012年(66)

2011年(35)

分类: Mysql/postgreSQL

2015-06-09 23:20:03

数据库需要经常的备份,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) |
给主人留下些什么吧!~~