Standby Datenbank in "5 Minuten"
von Sebastian Solbach, ORACLE Deutschland GmbH

Mit Oracle 11g und den neuen Funktionalitäten im RMAN und Data Guard ist der Aufbau einer Standby Datenbank fast eine Sache von wenigen Minuten. Zumindest was die eigentliche Arbeit am Rechner anbelangt - die Zeit zum Kopieren der Daten ist hierbei natürlich nicht eingerechnet. Denn eine Datenbank muss natürlich in Gänze kopiert werden; Dass dies bei einer Terabyte Datenbank nicht in Minuten passiert, sollte ersichtlich sein.

Nichts desto trotz hat sich gerade im Bereich RMAN viel getan: So dient als Ausgangsbasis für einen Klon der Datenbank nicht mehr ein existierendes Backup sondern die Produktive Source Datenbank selber. Eine Kopie kann direkt über das Netzwerk entstehen.

Dieser Tipp beschreibt in Kürze die einfachen Schritte zum Klonen des Oracle Homes, der Erstellung einer 11g Standby Datenbank inkl. Konfiguration des Data Guard Brokers - das alles ohne Einsatz von Oracle Enterprise Manager Grid Control. Mit EM ist die ganze Funktionalität seit 10.2.0.5 auch graphisch unterstützt, aber in manchen Fällen hat auch das manuelle Vorgehen seinen Reiz.

Das Vorgehen besteht aus mehreren Schritten, bei denen natürlich je nach Bedarf einzelne Schritte weggelassen werden können.

  1. Klonen Oracle Software
  2. Vorbereitung der Source Datenbank fürs Klonen
  3. Anlegen der Standby Redologs für Standby Datenbanken
  4. Anpassung der Netzwerkkonfiguration fürs Klonen & DataGuard Broker
  5. Zielvorbereitungen fürs Klonen
  6. RMAN Duplikate
  7. Kleinere Nacharbeiten
  8. Data Guard Broker Konfiguration
  9. Test
Besteht z.B. auf dem Zielrechner die Oracle Software Installation schon, so kann der erste Schritt ausgelassen werden. Möchte man nur eine Kopie der Datenbank ohne eine Standby Umgebung aufzubauen, müssen nur Schritt 1,2,4,5,6 durchgeführt werden.

Vorbemerkung:

Folgende Umgebungsvariablen und Namen werden in den Beispielen verwendet:

NameVariableWert
Oracle Home$ORACLE_HOME/opt/oracle/product/db
Oracle Base$ORACLE_BASE/opt/oracle
Oracle Inventory$INVENTORY/opt/oracle/oraInventory
Servername Primär Datenbankdgstg
Servername Standby Datenbankdgmuc
Name Primär Datenbankstg
Name Standby Datenbankmuc
Datendateien stg/opt/oracle/oradata/stg
Datendateien muc/opt/oracle/oradata/muc

Ausgangslage: Auf dem Server dgstg läuft eine 11g (11.1.0.7) Oracle Datenbank mit der SID stg.

Schritt 1: Klonen der Oracle Software

Die Oracle Software lässt sich mit Hilfe des Oracle Universal Installers (OUI) Klonen und auf dem Standby Rechner installieren. Dies hat den großen Vorteil, dass alle installierten Patches gleich mit gekloned werden und man nicht zusätzlich prüfen muss, ob auf dem Standby Rechner derselbe Softwarestand vorliegt. Dies ist eine Vorraussetzung für Data Guard.

Das Vorgehen beim Klonen von Oracle Homes ist, die Software zu taren oder zu zippen und die Software auf dem Standby Rechner zu entpacken. Allerdings sollten beim Klonen von Oracle Homes mit installierten Oracle Datenbanken die Enterprise Manager Konfigurations- und Log-files nicht transportiert werden. Diese Verzeichnisse können gleich beim Packen weggelassen werden, indem man eine Exclude Filelist angibt:

