2017-08-11 2 views
0

Je dois faire une copie d'un schéma dans une base de données Oracle avec un nom légèrement différent.Meilleure façon de faire une copie d'une base de données Oracle en utilisant seulement le shell SQL

Je peux le faire assez facilement avec MSS avec quelque chose comme:

BACKUP DATABASE {DATABASE_NAME} TO DISK='{DIRECTORY}\{BACKUP_NAME}' 
RESTORE FILELISTONLY FROM DISK = '{DIRECTORY}\{BACKUP_NAME}' 
RESTORE DATABASE {NEW_DATABASE} FROM DISK = '{DIRECTORY}\{BACKUP_NAME}' WITH MOVE '{mdf}' TO '{DIRECTORY}\{mdf}.mdf', MOVE '{ldf}' TO '{DIRECTORY}\{ldf}.ldf' 

Y at-il équivalent pour Oracle DB?

Pour référence, je me connecte à la base de données avec tous les privilèges en utilisant JBDC.

Répondre

1

MSS utilise "base de données" pour faire référence à plusieurs concepts différents dans Oracle. Je pense que vous voulez peut-être dire que vous voulez exporter un schéma et le réimporter dans la même base de données Oracle avec un nom de schéma différent. J'utiliserais normalement datapump à partir de la ligne de commande pour cela (expdp/impdp). Cependant, there is a datapump API que vous pouvez utiliser pour le faire à partir d'un shell SQL.

-- export 
declare 
    l_dp_handle  NUMBER; 
BEGIN 
    l_dp_handle := DBMS_DATAPUMP.open('EXPORT','SCHEMA',null,'MY_EXPORT','LATEST'); 
    DBMS_DATAPUMP.add_file(l_dp_handle,'my_export.dmp','DATA_PUMP_DIR'); 
    DBMS_DATAPUMP.add_file(l_dp_handle,'my_export.log','DATA_PUMP_DIR',null,DBMS_DATAPUMP.KU$_FILE_TYPE_LOG_FILE); 
    DBMS_DATAPUMP.metadata_filter(l_dp_handle,'SCHEMA_EXPR','= ''OLD_SCHEMA_NAME'''); 
    DBMS_DATAPUMP.start_job(l_dp_handle); 
    DBMS_DATAPUMP.detach(l_dp_handle); 
END; 
/

-- check status with: 
select * from dba_datapump_jobs; 

-- import 
declare 
    l_dp_handle  NUMBER; 
BEGIN 
    l_dp_handle := DBMS_DATAPUMP.open('IMPORT','SCHEMA',null,'MY_IMPORT','LATEST'); 
    DBMS_DATAPUMP.add_file(l_dp_handle,'my_export.dmp','DATA_PUMP_DIR'); 
    DBMS_DATAPUMP.add_file(l_dp_handle,'my_export.imp.log','DATA_PUMP_DIR',null,DBMS_DATAPUMP.KU$_FILE_TYPE_LOG_FILE); 
    DBMS_DATAPUMP.metadata_filter(l_dp_handle,'SCHEMA_EXPR','= ''OLD_SCHEMA_NAME'''); 
    DBMS_DATAPUMP.metadata_remap(l_dp_handle,'REMAP_SCHEMA','OLD_SCHEMA_NAME','NEW_SCHEMA_NAME'); 
    DBMS_DATAPUMP.start_job(l_dp_handle); 
    DBMS_DATAPUMP.detach(l_dp_handle); 
END; 
/

Notez que vous aurez besoin de privilèges DBA si vous souhaitez importer dans un schéma autre que le vôtre. Votre utilisateur Oracle aura également besoin de privilèges de lecture/écriture sur le répertoire (DATA_PUMP_DIR dans cet exemple), d'exécution de privilèges sur DBMS_DATAPUMP, etc.

+0

Je * pense * c'est exactement ce que je veux. Je vais l'essayer. – Darrien

+0

Pour la première ligne add_file, on me dit que je donne une valeur d'argument invalide. C'est ce que je fais: DBMS_DATAPUMP.ADD_FILE (l_dp_handle, '{dbBackup.ToLower()}. Dmp', '{DbDumpDir}'); où dbBackup est le nom de la sauvegarde et DbDumpDir est un chemin d'accès au vidage de la base de données. Une idée quelle erreur je fais? – Darrien

+0

@Damien - vous devez transmettre le nom d'un objet de répertoire Oracle, pas un chemin de répertoire du système d'exploitation. Regardez dans 'all_directories' pour voir si vous avez accès à tout. Vous pouvez avoir besoin de privilèges supplémentaires (pour cela, et pour créer le nouvel utilisateur). –