您的位置:首页 > 数据库

PostgreSQL备份

2014-09-29 09:49 148 查看
有3中基本的不同方法来备份PostgreSQL数据

1 sql dump

2文件系统级备份

3持续归档

sql dump

这个方法是产生一个包含sql命令的文本文件,当返回到数据库的时候,会重新创建dump时候的数据库。PostgreSQL提供pg_dump工具来完成这个,命令的基本形式是

pg_dump dbname > outfile

pg_dump是一个常规的PostgreSQL客户端程序,也就是可以再任意的远程机器上来备份。为了指定那个数据库要连接,使用命令选项-h host 和-p port,跟别的客户端程序一样,pg_dump会连接与当前操作系统用户名相等的数据库用户名。为了覆盖这个,或者使用-U指定或设置PGUSER变量。一个主要的pg_dump比其他方式备份的优点是pg_dump的输出可以重新在新版本的PostgreSQL中被加载。pg_dump也可以跨不同的机器架构,比如从32位到64位。pg_dump在工作的时候,不阻塞别的操作。

如果你的数据库模式依赖OIDs,你必须也dump出OIDs,为了实现这个,使用-o选项。

恢复dump

恢复的命令式

psql dbname <infile

dbname数据库不会被这个命令创建,所以在执行psql之前你必须通过template0来创建它。psql提供与pg_dump相同的参数来指定连接的数据库和用户名。在恢复之前,所有的对象用户或被给对象权限的用户必须已经在库中存在。默认的,psql脚本在遇到一个sql错误的时候,仍然会继续执行,你可以使用on_error_stop变量来改变这个行为,如下

psql --set on_error_stop=on dbname <infile

另外你可以指定整个dump应该在一个事务中,所以回复要么完全成功,要么完全失败,可以指定-l或--single-trasaction命令选项。可以用下面的命令dump数据库直接到另一个数据库

pg_dump -h host1 dbname | psql -h host2 dbname

pg_dump只是dump一个单独的数据库,不会dump出关于角色和表空间的信息,为了支持dump数据库集群的所有内容,使用pg_dumpall,

pg_dumpall > outfile

恢复

psql -f infile postgres

处理大数据库

有的数据库很大,在创建dump输出文件的时候可能会有问题,可以使用下面的方法来解决

1pg_dump dbname | gzip >filenam.gz

gunzip -c filename.gz | psql dbname

2 pg_dump dbname | split -b 1m -filename

cat filename * | psql dbname

使用pg_dump的并行特色

为了加速dump一个大的数据库,你可以使用pg_dump的并行模式,

pg_dump -j num -F d -f out.dir dbname

使用 pg_restore -j来并行恢复一个dump

文件级别的备份

可以直接备份PostgreSQL使用的文件。例如

tar -cf backup.tar /usr/local/pgsql/data

这个方法有2个限制,使这个方法相对pg_dump很低等

1数据库必须关闭。

2不能备份单独的表或文件。

持续的归档和point-in-time恢复

在任何的时候,PostgreSQL都在pg_xlog/子目录下面维护一个write ahead log(WAL),这个日志记录着数据库数据文件的每次改变。这个日志存在主要是为了crash-safety目的:如果系统crash,数据库可以通过重新应用自从最近一次检查点以来的日志条目来恢复到一致性状态。这就提供了第三个备份数据库的方法:我们可以结合文件系统级备份和备份WAL文件。如果需要恢复,我们恢复文件系统的备份然后replay备份的WAL文件来将数据库带到当前状态。该方法比上两种复杂,但是提供了下面的优点:

1我们不需要在开始备份的时间点以来文件系统备份的完全一致,任何内部的不一致将会通过log replay来修正。

2因为我们可以用无限长的wal日志序号来replay,持续的备份可以通过持续的归档wasl文件来简化。对于大数据库很有用。

3不必replay wal条目从头到尾。我们可以在任意点来停止replay。

4如果我们持续提供wal文件给别的机器,而且这个机器已经加载了相同的基本备份文件,我们有了一个热备的系统。在任意时间点,我们可以拉起第二台机器,有一个数据库近乎相同的拷贝。

设置wal归档

在运行的PostgreSQL系统会产生一个无限长的wal记录的序号,系统物理的分割这个序号到wasl段文件,该文件通常16MB大小。段文件被分配数字名字来反映他们在wal序号中的位置。当不适用wal归档,系统只是生成几个段文件然后循环他们通过重命名不在需要的段文件到更高的段号。当归档wal数据,一旦文件填满我们需要捕获每个段文件内容,并将数据保存在别的地方在段文件被重用之前。为了启用wal归档,设置wal_level配置参数为archive,archive_mode 为on,在archive_command中使用具体的shell命令,在archive_command中,%p被文件的路径名取代,%f是文件名。如果要%在命令中,使用%%,例如:

archive_command        = ’copy    "%p"   "C:\\server\\archivedir\\%f"’              #  Windows

archive_command = 'test ! -f /mnt/server/archivedir/%f && cp %p /mnt/server/archivedir/%

这个会将wal段拷贝到/mnt/server/archivedir目录

要是归档命令成功了,会返回0,返回0 ,postgreSQL会认为文件已经被成功归档了,可以重用文件了。

创建一个基本备份

最简单的方法是使用pg_basebackup工具,它可以创建一个基本备份或是一个普通文件或是一个tar归档文件。无需关系基本备份需要的时间,然而,如果在运行服务的时候,full_page_writes禁用了,在备份的时候性能可能会下降。为了使用备份,你需要保存所有的wal段文件。


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  PostgreSQL备份