У меня есть база данных PostgreSQL, в которой хранятся мои РАДИУС информация о подключении. Я хочу хранить журналы только за месяц. Как мне создать оператор SQL, который я могу запустить из cron, который будет идти и удалять, и строки, которые старше месяца?
Формат даты в таблице. Эта дата взята из столбца acctstoptime. Формат даты 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;
для восстановления индексов (иначе вы можете столкнуться с раздуванием индексов).
Если вы используете старую версию Postgres, вы можете захотеть VACUUM
таблица периодически.
Если таблица огромна, сделайте VACUMM FULL ANALYZE radacct
при первом выгрузке старых данных (или дампе / перезагрузке таблицы), чтобы освободить место и обновить планировщик запросов.
также рассмотрите возможность использования исключения ограничений. тогда вы можете легко удалить старые разделы. это также значительно сэкономит вакуумную нагрузку.