2 votes

Comment exclure certaines tables de l'exportation du datapump Oracle ?

J'ai un grand nombre de schémas utilisateur dans ma base de données Oracle. Je souhaite exporter les données des tables de ces schémas, mais exclure toutes les tables dont le nom comporte le deuxième caractère, un trait de soulignement.

Par exemple, je souhaite exporter des tableaux TPI_SUMMARY , DFXRRT y RTAFF mais excluent C_NAMES , G_BEARS etc. En fait, je veux juste exclure tout ce qui a un trait de soulignement comme deuxième caractère.

J'utilise Oracle data pump :

expdp system/xxxxx@string parfile=parfile.par

En parfile contient :

INCLUDE=TABLE:"IN(select table_name from dba_tables where table_name not like '_\_%')" 
EXCLUDE=SCHEMA:"='SYS','SYSTEM','SYSMAN','DBSNMP','OUTLN','APPQOSSYS'"
DIRECTORY=paul_test 
DUMPFILE=infrep_temp1.dmp 
FULL=Y 
LOGFILE=Daily_Backup_infrep_temp1.log

Je n'arrive pas à le faire fonctionner. I pensez à que le EXCLUDE est OK mais le bit INCLUDE La requête est erronée. Le site DIRECTORY , DUMPFILE y LOGFILE sont tous OK.

J'obtiens ce qui suit :

Export: Release 11.2.0.4.0 - Production on Thu May 4 16:41:48 2017  

Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.  

Connected to: Oracle Database 11g Release 11.2.0.4.0 - 64bit Production  
ORA-39001: invalid argument value  
ORA-39071: Value for EXCLUDE is badly formed.  
ORA-00933: SQL command not properly ended  

Des idées ? J'ai vraiment du mal à faire en sorte que cela fonctionne.

3voto

Alex Poole Points 43006

L'erreur concerne EXCLUDE pas INCLUDE :

ORA-39071: Value for EXCLUDE is badly formed

... et c'est bien cela qui est mauvais. Vous essayez d'utiliser l'égalité avec des valeurs multiples ; il vous suffit d'utiliser une fonction IN() encore :

EXCLUDE=SCHEMA:"IN('SYS','SYSTEM','SYSMAN','DBSNMP','OUTLN','APPQOSSYS')"

Mais comme il est dit dans la documentation :

En EXCLUDE y INCLUDE sont mutuellement exclusifs.

Vous êtes autorisé à utiliser deux EXCLUDE cependant, vous pouvez annuler la première clause INCLUDE :

EXCLUDE=TABLE:"NOT IN(select table_name from dba_tables where table_name not like '_\_%')" 
EXCLUDE=SCHEMA:"IN('SYS','SYSTEM','SYSMAN','DBSNMP','OUTLN','APPQOSSYS')"

ou comme c'est maintenant une double négation :

EXCLUDE=TABLE:"IN(select table_name from dba_tables where table_name like '_\_%')" 
EXCLUDE=SCHEMA:"IN('SYS','SYSTEM','SYSMAN','DBSNMP','OUTLN','APPQOSSYS')"

Mais cela like ne correspond pas à ce que vous attendez ; vous devez ajouter une balise escape et dans ce contexte, vous devez échapper à la barre oblique inverse en la doublant :

EXCLUDE=TABLE:"IN(select table_name from dba_tables where table_name like '_\_%' escape '\\')" 

ou vous pouvez utiliser substr() à la place :

EXCLUDE=TABLE:"IN(select table_name from dba_tables where substr(table_name, 2, 1) = '_')"

Vous pouvez également, si vous avez une liste de schémas que vous faire voulez, utilisez deux INCLUDE à la place - ce qui peut être plus simple que de lister tous les schémas intégrés, qui peuvent varier.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X