Wol*_*gon 20 sql postgresql metadata database-administration
我正在使用一个批量更新的postgreSQL数据库.我需要知道数据库(或数据库中的表)最后一次更新或修改的时间.
我看到postgeSQL论坛上有人建议使用日志记录并查询日志.这对我不起作用,因为我无法控制客户端代码库.
ara*_*nid 26
每次在特定表上进行插入/更新时,您都可以编写一个触发器来运行.常见的用法是一个"创造"或"LAST_UPDATED"行的列设置为当前时间,但你也可以更新的中央位置时,如果你不想改变现有的表.
例如,典型的方法如下:
CREATE 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();
Run Code Online (Sandbox Code Playgroud)
然后,要查找上次更新时间,您需要从您正在跟踪的每个表中选择"MAX(last_updated)",并采取最大的更新时间,例如:
SELECT MAX(max_last_updated) FROM (
SELECT MAX(last_updated) AS max_last_updated FROM sometable
UNION ALL
SELECT MAX(last_updated) FROM someothertable
) updates
Run Code Online (Sandbox Code Playgroud)
对于具有串行(或类似生成)主键的表,您可以尝试通过使用主键索引来避免顺序扫描以查找最新更新时间,或者在last_updated上创建索引.
-- get timestamp of row with highest id
SELECT last_updated FROM sometable ORDER BY sometable_id DESC LIMIT 1
Run Code Online (Sandbox Code Playgroud)
请注意,如果ID不是非常顺序,但是您需要多少准确度,这会导致稍微错误的结果?(请记住,事务意味着行可以以与创建它们不同的顺序对您可见.)
避免向每个表添加"更新"列的另一种方法是使用中央表来存储更新时间戳.例如:
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();
Run Code Online (Sandbox Code Playgroud)
这将为您提供一个表,每个表更新都有一行:您可以这样做:
SELECT MAX(updated) FROM update_log
Run Code Online (Sandbox Code Playgroud)
获取上次更新时间.(如果你愿意的话,可以按表拆分).这个表当然会继续增长:要么在'updated'上创建一个索引(这应该会使得最新的一个很快)或者如果它适合你的用例就定期截断它(例如对表进行独占锁定,获取最新的更新时间,然后在需要定期检查是否已进行更改时截断它.
另一种方法 - 可能是论坛上的人们所说的 - 是在数据库配置中设置'log_statement = mod'(对于集群是全局的,或者是您需要跟踪的数据库或用户),然后是所有语句修改数据库将写入服务器日志.然后,您需要在数据库外部编写一些内容来扫描服务器日志,过滤掉您不感兴趣的表等.
小智 5
我喜欢杰克的做法。您可以查询表统计信息并了解插入、更新、删除等的数量:
select n_tup_upd from pg_stat_user_tables where relname = 'YOUR_TABLE';
Run Code Online (Sandbox Code Playgroud)
每次更新都会将计数加 1。
请记住,当您拥有单个数据库时,此方法是可行的。多个实例可能需要不同的方法。