2017-05-04 2 views
0

J'ai un grand nombre de schémas utilisateur dans ma base de données Oracle. Je souhaite exporter les données de table pour ces schémas mais exclure toutes les tables nommées avec le deuxième caractère un trait de soulignement.Comment exclure certaines tables de l'exportation de datapump Oracle

Par exemple, je souhaite exporter des tables TPI_SUMMARY, DFXRRT et RTAFF mais excluent C_NAMES, G_BEARS etc. Fondamentalement voulez exclure quoi que ce soit avec un trait de soulignement comme le second caractère

J'utilise la pompe de données Oracle:

expdp system/[email protected] parfile=parfile.par 

Le 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 à faire marcher ça. Je pense que le bit EXCLUDE est OK mais la requête INCLUDE est erronée. Les DIRECTORY, DUMPFILE et LOGFILE sont tous OK.

Je reçois le texte suivant:

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 

Toutes les idées? J'ai vraiment du mal à faire fonctionner ça.

Répondre

2

L'erreur fait référence à EXCLUDE, non INCLUDE:

ORA-39071: Value for EXCLUDE is badly formed 

... et il est en effet ce qui est faux. Vous essayez d'utiliser l'égalité avec plusieurs valeurs. vous avez juste besoin d'utiliser un nouveau IN():

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

Mais as it says in the documentation:

Les EXCLUDE et INCLUDE paramètres sont mutuellement exclusifs.

Vous êtes autorisé à utiliser deux EXCLUDE clauses, donc vous pouvez annuler la première 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 qui est maintenant un double négatif:

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

Mais ce like ne correspond pas comme prévu vous devez ajouter une clause escape, et dans ce contexte, vous avez besoin d'échapper à la barre oblique inverse en doublant vers le haut:

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 vous avez une liste de schémas que vous voulez , utilisez deux clauses INCLUDE à la place - ce qui pourrait être plus simple que de répertorier tous les schémas intégrés, qui peuvent varier.

+0

Merci beaucoup, cela a fonctionné comme souhaité – sasquartch