web-dev-qa-db-fra.com

Copier la base de données Oracle 10g vers 12c

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.

4
r0tt

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".

  1. faire une exportation complète sur la base de données source:

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

  1. créer une nouvelle base de données cible "targetdb" en utilisant dbca (base de données personnalisée - sélectionnez ou supprimez tous les composants dont vous avez besoin Oracle spatial, etc.)
    • choisissez le bon jeu de caractères. Vous pouvez trouver le jeu de caractères sur votre sourcedb par cette requête:

sélectionnez le paramètre, la valeur de nls_database_parameters où le paramètre comme '% CHARACTERSET%';

  1. sur la machine cible exécutez la commande suivante. Il produira le journal avec les stamenets sql utilisés par l'importation, où vous pouvez trouver les instructions create pour créer des espaces de table. Vous devez les modifier (avec de nouveaux emplacements de fichiers de données) et les exécuter manuellement avant l'importation car l'ancien import ne peut pas remapper les fichiers de données:

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.

  1. une fois tous les espaces disque logiques créés, vous pouvez exécuter l'importation sur la machine cible:

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

  1. après importation réussie sur la machine cible:

--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.

3
teo

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.

0
r0tt