Datenänderungen in einer Oracle Active Standby Datenbank
Ralf Durben, 18.08.2010

Eine Oracle Active Standby Datenbank ist eine spezielle Variante von Standby-Lösungen mit Oracle Data Guard. Dabei ist die Standby-Datenbank einerseits READ ONLY geöffnet, wird aber gleichzeitig über Log-Dateien, die von der Primärdatenbank kommen, aktualisiert.

Mit dieser Technik kann man unter anderem die Leselast von einem operationalen System herunternehmen, indem die lesenden Anwendungen auf eine Active Standby Datenbank umgeleitet werden. Da in Oracle Data Guard bis zu 20 Standby Datenbanken (Stand Oracle 11g Release 2) erstellt werden können und diese auch noch im Cluster (z.B. RAC), kann die Leselast quasi beliebig skaliert werden.

Gute Anwendungsmöglichkeiten ergeben sich zum Beispiel für Auftragsverfolgungs- oder Buchungssysteme.

Im Detail gibt es dabei aber ein kleines Problem: Die meisten Anwendung greifen nicht nur lesend auf die Datenbank zu. Teilweise werden temporäre Daten geschrieben oder eben Buchungen getätigt. Und das ist in einer READ ONLY Datenbank nun einmal nicht möglich - zumindest nicht direkt. Es gibt nämlich einen Weg durch Verwendung von Datenbank-Links.

Die Idee ist recht simpel: Die Anwendung schickt das Kommando zur Datenänderung an die Active Standby Datenbank. Die Datenänderung wird jedoch umgeleitet und findet in der Primärdatenbank statt. Über den Log-Tranfer vom Standby-Mechanismus gelangt die Datenänderung mit einer kurzen Verzögerung zur Standby Datenbank.

Wichtig ist, dass die Datenbank-Links in der Primärdatenbank erstellt werden müssen, denn in der Active Standby Datenbank, die ja READ ONLY geöffnet ist, funktioniert das nicht. Zusätzlich zum Datenbank-Link wird ein Synonym erstellt, dass für die Anwendung ein Platzhalter ist, um die Datenänderung umzuleiten.

Das folgende Beispiel macht es deutlich:

1. Schritt: Erstellen eines TNS-Alias in der tnsnames.ora


Der Datenbank-Link, der auf die Primärdatenbank verweisen soll, verwendet einen TNS-Alias. Dazu erstellen Sie (falls noch keine existiert) im Verzeichnis "$ORACLE_HOME/network/admin" eine Datei namens "tnsnames.ora". Die Datei muss sowohl auf Primär- als auch auf Standbyseite existieren. Der Inhalt sollte ungefähr so aussehen:
OE =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = hostname)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = OE)
    )
  ) 
Im obigen Beispiel hat die Instanz der Primärdatenbank den Namen "OE" und ist unter diesem Namen als Service erreichbar.

2. Schritt: Datenbank-Link erstellen


Erstellen Sie einen Datenbank-Link zur Primärdatenbank. Dieses Kommando muss in der Primärdatenbank ausgeführt werden!
CREATE PUBLIC DATABASE LINK oe.de.oracle.com CONNECT TO scott IDENTIFIED BY tiger USING 'OE'; 
In diesem Beispiel wurde als Zielschema das Beispielschema SCOTT gewählt.

3. Schritt: Synonym erstellen


Jetzt muss noch das Synonym erstellt werden. Auch dieses Kommando muss in der Primärdatenbank laufen.
CREATE SYNONYM emp_dml for emp@oe.de.oracle.com;
Dieses Synonym soll eine Datenänderung für die Tabelle EMP auf der Active Standby Datenbank ermöglichen.

Test


Jetzt zeigt der folgende Test das Ergebnis:

Ein direktes Update auf die Tabelle EMP ergibt den Fehler
SQL> update emp set sal=sal+1;
update emp set sal=sal+1;
       *
ERROR at line 1:
ORA-16000: database open for read-only access
Ein Update auf das Synonym EMP_DML ergibt folgendes Ergebnis:
SQL> update emp_dml set sal=sal+1;

14 rows updated.
Mit dem oben beschriebenen kleinen Kunstgriff lassen sich also durchaus Datenänderungen in der READ ONLY Datenbank durchführen.

Impressum