News zu Oracle

DBA Tipp: Daten und Tabellen online re­struk­tu­rie­ren mit dem Feature Online Redefinition

Im Rahmen deiner täglichen DBA-Arbeiten ist es zuweilen nötig, bestimmte Än­de­run­gen an wichtigen Daten oder auch an Ta­bel­len­struk­tu­ren vor­zu­neh­men. Je nach Art, Umfang oder vor­lie­gen­der Da­ten­men­ge bringen diese Än­de­run­gen mög­li­cher­wei­se eine längere Downtime mit sich. Zumindest ist eine deutlich spürbare Be­ein­träch­ti­gung des laufenden Betriebes zu erwarten. Um genau das zu vermeiden, steht dir für die Er­le­di­gung solcher typischen Aufgaben in der En­ter­pri­se Edition das hilf­rei­che Feature „Online Re­de­fi­ni­ti­on“ zur Verfügung. In diesem DBA Tipp erläutern wir dir konkrete, pra­xis­na­he An­wen­dungs­fäl­le und sagen dir, wie du Schritt für Schritt mit dem Tool umgehst.

Logo Oracle Database grau

An­wen­dungs­fäl­le für das Re­or­ga­ni­sie­ren oder Re­struk­tu­rie­ren einer Tabelle

Die Er­for­der­nis­se für ein Re­or­ga­ni­sie­ren oder Re­struk­tu­rie­ren einer Tabelle sind viel­fäl­tig. Einige davon können voll­kom­men trans­pa­rent erfolgen, andere be­ein­träch­ti­gen zumindest den Betrieb vor­über­ge­hend, dritte bedingen eine echte Downtime. Hier einige Beispiele:

  • Änderung eines Spal­ten­typs oder Löschen einer Spalte
    Während der DDL-Operation ist die be­trof­fe­ne Tabelle gegen Schreib­zu­grif­fe gesperrt. Bei Tabellen mit hin­rei­chend großer Zei­len­zahl kann das eine Anwendung in­ak­zep­ta­bel lang beeinträchtigen.

  • Wechsel der Ta­bel­len­or­ga­ni­sa­ti­on von par­ti­tio­niert in un­par­ti­tio­niert oder umgekehrt bzw. Änderung der Par­ti­tio­nie­rungs­me­tho­de
    Diese Ope­ra­tio­nen wären nur per Export/Import oder „insert as select“ durch­führ­bar. In beiden Fällen bedeutet das eine Downtime für die Anwendung.

  • Sortierte Spei­che­rung der Daten zur Ver­rin­ge­rung des clus­te­ring factors eines Indexes
    Auch das ist ohne Re­de­fi­ni­ti­on nur durch „insert as select“ durch­führ­bar und dadurch mit einer Downtime verbunden.

  • Shrinken von Datafiles
    Während die De­frag­men­tie­rung von Tabellen und Indizes mitt­ler­wei­le mittels der shrink-Funktion komplett online und trans­pa­rent erfolgen kann, erfordert das Shrinken von Datafiles nach wie vor ein „alter table move“, um Ta­bel­len­ob­jek­te und damit letztlich die High-Water-Mark in Richtung Da­ta­fi­le­be­ginn zu ver­schie­ben. Zwar kann das Bewegen der Tabelle selbst auch online erfolgen. Die auf der Tabelle de­fi­nier­ten Indizes werden al­ler­dings mit dem Ver­schie­ben unusable und müssen mit rebuild neu erstellt werden. Bis zum Abschluss des Rebuild (der zudem nur in der En­ter­pri­se Edition online erfolgen kann) dürfte zumindest die Per­for­mance leiden. Im schlimms­ten Fall kann das vor­über­ge­hen­de Fehlen der an Indizes ge­bun­de­nen primary-key- oder unique-Cons­traints sogar logische In­kon­sis­ten­zen in der Datenbank verursachen.

Ver­fah­rens­wei­se für ein Online Redefinition

Die einzelnen Schritte für die Durch­füh­rung des Online Re­de­fi­ni­ti­on sind folgende:

1. Prüfen der Ausgangstabelle

Mittels DBMS_REDEFINITION.CAN_REDEF_TABLE prüfst du optional, ob die ent­spre­chen­de Tabelle die Vor­aus­set­zun­gen für ein Re­de­fi­ni­ti­on erfüllt. Auch für Online Re­de­fi­ni­ti­on gibt es einige ver­hin­dern­de Ein­schrän­kun­gen. In der Praxis trifft man aber ten­den­zi­ell eher selten darauf.

2. Anlegen einer Interimstabelle

Diese Tabelle ent­spricht in ihrer Struktur (Spal­ten­zahl, ‑folge, ‑namen, ‑typen, Par­ti­tio­nie­rung, Ta­b­le­space etc.) dem ge­wünsch­ten Ziel­zu­stand. Der Name der Tabelle ist ir­rele­vant. Er wird am Ende des Re­de­fi­ni­ti­on durch den Namen der Aus­gangs­ta­bel­le ersetzt.

3. Starten des Redefinition

Mit der Procedure DBMS_REDEFINITION.START_REDEF_TABLE in­iti­ierst du die Re­de­fi­ni­ti­on. Das bedeutet im Detail, dass die Aus­gangs­ta­bel­le in den Re­de­fi­ni­ti­on­s­ta­tus versetzt wird und alle Daten der Aus­gangs­ta­bel­le in die In­te­rims­ta­bel­le kopiert werden. Dieser Status sorgt dafür, dass die Aus­gangs­ta­bel­le jetzt in keiner weiteren Re­de­fi­ni­ti­on verwendet werden kann. Ein­kom­men­de Da­ten­än­de­run­gen werden gepuffert und später noch auf die In­te­rims­ta­bel­le syn­chro­ni­siert. In diesem Schritt erfolgt damit die ei­gent­li­che Re­de­fi­ni­ti­on, also zum Beispiel De­frag­men­tie­rung, Sor­tie­rung, Spal­ten­map­ping oder Par­ti­tio­nie­run­g/­De-Par­ti­tio­nie­rung. Auch wenn sich die be­tref­fen­de Tabelle im Re­de­fi­ni­ti­on­s­ta­tus befindet (und im Hin­ter­grund ihre Daten in die In­te­rims­ta­bel­le kopiert werden), sind SELECT und DML weiterhin un­ein­ge­schränkt möglich.

