PostgreSQL从日志表中删除旧logging

我有一个存储我的RADIUS连接信息的PostgreSQL数据库。 我想要做的只是存储一个月的日志。 我将如何创build一个SQL语句,我可以从cron运行,将删除和行超过一个月?

表格中date的格式。 该date取自acctstoptime栏。 date格式2010-01-27 16:02:17-05

有问题的表的格式。 – 表:radacct

CREATE TABLE radacct ( radacctid bigserial NOT NULL, acctsessionid character varying(32) NOT NULL, acctuniqueid character varying(32) NOT NULL, username character varying(253), groupname character varying(253), realm character varying(64), nasipaddress inet NOT NULL, nasportid character varying(15), nasporttype character varying(32), acctstarttime timestamp with time zone, acctstoptime timestamp with time zone, acctsessiontime bigint, acctauthentic character varying(32), connectinfo_start character varying(50), connectinfo_stop character varying(50), acctinputoctets bigint, acctoutputoctets bigint, calledstationid character varying(50), callingstationid character varying(50), acctterminatecause character varying(32), servicetype character varying(32), xascendsessionsvrkey character varying(10), framedprotocol character varying(32), framedipaddress inet, acctstartdelay integer, acctstopdelay integer, freesidestatus character varying(32), CONSTRAINT radacct_pkey PRIMARY KEY (radacctid) ) WITH (OIDS=FALSE); ALTER TABLE radacct OWNER TO radius; -- Index: freesidestatus CREATE INDEX freesidestatus ON radacct USING btree (freesidestatus); -- Index: radacct_active_user_idx CREATE INDEX radacct_active_user_idx ON radacct USING btree (username, nasipaddress, acctsessionid) WHERE acctstoptime IS NULL; -- Index: radacct_start_user_idx CREATE INDEX radacct_start_user_idx ON radacct USING btree (acctstarttime, username); 

 DELETE FROM radacct WHERE acctstoptime < (now() - '30 days'::interval); 

摆脱旧的数据。

 REINDEX TABLE radacct; 

重build指数(否则你可能会结束指数膨胀)。

如果您运行的是旧版Postgres,则可能需要定期对表进行VACUUM
如果表格很大,在第一次转储旧数据(或转储/重新加载表)以收回空间并更新查询计划程序时,请执行VACUMM FULL ANALYZE radacct

另外,考虑使用约束排除。 那么你可以很容易地丢弃旧的分区。 它也将节省大量的真空负荷。