Oracle: Tablespace verwalten

Aus Wikibooks


Konfiguration von Tablespaces[Bearbeiten]

Nach der Installation von Oracle gibt es nur den SYSTEM-Tablespace (bei Oracle Version < 10g), ab Oracle Version 10g gibt es mind. den SYSTEM und den SYSAUX Tablespace.

Es ist empfehlenswert, die System-Daten und die Anwendungsdaten in getrennten Tablespaces zu speichern.

Für die Systemdaten kann man eigene Tablespaces einrichten für

  • Datadictionary (existiert schon)
  • Tools
  • Rollback-Segmente
  • Sort-Bereich (temporärer Tablespace)

Für die Anwendungsdaten kann man Tablespaces einrichten für

  • die einzelnen Fachgebiete
  • Indices

Informationen von Tablespaces auslesen[Bearbeiten]

     select
     file_name, tablespace_name, 
     bytes/1048576, maxbytes/1048576, CASE WHEN maxbytes = 0 THEN 0 ELSE 100*bytes/maxbytes END,
     blocks/1024, maxblocks/1024, CASE WHEN maxblocks = 0 THEN 0 ELSE 100*blocks/maxblocks END,
     status, autoextensible, online_status
     from
     dba_data_files order by tablespace_name;

Neuen Tablespace erstellen[Bearbeiten]

 CREATE TABLESPACE user_ts 
     DATAFILE 'c:\oracle\oradata\ora\userts.dbf' SIZE 10M;

Der Tablespace wird mit einer festen Größe von 10MB angelegt.

 CREATE TABLESPACE user_ts 
     DATAFILE 'c:\oracle\oradata\ora\userts.dbf' SIZE 10M
     EXTENT MANAGEMENT LOCAL UNIFORM SIZE 100K;

Die Extent-Verwaltung erfolgt bei diesem Tablespace lokal im Tablespace durch ein BITMAP und nicht über das Datadictionary. Alle Extents haben dieselbe Größe.

 CREATE TABLESPACE user_ts 
     DATAFILE 'c:\oracle\oradata\ora\userts.dbf' SIZE 10M
     AUTOEXTEND ON NEXT 200K  MAXSIZE 200M;

Dieser Tablespace wird zunächst mit 10MB angelegt. Er kann sich bei Bedarf in Schritten von 200 KB bis zu einer Maximalgröße von 200MB selbst erweitern.

Tablespace erweitern[Bearbeiten]

 ALTER TABLESPACE user_ts1 
     ADD DATAFILE 'c:\oracle\oradata\ora\userts1.dbf' SIZE 10M;
 ALTER TABLESPACE user_ts2 
     ADD DATAFILE 'c:\oracle\oradata\ora\userts2.dbf' SIZE 10M
     AUTOEXTEND ON NEXT 200K  MAXSIZE 200M;

Die beiden Tablespaces werden erweitert, indem eine weitere Datei hinzugefügt wird. Im ersten Fall ist es eine Datei mit fester Größe, im zweiten Fall ist es eine Datei, die sich bei Bedarf selbst erweitern kann.

 ALTER TABLESPACE user_ts1 
     ADD DATAFILE 'c:\oracle\oradata\ora\userts1.dbf' SIZE 10M
     AUTOEXTEND ON NEXT 200K  MAXSIZE 200M;
 ALTER TABLESPACE user_ts2 
     ADD DATAFILE 'c:\oracle\oradata\ora\userts2.dbf' SIZE 10M
     AUTOEXTEND OFF;
 ALTER DATABASE 
     DATAFILE 'c:\oracle\oradata\ora\userts2.dbf'
     AUTOEXTEND ON NEXT 200K MAXSIZE 100M;

Wenn der TEMP Tablespace erweitert werden soll, dann wird TEMPFILE anstelle von DATAFILE angegeben:

 ALTER TABLESPACE temp 
     ADD TEMPFILE 'c:\oracle\oradata\ora\temp2.dbf' SIZE 10M
     AUTOEXTEND ON NEXT 200K  MAXSIZE 200M;

Die AUTOEXTEND-Einstellung kann man nachträglich mit Hilfe des ALTER-DATABASE-Befehls verändern.

 ALTER DATABASE
     DATAFILE 'c:\oracle\oradata\ora\userts1.dbf' 
    resize 10M;

Die Tablespace-Datei wird wieder verkleinert auf 10 MB. Dieser Befehl kann nur dann ausgeführt werden, wenn das bestehende Datenvolumen nicht den abzutrennenden Speicherbereich verwendet.

 ALTER TABLESPACE user_ts1 COALESCE;

Die einzelnen hintereinanderliegenden freien Extents in den Tablespace-Dateien werden zu ganzen Blöcken zusammengefasst. Dadurch können neue größere Extents in dem freien Platz angelegt werden.

Tablespace administrieren[Bearbeiten]

Für bestimmte administrative Tätigkeiten müssen Tablespaces offline gesetzt werden.

In einer NOARCHIVELOG-Umgebung (d.h. es ist kein ARCH-Prozess aktiv, dementsprechend werden die Redolog-Dateien nicht archiviert):

 ALTER TABLESPACE user_ts1 OFFLINE DROP;
 ALTER TABLESPACE user_ts1 ONLINE;

In einer ARCHIVELOG-Umgebung (die Redolog-Dateien werden vom ARCH-Prozess archiviert):

 ALTER TABLESPACE user_ts1 OFFLINE NORMAL;
 ALTER TABLESPACE user_ts1 OFFLINE IMMEDIATE;
 ALTER TABLESPACE user_ts1 OFFLINE TEMPORARY;
 ALTER TABLESPACE user_ts1 ONLINE;

Schlüsselwort NORMAL: die Anweisung wird nur dann ausgeführt, wenn sich der Tablespace in einer Fehlersituation befindet.