<servername>_<sid>
EMStagePatches_<sid>
Im Beispiel sind dies in der exclude Liste:
$ cat exclude
product/db/dgstg_stg
product/db/EMStagePatches_stg
Nun kann die Software auf den Standby Rechner kopiert werden (hier im Beispiel mit TAR und gleichzeitigem UNTAR). Das /opt/oracle Verzeichnis sollte auf dem Zielrechner bereits exsistieren und der Oracle User sollte Schreibberechtigung besitzen:
$ cd $ORACLE_BASE
$ tar -cvpf - -X exclude product | ssh dgmuc "cd /opt/oracle && tar -xvpf -"
Auf dgmuc wird nun das Oracle Inventory von der kopierten Software erstellt. Vorher kopieren wir noch 2 Template Files - dies ist im Moment noch bei 11.1.0.7 notwendig:
Auf dgmuc:
$ cp $ORACLE_HOME/sysman/config/lfm_efiles.template $ORACLE_HOME/sysman/config/lfm_efiles.template1
$ cp $ORACLE_HOME/sysman/config/lfm_ifiles.template $ORACLE_HOME/sysman/config/lfm_ifiles.template1

$ $ORACLE_HOME/oui/bin/runInstaller -clone ORACLE_HOME=/opt/oracle/product/db ORACLE_HOME_NAME=Ora11gDB 
ORACLE_BASE=/opt/oracle INVENTORY_LOCATION=/opt/oracle/oraInventory
Damit wäre die Oracle Software gekloned und einsatzbereit.

Schritt 2: Vorbereitungen auf der Source Datenbank stg - Archive Logging & Flashback

Damit überhaupt eine Online Sicherung gemacht werden kann, muss sich die Source Datenbank im Archivelogmodus befinden. Ebenso ist es seit 10g sinnvoll in Standby Umgebungen Flashback Logging zu aktivieren. Dies erlaubt u.a. eine leichte Reinstanziierung der Standby Datenbank (ohne erneutes RMAN Backup/Klon) und Daten schneller und leichter zu Recovern als über ein Point in Time Recovery.

$ sqlplus sys/oracle@stg as sysdba

SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP MOUNT;
SQL> ALTER DATABASE ARCHIVELOG;
SQL> ALTER DATABASE FLASHBACK ON;
SQL> ALTER DATABASE FORCE LOGGING;
SQL> ALTER DATABASE OPEN;

Schritt 3: Anlegen der Standby Redo Logs

Seit 11g ist der LGWR (Logwriter) der Default Transportmechanismus bei Standby Datenbanken. Dieser benötigt für Funktionalitäten wie "Zero Data Loss" sog. Standby Redologs. Diese sollten sowohl auf der Primär Seite, wie auch auf der Standby Seite angelegt werden.

Für die Berechnung der Anzahl an Standby Redologs gilt folgendes:

(Maximale Anzahl an Logfiles pro Thread (Instanz) +1) * Maximale Anzahl an Threads (Instanzen)

Sie werden mit der Syntax:

alter database add standby logfile thread X group Y size ZZ;

angelegt. Die Größe eines Standby Redologs richtet sich dabei nach der Größe der normalen Redologs.
SQL> alter database add standby logfile ('/opt/oracle/oradata/stg/std01.log') size 50M;
SQL> alter database add standby logfile ('/opt/oracle/oradata/stg/std02.log') size 50M;
SQL> alter database add standby logfile ('/opt/oracle/oradata/stg/std03.log') size 50M;
SQL> alter database add standby logfile ('/opt/oracle/oradata/stg/std04.log') size 50M;
SQL> alter system set standby_file_management=AUTO ;

SQL> SELECT GROUP#,THREAD#,SEQUENCE#,ARCHIVED,STATUS FROM V$STANDBY_LOG;

Schritt 4: Anpassung der listener.ora/tnsnames.ora für RMAN Copy & Data Guard Broker

Bei der Standard Netzwerkkonfiguration registriert sich die Datenbank mit ihren Services beim Listener, sobald diese gestartet wird. Allerdings hat man somit keinen Zugriff von extern auf die Datenbank, falls die Datenbank nicht gestartet ist, oder noch gar nicht existiert - wie in unserem Fall.

