Fazer um exp full

Backup, Recover, Import, Export, Datapump, etc
  

Mensagemem Sex, 27 Abr 2012 10:25 am

Hoje quando subi uma base de teste no meu banco Oracle, tive alguns problemas com objetos descompilados, os mesmos davam os seguintes erros table or view not found. Verificando melhor vi que essas tabelas que não foram encontradas, eram tabelas que existiam no banco porem não possuia nenhum registro.

Gostaria de saber como posso fazer um exp com todas as tabelas incluindo as que estão vazia no banco.

Faço da seguinte forma:

exp teste/t@teste full=y file=c:\arquivo25042012.dmp

Agradeço desde já.
skiche

Mensagemem Qua, 02 Mai 2012 6:51 pm

Olá skiche,

Desconfio que a sua base de dados é ORACLE 11G.

Neste caso, tenho uma notícia um pouco ruim para você. Nesta versão, o ORACLE 11G só exporta dados de tabelas que tenham sido populadas com pelo menos um registro desde sua criação. Ou seja, se na sua relação de tabelas você tem uma que foi criada e nunca populada, ela jamais será relacionada no seu export, mesmo que seja FULL.

O produto EXPORT se baseia nas informações da DBA_SEGMENTS para avaliar quais tabelas devem ser exportadas. Nas versões anteriores ao 11G, ao se dar um comando de CREATE TABLE, a DBA_SEGMENTS era SEMPRE populada com um registro ao menos. Então,

Mas no 11G isso não acontece mais. Ao dar CREATE TABLE, ele não popula mais a DBA_SEGMENTS. Ela é populada somente quando um primeiro registro for inserido nesta tabela. Este recurso foi incorporado ao 11G para agilizar a execução de scripts DDL, uma vez que os comandos CREATE TABLE/INDEX não alocam automaticamente espaço em disco. Somente quando um registro é inserido na nova tabela se criam registros na DBA_SEGMENTS. Feito isso, você pode executar um DELETE FROM <tabela>, que mesmo assim ela passa a ser incluida posteriormente no EXPORT.

Uma solução para seu problema é a de deixar de usar o IMP/EXP e passar a executar o IMPDP e EXPDP. Estes são os programas atualmente reconhecidos como de backup a partir do 11G, sendo o uso do IMP/EXP não mais recomendado por ela.

Mas o chato disso tudo é que você não consegue executar localmente um IMPDP ou EXPDP. Somente no servidor de banco isso é possível.

Eu tive um problema semelhante ao seu com uma base 11G. No meu caso conseguí resolver o problema inserindo e deletando (logo em seguida) um registro em cada uma das tabelas sem registros. Depois desta atividade lusitana, eu conseguí relacionar todas as tabelas no EXPORT.

Imagino que isso seja complicado em um banco de dados relacional, cheio de FKs. Mas basta desativar temporariamente estas FKs durante a inserção/deleção, e posteriormente reativar as FKs. Feito isso, você vai notar que seu EXPORT vai começar a relacionar estas tabelas.

Esta é a única solução possível, caso você deseje usar o IMP e EXP no 11G.

Abraços e boa sorte,

Sergio Coutinho
stcoutinho
Localização: Sao Paulo - SP

Mensagemem Seg, 07 Mai 2012 5:13 pm

Olá skiche,

Falei agora com uma colega DBA e esta me repassou uma solução muito mais simples para seu problema.

No 11G é possível alocar extents (espaço) para as tabelas vazias que ainda não disponham de segments. Bastaria executar o comando "ALTER TABLE .... ALLOCATE EXTENT;" para a tabela vazia.

Desta forma, execute o script abaixo, que deverá te mostrar os comandos ALTER que deverão ser executados no seu schema onde as tabelas residem:
Código: Selecionar todos
SELECT 'ALTER TABLE '||TABLE_NAME||' ALLOCATE EXTENT;' FROM USER_TABLES WHERE TABLE_NAME NOT IN (SELECT SEGMENT_NAME FROM USER_SEGMENTS);


Execute os comandos ALTER gerados pela querie acima.

Depois disso, pode fazer um teste com o EXP. Você vai constatar que as tabelas sem registros passarão a ser relacionadas no seu export.

Abraços,

Sergio Coutinho
stcoutinho
Localização: Sao Paulo - SP

Mensagemem Qua, 09 Mai 2012 6:23 pm

Obrigado STCOUTINHO pela sua ajuda.
Estarei verificando esta possibilidade.
skiche



Voltar para DBA Backup / Recover

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 2 visitantes