Schlüsselwort IMMEDIATE: der Tablespace wird sofort in den OFFLINE-Modus gesetzt, auch wenn eine Transaktion diesen gerade benutzt. Beim ONLINE-Setzen muss ein Recover stattfinden.

Schlüsselwort TEMPORARY: die Dateien, die sich nicht in einer Fehlersituation befinden, werden durch einen Checkpoint gesichert. Beim ONLINE-Setzen muss ein Recover nur für die fehlerhaften Dateien stattfinden.

 ALTER DATABASE DATAFILE <Dateiname> OFFLINE;
 ALTER DATABASE DATAFILE <Dateiname> OFFLINE DROP;
 ALTER DATABASE DATAFILE <Dateiname> ONLINE;

Man kann auch einzelne Datenbankdateien online / offline setzen. In einer NOARCHIVELOG-Umgebung muss der Parameter DROP angegeben werden. Dies kann es ggf. erforderlich machen ein recover auf die Datenbankdatei auszuführen, bevor sie wieder online gesetzt werden kann.

 ALTER DATABASE RECOVER DATAFILE <Dateiname>;

Datenbankdatei umbenennen[Bearbeiten]

1. Schritt: Tablespace OFFLINE setzen

2. Schritt: Datei auf Betriebssystemebene kopieren (Oracle schaut in beiden Dateien nach)

3. Schritt: Neuen Namen im Oracle bekannt geben:

 ALTER TABLESPACE user_ts 
    RENAME DATAFILE <Dateiname-alt> TO <Dateiname-neu>;

oder:

 ALTER TABLESPACE user_ts 
    RENAME DATAFILE <Dateiname1-alt>, <Dateiname2-alt>, ...  
    TO <Dateiname1-neu>, <Dateiname2-neu>, ... ;

4. Schritt: Tablespace ONLINE setzen

5. Kontrollieren:

SQL> select * from v$datafile;
...
Online
...

6. Wenn die neue Datenbankdatei Online ist, kann die alte Datenbankdatei auf Betriebssystemebene gelöscht werden

Falls mehrere Datenbankdateien oder Dateien aus dem SYSTEM-Tablespace umbenannt werden sollen, können folgende Schritte ausgeführt werden:

1. Schritt: Datenbank in den MOUNT-Status versetzen

2. Schritt: Datei mit Betriebsystemmitteln umbenennen

3. Schritt: Neuen Namen im Oracle bekannt geben:

 ALTER DATABASE RENAME FILE <Dateiname-alt> TO <Dateiname-neu>;

oder:

 ALTER DATABASE RENAME 
    FILE <Dateiname1-alt>, <Dateiname2-alt>, ... 
    TO <Dateiname1-neu>, <Dateiname2-neu>, ... ;

4. Schritt: Datenbank in den OPEN-Status versetzen

Tablespace löschen[Bearbeiten]

Falls der Tablespace leer ist (keine Tabellen, Indexe, Rollback-Segmente vorhanden):

 DROP TABLESPACE user_ts;

Falls sich noch Objekte im Tablespace befinden:

 DROP TABLESPACE user_ts INCLUDING CONTENTS;

Ab Version 9 können auch die Datendateien auf Betriebssystemebene mit gelöscht werden:

 DROP TABLESPACE user_ts INCLUDING CONTENTS AND DATAFILES;

Falls sich noch Objekte im Tablespace befinden und von anderen Objekten Referenzen auf die Objekte im zu löschenden Tablespace existieren:

 DROP TABLESPACE user_ts INCLUDING CONTENTS CASCADE CONSTRAINTS;

Ohne die Angabe "AND DATAFILES" müssen die Dateien noch manuell mit Betriebssystemmitteln gelöscht werden.

Temporary Tablespace[Bearbeiten]

Wenn bei der Ausführung von SQL-Statements Sortierungen gefordert werden, und diese Daten für die SGA zu umfangreich sind, dann werden sie in einem Tablespace auf der Platte zwischengespeichert und sortiert. Dabei können kurzfristig viele Extents angefordert werden, die danach wieder freigegeben werden. Um die Speicherplatzverwaltung im SYSTEM-Tablespace und in den Daten-Tablespaces nicht unnötig zu belasten, sollten temporäre Tablespaces zur Aufnahme dieser Daten bereitgestellt werden.

Temporary Tablespace anlegen

 CREATE TEMPORARY TABLESPACE user_temp_ts TEMPFILE <Dateiname> SIZE 10M;

Ein temporärer Tablespace hat ein TEMPFILE und KEIN DATAFILE.

Man kann auch einen "normalen" Tablespace in einen temporären Tablespace umwandeln:

 ALTER TABLESPACE user_ts TEMPORARY;

Und man kann einen temporären Tablespace in einen "normalen" Tablespace umwandeln:

 ALTER TABLESPACE user_temp_ts PERMANENT;

Datadictionary-Views für Tablespaces[Bearbeiten]

Anzeige aller Tablespaces:

 select * from user_tablespaces;
 select * from dba_tablespaces;

Anzeige der Datendateien:

 select * from dba_data_files;
 select * from v$datafile;

Anzeige der Temp-Dateien:

 select * from dba_temp_files;

Freiplatzverwaltung:

 select * from dba_free_space;

Tablespaces mit AUTOEXTEND ON:

 select * from filext$;

Anzeige der Objekte in den Tablespaces:

 select * from dba_segments;

Wie groß ist der Redolog-Bereich? Redologs werden nicht in einem Tablespace gespeichert, sondern als "Archive-Log-Dateien" in einem dafür vorgesehenen Verzeichnis ausgegeben.

 select group#, bytes / 1024 / 1024 Redo_mb from v$log;