Replicação entre servidores

Limpeza de registros de DML_LOGS

RTREPLICATOR.FAQ-76511
O roteiro abaixo pode ser utilizado para reduzir o tamanho da tabela de LOG.
Atenção
Este roteiro deve ser utilizado com MUITO CUIDADO!
Ainda está em testes.

Executar o script e copiar o script resultante:
Geração do script
set data min(data)
from (
    select (l.date::date - 2) as data
    from (
       select n2.last_id_retrieved, n2.global_name
       from dml_logs_cfg cfg
       join replication_nodes n on n.id = cfg.node_id
       left join replication_nodes n2 on n2.server_node_id = n.id
       order by n2.last_id_retrieved
       limit 1) q
    join dml_logs l on l.id = q.last_id_retrieved

    union all

    select now()::date - 2
) q;

set nome replace('$data','-','');

select 'ALTER TABLE dml_logs RENAME TO dml_logs_${nome}; ' as script

union all

select 'ALTER TABLE dml_logs_${nome} RENAME CONSTRAINT ' || constraint_name 
    || ' TO ' || constraint_name || '_${nome};' 
from information_schema.table_constraints 
where table_name = 'dml_logs' 
and constraint_type in ('PRIMARY KEY') 

union all

SELECT 'ALTER INDEX '||i.relname||' RENAME TO '||i.relname||'_${nome};'
FROM pg_index AS idx
JOIN pg_class AS i ON i.oid = idx.indexrelid
JOIN pg_am AS am ON i.relam = am.oid
JOIN pg_namespace AS NS ON i.relnamespace = NS.OID
JOIN pg_user AS U ON i.relowner = U.usesysid
WHERE idx.indrelid :: REGCLASS::TEXT = 'dml_logs'
and idx.indisprimary = false

union all

SELECT 'create table dml_logs as select * from dml_logs_${nome} where date > ''${data}''::date and queue = ''F'';'

union all

SELECT 'insert into dml_logs select * from dml_logs_${nome} where queue in(''A'',''B'',''E'');'

Parar o servidor (tomcat)
Executar script gerado acima (via psql).
Faça comando por comando (linha por linha)! Certifique-se que não deu erro!
Reiniciar o servidor (tomcat)
Executar RTDBUT.UTL_DB_SCHEMA para ajustar a nova tabela de dml_logs, ou executar o script abaixo.
Atenção
Ao recriar os índices, deve se ter MUITO cuidado para não replicar os comandos.

alter table DML_LOGS add constraint PK_DMLLOG primary key (ID);

CREATE INDEX ak_dmllog_data
 ON public.dml_logs
 USING btree
 (date);

CREATE INDEX ak_dmllog_id
 ON public.dml_logs
 USING btree
 (original_id);

CREATE INDEX ak_dmllog_origin_record_id
 ON public.dml_logs
 USING btree
 (origin_record_id);

CREATE INDEX ak_dmllog_original_date
 ON public.dml_logs
 USING btree
 (original_date);

CREATE INDEX ak_dmllog_queue
 ON public.dml_logs
 USING btree
 (queue COLLATE pg_catalog."default");

CREATE INDEX ak_dmllog_queue_id
 ON public.dml_logs
 USING btree
 (queue COLLATE pg_catalog."default", id);

No final, os dados antigos da DML_LOGS estarão em uma tabela DML_LOGS_YYYYMMDD.
Se tudo estiver OK e se deseja remover definitivamente a tabela:
drop table DML_LOGS_YYYYMMDD;
Se desejar manter esta tabela, ela deverá ser removida do script de backup.

Dica
Este procedimento poderia ser automatizado em uma interface forçando um LOCK exclusivo para toda a tabela de DML_LOGS de forma que não seria necessário parar o TOMCAT.