Dienstag, 22. Mai 2012

Standby-Datenbank mit RMAN voll automatisch erstellen

Hier ein paar Notizen zum erstellen einer Standby-Datenbank mittels RMAN.
Immer wieder ärgere ich mich darüber, dass es im Internet keine vollständig beschriebene Anleitung gibt, wie man eine Standby-DB voll automatisch mit RMAN erstellt. Also habe ich mich dazu entschlossen eine weitere unvollständige Version hinzuzufügen. Vielleicht hilft es dem einen oder anderen... also, viel Erfolg!

Primary DB

  • Primary muss im Archivelog-Modus Laufen.
  • Force Loggin muss eingeschaltet sein.
  • Flashback muss an sein.
SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP MOUNT;
SQL> ALTER DATABASE ARCHIVELOG;
SQL> ALTER DATABASE FLASHBACK ON;
SQL> ALTER DATABASE FORCE LOGGING;
SQL> ALTER DATABASE OPEN;

Standby-Logfiles anlegen: Laut Oracle-Dokumentation sollen so viele Standby Log Gruppen angelegt werden wie Anzahl Redo Log Gruppen + 1. Im Fall eines RACs, sind es die Anzahl der Online Redo Logdateien + 1 multipliziert mit der Anzahl der RAC-Knoten.
Der Befehl zum Anlegen lautet wie folgt:
alter database add standby logfile group 4 size 50M;
alter database add standby logfile group 5 size 50M;
alter database add standby logfile group 6 size 50M;
alter database add standby logfile group 7 size 50M;

SQL-Net vorbereiten

In die SID-List des Primary und Standby Listeners die jeweilige Datenbank eintragen (+ _DGMGRL Eintrag). Anschließend die TNS-Names Einträge erstellen. Das Format des GLOBAL_NAME muss wie folgt sein: <db_unique_name>_DGMGRL[.db_domain]

listener.ora auf Primary

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = primhost)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = mars_DGMGRL)
      (ORACLE_HOME = c:\oracle\product\db112)
      (SID_NAME = mars)
    )
  )

listener.ora auf Standby

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = stbyhost)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = mars_dg_DGMGRL)
      (ORACLE_HOME = c:\oracle\product\db112)
      (SID_NAME = mars)
    )
  )

tnsnames.ora auf beiden Servern

DG_mars =
  (DESCRIPTION =
   (ADDRESS = (PROTOCOL=TCP)(HOST=primhost)(PORT=1521))
    (CONNECT_DATA =
      (SERVICE_NAME = mars_DGMGRL)
    )
  )
DG_mars_dg =
  (DESCRIPTION =
   (ADDRESS = (PROTOCOL=TCP)(HOST=stbyhost)(PORT=1521))
    (CONNECT_DATA =
      (SERVICE_NAME = mars_dg_DGMGRL)
    )
  )

Passwordfile

Das Passwordfile muss von der Primary Datenbank auf die Standby Datenbank kopiert werden. Neu erzeugen hilft nichts.

SPFILE erstellen

*.audit_file_dest='/opt/oracle/admin/dummy/adump'
*.db_create_file_dest='/opt/oracle/oradata'
*.db_name='mars'
*.db_recovery_file_dest='/opt/oracle/fast_recovery_area'
*.db_recovery_file_dest_size=17179869184
*.db_unique_name='mars_dg'
*.diagnostic_dest='/opt/oracle'
*.memory_target=536870912
*.undo_tablespace='UNDOTBS1'
!!!Es dürfen keine Dataguard-Spezifischen Parameter gesetzt sein. Wenn OMF verwendet wird, ist auch der Parameter "controlfiles" überflüssig. Alle nötigen Parameter werden von RMAN und später vom Broker gesetzt. Also am besten copy-paste übernehmen und namen anpassen.

Datenbank Clonen

