News
DBA-Tipp: Aufräumen ohne Downtime.

Die Information ist ein schnelllebiges Gut. Jeden Tag werden wir mit hunderten Informationen zugemüllt. Deshalb sind wir bestrebt uns auf das Wesentliche zu konzentrieren und nur substantiell nachhaltige Informationen bereitzustellen.

Icon Unternehmen

In Oracle Version 12c ist es nun mit dem SQL-Statement "ALTER DATABASE MOVE DATAFILE" erstmals möglich ein Datenfile zu verschieben oder umzubenennen, während die Datenbank geöffnet ist und die Benutzer darauf zugreifen. 

ALTER DATABASE MOVE DATAFILE ( 'filename' | 'ASM_filename' | file_number )
 [ TO ( 'filename' | 'ASM_filename' ) ] 
 [ REUSE ] [ KEEP ] 

Bei diesem Vorgang werden die Pointer, die auf diese Datei verweisen, in den Controlfiles geändert. Gleichzeitig werden die Dateien auch physikalisch umbenannt oder im Betriebssystem verschoben. 

Wenn es bereits eine Datei mit dem gleichen Namen und Speicherort, wie dem von der Anweisung "ALTER DATABASE" angegebenen Ziel, gibt, schlägt die Anweisung standardmäßig fehl. Wird "REUSE" im Statement mit angegeben, überschreibt Oracle hierbei die Datei, welche umbenannt oder verschoben werden sollte. 

sys@cdb$root:cdb> set linesize 400 
col file_name for a70 
col tablespace_name for a20 
select tablespace_name,file_id,file_name,round((bytes/1024/1024),1) as MB,round((maxbytes/1024/1024),1) as max_MB, autoextensible, status from dba_data_files order by 1,2; 

TABLESPACE_NAME         FILE_ID FILE_NAME                                     MB         MAX_MB AUT STATUS 
-------------------- ---------- --------------------------------------------- ---------- ---------- --- --------- 
SYSAUX                        3 +DG_DATA/CDB/DATAFILE/sysaux.257.886775743    800        32768  YES AVAILABLE 
SYSTEM                        1 +DG_DATA/CDB/DATAFILE/system.267.878205115    700        32768  YES AVAILABLE 
UNDOTBS1                      5 +DG_DATA/CDB/DATAFILE/undotbs1.263.878205123  845        32768  YES AVAILABLE 
USERS                         6 +DG_DATA/CDB/DATAFILE/users.256.878205137     5          32768  YES AVAILABLE 

4 rows selected

sys@cdb$root:cdb> HOST . ~/bin/oracle_env.sh grid; asmcmd ls -ls +DG_DATA/CDB/DATAFILE/sysaux.257.878205121 
Type      Redund  Striped  Time             Sys  Block_Size  Blocks      Bytes      Space  Name 
DATAFILE  UNPROT  COARSE   JUL 02 23:00:00  Y          8192  102401  838868992  847249408  sysaux.257.878205121 

sys@cdb$root:cdb> ALTER DATABASE MOVE DATAFILE '+DG_DATA/CDB/DATAFILE/sysaux.257.878205121' TO '/tmp/sysaux.257.87820512' REUSE; 

Database altered. 

sys@cdb$root:cdb> HOST . ~/bin/oracle_env.sh grid; asmcmd ls +DG_DATA/CDB/DATAFILE/sysaux.257.878205121 
ASMCMD-8002: entry 'sysaux.257.878205121' does not exist in directory '+DG_DATA/CDB/DATAFILE/' 

sys@cdb$root:cdb> HOST ls -alh /tmp/sysaux* 
-rw-r----- 1 oracle asmadmin 801M Aug  3 14:33 /tmp/sysaux.257.87820512

Wenn eine Datei mit dem "ALTER DATABASE MOVE DATAFILE"-Statement umbenannt oder verlagert wird, wird während der Operation eine Kopie der Datendatei erstellt. Es muss ausreichend Speicherplatz für die ursprüngliche Datendatei und die Kopie vorhanden sein, damit dies gelingt. Am Ende der Operation wird die Originaldatei standardmäßig gelöscht. 

Wird die Option "KEEP" verwendet, wird die Originaldatei nicht gelöscht. Die Datenbank verwendet in diesem Fall jedoch nur das Datenfile, welches als Ziel der Operation angegeben wurde.

sys@cdb$root:cdb> alter database move datafile '/tmp/sysaux.257.87820512' TO '+DG_DATA' KEEP; 

sys@cdb$root:cdb> HOST . ~/bin/oracle_env.sh grid; asmcmd ls -ls +DG_DATA/CDB/DATAFILE/sysaux.* 
Type      Redund  Striped  Time             Sys  Block_Size  Blocks      Bytes      Space  Name 
DATAFILE  UNPROT  COARSE   AUG 03 14:00:00  Y          8192  102401  838868992  847249408  SYSAUX.257.886775743 

sys@cdb$root:cdb> HOST ls -alh /tmp/sysaux* 
-rw-r----- 1 oracle asmadmin 801M Aug  3 14:35 /tmp/sysaux.257.87820512 



sys@cdb$root:cdb> set linesize 400 
col file_name for a70 
col tablespace_name for a20 
select tablespace_name,file_id,file_name,round((bytes/1024/1024),1) as MB,round((maxbytes/1024/1024),1) as max_MB, autoextensible, status from dba_data_files order by 1,2; 


TABLESPACE_NAME         FILE_ID FILE_NAME                                                                      MB     MAX_MB AUT STATUS 
-------------------- ---------- ---------------------------------------------------------------------- ---------- ---------- --- --------- 
SYSAUX                        3 +DG_DATA/CDB/DATAFILE/sysaux.257.886775743                                    800      32768 YES AVAILABLE 
SYSTEM                        1 +DG_DATA/CDB/DATAFILE/system.267.878205115                                    700      32768 YES AVAILABLE 
UNDOTBS1                      5 +DG_DATA/CDB/DATAFILE/undotbs1.263.878205123                                  845      32768 YES AVAILABLE 
USERS                         6 +DG_DATA/CDB/DATAFILE/users.256.878205137                                       5      32768 YES AVAILABLE 

4 rows selected.

Fazit:

“ALTER DATABASE MOVE DATAFILE” erleichtert die Aufräumarbeiten im Datendschungel. 

Zusätzlich kommt man mit diesem Feature einer 100%igen Verfügbarkeit der Datenbank wieder ein Stück näher. Wenn Oracle in einer der nächsten Versionen auch die Aktivierung, bzw. Deaktivierung des Archivelog-Modus zur Laufzeit implementieren würde, bräuchte man einige Wartungsfenster weniger.