Como determinar a esquemas dentro de um arquivo do Oracle Data Pump Export
Pergunta
- Eu tenho um arquivo de backup do banco de dados Oracle (DMP) que foi criado com expdp.
- O ficheiro.dmp era uma exportação de um banco de dados inteiro.
- Eu preciso restaurar um dos esquemas de dentro desse arquivo de despejo.
- Eu não sei os nomes dos esquemas dentro deste arquivo de despejo.
- Para usar impdp para importar os dados que eu preciso o nome do esquema para carga.
Então, eu preciso inspecionar o arquivo .dmp e lista de todos os esquemas em que, como eu faço isso?
Update (2008-09-18 13:02) - Informações mais detalhadas:
O comando impdp eu sou atual usando é:
impdp user/password@database directory=DPUMP_DIR
dumpfile=EXPORT.DMP logfile=IMPORT.LOG
E o DPUMP_DIR está configurado corretamente.
SQL> SELECT directory_path
2 FROM dba_directories
3 WHERE directory_name = 'DPUMP_DIR';
DIRECTORY_PATH
-------------------------
D:\directory_path\dpump_dir\
E sim, o arquivo export.dmp é de facto nessa pasta.
A mensagem de erro que eu recebo quando eu executar o comando impdp é:
Connected to: Oracle Database 10g Enterprise Edition ...
ORA-31655: no data or metadata objects selected for job
ORA-39154: Objects from foreign schemas have been removed from import
Esta mensagem de erro é principalmente o esperado. Eu preciso o comando impdp ser:
impdp user/password@database directory=DPUMP_DIR dumpfile=EXPORT.DMP
SCHEMAS=SOURCE_SCHEMA REMAP_SCHEMA=SOURCE_SCHEMA:MY_SCHEMA
Mas para fazer isso, eu preciso do esquema de origem.
Solução
Se você abrir o arquivo DMP com um editor que pode lidar com grandes arquivos, você pode ser capaz de localizar as áreas onde os nomes de esquema são mencionados. Apenas certifique-se de não mudar nada. Seria melhor se você abriu uma cópia do depósito inicial.
Outras dicas
exportações impdp
o DDL de um backup dmp
para um arquivo se você usar o SQLFILE
parâmetro . Por exemplo, colocar isso em um arquivo de texto
impdp '/ as sysdba' dumpfile=<your .dmp file> logfile=import_log.txt sqlfile=ddl_dump.txt
Em seguida, verifique ddl_dump.txt
para os espaços de tabelas, usuários e esquemas no backup.
De acordo com a documentação, isso não realmente modificar o banco de dados:
O SQL não é realmente executado, e o sistema de destino permanece inalterado.
Update (2008-09-19 10:05) - Solução:
Minha Solução: A engenharia social, eu cavei alguém duro e encontrou real, que sabia o nome do esquema
.
Solução Técnica: Pesquisando na ficheiro.dmp fez deu o nome do esquema
.
Uma vez que eu sabia o nome do esquema, eu procurei o arquivo de despejo e aprendeu onde encontrá-lo.
Coloca o nome esquemas foram vistos, na ficheiro.dmp:
-
<OWNER_NAME>SOURCE_SCHEMA</OWNER_NAME>
Isto foi visto antes de cada nome de tabela / definição. -
SCHEMA_LIST 'SOURCE_SCHEMA'
Isto foi visto perto do final do .dmp.
Curiosamente, em torno da seção SCHEMA_LIST 'SOURCE_SCHEMA'
, ele também teve a linha de comando usado para criar o despejo, diretórios utilizados, arquivos par usados, versão do Windows que foi executado, e configurações de sessão de exportação (linguagem, formatos de data).
Assim, problema resolvido:)
Assumindo que você não tem o arquivo de log do trabalho expdp que gerou o arquivo em primeiro lugar, a opção mais fácil seria provavelmente a usar o SQLFILE parâmetro ter impdp gerar um arquivo de DDL (com base em uma importação completa). Então você pode pegar os nomes de esquema de arquivo. Não é o ideal, é claro, já que impdp tem que ler o arquivo de despejo inteira para extrair o DDL e, em seguida, novamente para obter o esquema que você está em interessado, e você tem que fazer um pouco de pesquisa arquivo de texto para as várias instruções CREATE USUÁRIO , mas deve ser factível.
A execução do comando impdp para produzir um SQLFile, você precisará executá-lo como um usuário que tem o papel DATAPUMP_IMP_FULL_DATABASE.
Ou ... executá-lo como um usuário privilegiado baixo e usar o MASTER_ONLY = YES opção, então inspecionar a tabela mestre. por exemplo.
select value_t
from SYS_IMPORT_TABLE_01
where name = 'CLIENT_COMMAND'
and process_order = -59;
col object_name for a30
col processing_status head STATUS for a6
col processing_state head STATE for a5
select distinct
object_schema,
object_name,
object_type,
object_tablespace,
process_order,
duplicate,
processing_status,
processing_state
from sys_import_table_01
where process_order > 0
and object_name is not null
order by object_schema, object_name
/
Passo 1: Aqui está um exemplo simples. Você tem que criar um arquivo de SQL a partir do arquivo de despejo usando a opção SQLFILE
.
Passo 2: Grep para CREATE USER
no arquivo SQL gerado (aqui tables.sql)
Exemplo aqui:
$ impdp directory=exp_dir dumpfile=exp_user1_all_tab.dmp logfile=imp_exp_user1_tab sqlfile=tables.sql
Import: Lançamento 11.2.0.3.0 - Produção em Sex 26 abril 08:29:06 2013
Copyright (c) 1982, 2011, Oracle e / ou suas afiliadas. Todos os direitos reservados.
Usuário: / as sysdba
Processamento de tipo de objeto SCHEMA_EXPORT / PRE_SCHEMA / PROCACT_SCHEMA Job "SYS". "SYS_SQL_FILE_FULL_01" concluída com êxito em 8:29:12
$ grep "CREATE USER" tables.sql
CRIAR USUÁRIO "USER1" identificados por valores 'S: 270D559F9B97C05EA50F78507CD6EAC6AD63969E5E; BBE7786A5F9103'
Lot of DataPump opções explicado aqui http://www.acehints.com/p/ Site-map.html
A minha solução (semelhante a resposta de KyleLanser) (em uma caixa de Unix):
strings dumpfile.dmp | grep SCHEMA_LIST
Você precisa procurar OWNER_NAME.
cat -v dumpfile.dmp | grep -o '<OWNER_NAME>.*</OWNER_NAME>' | uniq -u
cat -v transformar o dumpfile em texto visível.
grep -o mostra apenas o jogo de modo que não vemos realmente long linhas
uniq -u remove duplicado linhas de modo que você vê menos saída.
Isso funciona muito bem, mesmo em grandes arquivos de despejo, e pode ser ajustado para uso em um script.