C:\Users\Administrator.DC_MARS>set ORACLE_SID=mars
(der folgende Befehl nur unter Windows)
C:\Users\Administrator.DC_MARS>oradim -new -sid mars
Instanz erstellt.
C:\Users\Administrator.DC_MARS>sqlplus / as sysdba
SQL*Plus: Release 11.2.0.2.0 Production on Fr Mai 4 12:28:51 2012
Copyright (c) 1982, 2010, Oracle. All rights reserved.
Bei einer nicht hochgefahrenen Instanz angemeldet.
SQL> create spfile from pfile;
Datei erstellt.
SQL> startup nomount
ORACLE-Instanz hochgefahren.
Total System Global Area 4,8103E+10 bytes
Fixed Size 2264200 bytes
Variable Size 2,2414E+10 bytes
Database Buffers 2,5636E+10 bytes
Redo Buffers 50454528 bytes
SQL>
Und jetzt das eigentlich Clonen...
C:\Users\Administrator.DC_MARS>rman
Recovery Manager: Release 11.2.0.2.0 - Production on Fr Mai 4 12:32:39 2012
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
RMAN> connect target sys/<pw>@DG_mars
Mit Ziel-Datenbank verbunden: MARS (DBID=3147292014)
RMAN> connect auxiliary sys/<pw>@DG_mars_dg
Bei Hilfsdatenbank angemeldet: MARS (nicht mit MOUNT angeschlossen)
RMAN>
RMAN>
RMAN> run {
allocate channel d1 device type disk;
allocate channel d2 device type disk;
allocate channel d3 device type disk;
allocate auxiliary channel aux1 device type disk;
allocate auxiliary channel aux2 device type disk;
allocate auxiliary channel aux3 device type disk;
duplicate target database for standby from active database;
}
Kontrolldatei der Zieldatenbank wird anstelle des Recovery-Katalogs verwendet
Zugewiesener Kanal: d1
Kanal d1: SID=1267 Device-Typ=DISK
Zugewiesener Kanal: d2
Kanal d2: SID=1373 Device-Typ=DISK
Zugewiesener Kanal: d3
Kanal d3: SID=1468 Device-Typ=DISK
Zugewiesener Kanal: aux1
Kanal aux1: SID=673 Device-Typ=DISK
Zugewiesener Kanal: aux2
Kanal aux2: SID=770 Device-Typ=DISK
Zugewiesener Kanal: aux3
Kanal aux3: SID=866 Device-Typ=DISK
Starten Duplicate Db um 04.05.12
Inhalt von Speicher-Skript:
{
backup as copy reuse
targetfile 'c:\oracle\product\db112\DATABASE\PWDmars.ORA' auxiliary format
'c:\Oracle\product\db112\DATABASE\PWDmars.ORA' ;
}
Speicher-Skript wird ausgef³hrt
Starten backup um 04.05.12
Beendet backup um 04.05.12
Inhalt von Speicher-Skript:
{
sql clone "alter system set control_files = ''L:\ORADATA\MARS\CONTROLFILE\O1_MF_7T7FK57Q_.CTL'', ''F:\ORAFLASH\MARS\CONTROLFILE\O1_MF_7T7FK57Q_.CTL'' comment=''Set by RMAN'' scope=spfile";
backup as copy current controlfile for standby auxiliary format 'L:\ORADATA\MARS\CONTROLFILE\O1_MF_7T7FK586_.CTL';
restore clone controlfile to 'F:\ORAFLASH\MARS\CONTROLFILE\O1_MF_7T7FK586_.CTL' from 'L:\ORADATA\MARS\CONTROLFILE\O1_MF_7T7FK586_.CTL';
sql clone "alter system set control_files = ''L:\ORADATA\MARS\CONTROLFILE\O1_MF_7T7FK586_.CTL'', ''F:\ORAFLASH\MARS\CONTROLFILE\O1_MF_7T7FK586_.CTL'' comment=''Set by RMAN'' scope=spfile";
shutdown clone immediate;
startup clone nomount;
}
Speicher-Skript wird ausgef³hrt
SQL-Anweisung: alter system set control_files = ''L:\ORADATA\MARS\CONTROLFILE\O1_MF_7T7FK57Q_.CTL'', ''F:\ORAFLASH\MARS\CONTROLFILE\O1_MF_7T7FK57Q_.CTL'' comment= ''Set by RMAN'' scope=spfile
Starten backup um 04.05.12
Kanal d1: Datendatei-Kopie wird gestartet
Standby-Kontrolldatei wird kopiert
Ausgabedateiname=C:\ORACLE\PRODUCT\DB112\DATABASE\SNCFMARS.ORA Tag=TAG20120504T125741 RECID=111 STAMP=782398662
Kanal d1: Datendatei-Kopie abgeschlossen, abgelaufene Zeit: 00:00:02
Beendet backup um 04.05.12
Starten restore um 04.05.12
Kanal aux2: ³bersprungen, AUTOBACKUP schon gefunden
Kanal aux3: ³bersprungen, AUTOBACKUP schon gefunden
Kanal aux1: Kontrolldateikopie wurde kopiert
Beendet restore um 04.05.12
SQL-Anweisung: alter system set control_files = ''L:\ORADATA\MARS\CONTROLFILE\O1_MF_7T7FK586_.CTL'', ''F:\ORAFLASH\MARS\CONTROLFILE\O1_MF_7T7FK586_.CTL'' comment= ''Set by RMAN'' scope=spfile
Oracle-Instanz heruntergefahren
Mit Hilfsdatenbank verbunden (nicht gestartet)
Oracle-Instanz gestartet
Gesamte System Global Area 48102666240 Byte
Fixed Size 2264200 Byte
Variable Size 22414361464 Byte
Database Buffers 25635586048 Byte
Redo Buffers 50454528 Byte
Zugewiesener Kanal: aux1
Kanal aux1: SID=578 Device-Typ=DISK
Zugewiesener Kanal: aux2
Kanal aux2: SID=673 Device-Typ=DISK
Zugewiesener Kanal: aux3
Kanal aux3: SID=770 Device-Typ=DISK
Inhalt von Speicher-Skript:
{
sql clone 'alter database mount standby database';
}
Speicher-Skript wird ausgef³hrt
SQL-Anweisung: alter database mount standby database
Inhalt von Speicher-Skript:
{
set newname for clone tempfile 2 to new;
switch clone tempfile all;
set newname for clone datafile 1 to new;
set newname for clone datafile 2 to new;
set newname for clone datafile 3 to new;
set newname for clone datafile 4 to new;
set newname for clone datafile 5 to new;
set newname for clone datafile 6 to new;
backup as copy reuse
datafile 1 auxiliary format new
datafile 2 auxiliary format new
datafile 3 auxiliary format new
datafile 4 auxiliary format new
datafile 5 auxiliary format new
datafile 6 auxiliary format new
;
sql 'alter system archive log current';
}
Speicher-Skript wird ausgef³hrt
Befehl wird ausgef³hrt: SET NEWNAME
Temporõre Datei 2 in Kontrolldatei in L:\ORADATA\MARS\DATAFILE\O1_MF_TEMP_%U_.TMP umbenannt
Befehl wird ausgef³hrt: SET NEWNAME
Befehl wird ausgef³hrt: SET NEWNAME
Befehl wird ausgef³hrt: SET NEWNAME
Befehl wird ausgef³hrt: SET NEWNAME
Befehl wird ausgef³hrt: SET NEWNAME
Befehl wird ausgef³hrt: SET NEWNAME
Starten backup um 04.05.12
Kanal d1: Datendatei-Kopie wird gestartet
Dateinummer der Eingabedatendatei=00004 Name=E:\ORADATA\MARS_DG\DATAFILE\O1_MF_DATA1_DATA_D-MARS_I-3147292014_TS-DATA1_FNO-4_1EMOBHPS_.DBF
Kanal d2: Datendatei-Kopie wird gestartet
Dateinummer der Eingabedatendatei=00006 Name=E:\ORADATA\MARS_DG\DATAFILE\O1_MF_DATA1_77P38MKR_.DBF
Kanal d3: Datendatei-Kopie wird gestartet
Dateinummer der Eingabedatendatei=00001 Name=E:\ORADATA\MARS_DG\DATAFILE\O1_MF_SYSTEM_DATA_D-MARS_I-3147292014_TS-SYSTEM_FNO-1_1GMOBHPT_.DBF
Ausgabedateiname=L:\ORADATA\MARS\DATAFILE\O1_MF_SYSTEM_DATA_D-MARS_I-3147292014_TS-SYSTEM_FNO-1_D7NA4T7J_.DBF Tag=TAG20120504T125827
Kanal d3: Datendatei-Kopie abgeschlossen, abgelaufene Zeit: 00:02:36
Kanal d3: Datendatei-Kopie wird gestartet
Dateinummer der Eingabedatendatei=00003 Name=E:\ORADATA\MARS_DG\DATAFILE\O1_MF_UNDOTBS1_DATA_D-MARS_I-3147292014_TS-UNDOTBS1_FNO-3_1HMOBHPT_.DBF
Ausgabedateiname=L:\ORADATA\MARS\DATAFILE\O1_MF_UNDOTBS1_DATA_D-MARS_I-3147292014_TS-UNDOTBS1_FNO-3_D8NA4TCF_.DBF Tag=TAG20120504T125827
Kanal d3: Datendatei-Kopie abgeschlossen, abgelaufene Zeit: 00:00:36
Kanal d3: Datendatei-Kopie wird gestartet
Dateinummer der Eingabedatendatei=00002 Name=E:\ORADATA\MARS_DG\DATAFILE\O1_MF_SYSAUX_DATA_D-MARS_I-3147292014_TS-SYSAUX_FNO-2_1IMOBHPT_.DBF
Ausgabedateiname=L:\ORADATA\MARS\DATAFILE\O1_MF_SYSAUX_DATA_D-MARS_I-3147292014_TS-SYSAUX_FNO-2_D9NA4TDJ_.DBF Tag=TAG20120504T125827
Kanal d3: Datendatei-Kopie abgeschlossen, abgelaufene Zeit: 00:00:25
Kanal d3: Datendatei-Kopie wird gestartet
Dateinummer der Eingabedatendatei=00005 Name=E:\ORADATA\MARS_DG\DATAFILE\O1_MF_INDEX1_DATA_D-MARS_I-3147292014_TS-INDEX1_FNO-5_1JMOBHPT_.DBF
Ausgabedateiname=L:\ORADATA\MARS\DATAFILE\O1_MF_INDEX1_DATA_D-MARS_I-3147292014_TS-INDEX1_FNO-5_DANA4TEC_.DBF Tag=TAG20120504T125827
Kanal d3: Datendatei-Kopie abgeschlossen, abgelaufene Zeit: 00:00:07
Ausgabedateiname=L:\ORADATA\MARS\DATAFILE\O1_MF_DATA1_DATA_D-MARS_I-3147292014_TS-DATA1_FNO-6_D6NA4T7J_.DBF Tag=TAG20120504T125827
Kanal d2: Datendatei-Kopie abgeschlossen, abgelaufene Zeit: 00:09:13
Ausgabedateiname=L:\ORADATA\MARS\DATAFILE\O1_MF_DATA1_DATA_D-MARS_I-3147292014_TS-DATA1_FNO-4_D5NA4T7J_.DBF Tag=TAG20120504T125827
Kanal d1: Datendatei-Kopie abgeschlossen, abgelaufene Zeit: 00:10:33
Beendet backup um 04.05.12
SQL-Anweisung: alter system archive log current
Inhalt von Speicher-Skript:
{
switch clone datafile all;
}
Speicher-Skript wird ausgef³hrt
Datendatei 1 gegen Datendateikopie ausgetauscht
Eingabe-Datendateikopie RECID=111 STAMP=782399342 Dateiname=L:\ORADATA\MARS\DATAFILE\O1_MF_SYSTEM_DATA_D-MARS_I-3147292014_TS-SYSTEM_FNO-1_D7NA4T7J_.DBF
Datendatei 2 gegen Datendateikopie ausgetauscht
Eingabe-Datendateikopie RECID=112 STAMP=782399342 Dateiname=L:\ORADATA\MARS\DATAFILE\O1_MF_SYSAUX_DATA_D-MARS_I-3147292014_TS-SYSAUX_FNO-2_D9NA4TDJ_.DBF
Datendatei 3 gegen Datendateikopie ausgetauscht
Eingabe-Datendateikopie RECID=113 STAMP=782399342 Dateiname=L:\ORADATA\MARS\DATAFILE\O1_MF_UNDOTBS1_DATA_D-MARS_I-3147292014_TS-UNDOTBS1_FNO-3_D8NA4TCF_.DBF
Datendatei 4 gegen Datendateikopie ausgetauscht
Eingabe-Datendateikopie RECID=114 STAMP=782399342 Dateiname=L:\ORADATA\MARS\DATAFILE\O1_MF_DATA1_DATA_D-MARS_I-3147292014_TS-DATA1_FNO-4_D5NA4T7J_.DBF
Datendatei 5 gegen Datendateikopie ausgetauscht
Eingabe-Datendateikopie RECID=115 STAMP=782399342 Dateiname=L:\ORADATA\MARS\DATAFILE\O1_MF_INDEX1_DATA_D-MARS_I-3147292014_TS-INDEX1_FNO-5_DANA4TEC_.DBF
Datendatei 6 gegen Datendateikopie ausgetauscht
Eingabe-Datendateikopie RECID=116 STAMP=782399343 Dateiname=L:\ORADATA\MARS\DATAFILE\O1_MF_DATA1_DATA_D-MARS_I-3147292014_TS-DATA1_FNO-6_D6NA4T7J_.DBF
Beendet Duplicate Db um 04.05.12
Freigegebener Kanal: d1
Freigegebener Kanal: d2
Freigegebener Kanal: d3
Freigegebener Kanal: aux1
Freigegebener Kanal: aux2
Freigegebener Kanal: aux3
RMAN>

