PostgreSQL excluindo registros antigos das tabelas de log

3

Eu tenho um banco de dados PostgreSQL que armazena minhas informações de conexão RADIUS . O que eu quero fazer é armazenar apenas um mês de registros. Como eu poderia elaborar uma instrução SQL que eu possa executar a partir do cron que iria e excluir e linhas que, quando mais de um mês?

Formato da data na tabela. Essa data é tirada da colunm acctstoptime. Formato da data 2010-01-27 16: 02: 17-05

Formato da tabela em questão.     - Tabela: 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);
    
por Peter Mortensen 30.03.2010 / 20:41

2 respostas

3

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

para se livrar dos dados antigos.

REINDEX TABLE radacct;

para reconstruir os índices (caso contrário, você pode acabar com o índice de inchaço).

Se você estiver executando uma versão antiga do Postgres, convém VACUUM a tabela periodicamente.
Se a tabela for enorme, faça um VACUMM FULL ANALYZE radacct na primeira vez que você despejar dados antigos (ou descarregar / recarregar a tabela) para recuperar espaço & atualize o planejador de consultas.

    
por 30.03.2010 / 23:12
1

também, considere o uso da exclusão de restrição. você pode facilmente largar partições antigas. também economizará bastante carga de vácuo.

    
por 05.04.2010 / 19:58