我遇到了这个奇怪的问题,我使用sqlworkbench/J
(java 客户端)连接到本地 pg14 数据库,笔记本电脑被挂起,早上,当我运行以下查询时:
select current_setting ('TIMEZONE'), current_timestamp, current_timestamp::timestamp;
...我收到以下结果:
current_setting | current_timestamp | current_timestamp -----------------+-------------------------------+---------------------------- Asia/Shanghai | 2022-12-12 17:30:30.425635+08 | 2022-12-12 17:30:30.425635
但是如果我打开(一个新的会话)sudo -u postgres psql
,同样的查询会给我
current_setting | current_timestamp | current_timestamp -----------------+-------------------------------+---------------------------- Asia/Shanghai | 2022-12-13 07:30:36.760764+08 | 2022-12-13 07:30:36.760764
我也试过pgmodeler
了,同样正确的结果。
sqlworkbench/j 中涉及的所有后续查询currenttimestamp
将产生一致的错误结果(这就是我注意到这一点的方式,我的一些涉及 current_time - some_log_time 的查询变为负数,这在逻辑上是不可能的。)。但是在我重新启动之后workbench/j
(也许简单的重新连接就足够了,我很遗憾,我一开始就选择了重新启动)。一切又恢复正常。
这种故障背后的逻辑是什么?不只current_timestamp
在服务器端处理吗?(我的意思是无论 workbench/j 发生了什么,在这种情况下,查询怎么会产生负时间增量,这意味着服务器在该 sql 会话的查询处理中确实将 current_timestamp 视为 17:xx,对吗?同时新会话被正确地视为7:xx)
故障就在你这边。旧会话开始一个事务并保持打开几个小时。
current_timestamp
显示您开始交易的时间,无论交易需要多长时间。也许您在交互式客户端中禁用了自动提交。这是一个错误,因为它可能会损坏您的 PostgreSQL 数据库:您的事务可能会阻止 autovacuum 清理死元组,如果有很多
UPDATE
s,这会使您的表不合理地增长。