2009-05-22 57 views
17

我正在使用批量更新的postgreSQL数据库。我需要知道最后一次数据库(或数据库中的表)是否已被更新或修改,或者会执行。我如何找到上次更新PostgreSQL数据库的时间?

我看到有人在postgeSQL论坛上建议使用日志记录并查询您的日志。这对我来说不起作用,因为我无法控制客户端代码库。

回答

22

你可以写一个trigger运行每一个插入/更新由时间一个特定的表格。常用的用法是将该行的“已创建”或“最后更新”列设置为当前时间,但如果不想更改现有表,则还可以在中央位置更新时间。

因此,例如,一个典型的方法是以下之一:

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(); 

然后找到最后更新的时间,您需要从您正在跟踪每个表中选择“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 

由串口(或类似的生成)主键的表,你可以尝试避免顺序扫描通过主键索引查找最新更新时间,或者你创建指数在last_updated。

-- get timestamp of row with highest id 
SELECT last_updated FROM sometable ORDER BY sometable_id DESC LIMIT 1 

请注意,这可能会导致略有错误的结果,在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(); 

这会给你一个表,一排每个表更新:那么你可以这样做:

SELECT MAX(updated) FROM update_log 

为了得到最后的更新时间。 (如果你愿意,你可以通过表格分割出来)。这个表格当然会持续增长:要么创建一个'更新'的索引(它应该让最新的一个很快),或者如果这符合你的用例,就定期截断它(例如,在表格上独占一个锁,获取最新的更新时间,然后截断它,如果您需要定期检查是否进行了更改)。

另一种方法 - 可能是论坛上人们的意思 - 在数据库配置中设置“log_statement = mod”(全局用于集群,或者您需要跟踪的数据库或用户)和那么修改数据库的所有语句都将写入服务器日志。然后,您需要在数据库之外编写一些内容来扫描服务器日志,筛选出您不感兴趣的表格等。

0

您可以在“不可信写一个存储过程语言“(例如plpythonu):这允许访问postgres”base“目录中的文件。在存储过程中返回这些文件的大数据时间。

但是这只是模糊的,因为真空会改变这些文件和mtime。

3

我喜欢杰克的方法。您可以查询该表统计和了解的插入,更新,删除数量等:

select n_tup_upd from pg_stat_user_tables where relname = 'YOUR_TABLE'; 

每次更新都会增加1

裸记住增加了计数,这种方法是可行的,当你有一个单个数据库。多个实例可能需要不同的方法。

相关问题