Erstellen einer Standby Datenbank mit RMAN unter Oracle 10g
Das Online-Manual zum Erstellen einer Standby-Datenbank mittels RMAN auf den Oracle-Seiten kann einen ziemlich verwirren: Man muss ständig zwischen den Artikeln hin und her, sowie vor und zurück springen, wobei man sehr leicht den Überblick verliert. Hinzu kommen Dinge wie "folgen Sie den unter x beschriebenen Schritten, außer y und machen Sie nicht z". Wow.
Worum es in diesem Artikel geht
Obiger Absatz beschreibt den Hintergrund zur Entstehung dieses Artikels. Er soll so einfach wie möglich durch die nötigen Schritte zur Erstellung einer Standby Datenbank führen – in einer Art, die Verwirrung möglichst vermeidet. Das Ganze spielt in einer Oracle 10g Umgebung unter Linux/Unix, und wir wollen RMAN dabei verwenden.
Worum es in diesem Artikel NICHT geht
Wie oben bereits erwähnt, befinden wir uns in einer *nix Umgebung – auf andere Betriebssystem-Spezifika wird nicht eingegangen (keine Angst – BS-spezifische Punkte sind wirklich rar hier). Auch wird nicht auf Oracle-Versionen eingegangen, die größer oder kleiner als 10g sind.
Inhalt
- Voraussetzungen
- Vorbereitung
- Erstellung der Standby Datenbank
- Nacharbeiten und Anmerkungen
- SwitchOver / FailOver
Voraussetzungen
Hardware und Software
Da es in diesem Artikel nicht um die Installation von Oracle geht, wollen wir hier auch nicht zu sehr ins Detail gehen – sondern die Spezifika für diesen Artikel beleuchten. Was wir brauchen sind:
- Zwei verschiedene Maschinen – eine für die Master (Primary) Datenbank, eine für die Standby Datenbank
- Oracle 10g ist auf beiden Maschinen installiert
- Master und Standby haben die gleichen Verzeichnisstrukturen (für Datenbank-relevante Dateien/Verzeichnisse)
- Die primäre Datenbank ist bereits konfiguriert und gestartet
- Die File Recovery Area (FRA) ist konfiguriert und wird für Backups und ArchiveLog genutzt
Vorbereitung
Vorbereitung der init.ora für die Standby Datenbank
Was zu tun ist
Als Grundlage dient hier die init.ora der (bereits laufenden) Master-Datenbank.
Die zur Erstellung derselben verwendete Datei findet sich unter
$ORACLE_HOME/dbs/init<SID>.ora. Sofern in der Datenbank bereits Änderungen
(ALTER SYSTEM SET...SCOPE=<spfile|both>) durchgeführt wurden, sollten diese
spätestens jetzt in der init.ora nachgezogen werden. Wer sich nicht sicher
ist, macht sich ein Backup der init<SID>.ora und führt dann in SQLPlus den
Befehl CREATE PFILE FROM SPFILE; aus, um die Einstellungen zu vergleichen.
Jetzt müssen folgende Einstellungen ergänzt bzw. angepasst werden:
LOG_ARCHIVE_DEST_1='SERVICE=<master-tns-alias> VALID_FOR=(ALL_LOGFILES,PRIMARY_ROLE)
STANDBY_FILE_MANAGEMENT=AUTO
STANDBY_ARCHIVE_DEST='LOCATION=USE_DB_RECOVERY_FILE_DEST'
DB_UNIQUE_NAME=<unique name for the standby DB>
FAL_SERVER=<master-tns-alias>
FAL_CLIENT=<standby-tns-alias>
REMOTE_LOGIN_PASSWORD_FILE=EXCLUSIVE
<master-tns-alias> und <standby-tns-alias> sind die Namen, die
später in der tnsnames.ora für die jeweiligen Datenbanken
konfiguriert werden.
Mit Ausnahme des DB_UNIQUE_NAME, der im Nachhinein nicht mehr modifizierbar
ist, werden wir diese Änderungen später auch auf die Master
Datenbank anwenden, wobei wir hier die Werte für FAL_SERVER und FAL_CLIENT
untereinander vertauschen, sowie bei LOG_ARCHIVE_DEST1 den TNS-Alias der
Standby Datenbank eintragen.
Was diese Parameter bedeuten
Wen es nicht interessiert, der mag diesen Abschnitt überspringen – man muss es nicht unbedingt wissen, damit es klappt. Wer es jedoch noch nicht weiß, dem sei die Lektüre empfohlen – man sollte schon wissen, was man tut ;)
- LOG_ARCHIVE_DEST_1: Teilt der Master Datenbank mit, dass sie die
Standby mit Redo füttern soll. Das Keyword
VALID_FOR=(PRIMARY_ROLE)stellt dabei sicher, dass die Standby Datenbank dieses Statement ignoriert. Da sie aber nach einem Switchover/Failover zur Master wird, ist es hier dennoch wichtig. - STANDBY_FILE_MANAGEMENT: Was soll die Standby machen, wenn auf der
Master Datenbank neue Datendateien angelegt oder gelöscht werden?
AUTOkümmert sich automatisch darum, und zieht auch diese Dateisystem-Änderungen nach. - STANDBY_ARCHIVE_DEST: Wo soll die Standby Datenbank die von der Master empfangenen RedoLogs speichern? Wir legen sie in die FRA, dann kümmert sich Oracle auch wieder selbstständig ums Aufräumen.
- DB_UNIQUE_NAME: Beide Datenbanken haben identische SIDs sowie DBIDs, also brauchen wir ein Unterscheidungsmerkmal. Wenn später alles läuft, wird man sehen, dass dieser unique Name in der FRA verwendet wird.
- FAL_SERVER/FAL_CLIENT: Hier wird der Transfer der archivierten
Logdateien konfiguriert (FAL = Fetch Archive Log). Diese Einstellungen
legen also fest, wer hier wen bedient – werden aber nur auf dem FAL_SERVER
ausgewertet. Da die Rollen nach einem SwitchOver/FailOver vertauscht
werden, können wir sie auf dem
FAL_CLIENTalso gleich anders herum definieren – damit es nicht im Fall des Falles vergessen wird. - REMOTE_LOGIN_PASSWORD_FILE: Wie der Name es bereits vermuten
lässt, benötigen wir eine solche Datei, um uns auch "von Remote" als
SYSDBA verbinden zu können. In der
init.orageben wir an, ob diese DateiEXCLUSIVEzu dieser Datenbank gehört, oder von mehreren Datenbanken auf dem selben ServerSHAREDwird. Vermeiden sollten wir den WertNONE, da damit die Funktion deaktiviert wird. Die Passwort-Datei selber erstellen wir im nächsten Schritt.
Die Oracle Passwort-Datei
Wer noch keine Passwort-Datei verwendet, sollte sie spätestens jetzt erstellen – sonst gibt es keinen Remote-Login als SYSDBA (was für die Standby Voraussetzung ist). Wichtig ist hier:
- Die Datei muss sich im Verzeichnis
$ORACLE_HOME/dbsbefinden - Die Datei muss
orapw<ORACLE_SID>heißen - Die Passwörter müssen auf der Primary und der Standby identisch sein
Ist die erste oder zweite Bedingung nicht erfüllt, wird die Passwort-Datei überhaupt nicht gefunden (und daher auch nicht verwendet). Die dritte Bedingung ist für den Betrieb der Standby Datenbank wichtig.
Konfiguration des Listeners
Jetzt gilt es, auf beiden Maschinen den Listener zu konfigurieren. Hierzu brauchen wir eindeutige Namen (Aliase) für beide Instanzen, die aber auf beiden Maschinen identisch sein müssen (d. h. master-tns-alias verweist immer auf die Master, usw.).
Fangen wir also mit der tnsnames.ora an. Diese findet sich gewöhnlich im
Verzeichnis $ORACLE_HOME/network/admin. Hier fügen wir zwei neue Einträge
hinzu – für jede Datenbank einen:
<master-tns-alias> = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP) (Host = <DNS-Name/IP des Master Servers>) (Port = 1521))
(CONNECT_DATA = (SID = <ORACLE_SID>) ))
<standby-tns-alias> = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP) (Host = <DNS-Name/IP des Standby Servers>) (Port = 1521))
(CONNECT_DATA = (SID = <ORACLE_SID>) ))
Jetzt folgt die listener.ora aus dem gleichen Verzeichnis. Hier müssen wir
die lokale Instanz im Block SID_LIST_LISTENER hinzufügen (sollte der Listener
nicht, wie per Default, LISTENER heißen, bitte den entsprechenden anderen
Block auswählen):
(SID_DESC = (SID_NAME = <ORACLE_SID>) (ORACLE_HOME = /local/oracle/ora102))
Wie bereits erwähnt, sollten diese Einträge auf beiden Rechnern identisch sein. Sind die Änderungen durchgeführt, gilt es den Listener (neu) zu starten:
oracle$ lsnrctl stop
oracle$ lsnrctl start
Überprüfen des Datenbank-Status
Bevor wir nun endgültig loslegen können, müssen wir sicherstellen, dass die
beiden Datenbanken im richtigen Modus laufen. Mit SQL*Plus verbinden wir uns
als SYSDBA, und setzen den Befehl SELECT status FROM v$instance ab. Auf
unserer Master-Datenbank sollte das Ergebnis OPEN oder zumindest MOUNTED
heißen, auf der Standby NOMOUNT. Ist dies nicht der Fall, kommt als nächstes
ein startup auf der Master-Datenbank, bzw. ein startup nomount auf der
Standby.
Ebenfalls prüfen müssen wir, ob eine Anmeldung über das Netz funktioniert. Also
noch ein sqlplus sys/passwort@master-tns-alias AS SYSDBA vom Standby-Rechner,
und sqlplus sys/passwort@standby-tns-alias AS SYSDBA von der
Standby-Maschine. Funktioniert soweit alles, geht es mit dem nächsten Schritt
weiter.
Backups
Unsere letzten Voraussetzungen sind ein vollständiges Backup sowie eine Kopie des Controlfiles für die Standby Datenbank, beides mit RMAN erstellt. Ist dies noch nicht geschehen, tun wir das hier:
oracle$ rman target /
rman> BACKUP CURRENT CONTROLFILE FOR STANDBY;
rman> BACKUP DATABASE;
Diese Befehle sind natürlich auf dem Master-Rechner abzusetzen. Für mehr Details zu den RMAN Kommandos verweise ich an dieser Stelle auf die RMAN Dokumentation, sofern dies jemand verfeinern will.
Abschließend müssen wir die erstellten Backups noch auf den Standby Server
kopieren, damit RMAN sie dort auch findet (bei Einsatz eines Media-Managers ist
dies u.U. nicht nötig). Am einfachsten geschieht dies, indem wir uns auf dem
Standby-Rechner als Benutzer oracle anmelden, in das Verzeichnis der
Recovery-Area wechseln, und uns die Dateien mit RSync holen:
rsync -Pae master:/path/to/recovery/area/ .
Damit sind die Vorbereitungen abgeschlossen, und wir können die Standby Datenbank erstellen.
Erstellung der Standby Datenbank
Jetzt kommt RMAN zum Einsatz, um uns die restliche Arbeit abzunehmen:
oracle$ rman target / auxiliary sys/password@standby-tns-alias
DUPLICATE TARGET DATABASE FOR STANDBY NOFILENAMECHECK;
Zurücklehnen und abwarten – sobald dieser Befehl abgearbeitet ist, haben wir unsere Standby Datenbank erstellt, und sie ist auch bereits gemountet.
Nacharbeiten und Anmerkungen
Nacharbeiten
- Sofern dies noch nicht geschehen ist, sollten jetzt auch die Parameter der Master-Datenbank angepasst werden (siehe erster Abschnitt)
- Unsere Standby-Datenbank ist nun zwar erstellt und gemountet – aber sie
verarbeitet noch keine neuen Informationen. Wir müssen also noch das
"managed Recovery" aktivieren:
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT;heißt der entsprechende SQL*Plus-Befehl, nachdem wir uns als SYSDBA auf der Standby Datenbank angemeldet haben. - Obwohl Oracle seit Version 10g beim Startup automatisch erkennt, ob es sich hier um eine Standby-Datenbank handelt, und sie dann entsprechend read-only mountet – wird der Recovery-Prozess wiederum nicht automatisch gestartet. Wird also die Maschine neu gestartet, muss sich darum noch separat gekümmert werden.
- Optional können an dieser Stelle noch STANDBY LOGFILE GROUPs erstellt werden (siehe unten).
Bezüglich der Standby Logs, hier ein kurzer Auszug aus einem Metalink Artikel:
"Standby redo logs are necessary for the higher protection levels such as Guaranteed, Instant, and Rapid. In these protection modes LGWR from the Primary host writes transactions directly to the standby redo logs. This enables no data loss solutions and reduces the amount of data loss in the event of failure. Standby redo logs are not necessary if you are using the delayed protection mode."
Anders ausgedrückt: Wir brauchen sie hier nicht, da wir im "deferred" Modus arbeiten: Die Redo-Information wird erst dann zur Standby Datenbank übertragen, wenn sie auf der primären Datenbank archiviert worden ist. Anders sieht das Ganze aus, wenn eine "Echtzeit-Übertragung" gewünscht wird (die Standby Datenbank also das Redo sofort bei Erzeugung bekommen und verarbeiten soll) – hier brauchen wir die Standby Logs. Sie sollten dann allerdings auf beiden Datenbanken – also auch auf der primären – angelegt werden. Auch wenn die primäre Instanz keine Standby Logs verwendet: Nach einem SwitchOver/FailOver wird sie schließlich zur Standby, und sollte darauf vorbereitet sein.
Bei der Einrichtung von Standby-Logs gibt es noch einiges mehr zu beachten, was
aber diesen Artikel sprengt. Daher verweise ich hier nur noch kurz auf den
entsprechenden Befehl zur Erstellung (ALTER DATABASE ADD STANDBY LOGFILE),
sowie das Metalink Dokument
180031.1.
Anmerkungen
RMAN Framework
Das RMAN Framework aus dem DBAHelper Paket kann die Erstellung einer Standby-Datenbank (und mehr) erleichtern und automatisieren. Kurz gesagt, kümmert sich dieses Framework um
- automatische Backups in die FRA
- natürlich auch das Management dieser Backups, Restoring, Recovering, Aufräumen …
- Ab v0.2.2: Erstellen einer Standby Datenbank
Generelle Anmerkungen
Auf der Standby-Datenbank kann Oracles DBConsole nicht genutzt werden: Diese erstellt ihr Repository nämlich generell in der lokalen Datenbank – was bei einer Standby-Datenbank nicht möglich ist (read-only). Es gibt wohl auch keine Möglichkeit, die DBConsole hierfür auf eine andere Datenbank umzubiegen. Wer also ein solches Interface für die Verwaltung verwenden möchte, der muss auf Grid Control zurückgreifen – Stoff genug für einen anderen Artikel.
Weiterführende Informationen
- MetaLink Note 789370.1: Creating physical standby using RMAN duplicate without shutting down the primary
SwitchOver / FailOver
SwitchOver oder FailOver?
Zwar haben beide Varianten gemeinsam, dass anschließend die ehemalige Standby-Datenbank zur Master geworden ist – dennoch gibt es jedoch Unterschiede, die es zu beherzigen gilt. So gibt es nach einem FailOver kein Standby-System mehr, und die (ehemalige) primäre Datenbank kann auch nicht mehr in eine Standby-Datenbank umgewandelt werden; es bleibt also nur noch die Möglichkeit, eine neue Standby-Datenbank zu erstellen. Bei einem SwitchOver hingegen tauschen beide einfach die Rollen, und es muss keine neue Standby-Datenbank mehr erstellt werden.
Ein DBA sollte es sich also gut überlegen, ob er ein FailOver initialisieren will. Auch wenn die Optionen fast offensichtlich sind, hier ein paar Entscheidungshilfen:
- Beide Datenbanken sind sowohl physisch als auch logisch in einwandfreiem Zustand, und auch für alle Applikationen erreichbar. Dennoch soll (z.B. aufgrund von Server-Wartungsarbeiten, Kernel-Updates o.ä.) das Standby System für die Applikationen geöffnet werden: SwitchOver
- Wie 1., jedoch ist die primäre Datenbank für die Applikationen nicht erreichbar (z.B. Netzwerk-Probleme): SwitchOver (dies setzt allerdings voraus, dass die primäre Instanz noch mit der Standby-Datenbank kommunizieren kann)
- Die primäre Instanz ist tot und nicht mehr zu erreichen: Hier haben wir wohl keine Wahl – FailOver
Oder anders ausgedrückt: Solange die Möglichkeit zu einem SwitchOver besteht, sollte kein FailOver ausgeführt werden.
SwitchOver
Kommen wir also zum SwitchOver. Die Durchführung ist nicht so schwer – die Reihenfolge der Operationen ist jedoch wichtig:
-- Sicherstellen, dass keiner mehr auf die Datenbank zugreift
sqlplus@master> SHUTDOWN IMMEDIATE
sqlplus@master> STARTUP [RESTRICT]
-- Vorbereiten für Rollenwechsel
sqlplus@master> ALTER DATABASE COMMIT TO SWITCHOVER TO STANDBY WITH SESSION SHUTDOWN;
sqlplus@standby> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;
-- Rollenwechsel
sqlplus@master> SHUTDOWN IMMEDIATE
sqlplus@master> STARTUP MOUNT
sqlplus@master> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT;
sqlplus@standby> ALTER DATABASE OPEN
Jetzt haben die beiden Datenbanken ihre Rollen getauscht. Bitte beachten: "@master" meint hier immer die alte Primary, "@standby" die alte Standby – auch nach dem Rollentausch!
FailOver
Zuerst noch einmal zum mitmeißeln: Ein FailOver sollte nur durchgeführt werden, wenn ein SwitchOver nicht in Frage kommt! Also geht man **nur im Notfall* wie folgt vor:
sqlplus@standby> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH;
sqlplus@standby> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;
Vergleich
Vergleichen wir nun beide Vorgehensweisen, so wird schnell klar, warum es nach einem FailOver keine Möglichkeit mehr gibt, die alte primäre Instanz zur neuen Standby-Datenbank zu machen: Sie hat nämlich auch noch RedoLogs generiert, nachdem wir die alte Standby geöffnet haben. Und letztere hat auch bereits Redo erstellt – die beiden sind also komplett "out-of-sync", und eine Synchronisation ist nicht mehr möglich. Beim SwitchOver haben wir dies vermieden: Wir haben im ersten Schritt unterbunden, dass die (alte) primäre Instanz weiteres Redo generiert – indem wir sie zur Standby gemacht haben. Für kurze Zeit hatten wir also zwei Standby-Datenbanken, und keine primäre. Während das neue Standby-System (zunächst freilich vergeblich) auf Redo-Informationen von einer (noch) nicht existenten primären Instanz wartete, konnte die (alte) Standby-Datenbank noch die restlichen Informationen verarbeiten – womit beide Datenbanken auf exakt dem selben Stand waren. In dem Augenblick, wo wir hier das alte Standby-System zum Primärsystem machten, wartete das neue Standby-System bereits darauf.
