PostgreSQL数据库备份与恢复技术比较

jopen 10年前

备份 PostgreSQL 数据有三种完全不同的方法:

·         SQL 转储

·         文件系统级别备份

·         在线备份

一、    SQL 转储

SQL转储是使用pg_dump应用工具将当前的数据块导出为SQL文件;当数据库需要重建时,将该SQL文件回馈给服务器,恢复数据库为重建时的数据库状态。

当备份整个数据库集群的时候可以使用pg_dumpall程序, pg_dumpall 备份给出的集群中的每个数据库,同时还确保保留象用户和组这样的全局数据状态。

当数据库中表的大小大于系统允许的最大文件大小时,需要使用标准的UNIX工具解决该问题。

不足

要获得数据库的超级用户权限,在数据库恢复时仍然要求这些权限的存在。

pg_dump运行的时候对数据库的更新将不会被转储。

 

二、    文件系统级别的备份

直接拷贝PostgreSQL数据库中用于存放数据库数据的文件。

方式

“一致快照方式”

   使用rsync执行文件系统备份

不足

在进行备份时必须关闭数据库

数据库分布在多个文件系统上时,只有关闭数据库足够长的时间才能完整备份

转储后的文件较大

 

三、    在线备份以及即时恢复

这种方式组合了系统备份与WAL文件的备份,当需要恢复时,会先恢复文件备份然后重放WAL文件。

优点

初始时并不需要完美的一致备份,因此不需要使用快照功能,tar或类似归档工具即可实现备份;

可以通过连续的备份WAL文件归档来实现连续的数据库备份;

可以将数据库恢复到开始备份以来的任意时刻的状态;

要求

只支持整个数据库集群的恢复;

要求大量的归档存储; 

操作

1、设置WAL归档

1)创建 WAL备份目录,比如:d:\pg_xlog_archive

2)修改 postgresql.conf中的 archive_command 设置,比如:

     archive_command = 'copy "%p" d:\\pg_xlog_archive\\%f'

    注:%p要用双引号括起来处理安装目录中有空格的情况。

 archive_mode = on

 wal_level'archive'

   postgresql.conf文件里用archive_command 声明shell命令用于将一个完整的段文件拷贝到指定位置,在该shell命令中需要用%p表示要归档的文件的绝对路径, %f表示文件名。

egarchive_command = 'cp -i %p /mnt/server/archivedir/%f </dev/null'

归档命令要在运行PostgreSQL服务器的同一个用户的权限下执行。另外,当且仅当归档命令运行成功时它才返回0

注意:尽管 WAL 归档允许恢复任何对PostgreSQL数据库的数据做的修改,在最初的基础备份之后,它不会恢复对配置文件的修改(也就是说,postgresql.confpg_hba.conf pg_ident.conf),因为这些文件都是手工编辑的,而不是通过 SQL操作来编辑的。所以你可能会需要把你的配置文件放在一个日常文件系统备份过程即可处理到的地方。

2、进行基础备份

1)确保 WAL归档打开并且可以运转。

2)以数据库超级用户身份连接到数据库,发出命令 SELECT pg_start_backup('label');

这里的 label 是任意你想使用的这次备份操作的唯一标识。(一个好习惯是使用你想把备份转储文件放置的目的地的全路径。) pg_start_backup用你的备份的信息,在你的集群目录里,创建一个备份标签文件,叫做 backup_label

3)执行备份,使用任何方便的文件系统工具,比如 tar或者 cpio。这些操作过程中既不需要关闭数据库,也不希望关闭数据库的操作。

4)再次以数据库超级用户身份连接数据库,然后发出命令 SELECT pg_stop_backup();

5)只要在备份过程中使用的 WAL段文件作为正常数据库活动的一部分备份完毕,你的备份工作就完成了。

注意:要保证你的备份转储包括所有数据库集群目录里的文件(比如,/usr/local/pgsql/data)以及表空间。