我如何找到上次更新PostgreSQL数据库的时间?
我正在使用批量更新的postgreSQL数据库。我需要知道最后一次数据库(或数据库中的表)是否已被更新或修改,或者会执行。我如何找到上次更新PostgreSQL数据库的时间?
我看到有人在postgeSQL论坛上建议使用日志记录并查询您的日志。这对我来说不起作用,因为我无法控制客户端代码库。
你可以写一个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”(全局用于集群,或者您需要跟踪的数据库或用户)和那么修改数据库的所有语句都将写入服务器日志。然后,您需要在数据库之外编写一些内容来扫描服务器日志,筛选出您不感兴趣的表格等。
请参见下面的文章:
的MySQL与PostgreSQL的:添加一个“最后修改时间”列于表 http://www.pointbeing.net/weblog/2008/03/mysql-versus-postgresql-adding-a-last-modified-column-to-a-table.html
您可以在“不可信写一个存储过程语言“(例如plpythonu):这允许访问postgres”base“目录中的文件。在存储过程中返回这些文件的大数据时间。
但是这只是模糊的,因为真空会改变这些文件和mtime。
我喜欢杰克的方法。您可以查询该表统计和了解的插入,更新,删除数量等:
select n_tup_upd from pg_stat_user_tables where relname = 'YOUR_TABLE';
每次更新都会增加1
裸记住增加了计数,这种方法是可行的,当你有一个单个数据库。多个实例可能需要不同的方法。