Broker Konfigurieren

Broker Starten

SQL> alter system set dg_broker_start=true;

Konfiguration erstellen

Primary Datenbank hinzufügen

DGMGRL> CONNECT sys/<pw>@DG_mars
DGMGRL> create configuration mars_dataguard as primary database is mars connect identifier is DG_mars;

Standby Datenbank hinzufügen

DGMGRL> add database mars_dg as connect identifier is DG_mars_dg maintained as physical;

Konfiguration anschalten

DGMGRL> enable configuration;

Standby File Management auf AUTO setzen

DGMGRL> edit database mars set property 'StandbyFileManagement'='AUTO';
DGMGRL> edit database mars_dg set property 'StandbyFileManagement'='AUTO';

Protection Mode anpassen

Konfigurationen vornehmen:
DGMGRL> edit database mars_dg set property 'logxptmode'='sync';
DGMGRL> edit database mars set property 'logxptmode'='sync';
Protection Mode wechseln:
DGMGRL> edit configuration set protection mode as maxavailability;
That's IT -- beim nächsten Mal mehr...

Freitag, 18. Mai 2012

Stabilität für Oracle Datenbanken


Warum Standardisierung zur Stabilitätsgewinnung?

"Ordnung ist das halbe Leben." Ein total abgedroschenes Sprichwort - finde ich - unwahr ist es deshalb aber bei Weitem nicht. Ganz im Gegenteil. Meine Erfahrungen als Oracle-DBA haben mich immer wieder zu dem Schluss geführt, dass viele Fehler vermeiden lassen wenn Ordnung herrscht.
Oracle Datenbanken zu betreiben, bedeutet weit mehr als Software Installation, Tablespaces erweitern und Backup. Datenbanken brauchen sehr viel Pflege und Zuwendung, sie sind sehr unbeständig und können ihre Ansprüche daher auch schnell verändern. Kümmert sich ein (DBA) nicht ständig um das Wohlergehen der Datenbanken, so wird bald ein Durcheinander und Wirrwarr entstehen. Dies hat zur wiederum Folge, dass die Performance und Stabilität der Systeme untergraben werden. Es gibt viele Oracle Datenbank Landschaften, die nach genau diesem Prinzip betrieben werden, aber sie sind alles andere als stabil, schnell und zuverlässig.
Meiner Meinung nach ist es also unabdingbar ein klares Konzept zu haben, ein "Handbuch" das eine Verbindliche Vorgehensweise beschreibt, wie Datenbanken unter welchen Umständen zu konfigurieren sind. Damit meine ich nicht nur die Konfigurations-Parameter der Datenbank selbst, sonder insbesondere die Infrastruktur in der diese Datenbank eingefügt ist.

