Benutzer-Werkzeuge

Webseiten-Werkzeuge


dba:oracle_tablespace_umziehen

Datenbank Dateien umziehen - Online und Offline

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 onlineTBS Status offlineDB im Mount Status
TEMPYESYESYES
UNDOYESYESYES
USERNOYESYES
SYSTEMNONOYES
SYSAUXNONOYES

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;

DROP tablespace TEMP01  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:

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:

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:

  1. Backup von der aktuellen Datenbank erstellen
  2. Trace vom Control File erstellen
  3. init.ora Datei aus dem aktuellen spfile erstellen
  4. Datenbank komplett stoppen
  5. Neue Verzeichnisstruktur bei Bedarf anlegen und die Rechte an dem DB User (Full Control!) vergeben!
  6. Alle Dateien in die neuen Daten Location kopieren
  7. Trace vom Control File auf die neuen Speicherorte anpassen
  8. init.ora auf die neuen Speicherorte der Control Files anpassen
  9. Datenbank im nomount Modus starten und Control Files neu anlegen
  10. Datenbank mounten
  11. Neuen SPfile wieder aus den aktuelle Einstellungen erzeugen
  12. DB neu starten
  13. Bei Bedarf DIAG/ADR Home und Fast/Flash Recovery Area umziehen
  14. 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!

 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
Cookies helfen bei der Bereitstellung von Inhalten. Durch die Nutzung dieser Seiten erklären Sie sich damit einverstanden, dass Cookies auf Ihrem Rechner gespeichert werden. Weitere Information
"Autor: Gunther Pipperr"
dba/oracle_tablespace_umziehen.txt · Zuletzt geändert: 2015/06/11 11:33 von Gunther Pippèrr