首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使Postgres数据库暂时只读(用于执行卷快照)

使Postgres数据库暂时只读(用于执行卷快照)
EN

Database Administration用户
提问于 2017-08-21 13:59:22
回答 1查看 28.8K关注 0票数 19

PostgreSQL内置的备份机制并不总是非常合适。有时,您希望将应用程序置于静默状态,因为它具有要在备份PG数据的同时备份的外部数据。但是,将应用程序置于静止状态的唯一方法是“锁定”数据库。PG缺乏数据库范围或集群范围的锁定机制。将PG放入只读状态将是以下解决方案的一部分:

  1. Quiesce应用程序数据(禁用登录)
  2. Quiesce数据库(使其只读)
  3. 执行PG检查点或pg_xlog_switch()
  4. 创建应用程序和数据卷的快照
  5. 恢复数据库(使其再次成为RW )
  6. 恢复申请
  7. 备份快照
EN

回答 1

Database Administration用户

发布于 2017-08-23 01:13:15

我个人认为,将此功能作为正式的PostgreSQL功能是可取的。

做它简单的

如果您不想为PostgreSQL扩展编写C代码,那么只需将连接池放在PostgreSQL前面即可。就像pgBouncer。

pgBouncer 具有暂停内置应用程序活动的能力。.不过,为了使其非常有用,您需要直接连接(而不是通过pgbouncer),并在暂停新连接之后取消活动连接。只有select pg_terminate_backend(pid) from pg_stat_activity where pid <> pg_backend_pid()

做得对

但是,如果你想弄脏你的手,可以用一个C扩展来完成。延期必须:

  • shared_preload_libraries中加载,这样它就可以使用布尔标志(如db_is_locked )注册一个小的静态共享内存段。
  • 注册一个在shmem中测试is锁定标志的ProcessUtility_hookExecutorStart_hook,如果设置好了,就在WaitLatch循环中睡觉,直到它再次看到标志被清除为止。(您可以使用解析器钩子代替)。
  • 在C中编写两个SQL可调用函数,其中一个设置标志。另一个清除标记并遍历PGPROC设置所有用户进程的锁存,以便他们知道立即唤醒。
  • 可选地编写第三个函数,如果设置了标志,则在PGXACT中迭代以找到打开的写事务,并向它们发出终止信号。

所有这些都已经实现为BDR扩展的一部分,但它是一个大得多的系统的一部分。您很可能将相关部分提取到自己的扩展中。见bdr_locks.cbdr_commandfilter.cbdr_executor.cbdr.c等。

请注意,这不会使PostgreSQL只在磁盘上读取--检查指针将继续运行,bgwriter将继续运行,归档程序仍将运行等等。因此,只允许您在没有原子文件系统快照或pg_start_backup() / pg_stop_backup()的情况下进行DB备份是不够的。但是,对于您的用例来说,在DB上暂停应用程序活动是很好的。

票数 9
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/183982

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档