数据库运行时,如何关闭/打开日志记录?Postgres



我正在尝试升级一个集群。问题是,对于集群和扩展来说,版本都很远。。我设法转储和恢复,修改表,修改代码,等等

但现在我也不得不以某种方式进行复制,因为我们负担不起停机时间。由于几乎所有内容之间存在巨大差异,现有的复制系统无法使用。我的想法是记录所有的查询,然后我编写的应用程序会接受这些查询,修改它们以符合新的约束,并在新的数据库上执行它们(假设查询在副作用方面有些兼容(

我完成了应用程序的编写,但我现在需要打开旧数据库的日志记录,以便在转储/重新加载后进行复制(数据库将处于备份模式,以便我可以对提交的数据进行操作;其余数据将在日志中(

在设置了所有必需的配置后,它归结为logging_collector,需要重新启动(与其他pg_reload_conf()足够的配置不同(

有没有什么方法可以在不重新启动的情况下打开日志记录?

是的,您可以

ALTER SYSTEM SET log_statement = 'all';
SELECT pg_reload_conf();

开始记录所有语句。要再次关闭,请运行

ALTER SYSTEM RESET log_statement;
SELECT pg_reload_conf();

但我怀疑这是否会如你所愿。首先,像COPY ... TO这样的语句将被记录,但数据不会被记录,因此您无法捕获它。还有一些其他情况,如fastpath API,不会被记录(这也会影响大型对象(。看看pgreplay,它做了一些你想要做的事情,看看它的局限性。

我建议您使用基于触发器的复制解决方案,如Slony-I。

最新更新