PostgreSQL "freeze"/"unfreeze" 命令等效项

Dan*_*Dan 8 postgresql derby postgresql-9.2

在 Derby(一种用 Java 编写的嵌入式数据库,主要用于测试或原型设计)中,有“freeze”和“unfreeze”命令可以在在线备份期间使用。“冻结”只会阻止所有数据库访问,直到调用“解冻”。这对于使用外部程序进行备份非常有用,如果外部程序比使用 Derby 的内部备份解决方案快得多,您可能会这样做。对于我的用例,我可以使用一些内置的文件系统实用程序几乎立即拍摄快照,因此它是一个恒定时间操作(不是O(length of DB files))。

我正在将一个已经超过 Derby 的应用程序迁移到 PostgreSQL,我想知道那里是否有任何类似的东西可以用来停顿所有连接。另外,我更想知道我的应用程序内部的序列化点是什么,这样我就不会陷入某种尴尬的状态,因此能够暂停/恢复所有其他访问对我来说真的很不错。

由于 PostgreSQL 有一个事务日志,我可以不“冻结”就创建快照,但是快照需要通过 PostgreSQL 的恢复机制运行才能使用它,否则存储在磁盘上的内容将与我拉取的内容相同普通文件系统上的插件。这种解决方案并不理想。

编辑我了解到这pg_start_backup()是关闭的,但它不会导致传入事务阻塞,直到匹配调用pg_stop_backup(),迫使我进行时间点恢复,以pg_start_backup()返回从文件系统快照返回的事务 ID 。不必实际关闭 PostgreSQL 来获得它会很好(也许有一个伪关闭命令可以保持连接打开?)。

Cra*_*ger 11

没有与您想要的完全相同的东西。选项包括:

原子文件系统快照

如果您使用的是原子文件系统快照,则不需要冻结数据库。如果您先强制执行CHECKPOINT,它可能会使恢复更快一点,但仅此而已。当您拍摄文件系统快照并复制它时,然后开始复制,到 PostgreSQL 就好像它崩溃了并正在重新启动。这完全没问题,它具有碰撞安全性,并且旨在以这种方式工作。

这种方法仅在快照是原子的情况下才有效——它们都在同一个虚拟时刻。您无法跨多个文件系统(至少在 Linux 上)获取原子快照,因此如果您的数据库跨多个表空间拆分或 WAL 位于与堆不同的磁盘上,则无法使用此方法。

pg_start_backup / pg_stop_backup

如果你不能做原子快照,你可以启用 WAL 归档、运行pg_start_backup、复制数据库、运行pg_stop_backup和捕获最后生成的 WAL 归档。

它有点复杂,但它可以为您提供一致的备份,而无需停止写入并且不需要文件系统级原子快照。

pg_basebackup

使用一种替代pg_start_backuppg_stop_backup是用pg_basebackup过与PostgreSQL的复制协议数据库的副本--xlog-method=stream。这要求只有一个PostgreSQL复制连接,不需要要停止的DB,倒也浑然一体。

--xlog-method=stream仅在最近的版本中添加,并且pg_basebackup它本身是相当新的。

pg_dump

我最初没有提到它,因为您正在寻找外部工具,但总是有pg_dump,它获取SERIALIZABLE数据库的快照并将其转储。数据库保持正常运行(它仍然可以接受写入),并且从您开始转储开始,转储在内部是完全一致的。

写静止

停止所有传入事务不会停止 PostgreSQL 写入。它仍然VACUUM与 autovacuum、要执行的检查点、要写入的统计信息等有关。

此时 Pg 中没有停止所有写入的功能。添加可能很好,但我不知道有人在做这件事。

一些文件系统,如 XFS,支持文件系统级别的写冻结;这会导致所有写入阻塞,直到解除冻结。冻结所有文件系统然后复制所有文件系统是安全的。