Inhalt der Database Guideline

Was sollte alles in der Database Guideline beschrieben werden? Meine Antwort darauf lautet „ALLES – (fast) alles!“. Alles was nicht individuell für diese eine Datenbank so eingestellt wird muss in diesem Handbuch stehen. Für ein 1-Mann DBA-Büro mag das unsinnig erscheinen - ist es aber nicht. Wer kennt das nicht: "Wie war das gerade nochmal? Ach, wird schon stimmen...". Die Schwierigkeit besteht also darin, zwischen sinniger und unsinniger Dokumentation zu bleiben. Dabei ist aber die unsinnige Dokumentation immer noch besser als keine Dokumentation.
Als Starthilfe will ich hier ein mögliches Inhaltsverzeichnis vorgeben:
  1. Host System
    1. Unterstützte Betriebsysteme (je weniger, desto besser)
    2. Benutzer und Benutzer-Gruppen
      1. Oracle Environment (UNIX/Linux)
      2. User und Group-IDs (sehr wichtig z.B. zentralen Script-Shares)
  2. Massenspeicher-Medien
  3. Datenbank Konfiguration
    1. Pfade für Software
      1. Oracle Datenbank
      2. ASM
      3. Application Server
    2. Pfade für Konfiguration
      1. Oracle HOME und BASE
      2. Parameter Dateien, Scripte, Kleine Helferlein
    3. Pfade für Daten
      1. Oradata
      2. Oraredo
      3. Oraarchive
      4. Oramirror (sofern verwendet)
      5. Flashrecovery Area (sofern verwendet)
    4. Namensauflösung
      1. TNSNAME / LDAP / OID
      2. Ein Standard, wie die Namensauflösung verteilt wird wenn TNANAMES verwendet wird
  4. Datenbank Backup
    1. Erläuterungen zum Backup-Konzept
    2. Scheduler
    3. Protokolle, Fehlermeldungen, Fehlerbehandlung
    4. Überwachung
    5. Anbindung an Backup-System
    6. RMAN-Scripte und Usage
  5. Hochverfügbarkeit
    1. RAC
      1. […]
    2. DataGuard
      1. […]
    3. Grid Infrastructure
    4. Oracle Restart / init-Scripte
  6. Antragsformulare
    1. Klingt bürokratisch, ist aber eine große Hilfe beim Managen von User-Anfragen
Fast alle dieser Punkte sind ein absolutes Muss. Je nach Datenbank Landschaft kommen noch einige Punkte hinzu, ganz besonders im Hochverfügbarkeits-Bereich. Wenn alle diese Punkte Dokumentiert und auf jeder Datenbank umgesetzt sind, so kann ich mit Sicherheit voraussagen, dass eine Grund-Stabilität geschaffen ist.
An dieser Stelle passt das folgende Beispiel aus einem Kundenprojekt: Fast täglich hatte irgend eine Datenbank (von ca. 70-80 Datenbanken) die unterschiedlichsten Probleme, meistens war eine Downtime nicht zu vermeiden. Zunächst wurde das zweiköpfige Datenbank-Team neu aufgestellt, anschließend arbeitete man an einem Konzept zur Standardisierung der Datenbank-Landschaft. Schon während der Umsetzung verringerten sich die Ausfälle immer mehr. Innerhalb von einem halben Jahr wurde das DBA-Team zum Aushängeschild der IT-Abteilung was Zuverlässigkeit der Systeme und Dokumentation anging.
That's IT :-)