Freitag, 10. August 2012

OracleNet für Clients in einer Data Guard Umgebung

Damit Clients immer auf die aktive Datenbank in einer Data Guard Umgebung kommen, muss die folgende Konfiguration vorgenommen werden.

Umgebung

Wir nehmen die folgende Konfiguration an:
Primary
Host: primhost
ORACLE_SID: mars
db_unique_name: mars
Standby
Host: primhost
ORACLE_SID: mars
db_unique_name: mars_dg
Konfiguration aus Sicht des Clients
Für die Clients soll der Oracle Service "marsdb" verfügbar gemacht werden. Dieser Dienst läuft immer auf der momentanen Primary-Database und wird bei einem Switchover oder Failover mit umgezogen. Dieses Verhalten kann mit einem Trigger erreicht werden, den wir auf der Primary Datenbank anlegen und per Redo-Apply auf die Standby Datenbank übertragen.

Trigger erstellen

Der Trigger startet den Oracle Service immer dann, wenn die Datenbank PRIMARY ist.
CREATE OR REPLACE TRIGGER MARS_SERVICE AFTER STARTUP ON DATABASE
DECLARE
  v_role VARCHAR(30);
BEGIN
  SELECT DATABASE_ROLE INTO v_role FROM V$DATABASE;
  IF v_role = ‘PRIMARY’ THEN
    DBMS_SERVICE.START_SERVICE(‘marsdb’);
  END IF;
END;
/
Wenn die Standby Datenbank von Zeit zu Zeit mal im READ_ONLY Modus laufen soll oder wenn das Feature Active Dataguard lizenziert wurde, kann der Trigger erweitert werden. Der Trigger startet immer dann der Oracle Service marsro (für "mars read only"), wenn es die momentane Standby Datenbank ist, die gerade gestartet wird. Die Erweiterung des Triggers sieht so aus:
CREATE OR REPLACE TRIGGER MARS_SERVICE AFTER STARTUP ON DATABASE
DECLARE
  v_role VARCHAR(30);
BEGIN
  SELECT DATABASE_ROLE INTO v_role FROM V$DATABASE;
  IF v_role = ‘PRIMARY’ THEN
    DBMS_SERVICE.START_SERVICE(‘marsdb’);
  ELSE
    DBMS_SERVICE.STOP_SERVICE(‘marsro’);
  END IF;
END;
/
Also, wie funktioniert der Trigger?
Immer beim ALTER DATABASE OPEN [READ ONLY]; prüft der Trigger ob die Datenbank PRIMARY ist oder nicht. Wenn sie PRIMARY ist, dann wird der Service marsdb gestartet. Andernfalls (READ_ONLY mit oder ohne Apply) wird der Service marsro gestartet. So ist die offene Datenbank immer unter dem Service Name marsdb erreichbar und die Datenbank im READ_ONLY Modus immer über den Service marsro. Also völlig transparent wird der Client immer auf die richtige Datenbank geschickt.

Client Konfiguration

Im Client ist jetzt eine Spezielle Konfiguration erforderlich damit er beide Datenbank-Server kennt.
In der TNSNAMES.ora muss der folgende Eintrag erstellt werden:
marsdb =
(DESCRIPTION =
  (ADDRESS_LIST =
  (ADDRESS = (PROTOCOL = TCP)(HOST = primhost)(PORT = 1521))
  (ADDRESS = (PROTOCOL = TCP)(HOST = stbyhost)(PORT = 1521))
  (LOAD_BALANCE = no)
  (FAILOVER = yes)
  )
  (CONNECT_DATA =
    (SERVER = DEDICATED)
    (SERVICE_NAME = marsdb)
    (failover_mode =
      (type = select)
      (method = preconnect)
      (retries = 50)
      (delay = 5)
    )
  )
)
Für unsere Freunde aus dem Java-Umfeld noch der JDBC Connectionstring:
jdbc:oracle:thin:@(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = primhost)(PORT = 1521)) (ADDRESS = (PROTOCOL = TCP)(HOST = stbyhost)(PORT = 1521))(LOAD_BALANCE = no)(FAILOVER = yes))(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = marsdb)(failover_mode = (type = select)(method = preconnect)(retries = 50)(delay = 5))))
Was wird hier dem Client mitgeteilt?
  • Es existieren 2 Datenbanken die wo der Service marsdb gefunden werden kann.
  • LOAD_BALANCE ist aus weil ja immer nur eine Datenbank offen ist.
  • FAILOVER ist an und zwar mit der folgenden Konfiguration:
    • PRECONNECT
    • 50x soll versucht werden ein Reconnect durchzuführen.
    • 5 Sekunden Abstand zwischen den Reconnects.
Diese Konfiguration eignet sich besonders für Umgebungen die einen Observer haben. Ansonsten kann der Teil "failover_mode" weggelassen werden, denn es muss sowieso ein Manueller Eingriff erfolgen.
Für den Dienst marsro muss natürlich aus so ein Eintrag erstellt werden.
That's IT

Mittwoch, 18. Juli 2012

Automatic Memory Management in 11g

In Oracle 11g wurde das Automatic Memory Management (AMM) eingeführt, dass sowohl die SGA als auch die PGA dynamisch verwaltet. Mit der Einführung wurden die beiden neuen Parameter MEMORY_MAX_TARGET und MEMORY_TARGET geschaffen.
Immer wieder stelle ich fest, dass Datenbanken unvorteilhaft konfiguriert werden. Dies ist vor allem auf die Dokumente von Oracle zurückzuführen, die hier nicht alle Aspekte abdecken. Um Automatic Memory Management zu nutzen, müssen die folgenden Parameter gesetzt werden:
  • MEMORY_TARGET: Definiert die Obergrenze des Dynamisch verwalteten Speichers. SGA + PGA = MEMORY_TARGET.
  • MEMORY_MAX_TARGET: Dieser Parameter ist optional. Wenn er auf 0 steht, wird bei starten der Instanz der Parameter auf den selben Wert wie MEMORY_TARGET gesetzt.
  • SGA_TARGET: Laut Oracle Note 443746.1 soll dieser Parameter auf 0 gesetzt werden. In der Theorie stimme ich zu, in der Praxis nicht. Mehr dazu im nächsten Absatz.
  • PGA_AGGREGATE_TARGET: Das Selbe wie für Parameter SGA_TARGET.
In der Oracle-Dokumentation wird beschrieben, dass bei SGA_TARGET=0, Autotuning für DEFERRED Modus deaktiviert ist. Dies führt zu ORA-4031 ("Out of Memory") Fehlern. Ähnliches gilt für den Parameter PGA_AGGREGATE_TARGET. Hier kann es zu Fehler ORA-4030 kommen wenn der Parameter auf Wert 0 gesetzt wurde.
Mein Vorschlag ist deshalb die Parameter SGA_TARGET und PGA_AGGREAGATE_TARGET auf einen kleinen Wert zu setzen. Dieser Wert ist dann jeweils das Minimum an zugewiesenem Speicher und erlaubt Oracle trotzdem frei mit dem Speicher zu haushalten.
Als vollständiges Beispiel hier:
SQL> show parameter target
NAME                                 TYPE                              VALUE
------------------------------------ --------------------------------- ------------------------------
archive_lag_target                   integer                           0
db_flashback_retention_target        integer                           1440
fast_start_io_target                 integer                           0
fast_start_mttr_target               integer                           0
memory_max_target                    big integer                       12G
memory_target                        big integer                       12G
parallel_servers_target              integer                           64
pga_aggregate_target                 big integer                       500M
sga_target                           big integer                       2G

That's IT

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 :-)