J'ai besoin de copier une base de données Oracle 10g (10.2.0.4.0) (150 Go) dans une base de données Oracle 12c (12.1.0.2.0). Les deux sont des éditions standard. Quelle méthode dois-je utiliser?
La cible se trouve sur un autre serveur - base de données vide. La structure du système de fichiers est différente. Target est un serveur de tests qui a besoin d'un état cohérent mais n'a pas besoin d'être à jour en production.
Dans votre cas, vous ne pouvez pas utiliser d'espace disque logique transportable car la base de données source doit être l'édition Enterprise.
En général, je préférerais une mise à niveau à l'aide de rman. Mais dans votre cas, ce n'est pas si facile car la mise à niveau directe de 10.2.0.4 vers 12.1.0.2 n'est pas prise en charge. Vous devrez mettre à niveau vers une version intermédiaire (par exemple 10.2.0.5) qui peut être directement mise à niveau vers 12.1.0.2. Voir https://docs.Oracle.com/database/121/UPGRD/preup.htm#UPGRD12359
Donc, pour vous, la meilleure approche sera de mettre à niveau en utilisant l'ancienne importation (imp) ou l'importation de la pompe de données (impdp).
J'ai une recette utilisant l'ancienne importation. La mise à niveau à l'aide de l'importation de la pompe de données sera similaire:
Supposons que le nom de la base de données source soit "sourcedb" et cible "targetdb".
définissez Oracle_home = c:\Oracle\product\10.2.0\db_1
définir Oracle_sid = sourcedb
c:\Oracle\product\10.2.0\db_1\bin\exp system/pass buffer = 1200000 file = d:\dump\full_sourcedb.dmp log = full_sourcedb.log full = y consistent = y
copiez full_sourcedb.dmp sur la machine cible
sélectionnez le paramètre, la valeur de nls_database_parameters où le paramètre comme '% CHARACTERSET%';
créer un espace de table "TEST" taille de bloc 8192 fichier de données 'd:\oradata\targetdb\test01.ora' taille 2000m gestion de l'étendue local autoallocation en ligne segment de nologging permanent gestion de l'espace auto;
etc.
imp system/pass full = y log = d:\dump\full_import_sourcedb.log file = d:\dump\full_sourcedb.dmp
consultez d:\dump\full_import_sourcedb.log pour les erreurs
--recompiler des objets
@% Oracle_HOME%/rdbms/admin/utlrp.sql
- vérifier tous les composants de la base de données
sélectionnez le propriétaire, type_objet, nom_objet dans dba_objects où status! = 'VALID' ordre par 1,2,3;
- recueillir des statistiques arrêt démarrage immédiat
commencer
dbms_stats.gather_database_stats (method_opt => 'POUR TOUTES LES COLONNES TAILLE AUTO', estimation_percent => 100, cascade => TRUE);fin;
/
Remarque:
L'importation à l'aide de l'importation de la pompe de données (expdp, impdp) peut être plus facile:
au lieu de cohérent = y, vous devez utiliser flashback_time = "to_timestamp ('04 -04-2016 11:55:00 ',' DD-MM-YYYY HH24: MI: SS ')" .........
Lors de l'importation, vous n'avez pas besoin de créer manuellement des espaces de table et vous pouvez utiliser le paramètre remap_datafile.
J'ai utilisé Oracle datapump expdp/impdp. Sur la base de données source utilisant expdp:
SQL*PLUS:
CREATE USER username IDENTIFIED BY pw;
GRANT dba TO username;
CREATE DIRECTORY db_copy AS ‘E:\DB_copy’;
GRANT read, write ON DIRECTORY db_copy TO username;
CMD:
expdp username/pw DIRECTORY= db_copy DUMPFILE=filename_%u.dmp
filesize=5gb FULL=Yes METRICS=Y EXCLUDE=STATISTICS
flashback_time=systimestamp LOGFILE=dbname_exp.log
Après avoir transféré le datapump, sur la base de données cible à l'aide d'impdp:
(Créez une sauvegarde avant de démarrer l'importation.)
SQL*PLUS:
CREATE USER username IDENTIFIED BY pw;
GRANT dba to username;
CREATE DIRECTORY db_copy AS ‘E:\DB_copy’;
GRANT read, write ON DIRECTORY db_copy TO username;
Je suis d'abord allé pour remapper le fichier de données - a suit dans le fichier de paramètres impdp:
REMAP_DATAFILE=D:\Oracle\ORADATA\DBNAME\DATAFILE_01.DBF:
E:\Oracle\ORADATA\DBNMAE\DATAFILE_01.DBF
Cela fonctionne, mais cela ne répondait pas aux exigences de réorganisation complète de la structure du système de fichiers. Une autre façon est de faire une importation en utilisant impdp avec l'option sqlfile. par exemple.:
CMD:
impdp username/pw parfile=impdp.par
impdp.par File:
DIRECTORY=db_copy
FULL=yes
DUMPFILE= filename_1.dmp, filename_2.dmp…
**SQLFILE=script.sql**
LOGFILE=dbname_imp.log
Depuis le script.sql, il est possible de copier les commandes ddl, par ex.
...CREATE TABLESPACE tbs_02 DATAFILE
F:\Oracle\ORADATA\DBNMAE\DATAFILE_01.DBF,
G:\Oracle\ORADATA\DBNMAE\DATAFILE_02.DBF,
H:\Oracle\ORADATA\DBNMAE\DATAFILE_03.DBF
SIZE 500K REUSE AUTOEXTEND ON NEXT 500K MAXSIZE 100M;
J'ai créé un script avec tous les espaces de table et remappé les fichiers de données comme souhaité. Après l'exécution du script, tous les espaces disque logiques sont créés. Il est maintenant possible de refaire l'impdp mais sans l'option sqlfile. Cela générera des erreurs car les espaces de table existent déjà mais les données sont toujours importées!
CMD:
impdp username/pw parfile=impdp.par
impdp.par file:
DIRECTORY=db_copy
FULL=yes
DUMPFILE= filename_1.dmp, filename_2.dmp…
LOGFILE=dbname_imp.log
Il crée de nombreux archivelogs. J'avais besoin d'exécuter une sauvegarde sur l'espace libre. Après avoir terminé, j'ai vérifié le fichier journal pour les erreurs - tout a fonctionné.
Je lance @?/Rdbms/sadmin/utlrp.sql mais cela ne semble pas nécessaire. Aucune compilation n'a été effectuée. Ces étapes ont fonctionné pour moi pour faire une copie/migration de 10g à 12c.