Im vorliegenden Beitrag wird Ihnen gezeigt, wie Sie eine Oracle-Datenbank mittels
RMAN aus einer Linux-Umgebung in eine Windows-Umgebung migrieren können.
Im konkreten Fall wird eine Produktiv-Datenbank der Version 12.2.0.1 unter Enterprise Linux 7.6
zu Testzwecken auf Windows 10 kopiert. Ob dabei eine oder beide Seiten unter ASM installiert
sind, spielt für die Vorgehensweise keine nennenswerte Rolle. Bei Pfadangaben muss lediglich
die Diskgroup-Angabe (z.B. +DG) erfolgen.
Achtung: Die Durchführung erfordert das READ ONLY Öffnen der Quellseite, d.h. Sie benötigen dazu ein Wartungsfenster.
Quellseite (hier: EL 7.6)
Schritt 1: Vorbereitung und Prüfung
Beginnen Sie mit dem Herunterfahren Ihres DB-Systems auf Quellseite.
Anschließend öffnen Sie die Datenbank im READ ONLY Modus.
sqlplus / as sysdba
SHUTDOWN IMMEDIATE
STARTUP OPEN READ ONLY;
Überprüfen Sie mittels DBMS_TDB, ob die Quellseite für die Migration geeignet und vorbereitet ist.
Dabei wird der READ ONLY Modus geprüft und die Endianess der beteiligten Betriebssysteme.
Quell- und Zielseite müssen die selbe Endianess besitzen. Über die View V$TRANSPORTABLE_PLATFORM
können Sie diese ermitteln.
SET SERVEROUTPUT ON
DECLARE
v_return BOOLEAN;
BEGIN
v_return:=dbms_tdb.check_db('Microsoft Windows x86 64-bit');
END;
/
Falls die Voraussetzungen nicht erfüllt sind, kommt es zu möglichen Fehlern:
1.) Database is not open in READ-ONLY mode. Open the database in READ-ONLY mode and retry.
2.) The specified target platform name <...> is invalid or the target platform is not transportable.
Durch den zweiten Aufruf von DBMS_TDB wird die Existenz von External Tables, von Directories und von BFILES
geprüft. Diese müssen nach der Migration noch einmal neu erzeugt und an die neuen Pfade angepasst werden.
DECLARE
v_return BOOLEAN;
BEGIN
v_return:=dbms_tdb.check_external;
END;
/
Die Rückmeldung sieht dann so aus:
The following external tables exist in the database:
SYS.OPATCH_XML_INV,
SH.SALES_TRANSACTIONS_EXT
The following directories exist in the database:
SYS.PREUPGRADE_DIR,
SYS.ORA_DBMS_FCP_LOGDIR,
SYS.SUBDIR,
SYS.SS_OE_XMLDIR,
SYS.ORA_DBMS_FCP_ADMINDIR,
SYS.XMLDIR,
SYS.ORACLE_OCM_CONFIG_DIR2,
SYS.ORACLE_OCM_CONFIG_DIR,
SYS.LOG_FILE_DIR,
SYS.DATA_FILE_DIR,
SYS.MEDIA_DIR
The following BFILEs exist in the database:
PM.PRINT_MEDIA
PL/SQL procedure successfully completed.
Schritt 2: Führen Sie nun ein Backup der Quellseite durch
Geben Sie dabei die Option FOR TRANSPORT und das Zielverzeichnis an.
$> RMAN TARGET /
RMAN> BACKUP FOR TRANSPORT FORMAT '/u01/backup/%U' DATABASE ;
Die Rückmeldung lautet dann so:
Starting backup at 18-02-2019 09:08:03
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=178 device type=DISK
channel ORA_DISK_1: starting full datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
input datafile file number=00003 name=/u01/app/oracle/oradata/o12c/sysaux01.dbf
input datafile file number=00005 name=/u01/app/oracle/oradata/o12c/example01.dbf
input datafile file number=00001 name=/u01/app/oracle/oradata/o12c/system01.dbf
input datafile file number=00004 name=/u01/app/oracle/oradata/o12c/undotbs01.dbf
input datafile file number=00006 name=/u01/app/oracle/oradata/o12c/users01.dbf
channel ORA_DISK_1: starting piece 1 at 18-02-2019 09:08:04
channel ORA_DISK_1: finished piece 1 at 18-02-2019 09:08:29
piece handle=/u01/backup/4ltq66jk_1_1 tag=TAG20190218T090803 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:25
Finished backup at 18-02-2019 09:08:29
Schritt 3: Erzeugen Sie eine Tracekopie der Controldatei
RMAN> ALTER DATABASE BACKUP CONTROLFILE TO TRACE AS '/u01/backup/control.sql' RESETLOGS;
-- Statement processed
Schritt 4: Erstellen Sie eine INIT-Datei
RMAN> CREATE PFILE='/u01/backup/inito12c.ora' FROM SPFILE;
-- Statement processed
Sie können jetzt wieder die Quellseite READ WRITE öffnen, damit weitergearbeitet werden kann !!
SHUTDOWN IMMEDIATE
STARTUP
Zielseite (Windows 10)
Nun wechseln Sie auf die Zielseite und führen dort die weiteren Schritte durch.
Schritt 5: Kopieren Sie die erzeugten (Backup)-Dateien von Linux nach Windows (z.B. c:\temp)
/u01/backup/4ltq66jk_1_1
/u01/backup/control.sql
/u01/backup/inito12c.ora
Schritt 6: Vorbereitungen
Erzeugen Sie den notwendigen Datenbank-Dienst mit ORADIM
C:\> oradim -new -sid o12c
Erzeugen Sie die entsprechenden Verzeichnisse, sofern diese noch nicht vorhanden sind
C:\> cd %ORACLE_BASE%
C:\> mkdir admin\o12c\adump
C:\> mkdir admin\o12c\dpdump
C:\> mkdir oradata\
C:\> mkdir fast_recovery_area\o12c
Die Pfade in der INIT-Parameter müssen an die neue Plattform angepasst werden.
Das Aktivieren des OMF-Features ist Pflicht. Setzen Sie dazu db_create_file_dest.
...
*.audit_file_dest='c:\oracle12\admin\o12c\adump'
*.control_files='c:\oracle12\oradata\o12c\control01.ctl','c:\oracle12\fast_recovery_area\o12c\control02.ctl'
*.db_recovery_file_dest='c:\oracle12\fast_recovery_area'
*.db_create_file_dest='c:\oracle12\oradata'
*.diagnostic_dest='c:\oracle12'
...
Wandeln Sie die INIT-Datei in ein SPFILE um und starten Sie die Instanz.
C:\> set ORACLE_SID=o12c
C:\> sqlplus / as sysdba
CREATE SPFILE FROM PFILE='c:\temp\inito12c.ora';
STARTUP NOMOUNT
exit
Schritt 8: Spielen Sie das Backup mit der Option FROM PLATFORM ein
C:\> RMAN TARGET /
RMAN> RESTORE FROM PLATFORM 'Linux x86 64-bit' FOREIGN DATABASE
TO NEW FROM BACKUPSET 'c:\temp\4ltq66jk_1_1';
restore wird gestartet bei 18.02.19
Kontrolldatei der Zieldatenbank wird anstelle des Recovery-Katalogs verwendet
Zugewiesener Kanal: ORA_DISK_1
Kanal ORA_DISK_1: SID=292, Gerõtetyp=DISK
Kanal ORA_DISK_1: Zur³ckschreiben von Datendatei-Backup Set beginnt
Kanal ORA_DISK_1: Datendatei(en) werden zum Wiederherstellen aus Backup Set angegeben
Kanal ORA_DISK_1: Alle Fremddateien in Backup-Piece werden zur³ckgeschrieben
Kanal ORA_DISK_1: Lesen aus Backup-Piece c:\temp\4ltq66jk_1_1
Kanal ORA_DISK_1: Fremddatei 3 wird in C:\ORACLE12\ORADATA\O12C\DATAFILE\O1_MF_SYSAUX_G6NVDRB1_.DBF wiederhergestellt
Kanal ORA_DISK_1: Fremddatei 5 wird in C:\ORACLE12\ORADATA\O12C\DATAFILE\O1_MF_EXAMPLE_G6NVDRB4_.DBF wiederhergestellt
Kanal ORA_DISK_1: Fremddatei 1 wird in C:\ORACLE12\ORADATA\O12C\DATAFILE\O1_MF_SYSTEM_G6NVDRB6_.DBF wiederhergestellt
Kanal ORA_DISK_1: Fremddatei 4 wird in C:\ORACLE12\ORADATA\O12C\DATAFILE\O1_MF_UNDOTBS1_G6NVDRB9_.DBF wiederhergestellt
Kanal ORA_DISK_1: Fremddatei 6 wird in C:\ORACLE12\ORADATA\O12C\DATAFILE\O1_MF_USERS_G6NVDRBD_.DBF wiederhergestellt
Kanal ORA_DISK_1: fremdes Piece Handle=c:\temp\4ltq66jk_1_1
Kanal ORA_DISK_1: Backup-Piece 1 wurde wiederhergestellt
Kanal ORA_DISK_1: Wiederherstellung abgeschlossen, abgelaufene Zeit: 00:00:56
restore wurde beendet bei 18.02.19
Schritt 9: Die erzeugte Tracekopie der Controldatei muss an die Windows-Umgebung anpasst und ausgeführt werden
Inhalt der Tracedatei control.sql
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE SET DATABASE "O12C" RESETLOGS ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 1214
LOGFILE
GROUP 1 ('c:\oracle12\oradata\o12c\redo01.rdo') SIZE 100M BLOCKSIZE 512,
GROUP 2 ('c:\oracle12\oradata\o12c\redo02.rdo') SIZE 100M BLOCKSIZE 512,
GROUP 3 ('c:\oracle12\oradata\o12c\redo03.rdo') SIZE 100M BLOCKSIZE 512
DATAFILE
'C:\ORACLE12\ORADATA\O12C\DATAFILE\O1_MF_SYSTEM_G6NVDRB6_.DBF',
'C:\ORACLE12\ORADATA\O12C\DATAFILE\O1_MF_SYSAUX_G6NVDRB1_.DBF',
'C:\ORACLE12\ORADATA\O12C\DATAFILE\O1_MF_UNDOTBS1_G6NVDRB9_.DBF',
'C:\ORACLE12\ORADATA\O12C\DATAFILE\O1_MF_EXAMPLE_G6NVDRB4_.DBF',
'C:\ORACLE12\ORADATA\O12C\DATAFILE\O1_MF_USERS_G6NVDRBD_.DBF'
CHARACTER SET AL32UTF8
;
RECOVER DATABASE USING BACKUP CONTROLFILE UNTIL CANCEL;
CANCEL
ALTER DATABASE OPEN RESETLOGS;
ALTER TABLESPACE TEMP ADD TEMPFILE;
C:\> sqlplus / as sysdba
@ c:\temp\control.sql
Schritt 10: Überprüfung der Daten- und Redologdateien
SELECT name FROM v$datafile
UNION
SELECT name FROM v$tempfile;
NAME
------------------------------------------------------------------
C:\ORACLE12\ORADATA\O12C\DATAFILE\O1_MF_SYSTEM_G6NVDRB6_.DBF
C:\ORACLE12\ORADATA\O12C\DATAFILE\O1_MF_SYSAUX_G6NVDRB1_.DBF
C:\ORACLE12\ORADATA\O12C\DATAFILE\O1_MF_UNDOTBS1_G6NVDRB9_.DBF
C:\ORACLE12\ORADATA\O12C\DATAFILE\O1_MF_EXAMPLE_G6NVDRB4_.DBF
C:\ORACLE12\ORADATA\O12C\DATAFILE\O1_MF_USERS_G6NVDRBD_.DBF
C:\ORACLE12\ORADATA\O12C\DATAFILE\O1_MF_TEMP_G7SSN1GY_.TMP
SELECT member FROM v$logfile;
MEMBER
------------------------------------------------------------------
C:\ORACLE12\ORADATA\O12C\REDO03.RDO
C:\ORACLE12\ORADATA\O12C\REDO02.RDO
C:\ORACLE12\ORADATA\O12C\REDO01.RDO
Schritt 11: Erzeugen Sie die Directories neu, die noch auf einen Linux-Pfad verweisen
SELECT directory_name, directory_path FROM dba_directories;
DIRECTORY_NAME DIRECTORY_PATH
------------------------------ --------------------------------------------------------------------------------
PREUPGRADE_DIR /u01/app/oracle/cfgtoollogs/o12c/preupgrade
ORA_DBMS_FCP_LOGDIR /u01/app/oracle/product/12.2.0.1/dbhome_1/cfgtoollogs
SUBDIR /u01/app/oracle/product/12.1.0.2/dbhome_1/demo/schema/order_entry//2002/Sep
SS_OE_XMLDIR /u01/app/oracle/product/12.1.0.2/dbhome_1/demo/schema/order_entry/
ORA_DBMS_FCP_ADMINDIR /u01/app/oracle/product/12.2.0.1/dbhome_1/rdbms/admin
XMLDIR /u01/app/oracle/product/12.2.0.1/dbhome_1/rdbms/xml
ORACLE_OCM_CONFIG_DIR2 /u01/app/oracle/product/12.2.0.1/dbhome_1/ccr/state
ORACLE_OCM_CONFIG_DIR /u01/app/oracle/product/12.2.0.1/dbhome_1/ccr/state
LOG_FILE_DIR /u01/app/oracle/product/12.1.0.2/dbhome_1/demo/schema/log/
DATA_FILE_DIR /u01/app/oracle/product/12.1.0.2/dbhome_1/demo/schema/sales_history/
MEDIA_DIR /u01/app/oracle/product/12.1.0.2/dbhome_1/demo/schema/product_media/
XSDDIR /u01/app/oracle/product/12.2.0.1/dbhome_1/rdbms/xml/schema
DATA_PUMP_DIR /u01/app/oracle/admin/o12c/dpdump
OPATCH_INST_DIR C:\Oracle12\product\12.2.0\dbhome_1\OPatch
OPATCH_SCRIPT_DIR C:\Oracle12\product\12.2.0\dbhome_1\QOpatch
OPATCH_LOG_DIR C:\Oracle12\product\12.2.0\dbhome_1\rdbms\log
ORACLE_BASE /
ORACLE_HOME /
Ermittlung und Setzen des ORACLE_BASE-Verzeichnis
var os_base varchar2(50)
exec dbms_system.get_env('ORACLE_BASE',:os_base);
COL os_base NEW_VALUE os_base
SELECT :os_base as os_base from dual;
CREATE OR REPLACE DIRECTORY ORACLE_BASE AS '&&os_base';
Ermittlung und Setzen des ORACLE_HOME-Verzeichnis
COL os_home NEW_VALUE os_home
SELECT sys_context('userenv', 'ORACLE_HOME') as os_home from dual;
CREATE OR REPLACE DIRECTORY ORACLE_HOME AS '&&os_home';
Anpassen der Directories aus altem ORACLE_HOME
SELECT 'CREATE OR REPLACE DIRECTORY '||directory_name||' AS '||chr(39)||sys_context('userenv','ORACLE_HOME')||
substr(directory_path, instr(directory_path, '_1')+2)||chr(39)||';'
FROM dba_directories
WHERE directory_path LIKE '/u01%dbhome_1/%';
CREATE OR REPLACE DIRECTORY ORA_DBMS_FCP_LOGDIR AS 'C:\Oracle12\product\12.2.0\dbhome_1/cfgtoollogs';
CREATE OR REPLACE DIRECTORY SUBDIR AS 'C:\Oracle12\product\12.2.0\dbhome_1/demo/schema/order_entry//2002/Sep';
CREATE OR REPLACE DIRECTORY SS_OE_XMLDIR AS 'C:\Oracle12\product\12.2.0\dbhome_1/demo/schema/order_entry/';
CREATE OR REPLACE DIRECTORY ORA_DBMS_FCP_ADMINDIR AS 'C:\Oracle12\product\12.2.0\dbhome_1/rdbms/admin';
CREATE OR REPLACE DIRECTORY XMLDIR AS 'C:\Oracle12\product\12.2.0\dbhome_1/rdbms/xml';
CREATE OR REPLACE DIRECTORY ORACLE_OCM_CONFIG_DIR2 AS 'C:\Oracle12\product\12.2.0\dbhome_1/ccr/state';
CREATE OR REPLACE DIRECTORY ORACLE_OCM_CONFIG_DIR AS 'C:\Oracle12\product\12.2.0\dbhome_1/ccr/state';
CREATE OR REPLACE DIRECTORY LOG_FILE_DIR AS 'C:\Oracle12\product\12.2.0\dbhome_1/demo/schema/log/';
CREATE OR REPLACE DIRECTORY DATA_FILE_DIR AS 'C:\Oracle12\product\12.2.0\dbhome_1/demo/schema/sales_history/';
CREATE OR REPLACE DIRECTORY MEDIA_DIR AS 'C:\Oracle12\product\12.2.0\dbhome_1/demo/schema/product_media/';
CREATE OR REPLACE DIRECTORY XSDDIR AS 'C:\Oracle12\product\12.2.0\dbhome_1/rdbms/xml/schema';
Anpassen der Directories aus altem ORACLE_BASE
CREATE OR REPLACE DIRECTORY preupgrade_dir AS '&&os_base\cfgtoollogs\o12c\preupgrade';
CREATE OR REPLACE DIRECTORY data_pump_dir AS '&&os_base\admin\o12c\dpdump';