如果尚未将数据加载到PostgreSQL表中则发出警报

时间:2018-12-05 13:43:42

标签: postgresql monitoring

如果表或字段/列当天未插入任何数据,有什么办法提醒我?

我有一些工作可以将数据自动插入到我的表中,但是如果不查询表就无法知道它是否确实在运行。

2 个答案:

答案 0 :(得分:2)

  

..但是如果没有查询表就无法知道它是否真正运行了。

您可以查看postgresql的内部日志:

ALTER DATABASE your_database_name
SET log_statement = 'all';

或者更深入地研究它,然后像下面那样编辑postgresql.conf:

log_directory = 'pg_log'
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
log_statement = 'all'
logging_collector = on

并重新启动postgresql

sudo service postgresql restart 

或者您可以让您的工作/服务捕获sql查询的返回值,并在更适合您的需要时将其记录到文件中。

请记住,日志会随着时间的推移而变得很大(取决于查询频率)。

编辑

如Laurenz在他的评论中所述,最好使用

 SET log_statement = 'mod';

以防它是“繁忙”的数据库。谢谢@Laurenz

答案 1 :(得分:0)

这是一个示例如何使用触发器实现这种事情的示例:

首先,我们要检查数据修改的表:

CREATE TABLE collected_values (
   ...
);

现在有了一个表,我们在其中记录数据修改(fillfactor是为了使我们可以进行HOT更新并避免表膨胀,即使更改率很高):

CREATE TABLE last_updated (
   updated_table regclass PRIMARY KEY,
   mod_time timestamp with time zone NOT NULL
) WITH (fillfactor = 40);

INSERT INTO last_updated
   VALUES ('collected_values'::regclass, '-infinity');

触发功能和触发:

CREATE FUNCTION record_mod() RETURNS trigger
   LANGUAGE plpgsql AS
$$BEGIN
   UPDATE last_updated
   SET mod_time = current_timestamp
   WHERE updated_table = TG_RELID;

   RETURN NULL;
END;$$;

CREATE TRIGGER record_mod AFTER INSERT OR UPDATE OR DELETE ON collected_values
   FOR EACH STATEMENT EXECUTE PROCEDURE record_mod();

现在last_updated将始终包含表的最后修改时间。监视值以获得警报。