回答

收藏

如何找到上次更新PostgreSQL数据库的时间?

技术问答 技术问答 488 人阅读 | 0 人回复 | 2023-09-14

我正在使用批处理更新postgreSQL数据库。我需要知道最后一次更新或修改数据库(或数据库中的表)的时间。- o0 t& p; a0 [# b7 }! c& o; ^
我看到在postgeSQL论坛上有人建议使用日志记录并查询您的日志。这对我没有影响,因为我无法控制客户端代码库。
  j" \! n, |/ k! R7 f                                                               
7 ?% Q2 N2 y5 p+ R; \    解决方案:                                                               
& v  P4 b; n1 S9 t0 _0 X- v                                                                每次插入/更新特定表格时,可以编写触发器进行操作。通常的用法是创建或创建银行4 P1 W# g# M! c6 X' s# J9 X8 b4 M
last_updated列设置为当前时间,但如果您不想更改现有表,也可以在中心位置更新时间。9 J+ n) X: z" Z8 f  ?
例如,典型的方法如下:
( q- @) t4 z% n' U8 D8 fCREATE FUNCTION stamp_updated() RETURNS TRIGGER LANGUAGE 'plpgsql' AS $$BEGIN  NEW.last_updated := now();  RETURN NEW;END$$;-- repeat for each table you need to track:ALTER TABLE sometable ADD COLUMN last_updated TIMESTAMP;CREATE TRIGGER sometable_stamp_updated  BEFORE INSERT OR UPDATE ON sometable  FOR EACH ROW EXECUTE PROCEDURE stamp_updated();然后,要找到最后一个更新时间,需要从每个需要跟踪的表中选择 MAX(last_updated)充分利用最大值,如:
- ~- f" D9 d- x8 }$ ~1 eSELECT MAX(max_last_updated) FROM (  SELECT MAX(last_updated) AS max_last_updated FROM sometable  UNION ALL  SELECT MAX(last_updated) FROM someothertable) updates对于串行(或类似生成)主键的表,尽量避免使用主键索引进行顺序扫描,以找到最新的更新时间,或者在last_updated创建索引。
$ Q9 u& O4 {  G# @-- get timestamp of row with highest idSELECT last_updated FROM sometable ORDER BY sometable_id DESC LIMIT 1请注意,在ID在不连续的情况下,这可能会导致错误的结果,但你需要多少精度?(请记住,事务意味着线路可以以不同的顺序显示给您。6 X! X8 S$ E. y
另一种避免将更新列添加到每个表中的方法是使用中央表存储更新时间戳。
- s% E% ?/ Z- Y; \( `CREATE TABLE update_log(table_name text PRIMARY KEY,updated timestamp NOT NULL DEFAULT now());CREATE FUNCTION stamp_update_log() RETURNS TRIGGER LANGUAGE 'plpgsql' AS $$BEGIN  INSERT INTO update_log(table_name) VALUES(TG_TABLE_NAME);  RETURN NEW;END$$;-- Repeat for each table you need to track:CREATE TRIGGER sometable_stamp_update_log AFTER INSERT OR UPDATE ON sometable FOR EACH STATEMENT EXECUTE stamp_update_log();这将为您提供一个表,每个表都有一行更新:然后您可以执行以下操作:
% o0 g* z0 Y2 O4 g4 kSELECT MAX(updated) FROM update_log获得最后一次更新时间。(如有必要,可按表拆分)。当然,表会继续增长:或者在. F+ a; u5 ?) w
updated在上面创建索引(这应该使得获得最新的索引快速),或者在适合您的用例的情况下定期切断它(例如,排他锁表以获得最新的更新时间,并定期检查是否已更改)。
4 t/ c' P0 l2 k在数据库配置中设置 log_statement =
* W: x  }6 W  J! @- C& Mmod(集合是全球性的,或者是需要跟踪的数据库或用户),然后设置所有修改的数据库,然后写入服务器日志。然后,你需要在数据库外写一些东西来扫描服务器日志,过滤掉你不感兴趣的表,等等。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则