Aus diesem Grund passen wir die Netzwerkkonfiguration für den Data Guard Broker und für den RMAN Klon an:

LISTENER.ORA auf dgstg:

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = dgstg)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = stg_DGMGRL)
      (SID_NAME = stg)
    )
  ) 

LISTENER.ORA auf dgmuc:

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = dgmuc)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = muc_DGMGRL)
      (SID_NAME = muc)
    )
  )

TNSNAMES.ORA

stg =
  (DESCRIPTION =
   (ADDRESS = (PROTOCOL=TCP)(HOST=dgstg)(PORT=1521))
    (CONNECT_DATA =
      (SERVICE_NAME = stg)
    )
  )

muc =
  (DESCRIPTION =
   (ADDRESS = (PROTOCOL=TCP)(HOST=dgmuc)(PORT=1521))
    (CONNECT_DATA =
      (SERVICE_NAME = muc)
    )
  )
DG_stg =
  (DESCRIPTION =
   (ADDRESS = (PROTOCOL=TCP)(HOST=dgstg)(PORT=1521))
    (CONNECT_DATA =
      (SERVICE_NAME = stg_DGMGRL)
    )
  )

DG_muc =
  (DESCRIPTION =
   (ADDRESS = (PROTOCOL=TCP)(HOST=dgmuc)(PORT=1521))
    (CONNECT_DATA =
      (SERVICE_NAME = muc_DGMGRL)
    )
  )
Vergessen Sie bitte nicht, den Listener auf dem Source Rechner (dgstg) durchzustarten.

Schritt 5: Vorbereitung des Zielknoten (dgmuc) für das Kloning

Zu den Vorbereitungen auf dem Zielrechner gehört das Anlegen von Verzeichnissen. Einige Verzeichnisse werden nicht automatisch beim Datenbankklonen von RMAN angelegt. Ebenfalls muss im Vorfeld das Passwortfile der neuen Datenbank existieren und diese sollte manuell in /etc/oratab eingetragen werden.

$ export ORACLE_HOME=/opt/oracle/product/db
$ export ORACLE_SID=muc

Listener starten
$ lsnrctl start

Passwortfile anlegen
$ orapwd file=/opt/oracle/product/db/dbs/orapwmuc password=oracle 

Verzeichnisse
$ mkdir /opt/oracle/flash_recovery_area
$ mkdir /opt/oracle/admin
$ mkdir /opt/oracle/admin/muc
$ mkdir /opt/oracle/admin/muc/adump
$ mkdir /opt/oracle/oradata
$ mkdir /opt/oracle/oradata/muc

Eintrag in die oratab (als root)
# echo "muc:/opt/oracle/product/db" >>/etc/oratab

Schritt 6: Klonen der Oracle Datenbank mit RMAN Duplicate

Der folgende Schritt klont die Oracle Datenbank direkt übers Netz mit Hilfe des RMAN Duplicate Kommandos:

$ rman

RMAN> CONNECT TARGET SYS/oracle@dg_stg
RMAN> CONNECT AUXILIARY SYS/oracle@dg_muc
RMAN> STARTUP AUXILIARY nomount;
RMAN> SQL 'alter system archive log current';
RMAN> duplicate target database
2> for standby
3> from active database
4> spfile PARAMETER_VALUE_CONVERT '/stg/','/muc/'
5> set "DB_UNIQUE_NAME"="muc"
6> set LOG_FILE_NAME_CONVERT '/stg/','/muc/'
7> set DB_FILE_NAME_CONVERT '/stg/','/muc/'
8> dorecover;
Selbstverständlich können Sie hier weitere SPFile Änderungen einfließen lassen (z.B. Änderung der SGA Größe). Falls NAME_CONVERT nicht verwendet wird, muss explizit NOFILENAMECHECK hinzufügt werden, da RMAN einen Sicherheitscheck eingebaut hat, der das Kopieren in dieselben Dateinamen verhindern soll und somit das Überspielen existierender Dateien. NAME_CONVERT ist besonder bei der Verwendung von ASM ('+DATA','+STDDATA') oder dem Klonen auf demselben Host hilfreich.