4. Kopieren aller ab­hän­gi­gen Objekte

Nach dem Abschluss des START_REDEF_TABLE ist nun die Beziehung zwischen Ausgangs- und In­te­rims­ta­bel­le her­ge­stellt und der Da­ten­stand zwischen den beiden Tabellen initial ab­ge­gli­chen. In einem weiteren Schritt kannst du nun noch alle ab­hän­gi­gen Objekte der Aus­gangs­ta­bel­le, also Pri­vi­le­gi­en, Cons­traints, Trigger, Sta­tis­ti­ken und Indizes, an die In­te­rims­ta­bel­le kopieren. Hierzu ver­wen­dest du DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS. Die ab­hän­gi­gen Objekte werden vorerst unter sys­tem­ge­ne­rier­ten Namen erstellt, die aber am Ende des Re­de­fi­ni­ti­on au­to­ma­tisch durch die Namen der kor­re­spon­die­ren­den Objekte der Aus­gangs­ta­bel­le ersetzt werden. Es ist also nach Abschluss des Re­de­fi­ni­ti­on si­cher­ge­stellt, dass bei­spiels­wei­se benannte In­dex­hints oder SQL-Profile, aber auch re­fe­ren­ti­el­le In­te­gri­tä­ten, weiterhin greifen und „spre­chen­de“ Namen erhalten bleiben. 

Hinweis:

Sowohl in Schritt 3 als auch 4 solltest du verstärkt auf das Ar­chi­velo­gauf­kom­men achten. Beide Schritte erzeugen im Hin­ter­grund klas­si­sches DML/DDL und damit mög­li­cher­wei­se ent­spre­chend viel Redoinformationen.

5. Ab­schlie­ßen des Redefinition

Sind die ab­hän­gi­gen Objekte fertig syn­chro­ni­siert, schließt du das Re­de­fi­ni­ti­on ab. Alle Än­de­run­gen, die seit dem Start des Re­de­fi­ni­ti­on (mit START_REDEF_TABLE) auf­ge­lau­fen sind, wurden zwi­schen­zeit­lich gepuffert. Dieser Puffer kann (und sollte – ins­be­son­de­re, falls Kopieren der Daten oder ab­hän­gi­gen Objekte lange gedauert haben) mittels DBMS_REDEFINITION.SYNC_INTERIM_TABLE ab­ge­gli­chen werden.

6. Beenden des Redefinition

Mit einem ab­schlie­ßen­den DBMS_REDEFINITION.FINISH_REDEF_TABLE beendest du das Re­de­fi­ni­ti­on schließ­lich. Lediglich an diesem Punkt werden Ausgangs- und In­te­rims­ta­bel­le für einen kurzen Au­gen­blick gesperrt. In diesem Schritt über­trägt das Re­de­fi­ni­ti­on noch die letzten Daten. Ab­schlie­ßend werden die Namen zwischen Ausgangs- und In­te­rims­ta­bel­le sowie allen ab­hän­gi­gen Objekten au­to­ma­tisch aus­ge­tauscht. Un­mit­tel­bar danach steht die in Schritt 2 erzeugte In­te­rims­ta­bel­le nun mit re­or­ga­ni­sier­ten Daten oder ver­än­der­ter Struktur unter dem Namen der ur­sprüng­li­chen Aus­gangsta­bel­le zur Verfügung. Alle An­wen­dun­gen, die bisher Zugriff auf die Aus­gangs­ta­bel­le hatten, greifen nun ohne den ge­rings­ten An­pas­sungs­auf­wand auf die re­de­fi­nier­te Tabelle zu. Die in Schritt 2 angelegte In­te­rims­ta­bel­le kannst du nun droppen.

Fazit

Das Oracle En­ter­pri­se Edition Feature „Online Re­de­fi­ni­ti­on“ erlaubt eine (praktisch) un­ter­bre­chungs- und stö­rungs­freie Re­or­ga­ni­sa­ti­on oder Re­de­fi­ni­ti­on von Tabellen. Unter andern Umständen (bei­spiels­wei­se in einer Oracle Standard Edition) wäre das mit er­heb­li­chen Be­ein­träch­ti­gun­gen bis hin zur kom­plet­ten Downtime der Anwendung verbunden. Dabei ist nicht nur eine reine Re­de­fi­ni­ti­on der Ta­bel­len­struk­tur möglich. Auch per­for­mance- oder platz­re­le­van­te War­tungs­ar­bei­ten wie De­frag­men­tie­rung und Ver­schie­ben von Daten kannst du über den be­schrie­be­nen Weg durch­füh­ren. Die Re­de­fi­ni­ti­on bleibt über ihre gesamte Laufzeit von START_REDEF_TABLE bis FINISH_REDEF_TABLE nach außen voll­kom­men transparent.

Hier findest du weitere Infos rund um Oracle oder die Oracle En­ter­pri­se Edition aus unserem News & Insights Bereich.

icon-arrow_right_medium-violet-blue.svg

Share this article

Facebook 
Twitter 
LinkedIn 
XING 
WhatsApp 
Email