基本上我们的 Postgresql 表的一部分用于保存服务器访问日志,因此有时在生产过程中它会变得非常大。有什么方法可以在 postgresql 中设置一个表可以拥有的最大记录数并推出最旧的记录?
dez*_*zso 12
您可以定义触发器来维护所需的行号:
CREATE OR REPLACE FUNCTION trf_keep_row_number_steady()
RETURNS TRIGGER AS
$body$
BEGIN
-- delete only where are too many rows
IF (SELECT count(id) FROM log_table) > rownum_limit
THEN
-- I assume here that id is an auto-incremented value in log_table
DELETE FROM log_table
WHERE id = (SELECT min(id) FROM log_table);
END IF;
END;
$body$
LANGUAGE plpgsql;
CREATE TRIGGER tr_keep_row_number_steady
AFTER INSERT ON log_table
FOR EACH ROW EXECUTE PROCEDURE trf_keep_row_number_steady();
Run Code Online (Sandbox Code Playgroud)
这可能不是性能最佳的选项,但一旦达到限制,就永远不会超过。如果有波动的空间,那么你可以定期检查行号,从头开始删除多余的行。
编辑:
如果您有非常大的日志(比如每月一百万),那么分区可能是最简单的解决方案。然后您可以简单地删除不必要的表(比如 wheremax(timestamp) < CURRENT_DATE - 1 year
)。您可以使用时间戳(或派生日期)作为范围分区的条件。
但是在丢弃旧日志之前要小心。你确定你永远不需要这些吗?