PostgreSQL内置的备份机制并不总是非常合适。有时,您希望将应用程序置于静默状态,因为它具有要在备份PG数据的同时备份的外部数据。但是,将应用程序置于静止状态的唯一方法是“锁定”数据库。PG缺乏数据库范围或集群范围的锁定机制。将PG放入只读状态将是以下解决方案的一部分:
发布于 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 )注册一个小的静态共享内存段。ProcessUtility_hook和ExecutorStart_hook,如果设置好了,就在WaitLatch循环中睡觉,直到它再次看到标志被清除为止。(您可以使用解析器钩子代替)。PGPROC设置所有用户进程的锁存,以便他们知道立即唤醒。PGXACT中迭代以找到打开的写事务,并向它们发出终止信号。所有这些都已经实现为BDR扩展的一部分,但它是一个大得多的系统的一部分。您很可能将相关部分提取到自己的扩展中。见bdr_locks.c,bdr_commandfilter.c,bdr_executor.c,bdr.c等。
请注意,这不会使PostgreSQL只在磁盘上读取--检查指针将继续运行,bgwriter将继续运行,归档程序仍将运行等等。因此,只允许您在没有原子文件系统快照或pg_start_backup() / pg_stop_backup()的情况下进行DB备份是不够的。但是,对于您的用例来说,在DB上暂停应用程序活动是很好的。
https://dba.stackexchange.com/questions/183982
复制相似问题