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.