rec模式的backup and backuprestore可以删是不是帮你刷机但会保存数据

pg_dumpall使用emitting命令重建角色、表空间和空數据库然后对每个数据库使用pg_dump。这意味着虽然每个数据库内会保持一致但不同数据库的快照可能不完全同步。

还有一个备份的策略是矗接拷贝PostgreSQL的存储文件可以用如下命令:

这种方法有两个弱点,但它并不逊色与pg_dump:

1.数据库服务必须关闭才能得到有用的备份。一个折中嘚办法是阻止所有连接在恢复数据前也要关闭服务。

2.如果你已经查看了数据库文件系统的目录结构你可能想尝试备份和恢复某个特定嘚表或库。这是不行的因为没有提交日志文件,这些目录中的信息是不能用的pg_clog/*包含所有事务的提交状态。一个表文件只有和这些提交狀态信息一起才能使用当然只恢复一个表文件和关联的pg_clog数据也是不行的,因为数据库的其他表都不可用了所以文件系统备份必须整体備份数据库。

如果你的系统支持也可以使用文件系统的“一致性快照”进行备份。

要注意的是文件系统备份通常比pg_dump大。但是文件系统備份会快一些

在任何时候,PostgreSql在pg_xlog/目录中维护一个写日志(WAL)日志文件记录了数据库的每次修改。这个日志的主要目的是崩溃安全:如果系统崩溃了数据库可以通过从上次的检查点“回放”日志来恢复数据库。然而我们可以用日志做备份的第三种策略你可以混合一个文件系統级别的备份和WAL文件备份。如果需要恢复我们先恢复文件系统备份,再回放WAL的内容使数据库恢复到当前状态。这种方法比前两种更复雜但它也有一些优势:

  • 我们不需要一个完全一致的文件系统备份起始点。在备份中的任何内部一致时间点都可以正确回放。(这和系統崩溃后恢复是差不多的)所以我们不需要一个文件系统快照功能只要tar压缩或类似的归档工具。
  • 既然我们可以整合一个无限长的WAL文件序列进行回放所以持续备份可以通过简单的连续归档WAL文件实现。对于大型数据库频繁的完全备份是很不方便的。
  • 我们不需要回放整个WAL文件我们可以在任何时间点停止回放,可以得到那个时间点的数据库快照因此,这种技术支持点即时恢复(point-in-time recovery):基于你的基础备份可鉯恢复数据库到任何时间状态。
  • 如果我们连续提供WAL文件序列给另一台机器让这台机器读取相同的备份文件,那么我们就有了一个热备份系统:在任何时候我们可以使用第二台机器它有和第一台几乎一样(最近时间点备份)的数据。

注意:pg_dump和pg_dumpall不能用于持续备份方案它们嘚转储文件不包含逻辑和必要的信息可以使用WAL回放。

普通文件备份技术只支持恢复整个数据库集不能只恢复一个子系统。此外它需要大量的归档存储:基础备份可能很大一个繁忙的系统会产生很多兆的WAL文件,这些都需要传输然而这种方式仍然是高可用性的首选备份技術。

要使用连续归档成功恢复(也被成为“在线备份”)你需要从最后备份文件时间点后的连续序列的WAL归档文件。所以在基础备份之前伱需要设置和测试WAL归档文件因此我们首先讨论WAL归档机制。

理论上一个运行的PostgreSql系统会产生无限长的WAL记录序列。系统雾里找份WAL序列一般昰16M一份(可以在编译PostgreSql是改变该值)。拆分的片段文件用反应位置的数字命名当不适用WAL归档时,系统一般创建几个片段文件并通过重命名“回收”他们系统假设那些包含检查点之前内容片段文件不会被关注,所以可以回收

当使用WAL归档时,我们需要捕获每个片段文件被填滿的事件保存这个片段文件到其他位置以防止系统回收。根据不同的应用和硬件可以有很多种方法实现“保存片段文件到其他位置”:伱可以将片段文件复制到NFS挂载的另一台机器上、将文件写入一个磁带驱动器或刻录到CD上为了数据库管理员的灵活性,关于如何保存归档PostgreSql没有做任何假定。相反PostgreSql让管理员指定shell命令去执行拷贝片段文件的操作。命令可以是简单的cp命令或者一个复杂的shell脚本这都取决于你。

這将拷贝WAL归档片段文件到/mnt/server/archivedir目录(这是一个例子,并不推荐不是在所有平台都能正常工作。)

%p和%f被替换后命令看起来是这个样子:

针對每个新WAL片段文件生成一个类似的命令。

归档命令(archive command)在PostgreSql服务器的所属用户下被执行WAL归档文件包含了你数据库的所有信息,你需要确认伱的信息不被泄露保存归档目录不要有组或全局读权限。

归档命令只有成功时才返回0并退出PostgreSql得到0,认为文件被成功归档系统记录并囙收改文件。PostgreSql如果得到一个非零状态则认为文件未被归档,她会再次尝试知道成功归档

归档命令一般应设计成拒绝覆盖任何预先存在嘚归档文件。这可以防止系统管理员的错误导致归档的完整性被破坏(如发送两个不同服务器的WAL文件到一个归档目录中)

明智的做法是測试你的归档命令确保不会覆盖已存在的归档文件,并返回非空值上面例子中Unix的命令包含一个测试(test)步骤。在一些Unix平台上cp命令有一個-i的参数,可以防止覆盖但是你不应该依靠这个返回状态值(一般情况下GNU cp的-i在目标文件已存在时会返回0)。

当你设计归档时需要考虑洳果归档命令反复失败会发生什么,因为有些方面需要操作员的干预或存档空间已用完的情况

比如如果你将归档文件存入磁带,当磁带被写满并没有更换的时候。你应该确保任何错误条件或需要人为操作的时候给出佘当的提示以便可以快速解决问题。pg_xlog目录里会继续写叺WAL片段文件直到问题被解决。(如果pg_xlog目录被写满PostgreSql将做恐慌关机(PANIC shutdown),没有提交的事务都将被丢失数据库将保持脱机状态直到你释放一些涳间。)

归档命令的速度并不重要只要它能赶上服务器产生WAL文件的平均速度就可以。即使归档进程落后一点也能正常工作如果归档明顯落后,将导致在发生灾难时有大量数据无法恢复并且pg_xlog目录中会存在大量的未归档文件片段,可能导致空间不足你应该监视你的归档進程,已确保它按你的意图工作在写归档命令时,文件名可以是最多64位包含任何ASCII字母数字和点的组合。

注意WAL归档可以还原数据库中嘚任何修改,但不会还原设置文件的修改(通常是postgresql.conf、pg_hba.conf和pg_ident.conf文件)因为这些都是手动编辑而不是通过SQL操作。

归档命令只在完成的WAL片段文件执荇因此,如果你的服务产生很少的WAL流量(或有空闲时间)有可能同步会有较长的延时。可以通过archive_timeout强制服务器切换到新的WAL片段文件注意,被强制切换的WAL文件的大小和正常WAL文件一样大因此设置archive_timeout很短是不明智的,他会占用你的存储空间此外,如果你想确保刚完成的事务被归档可以手动使用pg_switch_xlog强制切换片段文件。

当wal_level设置成最小一些SQL命令被优化已防止WAL记录。如果在执行这些SQL命令时归档或复制数据流开启WAL鈈包含足够的信息用于归档恢复。(崩溃恢复不受影响)处于这个原因,wal_level只能在服务器启动时改变但是,archive_command可以通过重加载配置文件来妀变如果你想临时停止归档,一种方法是设置archive_command为空字符串('')这导致WAL文件积累在pg_xlog目录中,直到archive_command重新建立

最简单的基础备份方法是使鼡pg_basebackup工具。它可以生成普通文件或tar压缩文件的基础备份如果需要比pg_basebackup更灵活,可以使用低级别API

生成基础备份需要大量的时间,这不必在意但是,如果你运行服务时禁止了full_page_writes你可能注意到在运行备份时性能下降了。

要使用备份你需要保留生成基础备份期间和以后的所有WAL片段文件。为了帮助实现这个基础备份进程创建备份历史文件保存到WAL归档区域。文件的命名是在第一个需要的WAL片段文件后增加一些内容仳如:如果开始的WAL文件是CD,那么备份历史文件的命名会像这样CD.007C9330.backup(文件名的第二部分代表的WAL文件内的确切位置,通常可忽略不计)一旦伱有个安全的文件系统备份和WAL片段文件,所有之前的WAL片段在恢复数据时都不再需要但是你应该考虑保留一些备份已确保你可以恢复数据。

备份历史文件只是一个小的文本文件它包含了你给pg_basebackup的标签字符串,以及备份的开始和结束时间备份的WAL片段。如果你使用唯一的标签標示转储文件那么归档历史文件足以告诉你哪些转储文件用于恢复。

因为你要保留从基础备份之后的所有WAL归档文件所以要适当选择两個基础备份的时间间隔。你也需要考虑准备花多长时间经行恢复恢复时系统需要回放自最近一次基础备份以后的所有WAL片段,这可能需要┅段时间

3、使用低级别API制作基础备份

使用低级别API比pg_basebackup有较多的步骤,并且必须按步骤执行

1)、确认WAL归档设为可用(enabled)并正常工作。

2)、鼡superuser登陆数据库并实施如下命令:

label是你要标示此次备份操作的唯一字符串。(一个好的做法是使用您想要用的备份转储文件的完整路径)pg_start_backup创建一个备份标签文件,名为backup_label在数据库集群的目录里有备份信息,包括开始时间和标签字符串这些文件的完整性很重要,你需要用怹们做恢复

连接数据库集群中那个数据库并不重要。你可以忽略函数返回值但如果报告失败,需要在执行前处理

默认情况下,pg_start_backup可能需要很长的时间才能完成这通常是你想要的,因为它最大限度地减少对查询处理的影响如果你想尽快开始备份,使用方法:

这样强制檢查点尽快完成

3)、执行备份,使用任何方便的文件系统备份工具比如tar或cpio(不要使用pg_dump或者pg_dumpall)。做此步骤时不需要也不应该停止数据库垺务

4)、再用superuser连接数据库,并执行如下命令:

这将终止备份模式并自动切换到下一个WAL片段。

5)、在生成备份期间一旦WAL片段被归档,伱就完了确定pg_stop_backup的结果是完整备份的最后的一个片段。如果archive_mode是enabledpg_stop_backup会等当前的片段被归档后才返回。当你定义了archive_command后归档会自动执行在大多數情况下,这发生的很快但还是建议你监视归档系统,确保没有延迟如果因为归档命令失败,导致归档重复尝试pg_stop_backup也会一直等待。如果你希望限定执行pg_stop_backup可以设置statement_timeout。

文件系统备份工具在拷贝正被修改的文件时发出警告或错误当制作基础备份时,这种情况很常见而且并鈈是一个错误但是你需要确认并从真正的错误区分开。幸运的是GNU的tar 1.16及更高的版本,这种情况返回1其他错误返回2.在GNU的tar 1.23及更高版本,你鈳以使用警告选项 --warning=no-file-changed --warning=no-file-removed

确认你的备份转储包括了数据库集群目录下的所有文件(例如:/usr/local/pgsql/data)如果你使用的表空间不在这个目录内,注意把他们吔包括在内(并确保你的备份转储归档符号链接的链接否则恢复将破坏你的表空间)。

你可以省略pg_xlog子目录中的备份转储文件这样会降低恢复的风险。

值得注意的是pg_start_backup创建的名字是备份标签的文件会被pg_stop_backup删除掉。这个文件会归档到你的备份转储文件中

服务停止时,一可疑淛造一个备份这这种情况下,你显然不能使用pg_start_backup或pg_stop_backup

4、使用连续备份存档恢复

从备份中恢复,下面是步骤:

2)、拷贝整个数据库集目录和任何表空间到一个临时位置

3)、删除数据库集目录内的所有文件和子目录,删除表空间目录

4)、从文件系统备份还原数据库。确定你恢复到正确的用户所有权下(数据库系统用户不是root)和权限。如果你使用表空间确认在pg_tblspc链接被正确还原。

5)、删除pg_xlog里的所有文件这些文件来自文件系统备份,可能已过时如果你在文件备份时没有备份pg_xlog,那需要重新创建并给与适当的权限。

6)、如果第2步中有未归档嘚wal片段文件拷贝这些文件到pg_xlog目录中。

8)、启动服务服务进入恢复模式,读取需要的WAL归档文件因为外部错误而使恢复终止,可以通过偅启继续进行恢复恢复过程完成后,服务器会重命名recovery.conf成recovery.done(防止再进入恢复模式)然后开始正常的数据库操作。

9)、检查数据库的内容以确保已恢复到理想状态。如果没有返回第1步如果一些正常,你需要修改pg_hba.conf回到正常允许客户连接

以上最关键的部分就是建立描述如哬恢复的配置文件。你可以用recovery.conf.sample(通常位于share目录里)为原型在recovery.conf中必须指定的是backuprestore可以删_command,它告诉PostgreSql如何检索已归档的WAL片段文件这是一个shell命令芓符串。它可以包含%f将被替换日志文件的名称,以及%p将被替换日志文件路径。(路径名是当前工作目录比如:数据库集目录)用%%转迻%。最简单的命令像这样:

这将从目录/mnt/server/archivedir拷贝之前的WAL归档片段文件在pg_xlog目录里没有找到已归档的WAL片段文件,允许使用最近的未归档的片段文件但是已归档的文件优先于未归档文件。通常情况下恢复会使用所有可用的WAL片段,直到当前时间点(或尽可能接近给定的可用WAL片段)因此,一般恢复会以“文件未找到(file not found)”结束这取决于你使用的backuprestore可以删_command命令。你可能会在恢复一开始看到一条错误消息类似.history。这是正常嘚

如果你要恢复到某个之前的时间点,只需要在recovery.conf中指定结束点可以通过日期/时间来指定,被称为“恢复目标”恢复目标只能在基础備份之后,基础备份中和以前的时间不能作为恢复目标

如果恢复发现损坏的WAL数据,恢复将停止在这一点上服务器将无法启动。在这种凊况下恢复过程可以从一开始重新运行,指定恢复目标在错误点之前之后可以分析错误原因,如果是外部原因比如系统损坏,WAL文件鈈可读等可以重启服务,它会从失败点从新开始

将数据库恢复到以前的时间点的能力产生了一些复杂的是类似于关于时间旅行和平行宇宙的科幻故事。例如在数据库的原始历史中,假设在星期二下午5:15你删掉了一个表但是直到星期三中午才意识到这是错误的。你拿出嘚的备份恢复到星期二下午5:14,并启动和运行。在这段数据库宇宙历史中你从未删除表。但是假设你以后意识到这不是个好主意,并想反悔原来的星期三早上某个时刻你将无法做到这点,如果你的数据库已经运行服务已经重写了一部分WAL片段,因此为了避免这种情况伱需要区分各个历史版本的WAL记录。

为了解决这个问题PostgreSql有时间线的概念。每当存档恢复完成后会创建一个新的唯一的时间线去标示一系列回复后的WAL文件。时间线编号是WAL片段文件名字的一部分所以新时间线的WAL文件不会覆盖旧的时间线的文件。实际中可能会产生多个不同的時间线归档

history)”文件,显示时间线何时从何分支这些历史文件使得系统可以从多时间线归档中选择正确的WAL文件进行恢复。因此它也在WAL归檔区域内就像WAL片段文件。历史文件是很小的文本文件如果你愿意,你可以往里添加注释记录为什么创建此时间线等恢复的默认方式昰沿着和基础本分相同的时间线进行。如果你想恢复到其他分支你需要在recovery.conf中指定时间表的ID。你不能恢复到基础备份之前的时间线分支

使用PostgreSql的备份特性,可以建立一个热备份这些备份不能用于某时间点恢复,但是一般比pg_dump的备份和恢复快很多(它的备份文件也比pg_dump大很多)

如果使用基础备份,最简单的方法是使用pg_basebackup工具制造独立热备份如果你调用它时包括-X参数,备份使用的所有事务日志都将被自动包含在備份中所以在恢复时不需要什么特别的操作。

基于上述的准备可以用类似下面的脚本进行备份:

首先创建交换文件/var/lib/pgsql/backup_in_progress,备份结束后删除交换文件。然后将WAL归档文件添加到备份中使得基础备份和所有WAL文件放在同一个tar文件中。请记住在你的脚本中添加错误处理

如果归档攵件的存储比较敏感,你可以使用gzip去压缩归档文件:

在恢复的时候你需要gunzip:

很多人使用脚本定义archive_command看起来像这样:

使用脚本比单个命令有優势,它可以更完善

一般脚本应该具有一下功能点:

  • 将数据复制到安全的异地数据存储。
  • 批量处理WAL文件每三小时转移一次,不是一次┅个
  • 与其他备份和恢复软件的接口。
  • 监控软件来报告错误的接口

提示:当使用archive_command脚本时,可以开启logging_collector这样脚本的输出也同将在数据库日誌中记录,这有助于容易的查找脚本的错误

在这个版本中(9.3)持续归档技术有一些限制。这可能会在以后的版本中修复:

对哈希索引的操作不会体现在WAL记录中所以回放不会更新这些索引。当恢复完成后建议您手动REINDEX每个这样的索引。

在进行基础备份的期间执行CREATE DATABASE,对应嘚模板数据库被修改在恢复时这可能会传播到已被创建的数据库中。为了避免这个风险最好在做基础备份时不要修改模板数据库。

CREATE TABLESPACE命囹在WAL记录中包含绝对路径回放时会创建同样绝对路径的表空间。这可能是不希望的如果回放是在不同的机器上进行。即使是相同机器囙放也可能是危险的,回放会覆盖原来表空间的内容为了皮面这种风险,最好的办法是用新的基础备份还原后再创建或删除表空间。

还应当指出的是缺省的WAL格式是相当笨重的,因为它包括许多磁盘页快照这些网页的快照被设计用于支持崩溃恢复,因为我们可能需偠修复部分写入磁盘的页面根据您的系统硬件和软件,部分写入的风险可能足以忽略在这种情况下,你可以使用full_page_writes参数关闭网页快照减尐归档日志的总容积小 关闭网页快照并不影响使用为PITR操作所记录的日志。

}

我要回帖

更多关于 backuprestore可以删 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信