Beachten Sie bitte: Sollte die Standby Datenbank später zu einer Logical Standby werden, verzichten Sie besser auf die CONVERT Parameter, da diese mit Logical Standby nicht unterstüzt sind.

Schritt 7: Kleinere Nacharbeiten auf der Standby

Hierzu gehört die Aktivierung des Data Guard Brokers auf der Primär und Standby Datenbank, sowie das Einschalten von Flashback auf der Standby. Die Aktivierung von Flashback wird nicht automatisch auf der Standby Seite durchgeführt.

$ sqlplus sys/oracle@DG_stg as sysdba
SQL> alter system set dg_broker_start=true
SQL> exit
$ sqlplus sys/oracle@DG_muc as sysdba
SQL> alter system set dg_broker_start=true
SQL> alter database flashback on;

Schritt 8: Einrichten von Data Guard

Default einer Data Guard Broker Konfiguration ist der ASYNC Logwriter Transport Mechanismus und der "Maximum Performance" Protection Modus. Für meine Konfiguration ändere ich den Transport Modus auf SYNC und verwende den "Maximum Availability" Modus.

$ dgmgrl

DGMGRL> CONNECT sys/oracle@DG_stg
DGMGRL> create configuration stg as 
        primary database is stg
        connect identifier is DG_stg;
DGMGRL> add database muc as
        connect identifier is DG_muc
        maintained as physical ;
DGMGRL> edit database stg set property 'logxptmode' ='sync' ;
DGMGRL> edit database muc set property 'logxptmode' ='sync' ;

Die Konfiguartion überprüfen
DGMGRL> show instance verbose 'dg' ; 
DGMGRL> show instance verbose 'dgst' ; 
DGMGRL> show database 'dg' ;
DGMGRL> show database 'dgst' ;

Konfiguration Aktivieren und überprüfen
DGMGRL> enable configuration ;
DGMGRL> show configuration verbose;

Maximum Avalability Modus Setzten
DGMGRL> Edit configuration set protection mode as maxavailability;
Danach ist die Standby Umgebung erfolgreich aufgesetzt und konfiguriert. Bleibt nur noch das Testen:

Schritt 9: Testen !

Bitte beachten Sie, dass zum Verbinden mit dem Data Guard Broker CLI immer der Connect String DG_xxx verwendet wird und niemals nur ein / . Dies ist zwingend notwendig, da der Data Guard Broker beim Umschalten/Failover die Datenbanken durchstartet. Bei einem Connect über / verliert der DG Broker dabei die Verbindung zur Datenbank. Infolgedessen ist der eigentliche Vorgang zwar erfolgreich (z.B. das Umschalten), die ehemalige Produktivdatenbank aber noch nicht als neue Standby Datenbank gestartet.

Umschalten der Produktivdatenbank:
$ dgmgrl
DGMGRL> connect sys/oracle@dg_stg wichtig!!
DGMGRL> switchover to muc
DGMGRL> switchover to stg

Failover zur Standby Datenbank + Reiinstanziierung
DGMGRL> shutdown abort
DGMGRL> failover to muc
DGMGRL> reinstate stg
DGMGRL> switchover to stg

Verwendung von Aktiv Data Guard (Neue kostenpflichtige Funktion der Oracle 11g Enterprise Edition)
DGMGRL> edit database muc set state read-only
DGMGRL> edit database muc set state apply-on

Nützliche Links und Referenzen

  • Oracle Universal Installer and OPatch User's Guide - 6 Cloning Oracle Software
  • Oracle Data Guard Concepts and Administration - 3 Creating a Physical Standby Database
  • Oracle Data Guard Concepts and Administration - F Creating a Standby Database with Recovery Manager
  • Data Guard Redo Transport & Network Configuration
  • Data Guard Redo Apply & Media Recovery
  • MAA Best Practices

    Zurück zur Community-Seite