Erro relatado:
# pg_dump -U postgres -d jetclass -v -Fc -f banco.backup -n public
pg_dump: reading schemas
pg_dump: reading user-defined functions
pg_dump: reading user-defined types
pg_dump: schema with OID 264202372 does not exist
pg_dump: *** aborted because of error
A solução para esse problema é procurar nas tabelas do catálogo (schema pg_catalog) para encontrar o OID que está gerando o erro e deletá-lo da base.
Baseado nessa solução criei uma pequena função em plpgsql para varrer o catálogo e procurar pelo OID problemático:
create or replace function fc_procura_oid(oid) returns boolean as
$$
declare
xOid alias for $1;
lRetorno boolean default false;
lAchou boolean default false;
rTabelas record;
sExecuta text;
begin
for rTabelas in
select pg_class.relname,
'SELECT EXISTS(SELECT oid FROM '||quote_ident(nspname)||'.'||quote_ident(relname)||' WHERE oid = ' as sql_to_search
from pg_attribute
inner join pg_class on pg_class.oid = pg_attribute.attrelid
inner join pg_namespace on pg_namespace.oid = pg_class.relnamespace
where pg_attribute.attname = 'oid'
and pg_class.relkind = 'r'
and pg_namespace.nspname = 'pg_catalog'
order by 1
loop
sExecuta := rTabelas.sql_to_search || xOid || ')';
execute sExecuta into lAchou;
if lAchou then
raise info 'OID % encontrado na tabela %', xOid, rTabelas.relname;
lRetorno := true;
end if;
end loop;
return lRetorno;
end;
$$
language plpgsql;
Para executar essa basta acessar a base via psql (ou até mesmo com pgadmin) e rodar:
training=# select fc_procura_oid(16);
INFO: OID 16 encontrado na tabela pg_type
fc_procura_oid
----------------
t
(1 registro)
Essa função retorna TRUE caso encontre, emitindo um echo na tela com o nome da(s) tabela(s) onde ele achou, ou FALSE caso negativo.
Show de bola meu amigo!!! Ótima idéia este blog.
ResponderExcluirSaudações de Sapiranga! Estaremos de olho, e certamente aproveitaremos as dicas!
ResponderExcluir\m/
valew a dica....
ResponderExcluir