我想记录针对POSTGRES实例执行的实际sql语句。我知道我可以启用sql语句的日志记录。不幸的是,这不会记录实际的sql,而是记录解析的版本,其中某些参数被剥离并单独列出。
是否有可靠的方法将此输出重新组合成可执行的sql语句?
或者有没有办法拦截发送到postgres实例的sql,以便可以记录该sql?
我们希望能够将这些sql语句重播到另一个数据库。
感谢您的帮助!
答案 0 :(得分:1)
通过在postgresql.conf上设置log_statement
到all
。见the documentation for runtime-config-logging
答案 1 :(得分:1)
实际上,PostgreSQL确实记录了执行的SQL。它不会剥离参数。相反,它不会插入它们,它会记录应用程序发送的内容,并将绑定参数分开。如果您的应用向sb = new StringBuilder ();
发送了绑定参数insert into x(a,b) values ($1, $2)
和42
,那就是记录的内容。
没有记录选项可以将绑定参数插入查询字符串。
你的最后一行是关键部分。你根本不想要记录。您正在尝试通过日志执行基于语句的复制。由于易失性功能,18
,每用户设置,序列分配顺序/间隙问题等原因,这将无法正常工作(如果有的话)。如果您想要复制,请不要尝试通过日志解析来完成。
如果您想尝试基于语句的复制,请查看PgPool-II。它的能力有限,并且有很多警告。