In-Database Archiving: Konzepte, Setup und Einsatz
von Ulrike Schwinn, Oracle Deutschland B.V. & Co. KG
Häufig gibt es die Anforderung bestimmte Zeilen einer Tabelle für die Anwendungen "unsichtbar" zu machen.
Die Realisierung kann über verschiedenste Methoden wie zum Beispiel das Anlegen von Views oder auch den Einsatz von Virtual Private Database erfolgen.
In dem Zusammenhang sollte man auch über das Feature In-Database Archiving nachdenken, das ab
Oracle Database 12c in allen Editionen sofort nach der Installation zur Verfügung steht.
Die Funktionsweise ist mit einem Satz erklärt: Mit In-Database Archiving lassen sich Zeilen einer Tabelle archivieren, in dem gewisse Zeilen ausgeblendet werden.
Möchte man In-Database Archiving verwenden, stellen sich zuerst einige grundsätzliche Fragen wie z.B.:
Wie funktioniert das Setup? Wird weiterhin nach der "Archivierung" Speicherplatz verbraucht?
Erfolgt eine automatische Archivierung? Kann man die "archivierten" Zeilen sichtbar machen? Muss eine Applikation für die Verwendung
angepaßt werden?
Das Setup
Das Konfiguration ist einfach. Die neuen Schlüsselworte ROW ARCHIVAL am Ende eines CREATE/ALTER TABLE
Kommandos sorgen dafür, dass das Feature In-Database Archiving eingeschaltet wird. Dazu wird unter anderem die "invisible" Spalte ORA_ARCHIVE_STATE zu der Tabelle
hinzugefügt und mit dem Wert 0 belegt. Der Wert 0 steht dabei für aktive Daten. Ändert man diesen Wert, wird die
entsprechende Zeile inaktiv.
Zur Erinnerung: Ab Oracle Database 12c können nicht nur Indizes sondern auch Spalten die Eigenschaft "invisible" erhalten.
Sie sorgt dafür, dass die Spalten bei der Verwendung von gewissen Zugriffen über SELECT, DESCRIBE oder %ROWTYPE (in PL/SQL)
unsichtbar (engl: invisible) sind.
Im ersten Beispiel nehmen wir die nicht partitionierte Tabelle SALESARCH, die eine Kopie der Tabelle SALES darstellt.
Sie besitzt 7 Spalten und hat 918843 Zeilen.
Später werden wir die Zeilen archivieren, in denen die Werte von AMOUNT_SOLD größer als 100 sind.
Offensichtlich handelt es sich dabei um 135669 Zeilen.
Jetzt aktivieren wir In-Database Archiving für die Tabelle SALEASARCH mit dem Kommando ALTER TABLE und überprüfen
erneut die Spalten.
Wie man leicht erkennen kann, sind direkt nach dem Einschalten von In-Database Archiving zwei Spalten hinzugefügt worden - ORA_ARCHIVE_STATE
und SYS_NC00008$. Die VARCHAR2 Spalte ORA_ARCHIVE_STATE hat den Wert 0; die RAW Spalte hingegen ist nicht belegt und wird nur für
interne Zwecke verwendet. Die Spalte ORA_ARCHIVE_STATE hat die Funktion den Status der Zeilen anzugeben. 0 bedeutet aktiv,
alle anderen Werte der Spalte repräsentieren den Zustand "archiviert". Zeilen mit der Eigenschaft "archiviert" sind standardmässig für die
die Applikationen unsichtbar.
In unserem Fall sind natürlich alle Zeilen (noch) aktiv, da wir bis jetzt keine Veränderung an der Spalte ORA_ARCHIVE_STATE vorgenommen haben,
Möchte man das ganze Verfahren wieder rückgängig machen, kann man die Syntax "alter table salesarch no row archival" verwenden.
Die zusätzlichen Spalten sind danach wieder gelöscht.
Nun kennzeichnen wir einige Zeilen als unsichtbar, in dem wir ein UPDATE auf die Spalte ORA_ARCHIVE_STATE durchführen und
den Wert ändern. Wie in der Abfrage auf USER_TAB_COLS zu erkennen ist, können bis zu 4000 Zeichen zur Kennzeichnung der
Archivierung verwendet werden. Die Verwendung von einstelligen Zahlenwerten - aus Gründen der Platzersparnis -
ist sicherlich sinnvoll. Eine Änderung auf den Wert 1 ist also völlig ausreichend.
Alternativ kann man die Funktion DBMS_ILM.ARCHIVESTATENAME() beim UPDATE der Spalte verwenden. Sie bildet
einen beliebigen Wert, der ungleich 0 ist, auf der Wert 1 (archviert) ab; der Wert 0 bleibt erhalten. Das UPDATE Kommando würde dann folgendermaßen aussehen.
Zugriffe
Im folgenden Abschnitt werden einige Zugriffe näher beleuchtet. Es ist sofort erkennbar, dass die archivierten Zeilen nicht mehr
angezeigt werden. Keine Änderungen an den Applikationen ist dazu erforderlich.
Um einen Einblick in die Implementierung zu erhalten, generieren wir für die letzte Abfrage den Ausführungsplan.
Ähnlich wie bei der Virtual Private Database (kurz VPD) Technologie, wird offensichtlich die Filterbedingung erweitert.
Somit nutzt der Optimizer beim Filtern nicht nur die Spalte AMOUNT_SOLD sondern evaluiert auch die Inhalte der Spalte
ORA_ARCHIVE_STATE. Geprüft wird auf die aktiven Zeilen - also den Wert 0, nachdem die ursprünglichen Werte von
ORA_ARCHIVE_STATE mit der DECODE Funktion auf 0 oder 1 umgeschlüsselt worden sind.
Da man "invisible columns" auch indizieren kann, werden wir im nächste Beispiel einen Index erzeugen
und die Abfrage erneut durchführen.
Wie im Falle von VPD lässt sich der Zugriff mit zusätzlichen Indizes ändern und tunen.
Die gleiche Abfrage erfolgt nun mit einem Indexzugriff.
Wei funktioniert das Datenladen über CREATE TABLE AS SELECT (CTAS) oder Data Pump Export und Import?
Die Eigenschaft In-Database Archiving wird beim CTAS nicht übertragen - auch unabhängig von den Sessioneinstellungen (siehe auch
nächstes Kapitel). Folgendes einfache Beispiel demonstriert diese Eigenschaft. Es werden alle Zeilen mit der Eingenschaft AMOUNT_SOLD>100 in die Tabelle COPYSALES
äbertragen.
Wegen eines Bugs in 12.1 (siehe auch MOS Note Doc ID 1999047.1) wird die Eigenschaft In-Database Archiving mit Data Pump
noch nicht unterstützt. Ein möglicher Workaround wäre die Tabelle zuerst manuell mit der Syntax ROW ARCHIVAL
anzulegen und den Import mit TABLE_EXISTS_ACTION=APPEND durchzuführen. Dabei geht allerdings die Information
welche Zeilen archiviert sind verloren. Die Spalte ORA_ARCHIVE_STATE muss für die entsprechenden Zeilen geändert werden.
Sessioneinstellungen
Ein zusätzliches Feature erlaubt die archivierten Zeilen innerhalb einer Session wieder sichtbar zu machen.
Dazu gibt es die neue Sessioneinstellung ROW ARCHIVAL VISIBILITY, die die Werte ALL und ACTIVE haben kann.
Der Wert ACTIVE zeigt dabei nur die aktiven Zeilen an - dies ist auch der Standardwert. Der Wert ALL hingegen, macht alle Zeilen sichtbar.
Wir zeigen nun das Verhalten unter Verwendung von ALL.
Diese Sessioneinstellung zeigt natürlich nur im Zusammenhang mit dem Feature In-Database Archiving ihre Wirkung.
Archivierung und Partitionierung
Da die Daten nicht mehr verwendet werden, wäre es sinnvoll die entsprechenden Zeilen im komprimierten Format abzulegen.
Realisieren kann man diese Anforderung beispielsweise mithilfe von Partitionierung. Dazu legen wir eine partitionierte Tabelle an,
die als Partitionierungskriterium die Spalte ORA_ARCHIVE_STATE verwendet.
Es werden zwei Partitionen verwendet: die Partition arch_stat_0 für die aktiven Daten und die Partition arch_stat_1
für die archivierten Daten. Der Tablespace ADVTEST erhält die Default Eigenschaft COMPRESS. Danach
werden alle Tabellen und Partitionen, die in diesem Tablespace erzeugt werden, komprimiert.
Das Ganze sieht dann folgendermassen aus.
Im nächsten Schritt werden die Daten aus der Tabelle SALES geladen. Alle Zeilen liegen danach in der Partition arch_stat_0.
Anschließend werden die Daten mit dem gleichen Verfahren wie oben archiviert. Dazu muss zuerst ROW MOVEMENT eingeschaltet werden,
sonst erhalten wir den folgenden Fehler:
ERROR at line 1:
ORA-14402: updating partition key column would cause a partition change
Bei der Überprüfung der Daten wird die Sessioneinstellung ROW ARCHIVAL VISIBILITY mit dem Wert ALL verwendet.
Offensichtlich liegen die archivierten Daten nun in der Partiton arch_stat_1 und sind somit komprimiert.
Denkbar ist auch eine Kombination mit dem ILM Feature Automatic Data Optimization.
So könnte man die zu archivierende Partition (hier arch_stat_1) mit einer Policy verknüpfen,
die eine Komprimierung der Daten nach einer bestimmten Eigenschaft einleitet.
Folgendes Beispiel zeigt eine mögliche Policy. (Hinweis: Vergessen Sie nicht, vorher die Heatmap einzuschalten.)
Lizenzierung
Das Feature In-Database Archiving ist in allen Editionen verfügbar. Für die im letzten Abschnitt
erwähnten Features sind allerdings zusätzlich die Advanced Compression Option (für ADO) bzw. die
Partitioning Option erforderlich.
Links
Oracle Learning Library: Using In-Database Row Archiving
Using in database Archiving aus Database VLDB and Partitioning Guide
12c: In-Database Archiving And Compression (Doc ID 1592186.1)
Zurück zur Community-Seite
|