===== Datenbank Dateien umziehen - Online und Offline ===== **06/2015** Am einfachsten läßt sich die Datei Struktur einer Oracle Datenbank mit RMAN anzeigen: #Umgebung und Oracle SID setzen rman RMAN> connect target / RMAN> report schema; using target database control file instead of recovery catalog Report of database schema for database with db_unique_name GPI List of Permanent Datafiles =========================== File Size(MB) Tablespace RB segs Datafile Name ---- -------- -------------------- ------- ------------------------ 1 780 SYSTEM YES R:\ORACLE\ORADATA01\GPI\SYSTEM01.DBF 2 660 SYSAUX NO R:\ORACLE\ORADATA01\GPI\SYSAUX01.DBF ... List of Temporary Files ======================= File Size(MB) Tablespace Maxsize(MB) Tempfile Name ---- -------- -------------------- ----------- -------------------- 1 63 TEMP 32767 R:\ORACLE\ORADATA01\GPI\TEMP01.DBF ==== Einen Oracle Tablespace Online Umziehen ===== Im welchen Status kann der Tablespace umgezogen werden? ^Tablespace^ TBS Status online^TBS Status offline^DB im Mount Status^ |TEMP|YES|YES|YES| |UNDO|YES|YES|YES| |USER|NO|YES|YES| |SYSTEM|NO|NO|YES| |SYSAUX|NO|NO|YES| === Umzug Temp Tablespace === Ein Temp Tablespace wurde auf der falschen ASM Disk Gruppe angelegt. Ablauf: * Neuen Temp Tablespace definieren * DB auf neuen TEMP Tablespace umstellen * Warten bis alle laufenden Transaktionen auf den Tablespace beendet sind * Altem TEMP Tablespace löschen * Falls der alten Namen behalten werden soll, das ganze von vorn CREATE TEMPORARY TABLESPACE TEMP01 TEMPFILE '+DATASSD' SIZE 2000M AUTOEXTEND ON NEXT 20M MAXSIZE 20000M EXTENT MANAGEMENT LOCAL UNIFORM SIZE 2M; ALTER DATABASE DEFAULT TEMPORARY TABLESPACE TEMP01; --alten löschen DROP tablespace TEMP INCLUDING CONTENTS AND DATAFILES; === Umzug Undo Tablespace === Auch der Undo Tablespace kann online theoretisch umgezogen werden, es kann aber etwas dauern, bis wirklich keine Transaktion mehr auf den Undo Tablespace zugreift. Beispiel für ein zwei Knoten Cluster mit den beiden Instancen GPIDB1 und GPIDB2: CREATE UNDO TABLESPACE UNDOTBS01 DATAFILE '+DATASSD' SIZE 3000M AUTOEXTEND ON NEXT 20M MAXSIZE 20000M; CREATE UNDO TABLESPACE UNDOTBS02 DATAFILE '+DATASSD' SIZE 3000M AUTOEXTEND ON NEXT 20M MAXSIZE 20000M; alter system set undo_tablespace='UNDOTBS01' scope=both sid='GPIDB1'; alter system set undo_tablespace='UNDOTBS02' scope=both sid='GPIDB2'; Die alten Undo Tablespaces können aber erst dann gelöschte werden, wenn alte laufenden Transaktionen auf den Tablespace beendet sind und die Undo Retention Period abgelaufen ist. SELECT a.name,b.status , d.username , d.sid , d.serial# FROM v$rollname a,v$rollstat b, v$transaction c , v$session d WHERE a.usn = b.usn AND a.usn = c.xidusn AND c.ses_addr = d.saddr AND a.name IN ( SELECT segment_name FROM dba_segments WHERE tablespace_name = 'UNDOTBS1' ); show parameter undo_retention DROP tablespace UNDOTBS1 INCLUDING CONTENTS AND DATAFILES; DROP tablespace UNDOTBS2 INCLUDING CONTENTS AND DATAFILES; siehe auch: * http://docs.oracle.com/cd/E18283_01/server.112/e17120/undo005.htm#i1106407 === Umzug User Tablespace === Ablauf: * Tablespace offline nehmen * Tablespace Datendateien mit RMAN kopieren * Dateidateien mit RMAN um Switchen RMAN> connect target / RMAN> report schema; Bericht des Datenbankschemas f³r Datenbank mit db_unique_name GPI Liste mit permanenten Datendateien =========================== Dateigröße (MB) Tablespace RB-Segmente Datendateiname ---- -------- -------------------- ------- ------------------------ ... 9 100 GPI_MDS *** D:\ORACLE\ORADATA01\GPI\GPI_MDS.DBF ... RMAN> sql "alter tablespace gpi_mds offline immediate"; RMAN> backup as copy tablespace GPI_MDS format 'D:\ORACLE\ORADATA02\GPI\GPI_MDS.DBF'; RMAN> switch tablespace gpi_mds to copy; RMAN> recover tablespace gpi_mds; RMAN> sql "alter tablespace gpi_mds online"; RMAN> report schema; Bericht des Datenbankschemas f³r Datenbank mit db_unique_name GPI Liste mit permanenten Datendateien =========================== Dateigröße (MB) Tablespace RB-Segmente Datendateiname ---- -------- -------------------- ------- ------------------------ ... 9 100 GPI_MDS *** D:\ORACLE\ORADATA02\GPI\GPI_MDS.DBF ... ------------- siehe auch: - http://docs.oracle.com/cd/E11882_01/backup.112/e10643/rcmsynta2020.htm#RCMRF159 === Umzug System / SYSAUX Tablespace === Gleicher Ablauf wie zuvor aber die DB befindet sich im Mount Status! Ablauf: * Tablespace Datendateien mit RMAN kopieren * Dateidateien mit RMAN um Switchen ----- ===== Offline die gesamte Datenbank einmal umziehen ===== Kann die DB offline umgezogen werden, ist das recht einfach, die Datenbank wird sauber gestoppt, alle Dateien bis auf die Control Files werden in die neue Struktur kopiert und neue Control File in den neuen Locations werden angelegt. Ablauf: - Backup von der aktuellen Datenbank erstellen - Trace vom Control File erstellen - init.ora Datei aus dem aktuellen spfile erstellen - Datenbank komplett stoppen - Neue Verzeichnisstruktur bei Bedarf anlegen und die Rechte an dem DB User (Full Control!) vergeben! - Alle Dateien in die neuen Daten Location kopieren - Trace vom Control File auf die neuen Speicherorte anpassen - init.ora auf die neuen Speicherorte der Control Files anpassen - Datenbank im nomount Modus starten und Control Files neu anlegen - Datenbank mounten - Neuen SPfile wieder aus den aktuelle Einstellungen erzeugen - DB neu starten - Bei Bedarf DIAG/ADR Home und Fast/Flash Recovery Area umziehen - Neues Backup anlegen ===Trace vom Control File erstellen== sqlplus / as sysdba alter database backup controlfile to trace as 'd:\temp\gpi_control_trace.txt'; ===init.ora als Text Datei vom spfile erstellen=== create pfile='d:\temp\initGPI.ora' from spfile; ===Datenbank herunterfahren/stoppen=== shutdown immediate exit === Neue Verzeichnisstruktur anlegen=== Neue Verzeichnisstruktur anlegen und die Rechte an dem DB User (Full Control!) und die Eigentümerschaft auf R\oracle und alle Unterordner vergeben! {{ :dba:oracle_umziehen_advanced_security_settings_auf_dateibaum.png?300 | Eigentümer neu vergeben!}} === Dateien kopieren === Im nächsten Schritt Datendateien und Redolog Dateien um kopieren in die neuen Location: cp D:\oracle\oradata\GPI\*.dbf R:\oracle\oradata01\GPI cp D:\oracle\oradata\GPI\REDO01.LOG R:\oracle\oradata01\GPI cp D:\oracle\oradata\GPI\REDO02.LOG R:\oracle\oradata02\GPI cp D:\oracle\oradata\GPI\REDO03.LOG R:\oracle\oradata02\GPI === init.ora Settings anpassen === init.ora in einem Editor öffnen Neue Control file Location in der init.ora anpassen, Parameter control_files #Alt *.control_files='D:\oracle\oradata\GPI\control01.ctl','D:\oracle\fast_recovery_area\GPI\control02.ctl' #Neu *.control_files='R:\oracle\oradata01\GPI\control01.ctl','R:\oracle\oradata02\GPI\control02.ctl' ! Prüfen ob die Verzeichnisstruktur auch existiert und die Rechte darauf für den Oracle Prozess Owner vergeben sind! === Script für das Erzeugen der Control Files erstellen === Trace vom Control File öffnen und dort die Verzeichnisse anpassen Dazu den Bereich den Bereich mit dem NORESTLOGS Case suchen und diesen dann in einen neue Datei „create_controlfile.sql“ kopieren. Diesen Abschnitt suchen und kopieren: .... -- Set #1. NORESETLOGS case STARTUP NOMOUNT .... -- bis ALTER TABLESPACE TEMP ... Neue Datei “create_controlfile.sql” anpassen: # #STARTUP NOMOUNT auskommentieren! # CREATE CONTROLFILE REUSE DATABASE "GPI" NORESETLOGS ARCHIVELOG MAXLOGFILES 16 MAXLOGMEMBERS 3 MAXDATAFILES 100 MAXINSTANCES 8 MAXLOGHISTORY 292 LOGFILE GROUP 1 'R:\ORACLE\ORADATA01\GPI\REDO01.LOG' SIZE 50M BLOCKSIZE 512, GROUP 2 'R:\ORACLE\ORADATA02\GPI\REDO02.LOG' SIZE 50M BLOCKSIZE 512, GROUP 3 'R:\ORACLE\ORADATA02\GPI\REDO03.LOG' SIZE 50M BLOCKSIZE 512 -- STANDBY LOGFILE DATAFILE 'R:\ORACLE\ORADATA01\GPI\SYSTEM01.DBF', 'R:\ORACLE\ORADATA01\GPI\SYSAUX01.DBF', 'R:\ORACLE\ORADATA01\GPI\UNDOTBS01.DBF', 'R:\ORACLE\ORADATA01\GPI\USERS01.DBF', 'R:\ORACLE\ORADATA01\GPI\PMDB_DAT1.DBF', 'R:\ORACLE\ORADATA01\GPI\PMDB_NDX1.DBF', 'R:\ORACLE\ORADATA01\GPI\PMDB_LOB1.DBF' CHARACTER SET AL32UTF8 ; -- Configure RMAN configuration record 1 VARIABLE RECNO NUMBER; EXECUTE :RECNO := SYS.DBMS_BACKUP_RESTORE.SETCONFIG('CONTROLFILE AUTOBACKUP','ON'); -- Configure RMAN configuration record 2 VARIABLE RECNO NUMBER; EXECUTE :RECNO := SYS.DBMS_BACKUP_RESTORE.SETCONFIG('DEVICE TYPE','DISK PARALLELISM 1 BACKUP TYPE TO BACKUPSET'); -- Configure RMAN configuration record 3 VARIABLE RECNO NUMBER; EXECUTE :RECNO := SYS.DBMS_BACKUP_RESTORE.SETCONFIG('RETENTION POLICY','TO REDUNDANCY 1'); -- Commands to re-create incarnation table -- Below log names MUST be changed to existing filenames on -- disk. Any one log file from each branch can be used to -- re-create incarnation records. -- ALTER DATABASE REGISTER LOGFILE 'D:\ORACLE\FAST_RECOVERY_AREA\GPI\ARCHIVELOG\2015_06_10\O1_MF_1_1_%U_.ARC'; -- Recovery is required if any of the datafiles are restored backups, -- or if the last shutdown was not normal or immediate. RECOVER DATABASE -- All logs need archiving and a log switch is needed. ALTER SYSTEM ARCHIVE LOG ALL; -- Database can now be opened normally. ALTER DATABASE OPEN; -- Commands to add tempfiles to temporary tablespaces. -- Online tempfiles have complete space information. -- Other tempfiles may require adjustment. ALTER TABLESPACE TEMP ADD TEMPFILE 'R:\ORACLE\ORADATA01\GPI\TEMP01.DBF' SIZE 66060288 REUSE AUTOEXTEND ON NEXT 655360 MAXSIZE 32767M; -- End of tempfile additions. === Controlfiles neu anlagen === Datenbank im mount Modus mit der angepassen init.ora starten sqlplus / as sysdba startup pfile='D:\temp\initGPI.ora' nomount --Controlfile Parameter pürfen ob die neue Location angezeigt wird! show parameter control -- Controlfile mit Script von oben neu erzeugen sql>@D:\temp\create_controlfile.sql Kontrolldatei wurde erstellt. PL/SQL-Prozedur erfolgreich abgeschlossen. PL/SQL-Prozedur erfolgreich abgeschlossen. PL/SQL-Prozedur erfolgreich abgeschlossen. ORA-00283: Recovery Session wegen Fehlern abgebrochen ORA-00264: Kein Recovery nötig System wurde geõndert. Datenbank wurde geõndert. Tablespace wurde geõndert. Auf Verzeichnisebene prüfen ob alle Control Files auch da sind! ===SPFile neu erstellen=== -- aktuell verwendete Werte in den neuen spfile schreiben create spfile from memory; Datei erstellt. ==DB stoppen und neu starten== shutdown immediate exit sqlplus / as sysdba startup -- mit entsprechenden Skripten die DB Strukturen prüfen @dbfiles @redo @tablespace -- sicherheitshalber über alle Redo Logs einen Switch durchführen alter system switch logfile; alter system switch logfile; alter system switch logfile; alter system switch logfile; -- usw. Für die Skripte siehe https://orapowershell.codeplex.com/SourceControl/latest#sql/help.sql ====Weitere Schritte bei Bedarf==== ===Diag Home umziehen=== show parameter diagnostic_dest alter system set diagnostic_dest='R:\oracle' scope=both sid='*'; ===Fast/Flash Recovery Destination umziehen=== show parameter reco alter system set db_recovery_file_dest='R:\oracle\fast_recovery_area' scope=both sid='*'; * Dateien aus der alten Recovery Area alle nun umziehen * Alte Recovery Area umbennen bzw. löschen * Reste der alten Datenbank wie die alten Controlfiles löschen * Recovery Ara neu katalogisieren rman rman> connect target / rman> catalog start with 'R:\oracle\fast_recovery_area\GPI'; rman> crosscheck archivelog all; rman> crosscheck backup; === Abschluss == * Alert.log der Daten bank prüfen * Neue Backup durchführen! ---- === Probleme mit RMAN nach dem Umzug der Recovery Area auf einem Windows 8 / 2012 System === **dbgc_init_all failed with ORA-48146** RMAN> connect target / dbgc_init_all failed with ORA-48146 RMAN-00571: =========================================================== RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS =============== RMAN-00571: =========================================================== RMAN-12001: Kanal default konnte nicht ge÷ffnet werden RMAN-10008: Kanalkontext konnte nicht erstellt werden RMAN-10013: Fehler beim Initialisieren von PL/SQL Rechte Problem auf den neuen Recovery Area Ordner? DB läuft unter den "oracle_admin" User, alle Reche auf die komplette Verzeichnisstruktur vergeben, DB neu gestartet und erneut getestet => Keine Besserung.... Auch nach einen Rückbau auf das alte Verzeichnis immer noch der gleiche Fehler ? Der Fehler Code bedeutet das folgende: ORA-48146: missing read, write, or exec permission on directory during ADR initialization [string] [string] Cause: Error encountered when checking if the process has read, write, and exec privileges on directories needed by the ADR subsystem. This error occurs during the initialization of the ADR subsystem. Action: Check the input arguments to the ADR initialization routine and the state of the operating system. Ensure that the user has the proper permissions on the ADR directories. Das heißt, meiner RMAN Session fehlt ein Recht auf das ADR! Datenbank gestoppt, auf dem r:\oracle\diag Ordner den DB User mit hinzugefügt, alle Unterordner gelöscht und DB neu gestartet, keine Besserung des Fehlers! **Lösung** Nun eine Administrative Shell gestartet und rman aus diese Shell gestartet, das funktioniert! D.h. es fehlt dem aktuellen User ein Recht auf dem Diag Verzeichnis ohne Admin Rechte zuzugreifen! Die Frage ist jetzt nur warum das zuvor funktioniert hat und was hier gesetzt werden muss ….. für jeden Tipp dankbar! === Probleme beim nächsten Start mit "ORA-02778: Name given for the log directory is invalid" === Durch das Anlegen des SPfiles mit der Option "from memory" wurden alle DB Parameter in den SPFile geschrieben, auch die die auf Default Werten beim Startup gesetzt werden! **Der Fehler** sqlplus / as sysdba SQL>startup SQL>ORA-02778: Name given for the log directory is invalid **Die Lösung** Debugging durch das Anlegen eines neue Pfiles aus der verwendeten SPfile Konfiguration: sqlplus / as sysdba create pfile='d:\temp\initGPI_error.ora' from spfile; shutdown abort Öffenen der d:\temp\initGPI_error.ora und prüfen ob Pfade alle stimmen. Wie: #Richtig *.db_recovery_file_dest='R:\oracle\fast_recovery_area' # #Noch falsch! #Das hätte sich eigentlich nach setzen des db_recovery_file_dest auch automatisch anpassen sollen? #BUG! *.core_dump_dest='D:\oracle\diag\rdbms\gpi\gpi\cdump' *._diag_adr_trace_dest='D:\oracle\diag\rdbms\gpi\gpi\trace' Diese Werte anpassen und Datei speichern. Die Instanz nun mit der n"reparierte" init.ora starten und einen neuen SPfile erstellen: sqlplus / as sysdba SQL>startup pfile='d:\temp\initGPI_error.ora' SQL>create spfile from pfile='d:\temp\initGPI_error.ora'; SQL>shutdown immediate SQL>exit #Beenden und Neu starten! sqlplus / as sysdba SQL>startup