Welcher Datenbankadministrator musste - aus welchem Grund auch immer: Plattenprobleme, Umstieg auf ASM oder wieder zurück, neue Philosophie in der Verzeichnisstruktur - nicht schon einmal Datendateien umziehen bzw. umbenennen? Bis Version 11.2 war dies ausschließlich offline zu erledigen, also immer mit einem Wartungsfenster und Downtime verbunden.
ALLGEMEINE SYNTAX
Die allgemeine Syntax dazu lautet:
ALTER DATABASE MOVE DATAFILE {<nr> | '<filename_old>' | '<ASM_filename_old>'}
[TO {'<filename_new>' | '<ASM_filename_new>'}] [REUSE] [KEEP];
Dabei kann die Quelldatei entweder durch die Dateinummer oder den Dateipfad und -namen angegeben werden. Die Zieldatei ist nur durch Pfad und Name zu bestimmen. Existiert der Pfad noch nicht, werden die fehlenden Verzeichnisse von Oracle automatisch erzeugt (unter Windows und Linux getestet).
Im Falle von Oracle Managed Files (OMF) kann die TO Klausel weggelassen werden. Oracle erzeugt dann einen eindeutigen Dateinamen in dem Verzeichnis, das durch db_create_file_dest festgelegt worden ist.
Bei Verwendung von REUSE wird eine bereits bestehende Datei einfach überschrieben.
Wird KEEP angegeben, wird die alte Datei am Ende des MOVE-Vorgangs nicht gelöscht, sondern bleibt bestehen. KEEP geht nicht beim Verschieben von OMF Dateien.
EINSATZMÖGLICHKEITEN
Mit Hilfe des neu eingeführten Features lassen sich nun Datendateien online verschieben, kopieren und/oder umbenennen. Dabei kann eine Datei aus dem (normalen) Dateisystem als OMF Datei oder als ASM Datei abgelegt werden. Ebenso können Sie damit ASM Dateien von einer Disk-Group in die andere umziehen oder ganz einfach wieder die Rückkehr ins (normale) Dateisystem vornehmen. Der RMAN ist hierfür nicht mehr erforderlich.
Während der Durchführung erzeugt die Datenbank eine Kopie der Datendatei und hängt am Ende lediglich den Zeiger innerhalb der Control-Files um. Und das Beste: das manuelle Kopieren bzw. Verschieben der Datei auf Betriebssystem-Ebene gehört endlich der Vergangenheit an.
BEISPIELE
Die nachfolgenden Beispiele sollen die verschiedenen Möglichkeiten des Online-Verschiebens demonstrieren.
1.) VERSCHIEBEN INNERHALB DES (NORMALEN) DATEISYSTEMS
Ermittlung der aktuellen Datendateistruktur
SELECT file_id, file_name FROM dba_data_files;
FILE_ID FILE_NAME
---------- --------------------------------------------------
1 /u01/app/oracle/oradata/o21c/system01.dbf
3 /u01/app/oracle/oradata/o21c/sysaux01.dbf
6 /u01/app/oracle/oradata/o21c/users01.dbf
4 /u01/app/oracle/oradata/o21c/undotbs01.dbf
Verschieben der Datei 6 auf eine andere Platte
ALTER DATABASE MOVE DATAFILE 6 TO
'/u02/oracle/oradata/o12c/users01.dbf';
Ermittlung der aktuellen Datendateistruktur
SELECT file_id, file_name FROM dba_data_files;
FILE_ID FILE_NAME
---------- --------------------------------------------------
1 /u01/app/oracle/oradata/o21c/system01.dbf
3 /u01/app/oracle/oradata/o21c/sysaux01.dbf
6 /u02/oracle/oradata/o21c/users01.dbf
4 /u01/app/oracle/oradata/o21c/undotbs01.dbf
2.) KOPIEREN AUS DEM (NORMALEN) DATEISYSTEM UND ANLEGEN ALS OMF DATEI
Definieren des OMF-Verzeichnisses
SQL> ALTER SYSTEM SET db_create_file_dest='/u02/oracle/oradata';
Kopieren der Datendatei 6 mit Vorhalten der alten Datei
SQL> ALTER DATABASE MOVE DATAFILE 6 KEEP;
Ermittlung der aktuellen Datendateistruktur
SQL> SELECT file_id, file_name FROM dba_data_files;
FILE_ID FILE_NAME
---------- ----------------------------------------------------------
1 /u01/app/oracle/oradata/o21c/system01.dbf
3 /u01/app/oracle/oradata/o21c/sysaux01.dbf
6 /u02/oracle/oradata/o21c/datafile/o1_mf_users_cvrokp9x.dbf
4 /u01/app/oracle/oradata/o21c/undotbs01.dbf
3.) VERSCHIEBEN IN ASM UND ANLEGEN ALS OMF DATEI
Dieses Beispiel ist analog zu 2.) durchzuführen. ASM und deren Disk-Groups müssen bereits vorbereitet sein.
Definieren des OMF-Verzeichnisses
ALTER SYSTEM SET db_create_file_dest='+DATA';
Verschieben der Datendatei 6 in ASM:
ALTER DATABASE MOVE DATAFILE 6;
Ermittlung der aktuellen Datendateistruktur
SELECT file_id, file_name FROM dba_data_files;
FILE_ID FILE_NAME
---------- ------------------------------------------
1 /u01/app/oracle/oradata/o21c/system01.dbf
3 /u01/app/oracle/oradata/o21c/sysaux01.dbf
6 +DATA/o21c/datafile/users.264.887106211
4 /u01/app/oracle/oradata/o21c/undotbs01.dbf
4.) VERSCHIEBEN INNERHALB EINER CONTAINER-DATENBANK
Das Verschieben einer Datendatei innerhalb einer Container-Umgebung erfolgt analog zu einer Nichtcontainer-Umgebung. Zu beachten ist lediglich, dass sich nur Dateien des aktuellen Containers verschieben lassen, also nur Dateien, die bei der Abfrage von DBA_DATA_FILES ausgegeben werden. Beim Versuch eine Datei aus einem nicht aktuellen Container zu verschieben, erhalten Sie den Oracle Fehler ORA-01516.
ORA-01516: nonexistent log file, data file, or temporary file ...
Der selbe Fehler kommt zurück, wenn Sie auf diese Art versuchen eine temporäre Datendatei zu verschieben.
Hinweise
Unter Windows besteht eine sehr hohe Wahrscheinlichkeit, dass beim Verschieben die alte Datei nicht automatisch auf Betriebssystem-Ebene gelöscht werden kann. Dazu erhält man in der Alert-Datei eine entsprechende Fehlermeldung:
Tue Aug 23 12:11:41 2020
alter database move datafile 7 to 'E:\ORACLE\ORADATA\O12C\AUD01.DBF' reuse
Tue Aug 23 12:11:41 2020
Moving datafile E:\ORACLE\OMF\O12C\DATAFILE\O1_MF_AUDTBS_CVR5LTN1_.DBF (7) to E:\ORACLE\ORADATA\O12C\AUD01.DBF
Tue Aug 23 12:12:13 2020
Move operation committed for file E:\ORACLE\ORADATA\O12C\AUD01.DBF
WARNING: Cannot delete old file E:\ORACLE\OMF\O12C\DATAFILE\O1_MF_AUDTBS_CVR5LTN1_.DBF left after datafile move
Tue Aug 23 12:12:15 2020
Errors in file E:\ORACLE\diag\rdbms\o21c\o21c\trace\o21c_ora_3932.trc:
ORA-27056: Datei konnte nicht gelöscht werden
OSD-04024: Datei kann nicht gelöscht werden.
O/S-Error: (OS 32) Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird.
Completed: alter database move datafile 7 to 'E:\ORACLE\ORADATA\O21C\AUD01.DBF' reuse
Beachten Sie, dass eine Reihe von internen Sperren während des Verschiebens gesetzt werden, die allerdings keine Auswirkung auf die Verfügbarkeit der Daten haben. Im folgenden Beispiel hat die Session mit der SID 329 den MOVE-Vorgang angestoßen:
-- Session mit SID=329
SQL> ALTER DATABASE MOVE DATAFILE 7;-- Parallele Abfrage von V$LOCK aus einer anderen Session
SQL> SELECT sid, type, id1, id2, lmode, ctime
FROM v$lock WHERE sid=329;
SID TY ID1 ID2 LMODE CTIME
------- -- ------- ------- ------- ------
...
329 MR 7 0 4 18 -> Media Recovery
329 IS 0 0 4 18 -> Instance State
329 MV 0 7 6 18 -> Online Datafile Move
329 MV 1 7 4 18
Machen Sie sich bewußt, dass Sie für den MOVE-Vorgang zunächst den doppelten Speicherplatz benötigen, da Oracle immer eine Kopie der Datei erstellt und das Original erst am Schluss löscht (sofern KEEP nicht angegeben worden ist).
Auch innerhalb einer Data Guard-Umgebung ist das Online-Verschieben möglich, allerdings wird dieser Vorgang nicht auf der Standby-Seite nachgespielt und müsste dort separat ausgeführt werden.
Im Falle eines FLASHBACK DATABASE Kommandos wird ein ALTER DATABASE MOVE DATAFILE nicht wieder zurückgesetzt, aber der Datenbestand auf den alten Stand gebracht.
Damit haben Sie einen Einblick in ein für den Administrator sehr nützliches neues Feature bekommen. Wenn Sie einen Überblick über die restlichen neuen Funktionen der Version 12c erhalten wollen, dann besuchen Sie doch unseren 12c New Features Kurs.