Назад | Перейти на главную страницу

PostgreSQL удаляет старые записи из таблиц журналов

У меня есть база данных 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 при первом выгрузке старых данных (или дампе / перезагрузке таблицы), чтобы освободить место и обновить планировщик запросов.

также рассмотрите возможность использования исключения ограничений. тогда вы можете легко удалить старые разделы. это также значительно сэкономит вакуумную нагрузку.