Seiten

Posts mit dem Label RAC werden angezeigt. Alle Posts anzeigen
Posts mit dem Label RAC werden angezeigt. Alle Posts anzeigen

Donnerstag, 27. November 2014

ORA-01041 - eine Frage der Zeit

Betreibt man einen RAC , kann man aus heiterem Himmel einen ORA-01041 (ORA-01041: Interner Fehler: hostdef-Erweiterung ist nicht vorhanden) bekommen, wenn man sich auf dem Knoten über die Betriebssystemauthentifizierung mit der DB verbinden möchte.
Zum Beispiel:
c:\rman target /

Recovery Manager: Release 11.2.0.4.0 - Production on So Nov 23 06:00:01 2014

Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.

RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-00554: Initialisierung des internen Recovery Manager Packages nicht erfolgreich
RMAN-04005: Fehler aus Zieldatenbank: 
ORA-01041: Interner Fehler: hostdef-Erweiterung ist nicht vorhanden
Mit sqlplus bietet sich das gleiche Bild.
Ein "normaler" connect auf die DB ist hingegen möglich und die Anwendungen auf der DB sind nicht beeinträchtigt.
Eine Ursache des Problems ist möglicherweise die Systemzeit auf dem Server.
Wenn man einen WindowsServer für die RAC-Installation einrichtet, sind Einstellungen in der Registry zu treffen, die verhindern, dass die Zeit zurückgestellt werden kann. ("Set the value for MaxNegPhaseCorrection to 0.": http://docs.oracle.com/cd/E14848_01/doc/install.112/e10817/prewin.htm#BABJBHFH)
Wenn die Uhr des Servers nun etwas zu schnell läuft und vorgeht, kann der Windowsdienst die Uhr nicht mehr korrigieren.
Irgendwann geht die Uhr des Servers mehr als 5min vor und dann passiert folgendes:
Der Server fliegt aus der Domäne. (http://support.microsoft.com/kb/884776/de) Ohne Domäne funktioniert die OS-Authentifizierung nicht mehr und der ORA-01041 kommt.
Dann hilft nur Clusterware stoppen, Zeit stellen, Clusterware starten.
  1. c:\>crsctl stop crs
  2. c:\>net stop w32time
  3. c:\>net start w32time
  4. c:\>w32tm /resync
  5. c:\>crsctl start crs
In einem anderen, neueren Dokument ist Oracle mit dem Wert für MaxNegPhaseCorrection übrigens nicht so restriktiv. Hier sind auf einmal 600s erlaubt:
https://docs.oracle.com/cd/E11882_01/install.112/e48194/prewin.htm#BAJHCEDG



Dienstag, 8. Juli 2014

Statspack auf dem RAC

Wenn man das Statspack auf einem RAC benutzen will, kann es laut Jonathan Lewis dazu kommen, dass sich die einzelnen Instanzen beim Zugriff auf die DB gegenseitig locken.
"Now there’s no reason why Statspack should lock up a RAC cluster – in principle. But this was an 8-node cluster and if you set up the automatic job to take snapshots by running the default spauto.sql script all eight nodes could start running every hour on the hour – so they would all be fighting constantly for every block of every table and index in the Statspack schema.  (I’m exaggerating for effect, of course, but not by much). You might not notice the global cache contention in a 2-node cluster but eight nodes could, indeed, “lock up the system” at this point."
Sein Artikel bezieht sich zwar auf die 10g, aber es sieht so aus, als könnte es dieses Risiko in der 11g und höher weiterhin geben.
Auch ist RAC mit 2 Nodes wohl nicht gefährdet. Ich habe trotzdem ein wenig weiter gegraben. Hier http://www.oracle-class.com/?p=2384 ist ein guter Artikel, in dem beschrieben wird, wie man das Statspack auf einem 4-Node-RAC ausführen lässt. Die Anleitung bezieht sich ebenfalls auf Jonathan Lewis und nutzt sehr anschaulich DBMS_SCHEDULER und Services um die einzelnen Nodes gezielt anzusprechen.
Die Skripte lassen sich - geringfügig angepasst - so nutzen.

Mittwoch, 26. Februar 2014

Oracle, Windowsdienste und ORA-12631

Damit die DB auch ins Netzwerk schreiben kann, muss der entsprechende Dienst unter einem Domainuser laufen.
Beim RMAN ist das zum Beispiel sehr nützlich, aber auch beim RAC kann man das gut gebrauchen, sofern die Instanzen der verschiedenen Nodes auf das Filesystem ihrer Kollegen zugreifen müssen.
Das lässt sich bequem über die Oberfläche einrichten (services.msc):
  1. rechte Maustaste auf dem Dienst und Properties auswählen
  2. auf den Reiter "Log On" wechseln
  3. This Account und 
  4. Account und Passwort angeben.
  5. OK
  6. Dienst neu starten und fertig.
Das könnte so einfach sein. Allerdings sollte man einen Fallstrick beachten.
Sofern man den Account bequem per Button "Browse" und anschließendem "Check Names" auswählt, wird das ganze nicht mehr wie gewohnt funktionieren.

 

In diesem Fall wird Windows den Account im Format "oradba@my.domain" eintragen.
Die Folge ist ein ORA-12631 beim Versuch eines Connects per NTS:

 Die Lösung: Der Username muss händisch im Format "domain\username"eingetragen werden:
Dann funktioniert alles wie gewohnt.


Montag, 28. Oktober 2013

CRSCTL – RAC-Statusausgabe und -verwertung

Eine einfache Möglichkeit, den Status eines RAC auszugeben, bietet CRSCTL.
D:\>crsctl status resource –t 
oder kürzer:
D:\>crsctl stat res –t
--------------------------------------------------------------------------------
NAME           TARGET  STATE        SERVER                   STATE_DETAILS
--------------------------------------------------------------------------------
Local Resources
--------------------------------------------------------------------------------
ora.LISTENER.lsnr
               ONLINE  OFFLINE      rac2
--------------------------------------------------------------------------------
Cluster Resources
--------------------------------------------------------------------------------
ora.LISTENER_SCAN3.lsnr
      1        ONLINE  OFFLINE
ora.orcl.db
      1        OFFLINE OFFLINE                               Instance Shutdown
      2        OFFLINE OFFLINE
Dieser Befehl liefert - gesteuert durch den Parameter "-t" eine eingeschränkte tabellarische Ansicht aller Ressourcen. "-h" liefert möglicher weitere Parameter.
     resName [...]     Ein oder mehrere durch Leerzeichen getrennte Ressourcennamen
     -w                Ressourcenfilter (Beispiel: "TYPE = ora.database.type")
     -p                Gibt statische Konfiguration aus
     -v                Gibt Laufzeitkonfiguration aus\r
     -e                Wertet Sonderwerte einer Ressourceninstanz aus\r
     -f                Gibt vollständige Konfiguration aus\r
     -l                Gibt alle Kardinalitäts- und Grad-Member aus
     -g                Prüft, ob Ressourcen registriert sind\r
     -k                Kardinalitäts-ID\r
     -d                Grad-ID\r
     -n                Servername\r
     -s                Ruft Zielserver für Umspeichern ab\r
     -t                Tabellarische Anzeige
Will man das Ergebnis verskripten, ist die tabellarische Ausgabe ungeeignet. Man lässt besser den Schalter „-t“ weg.
D:\>crsctl stat res
NAME=ora.LISTENER.lsnr
TYPE=ora.listener.type
TARGET=ONLINE
STATE=OFFLINE

NAME=ora.LISTENER_SCAN3.lsnr
TYPE=ora.scan_listener.type
TARGET=ONLINE
STATE=OFFLINE

NAME=ora.orcl.db
TYPE=ora.database.type
TARGET=OFFLINE, OFFLINE
STATE=OFFLINE, OFFLINE
Dieses Ergebnis kann man schon besser in z.B. der Powershell verarbeiten.
Die Ausgabe ist allerdings im Normalfall allumfassend.

Filter - Ich will nur Probleme sehen!

Wenn man nicht die Dinge sehen will, die in Ordnung sind, sondern nur die, die Probleme bedeuten, kann die Ausgabe mit „-w“ gefiltert werden.
D:\skripte>crsctl stat res -t -w "STATE != ONLINE"
Oder
D:\skripte>crsctl stat res -t -w "TARGET != ONLINE"
Das lässt sich hervorragend kombinieren:
D:\skripte>crsctl stat res -t -w "(TARGET != ONLINE OR STATE != ONLINE)"
--------------------------------------------------------------------------------
NAME           TARGET  STATE        SERVER                   STATE_DETAILS
--------------------------------------------------------------------------------
Local Resources
--------------------------------------------------------------------------------
ora.LISTENER.lsnr
               ONLINE  OFFLINE      rac2
ora.gsd
               OFFLINE OFFLINE      rac1
               OFFLINE OFFLINE      rac2
ora.ons
               ONLINE  OFFLINE      rac2
--------------------------------------------------------------------------------
Cluster Resources
--------------------------------------------------------------------------------
ora.LISTENER_SCAN3.lsnr
      1        ONLINE  OFFLINE
ora.orcl.db
      1        OFFLINE OFFLINE                               Instance Shutdown
      2        OFFLINE OFFLINE
GSD und ONS sind uninteressant? OK:
D:\skripte>crsctl stat res -t -w "((TARGET != ONLINE) OR (STATE != ONLINE)) AND (NAME != ora.gsd) AND (NAME != ora.ons)"
Besser als NAME ist die Verwendung von TYPE:
D:\skripte>crsctl stat res -t -w "((TARGET != ONLINE) OR (STATE != ONLINE)) AND (TYPE != ora.gsd.type) AND (TYPE != ora.ons.type)"
--------------------------------------------------------------------------------
NAME           TARGET  STATE        SERVER                   STATE_DETAILS
--------------------------------------------------------------------------------
Local Resources
--------------------------------------------------------------------------------
ora.LISTENER.lsnr
               ONLINE  OFFLINE      rac2
-------------------------------------------------------------------------------
Cluster Resources
--------------------------------------------------------------------------------
ora.LISTENER_SCAN3.lsnr
      1        ONLINE  OFFLINE
ora.orcl.db
      1        OFFLINE OFFLINE                               Instance Shutdown
      2        OFFLINE OFFLINE 
Und das Ganze noch einmal ohne "-t":
D:\skripte>crsctl stat res -w "((TARGET != ONLINE) OR (STATE != ONLINE)) AND (TYPE != ora.gsd.type) AND (TYPE != ora.ons.type)"
NAME=ora.LISTENER.lsnr
TYPE=ora.listener.type
TARGET=ONLINE
STATE=OFFLINE

NAME=ora.LISTENER_SCAN3.lsnr
TYPE=ora.scan_listener.type
TARGET=ONLINE
STATE=OFFLINE

NAME=ora.orcl.db
TYPE=ora.database.type
TARGET=OFFLINE, OFFLINE
STATE=OFFLINE, OFFLINE

Weiterverarbeitung in der Powershell

Auf Grundlage einer gefilterten crsctl-Ausgabe lassen sich verschiedene Möglichkeiten umsetzen.
So könnte man einen Listener, der OFFLINE gegangen ist, neu starten oder den Admin per Email über Probleme benachrichtigen lassen.
Hier ein sehr minimalistisches Beispiel:
$a = crsctl stat res -w "((TARGET != ONLINE) OR (STATE != ONLINE)) AND ((TYPE = ora.listener.type) OR (TYPE = ora.scan_listener.type))";
$to      = "admin@meinefirma.de"
$from    = "rac@meinefirma.de"
$smtp    = "email.meinefirma.de"
$body    = '';
$subject = '';
 
if($a){
    $subject = "Listener OFFLINE!";
    $body    = "Einer oder mehrere Listener sind offline!`r`n`r`n"
    $body   += [string]$a -replace " ", "`r`n"
}
else{}

send-mailmessage -to $to -from $from -body $body -subject $subject -smtpserver $smtp
Das Skript führt zunächst crsctl aus und filtert nach Listenern, die nicht ONLINE sind.
Die Rückgabe wird in eine Email gepackt und versendet.

Donnerstag, 13. Juni 2013

Clonen einer DB auf dem RAC

Das Duplizieren von Datenbanken auf einem RAC ist gar nicht so schwer.
Das erste, was man sich vergegenwärtigen muss, wenn man auf dem RAC eine DB clonen/duplizieren möchte ist: Es ist im Prinzip das gleiche wie auf einem "normalen" Server - normal meint hier: Single-Node - nur irgendwie komplizierter. Aber wen wundert das schon. ;)
Im Prinzip steht alles, was man wissen muss hier drin: Oracle® Database Backup and Recovery User's Guide
Speziell diese Kapitel sollen helfen:
Wer schon einmal eine DB auf einem "normalen" Server dupliziert hat, der weiß im Prinzip schon alles. Er musste dabei auf diverse Details seiner Systemumgebung achten - zum Beispiel:
  • Wird von ASM nach ASM, von ASM ins Filesystem oder umgekehrt dupliziert?
  • Wird OMF von target oder von auxiliary oder von beiden genutzt?
  • Duplizieren wir "backup based", "without/with target connection", "with/without recovery catalog" oder lieber nur "from active database"? 
  • ...Hä? ;)
...und das Ganze jetzt auch noch auf dem RAC...

Das Wichtigste gleich vorneweg:
Es ist unmöglich von RAC-DB zu RAC-DB zu duplizieren.
Aber: Man kann eine RAC-DB in eine Single-Instance-DB duplizieren und diese anschließend zu einer RAC-DB machen.
Na geht doch. 

Ausgangslage

Ich mache es mir einfach:
Wir haben einen 2-Knoten-RAC mit ASM und OMF - keine ausgefallenen Geschichten. Im Falle eines Standard-Edition-Systems und noch dazu auf Windows sollte dies in 99% der Fälle passen.
Auf dem RAC läuft die zu duplizierende DB (target), die auf dem selben RAC dupliziert werden soll. In der ASM ist genug Platz. Die DB läuft im Archivelog-Modus und ein RMAN-Backup ist eingerichtet.
Die Duplizierung läuft "backup based", "with target connection" und "without recovery catalog".
Das Server-OS ist (leider) ein WindowsServer 2008 R2. (englisch) 

Vorbereitung

Die neue Instanz (auxiliary) muss eingerichet werden. Hierfür sind eine Reihe von Schritten notwendig.

1. Dienst und Passwortdatei anlegen

D:\>set ORACLE_HOME=D:\oracle\product\11.2.0.3\dbhome_1

D:\>oradim -new -sid DUPLO
Instanz erstellt.

D:\>orapwd file=d:\oracle\product\11.2.0.3\dbhome_1\database\pwdDUPLO.ora
password=<SYSPWD>
Es bietet sich an, hier das gleiche Passwort zu nutzen, wie in der target-DB.

2. Parameterfile anlegen

Am besten kopiert man die init.ora der target-Instanz und kommentiert alle RAC-Parameter aus oder entfernt sie.
Für eine initiale Duplizierung sind nur wenige Parameter notwendig.
#initDUPLO.ora
### notwendige Parameter ###
db_name='DUPLO'
db_create_file_dest='+DATA'
#Falls Datafile-Konvertierungen nötig sind: DB_FILE_NAME_CONVERT
#DB_FILE_NAME_CONVERT='+DUPSOURCE','+DUPDEST'
control_files='+DATA(CONTROLFILE)/duplo/duplo_control01.ctl','+FRA(CONTROLFILE)/duplo/duplo_control02.ctl'
db_recovery_file_dest='+FRA'
db_recovery_file_dest_size=52428800000
#Falls Logfile-Konvertierungen nötig sind: LOG_FILE_NAME_CONVERT
#LOG_FILE_NAME_CONVERT='+DGDUPSOURCE','+DGDUPDEST'
log_archive_dest='+FRA'

### Hier die RAC-Parameter ###
cluster_database=false
#cluster_database_instances=2
#duplo1.instance_number=1
#duplo2.instance_number=2

### optionale Parameter ###
db_domain=''
db_block_size=8192
sga_target=3969908736
pga_aggregate_target=1323302912
log_archive_format='ARC%S_%R.%T'
db_create_online_log_dest_1='+FRA'
archive_lag_target=1800
[edit] hinzugefügt am 10.09.2013:

3. Die Datenbank und die Instanz in der Clusterware registrieren

Auf einem normalen DB-Server ohne Grid-Infrastruktur macht man die Instanzen über einen Eintrag in der listener.ora bekannt.
Auf dem RAC bemüht man eine Reihe von srvctl-Kommandos:
D:\>set ORACLE_HOME=D:\oragrid\11.2.0.3

D:\>srvctl add database -d DUPLO -o d:\oracle\product\11.2.0.3\dbhome_1\ -c SINGLE -x racnode01

rem D:\>srvctl add instance -d DUPLO -i DUPLO -n racnode01

D:\>srvctl config database -d DUPLO
Eindeutiger Datenbankname: DUPLO
Datenbankname:
Oracle-Standardverzeichnis: d:\oracle\pr
Oracle-Benutzer: nt authority\system
Spfile:
Domain:
Startoptionen: open
Stoppoptionen: immediate
Datenbankrolle: PRIMARY
Verwaltungs-Policy: AUTOMATIC
Server-Pools: DUPLO
Datenbankinstanz: DUPLO
DatentrΣgergruppen:
Mount Point-Pfade:
Services:
Typ: SINGLE
Die Datenbank ist administratorverwaltet
[/edit]

4. spfile anlegen

Zunächst startet man die Instanz der auxiliary-DB im nomount-Modus und erzeugt das spfile in der ASM.
Instanz starten:
D:\>set ORACLE_SID=DUPLO

D:\>set ORACLE_UNQNAME=DUPLO

D:\>sqlplus /nolog

SQL*Plus: Release 11.2.0.3.0 Production on Di Jun 11 20:16:35 2013

Copyright (c) 1982, 2011, Oracle.  All rights reserved.

SQL >conn / as sysdba
Bei einer nicht hochgefahrenen Instanz angemeldet.

SQL >startup nomount pfile='D:\oracle\product\11.2.0.3\dbhome_1\database\initDUPLO.ora';
ORACLE-Instanz hochgefahren.

Total System Global Area 3958439936 bytes
Fixed Size                  2261280 bytes
Variable Size             771755744 bytes
Database Buffers         3170893824 bytes
Redo Buffers               13529088 bytes
11.06.13 SYS AS SYSDBA@DUPLO>
SPFILE in der ASM erzeugen:
SQL >create spfile='+DATA' from pfile='d:\oracle\product\
11.2.0.3\dbhome_1\database\initDUPLO.ora';

Datei erstellt.

Abgelaufen: 00:00:00.32
11.06.13 SYS AS SYSDBA@DUPLO> 

Ein must have (1)

Hier halten wir kurz inne und nehmen uns Zeit für ein wenig Feinschliff.
Das spfile wird in der ASM automatisch unter '+DATA/DUPLO/PARAMETERFILE/' angelegt und bekommt wegen OMF einen nicht merkbaren Namen:
ASMCMD [+] > ls +data/duplo/parameterfile/
spfile.303.817894325
Es ist schöner, wenn man mit einem spfile arbeiten kann, das nicht diese Zahlen hat. Wenn man das trotz OMF haben will, ist MKALIAS in ASMCMD das Mittel der Wahl - also ein Link:
ASMCMD [+] > mkalias +DATA/DUPLO/PARAMETERFILE/spfile.303.817894325 +DATA/DUPLO/spfileduplo.ora
Hier sieht man dann schön das Ergebnis:
ASMCMD [+] > ls +data/duplo/
CONTROLFILE/
DATAFILE/
PARAMETERFILE/
duplo_control01.ctl
spfileduplo.ora
ASMCMD [+] >
Hier fehlt noch ein Detail: Die Instanz weiß nicht wo das spfile liegt und bedient sich weiter gemäß den Defaultvorgaben. Dazu aber später mehr.

 Die Duplizierung

1. RMAN - connect & duplicate

Jetzt kann man sich mit RMAN einloggen und die DB duplizieren:
D:\>rman target sys/<SYSPWD>@orcl auxiliary /

Recovery Manager: Release 11.2.0.3.0 - Production on Di Jun 11 20:52:29 2013

Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.

Mit Ziel-Datenbank verbunden: ORCL (DBID=4167151783)
Bei Hilfsdatenbank angemeldet: DUPLO (nicht mit MOUNT angeschlossen)

RMAN> duplicate target database to DUPLO until time "TO_DATE('11.06.2013:20:30','DD.MM.YYYY:HH24:MI')";

Starten Duplicate Db um 11.06.13
Kontrolldatei der Zieldatenbank wird anstelle des Recovery-Katalogs verwendet
Zugewiesener Kanal: ORA_AUX_DISK_1
Kanal ORA_AUX_DISK_1: SID=922 Device-Typ=DISK

...
...

Inhalt von Speicher-Skript:
{
   Alter clone database open resetlogs;
}
Speicher-Skript wird ausgeführt

Datenbank geöffnet
Beendet Duplicate Db um 11.06.13

RMAN>

An dieser Stelle wäre noch Platz für Nacharbeiten bzw. Umkonfigurieren der DB. (Onlinelogs hinzufügen, Pfadanpassungen...)

2. Aus 1 mach 2 (1)

Das pfile muss jetzt angepasst werden um aus der Singleinstancedatenbank eine RAC-DB machen zu können.
Hierzu werden dien RAC-Parameter in der init.ora editiert. Anschließend wird mit dem pfile das spfile in der ASM erzeugt.
Das reicht aber noch nicht aus. Die DB muss dann in den Cluster integriert werden
RAC-Parameter im pfile:
#initDUPLO.ora
...

### Hier die RAC-Parameter anpassen###
cluster_database=true
cluster_database_instances=2
duplo1.instance_number=1
duplo2.instance_number=2

...
jetzt das spfile erzeugen:
SQL >create spfile='+DATA/DUPLO/spfileduplo.ora' from pfile='d:\oracle\product\11.2.0.3\dbhome_1\database\initDUPLO.ora';

Datei erstellt.

Abgelaufen: 00:00:00.21
SQL >shu immediate
Datenbank geschlossen.
Datenbank dismounted.
ORACLE-Instanz heruntergefahren.
SQL >
Ohne den Alias auf das spfile hätte hier die Pfadangabe auf das bestehende spfile mit dem OMF-Namen erfolgen müssen. Zum Beispiel:
SQL >create spfile='+DATA/DUPLO/PARAMETERFILE/spfile.303.817894325' from pfile='d:\oracle\product\11.2.0.3\dbhome_1\database\initDUPLO.ora';

3. Ab in den Cluster

Jetzt wird zunächst das ORACLE_HOME aufs Grid geschwenkt und die Datenbank registriert:
D:\>set ORACLE_HOME=D:\oragrid\11.2.0.3

D:\>srvctl add database -d DUPLO -o d:\oracle\product\11.2.0.3\dbhome_1\
Die Prüfung der Konfiguration ergibt, dass die DB registriert ist, aber keine Datenbankinstanzen besitzt.
D:\>srvctl config database -d DUPLO
Eindeutiger Datenbankname: DUPLO
Datenbankname:
Oracle-Standardverzeichnis: d:\oracle\product\11.2.0.3\dbhome_1\
Oracle-Benutzer: nt authority\system
Spfile:
Domain:
Startoptionen: open
Stoppoptionen: immediate
Datenbankrolle: PRIMARY
Verwaltungs-Policy: AUTOMATIC
Server-Pools: DUPLO
Datenbankinstanzen:
Datenträgergruppen:
Mount Point-Pfade:
Services:
Typ: RAC
Die Datenbank ist administratorverwaltet

D:\>
Die Registrierung der Datenbankinstanzen ist der nächste Schritt. Die notwendige Syntax erhält man von SRVCTL, wenn man mit ihm spricht:
D:\>srvctl add instance -h

Fügt eine Datenbankinstanzkonfiguration zu Oracle Clusterware hinzu.

Verwendung: srvctl add instance -d  -i  -n  [-f]
    -d            Eindeutiger Name für die Datenbank
    -i            Instanzname
    -n            Knotenname
    -f                       Hinzufügen-Vorgang erzwingen, selbst wenn einige Ressourcen gestoppt werden
    -h                  Verwendung drucken
Kommunikation ist eben alles. ;)
Man kann sich übrigens mit fast allen Oracle-Kommadozeilenprogrammen so angeregt unterhalten und spart sich auf diese Weise den zeitraubenden Blick in Handbücher.
D:\>srvctl add instance -d DUPLO -i DUPLO1 -n racnode01

D:\>srvctl add instance -d DUPLO -i DUPLO2 -n racnode02

Das must have (2)

Jetzt sagen wir der DB noch schnell, wo das spfile - bzw. sein Alias - liegt:
D:\>srvctl modify database -d duplo -p +DATA/duplo/spfileduplo.ora
Konfiguration prüfen:
D:\>srvctl config database -d DUPLO
Eindeutiger Datenbankname: DUPLO
Datenbankname:
Oracle-Standardverzeichnis: d:\oracle\product\11.2.0.3\dbhome_1\
Oracle-Benutzer: nt authority\system
Spfile: +DATA/duplo/spfileduplo.ora
Domain:
Startoptionen: open
Stoppoptionen: immediate
Datenbankrolle: PRIMARY
Verwaltungs-Policy: AUTOMATIC
Server-Pools: DUPLO
Datenbankinstanzen: DUPLO1,DUPLO2
Datenträgergruppen:
Mount Point-Pfade:
Services:
Typ: RAC
Die Datenbank ist administratorverwaltet

D:\> 
Das spfile in der ASM ist bekannt und die Instanzen ebenfalls - perfekt.

Abschlussarbeiten und DB-Start

Jetzt sind beide Instanzen registriert, wie man sieht.
Die Instanzen kann man aber noch nicht starten. Hierfür sind noch zusätzliche Handgriffe zu erledigen.
  • Auf jedem Knoten muss ein pfile für die jeweilige Instanz existieren.
  • Jedes dieser pfiles kann auf "seine" Instanz angepasst sein. Es ist beispielsweise möglich, jeder Instanz unterschiedliche Mengen an Speicher zur Verfügung zu stellen. Best Practice ist aber: Alle Knoten sind möglichst identisch konfiguriert.
  • Die pfiles benötigen den Pfad zum gemeinsamen spfile in der ASM.

Aus 1 mach 2 (2)

Zunächst wird also auf jedem Knoten unter %ORACLE_HOME%/database ein pfile angelegt. Die pfiles sind einfache eine Kopie des bisher verwendeten pfile mit dem jeweiligen Instanznamen:
  1. Knoten 1: initDUPLO.ora -> initDUPLO1.ora
  2. Knoten 2: initDUPLO.ora -> initDUPLO2.ora
Der Pfad zum spfile wird ganz am Ende des pfiles eingetragen:
#initDUPLO.ora
### notwendige Parameter ###
db_name='DUPLO' 

...
...

SPFILE='+DATA/duplo/spfileduplo.ora'
Ein pfile, das nur den Verweis auf das spfile in der ASM enthält, reicht auch aus.

Fazit

Im Prinzip ganz einfach. Man muss es nur machen.:)
Das Clonen von RAC-DB in anderen Konstellationen - z.B. von einem RAC auf einen zweiten Cluster - funktioniert in leicht abgewandelter Form, wenn man das backup based duplicate durchführt.
Leider ist das Duplizieren "from active database" nicht so einfach, weil es da nicht ausreicht, sich per
External User Authentication mit der DB zu verbinden.

Mittwoch, 9. Januar 2013

RAC Housekeeping unter Windows

Wie man seinen RAC sauber hält, wird in diesem Artikel der Deutschsprachigen DBA-Community von Sebastian Solbach beschrieben: Housekeeping 11gR2 RAC
Wie fast immer wird sich auf Linux bezogen. Ich fasse das Ganze für Windowsserver zusammen.
Ich bin einer der [ironie]Glücklichen[/ironie], der einen RAC auf WindowsServer2008 administriert.
Der Betrieb des RAC verläuft recht problemlos, was dazu verleitet, den vielen Log-Dateien nicht die Aufmerksamkeit zu schenken, die sie verdienen – und sei es nur, sie zu löschen.
Log- und Tracedateien fallen im Grunde in 2 Bereichen an:
  • In der Grid-Infrastruktur
  • Datenbanken

GRID-Infrastruktur

Ein Großteil der Logdateien wird von der Clusterware verwaltet. Unterhalb von %GRID_HOME%\log\<host>\ liegen diverse Unterverzeichnisse mit rollierenden Logdateien. Bis auf 2 Ausnahmen muss man sich um nichts kümmern.
Folgende Logs auf jedem Node müssen manuell behandelt werden:
  • Das Clusterware-alert.log: %GRID_HOME%\log\<host>\alert<host>.log
  • Die Logs unterhalb: %GRID_HOME%\log\<host>\client\*

Alert.log - Clusterware

Das alert<host>.log wächst langsam. Auf meinem Beispielcluster mit 2 Knoten sind es nach einem Jahr Betrieb 15 bzw. 50MB.
Unter Windows kann das Logfile aber nicht wie unter Linux bei laufender Clusterware rolliert werden, da sich die Datei im Zugriff befindet.
Es bietet sich also an, das Log manuell im Zuge eines Wartungsfensters bei Windowsupdates zu rollieren.
Eine jährliche Rotation sollte ausreichen.
Ein Skript könnte so aussehen und im Zuge der Wartung per Windows-Scheduler beim Serverstart ausgeführt werden:
set GRID_HOME=D:\oragrid\11.2.0.3
set GRID_HOST=RAC1
set LOGPATH=%GRID_HOME%\log\%GRID_HOST%
set jahr=%date:~-4%
set monat=%date:~-7,2%
set tag=%date:~-10,2%
set LOGDATE=%jahr%%monat%%tag%

copy %LOGPATH%\alert%GRID_HOST%.log %LOGPATH%\alert%GRID_HOST%_%LOGDATE%.log
type nul > %LOGPATH%\alert%GRID_HOST%.log

OCRDUMP, OCRCHECK, OCRCONFIG, CRSCTL

Unterhalb %GRID_HOME%\log\<host>\client\* finden sich viele kleine Logdateien, die bei administrative Aufrufen von z.B. ocrcheck erzeugt werden.
Auf meinem Produktivsystem summierte sich der Platzbedarf innerhalb eines Jahres auf 200-250MB je Node. Mit diesem Skript kann man der Plage Herr werden:
set GRID_HOME=D:\oragrid\11.2.0.3
set GRID_HOST=RAC1
set LOGPATH=%GRID_HOME%\log\%GRID_HOST%

forfiles /P %LOGPATH%\client\ /S /M *.* /D -7 /C "cmd /c del /q @path"
Es löscht alle Dateien älter als 7 Tage. Wenn man das täglich oder monatlich über den Scheduler startet, hat man seine Ruhe.

Listener.log, listener_scan<#>.log rollieren

Auf jedem Knoten die Listener.log- und listener_scan1.log bis listener_scan3.log-Dateien umbenennen. Zum Beispiel:
%GRID_HOME%\log\diag\tnslsnr\<host>\listener\trace
%GRID_HOME%\log\diag\tnslsnr\<host>\listener_scan1\trace
%GRID_HOME%\log\diag\tnslsnr\<host>\listener_scan2\trace
%GRID_HOME%\log\diag\tnslsnr\<host>\listener_scan3\trace
Es genügt, die ursprüngliche log umzubenennen/löschen. Beim nächsten Eintrag wird eine neue Datei generiert.
Die Größe der Logs ist natürlich abhängig von der Aktivität auf dem Cluster. Auf meinem Beispielsystem liegen nach einem Jahr insgesamt 1,5GB an Listener-Logs vor.
Eine monatliche Rotation ist empfehlenswert.

ASM

Die Log- und Trace-Files der ASM-Instanzen werden im Automatic Diagnostic Repository gespeichert.
Das Housekeeping ist automatisiert.
Einstellungen zum Löschen alter Informationen:
  • Default 30 Tage
  • 365 Tage für das mechanische Alert File
Das Alert-log der ASM-Instanzen findet sich hier:
%ORACLE_BASE%\diag\asm\+asm\asm<#>\trace\alert_ asm<#>.log
Zum rollieren einfach
  1. die alert_ asm<#>.log in alert_ asm<#>_YYYYMMDD.log umbennennen und
  2. eine neue alert_ asm<#>.log anlegen.
Außerdem muss man sich um die Tracefiles unter %GRID_HOME%\RDBMS\trace selbst kümmern.

Datenbanken

Die RAC-DB verhalten sich wie die ASM-Instanzen:
Das Housekeeping wird vom ADR erledigt und um das alert.log muss sich der Admin kümmern.

Alert.log

Wie bei der ASM-Instanz auf allen Knoten unter %ORACLE_BASE%\diag\rdbms\<database>\<instance>\trace:
  1. alert_<instance>.log in alert_<instance>_YYYYMMDD.log umbennennen und
  2. neue alert_<instance>.log anlegen.

Sonstiges

OCR

Weiterhin gibt es laut Housekeeping 11gR2 RAC  unter %GRID_HOME%\cdata\<cluster>\ Sicherungen der OCR, die periodisch erzeugt und gelöscht werden müssen. In meiner WindowsServer-Installation existieren die angesprochenen Sicherungen nicht an dieser Stelle oder anderswo im GRID_HOME. Ich sehe bei Gelegenheit nach, ob diese in der ASM zu finden sind.

Auditfiles der ASM- und Datenbankinstanzen

Anders als in Housekeeping 11gR2 RACbeschrieben, existieren unter Windows diese Logs nicht im Filesystem. Dieses Auditing findet man in der Ereignisanzeige:
Event Viewer

Enterprise Manager DB Console / Enterprise Management Agent

Unterhalb %ORACLE_HOME%\<knoten>_<dbuniquename>\sysman\log befinden sich logs und tracefiles der DBCansole. Innerhalb eines Jahres kamen hier 120MB zusammen.
Monatliches Rollieren und Löschen kann nicht schaden.

cfgtoollogs

Hier zitiere ich direkt aus Housekeeping 11gR2 RAC :
Zu den bisher erwähnten Dateien sollte man noch auf das cfgtoollogs Verzeichnis (im $ORACLE_BASE und $ORACLE_HOME) achten. Je nach dem ob man häufiger mit OPatch die Oracle Homes überprüft, EMCA verwendet, um den Enterprise Manager umzukonfigurieren, oder den DBCA um Datenbanken anzulegen. Jedes dieser Tools schreibt ein Log in das entsprechende cfgtoollogs Verzeichnis. Sollte man in Skripten oder ähnlichem diese Tools periodisch verwenden, sollte auch das cfgtoollogs Verzeichnis von den anfallenden Logfiles befreit werden.
Je nach Aufkommen monatliches oder jährliches Löschen.

Fazit

Ob es sich lohnt bei einem 2-Knoten-RAC alle Einzelschritte zu verskripten ist Geschmackssache. Da das Datenaufkommen so gering ist, dass es genügt, die logs monatlich zu rollieren oder zu löschen, ist es zu verschmerzen, dies manuell zu erledigen. Netter Nebeneffekt: Man hat regelmäßig die Verzeichnisstruktur vor Augen.
Wenn man das Ganze in ein oder mehrere Skripte gießen und das gleich richtig machen will, bietet sich auf einem WindowsServer natürlich PowerShell an, statt lauter Batchdateien anzulegen.

Sonntag, 30. Dezember 2012

Es sich als Oracle-DBA auf einem Windowsserver gemütlich machen

Nach einer Standardinstallation der Oracle Datenbankksoftware auf einem Windowsserver sollte man folgende Anpassungen vornehmen, ohne die zwar auch arbeiten kann, das aber nicht sonderlich komfortabel.

Schnellstartleiste

in der Schnellstartleiste sollten sich diese Einträge befinden:
  1. Windows Explorer
  2. Services
  3. Server Manager
  4. Scheduler
Das alles braucht man häufig, wenn man die Oracle-DB auf dem Server administrieren muss.

Desktop

Auf dem Desktop lege ich verschiedene Verknüpfungen an, die ebenfalls häufig benötigt werden, welche in der Schnellstartleiste aber sehr schnell für Chaos sorgen würden.
Die Commandshell benötigt man natürlich oft und das auch noch mit unterschiedlichen Umgebungsvariablen je nachdem, mit welcher Datenbank oder unter welchem ORACLE_HOME man arbeiten möchte.
In einer frischen RAC-Installation hat man es sofort mit 2 ORACLE_HOME-Directories (Grid und DB), sowie 2 Instanzen (ASM und z.B. ORCL) zu tun.
Natürlich "weiß" CMD nicht, welche Umgebung man gerade braucht. Zu allem Überfluss gelten die Standard-Pfade bzw. das ORACLE_HOME der zeitlich zuletzt ausgeführten Oracle-Installation. Auf das Grid_Home hat man also keinen Zugriff ohne die Umgebung immer manuell zu modifizieren.

oraenv?

Unter Linux ist das Dank oraenv-Skript kein Problem. Unter Windows gibt es aus unerfindlichen Gründen kein oranev.
Es gibt eine Reihe von Anleitungen, sich das fehlende oraenv-Skript selbst zu erstellen. Eine entsprechende Lösung findet man nach kurzem googlen.

Command-Shell-Batches - oraenv für Arme

Die in einer RAC-Installation benötigten Aufrufe der CMD oder von SQLPLUS konfiguriert man sich mit einfachen Batchdateien, die auf dem Desktop als Verknüpfung abgelegt werden. In einer "normalen" - also einer Single-Instance-Installation ohne ASM benötigt man nur 2 dieser Batchdateien.
Unter zum Beispiel d:\skripte\oraenvbat\ werden also diese Batchdateien auf den jeweiligen Knoten angelegt:
  • cmd_grid1.bat
  • cmd_RACDB1.bat
  • sys_RACDB1.bat
  • asmcmd1.bat
  • sys_asm1.bat
Natürlich muss man diese dann auf jedem RAC-Knoten anlegen und die "1" durch den korrekten Wert ersetzen.

GRID shell - cmd_grid1.bat

In der cmd_grid1.bat wird die Umgebung für das GRID-Home und die ASM-Instanz gesetzt.
Hier zeigt die ORACLE_SID auf die "+ASM1"-Instanz. Die "1" steht dabei für die Instanz auf Node1 des RAC.
@echo off
SET ORACLE_SID=+ASM1
set SQLPATH=D:\skripte\oraenvbat
SET ORACLE_HOME=D:\oragrid\11.2.0.3
SET PATH=%ORACLE_HOME%\bin;%PATH%
set NLS_LANG=GERMAN_GERMANY.WE8PC850
%comspec%
pause

DB shell - cmd_RACDB1.bat

Die cmd_RACDB1.bat setzt ORACLE_SID der Instanz des RAC-Knotens (RACDB1), ORACLE_UNQNAME und Oracle-Home der Datenbank.
@echo off
SET ORACLE_SID=RACDB1
SET ORACLE_UNQNAME=RACDB
set SQLPATH=D:\skripte\oraenvbat
SET ORACLE_HOME=D:\oracle\product\11.2.0.3\dbhome_1
SET PATH=%ORACLE_HOME%\bin;%PATH%
set NLS_LANG=GERMAN_GERMANY.WE8PC850
%comspec%
pause

sqlplus auf die DB as sysdba - sys_RACDB1.bat

Es ist recht bequem, sich per Doppelklick auf die sys_RACDB1.bat als SYSDBA mit der DB  zu connecten. Und noch besser: hiermit kommt man auch noch auf Instanz des jeweiligen RAC-Knotens. (RACDB1)
@echo off
SET ORACLE_SID=RACDB1
set SQLPATH=D:\skripte\oraenvbat
SET ORACLE_HOME=D:\oracle\product\11.2.0.3\dbhome_1
SET PATH=%ORACLE_HOME%\bin;%PATH%
set NLS_LANG=GERMAN_GERMANY.WE8PC850
%ORACLE_HOME%\bin\sqlplus / as sysdba
pause

ASMCMD - asmcmd1.bat

Mit dieser Batchdatei startet man gleich ASMCMD.
@echo off
SET ORACLE_SID=+ASM1
set SQLPATH=D:\skripte\oraenvbat
SET ORACLE_HOME=D:\oragrid\11.2.0.3
SET PATH=%ORACLE_HOME%\bin;%PATH%
set NLS_LANG=GERMAN_GERMANY.WE8PC850
%ORACLE_HOME%\bin\asmcmd -p
pause

sqlplus auf die ASM as sysdba - sys_asm1.bat

Was man an Bequemlichkeit mit der sys_RACDB1.bat gewinnt, möchte man natürlich auch im Fall eines ASM-Connect haben.
@echo off
SET ORACLE_SID=+ASM1
set SQLPATH=D:\skripte\oraenvbat
SET ORACLE_HOME=D:\oragrid\11.2.0.3
SET PATH=%ORACLE_HOME%\bin;%PATH%
set NLS_LANG=GERMAN_GERMANY.WE8PC850
%ORACLE_HOME%\bin\sqlplus / as sysasm
pause
Mit diesen Batchdateien kommt man auf einem Windowssystem dann auch ohne oraenv gut über die Runden.

Dienstag, 25. Dezember 2012

Jobs in einer RAC-Installation an einen bestimmten Knoten binden

Es ist eigentlich ganz einfach, Jobs an einen bestimmten RAC-Knoten zu binden. Das einzige was man benötigt ist ein entsprechend konfigurierter Service und eine an diesen gebundene Job-Klasse.
Dem oder den Jobs weist man dann nur noch die Job-Klasse zu.
Fertig.

1. Service anlegen

Services legt man mit  dem DBCA oder srvctl an. Ich bevorzuge srvctl:
# Service auf einem Knoten anlegen 
srvctl add service -d RACDB -s JOB_SERVICE -r "RACDB1"

# Starten und stoppen des Service
srvctl start service -d RACDB -s JOB_SERVICE 
srvctl stop service -d RACDB -s JOB_SERVICE

# Disablen and enablen von Services.
srvctl disable service -d RACDB -s JOB_SERVICE
srvctl enable service -d RACDB -s JOB_SERVICE

# Möchte man den Service entfernen, dann mit remove:
srvctl remove service -d RACDB -s JOB_SERVICE

# Der Servicestatus:
srvctl status service -d RACDB -s JOB_SERVICE -v
Unter bestimmten Umständen zickt srvctl beim anlegen von Services. Beinhaltet die Domain der DB zum Beispiel ein "-" (minus), dann bemeckert srvctl das mit einem nichtssagenden PRCD-1223:
srvctl add service -d RACDB -s JOB_SERVICE -r "RACDB1"
PRCD-1223 : Der Servicename JOB_SERVICE enthält unzulässige Zeichen -
Abhilfe schafft die Umbenennung der Domain in der DB. Angenommen die Domain lautet "meinefirma-deutschland.de", macht man aus dem "-" einfach einen Punkt, oder was einem sonst gefällt.
srvctl modify database -m meinefirma.deutschland.de -d RACDB
Anschließend legt man den Service an und benennt die Domain wieder um.
srvctl add service -d RACDB -s JOB_SERVICE -r "RACDB1"
srvctl modify database -m meinefirma-deutschland.de -d RACDB

2. Job-Class anlegen

BEGIN
  DBMS_SCHEDULER.create_job_class (
    job_class_name => 'NODE1_JOB_CLASS',
    service        => 'JOB_SERVICE');
END;
/

3. Jobs eine Job-Klasse zuweisen

Jetzt kann man neue Jobs direkt einer Job-Klasse zuweisen oder existierende Jobs entsprechend ändern

3.a) Einen neuen Job mit Jobklasse anlegen

Beim anlegen eines Jobs kann man ihm mit dem Parameter JOB_CLASS gleich die Job-Klasse zuweisen.
Ohne Verwendung dieses Parameters, erfolgt die Zuweisung des Defaultwertes:
BEGIN
  DBMS_SCHEDULER.create_job (
    job_name        => 'TEST_JOB',
    job_type        => 'PLSQL_BLOCK',
    job_action      => 'BEGIN ... END;',
    job_class       => 'NODE1_JOB_CLASS',
    repeat_interval => 'FREQ=DAILY',
    enabled         => TRUE,
    comments        => 'Job mit Zuordnung zu einer Job-Klasse');
END;
/

3.b) Zuordnung einer Job-Klasse zu einem existierenden Job

Einfach:
BEGIN
  DBMS_SCHEDULER.set_attribute (
    name      => 'TEST_JOB',
    attribute => 'job_class',
    value     => 'NODE1_JOB_CLASS');
END;
/

4. Sonstiges

Jobs abfragen

SELECT owner, job_name, job_class, enabled 
FROM dba_scheduler_jobs;

Test: Führt der RAC den Job tatsächlich nur auf Node1 aus?

Wenn man testen möchte, ob die Servicezuweisung wirklich funktioniert, kann man wie folgt vorgehen.
Man legt per CTAS eine Testtabelle an:
CREATe TABLE job_test AS 
SELECT sysdate time, instance_name, host_name 
FROM v$instance;
Dann legt man einen Job an, der sekündlich sysdate, den Instanz- und Hostnamen in die Testtabelle schreibt:
BEGIN
  DBMS_SCHEDULER.create_job (
    job_name        => 'TEST_JOB',
    job_type        => 'PLSQL_BLOCK',
    job_action      => 'INSERT INTO job_test SELECT sysdate time, instance_name, host_name FROM v$instance;commit;',
    job_class       => 'NODE1_JOB_CLASS',
    start_date      => TO_TIMESTAMP_TZ('02/01/2012 13:45:00','dd/mm/yyyy hh24:mi:ss'),
    repeat_interval => 'FREQ=SECONDLY',
    end_date        => TO_TIMESTAMP_TZ('02/01/2013 14:00:00','dd/mm/yyyy hh24:mi:ss'),
    enabled         => TRUE,
    comments        => 'Job mit Zuordnung zu einer Job-Klasse');
END;
/
Die Abfrage zur Überprüfung sollte dann natürlich nur die eine beteiligte Instanz hervorzaubern:
SELECT * FROM job_test ORDER BY 1 DESC;

Was passiert, wenn der Service gedropt wird?

Wenn ein Service gelöscht wird, auf den Job-Klassen verweisen, wird automatisch die Default-Job-klasse gezogen.

Beispiel für die Nutzung von Services

Auf einer Oracle-RAC-DB mit 4 Knoten laufen eine Client-Server-Anwendung, ein Webportal und mehrere über Webservices realisierte Schnittstellen zu anderen Anwendungen.
Die Anforderungen der 3 auf die DB zugreifenden Systeme unterscheiden sich stark und sollen voneinander getrennt und optimiert arbeiten. 
# 3 Services anlegen
srvctl add service -d RACDB -s CLIENT_SERVICE -r RACDB1 -a "RACDB1,RACDB4"
srvctl add service -d RACDB -s WWW_SERVICE -r RACDB2,RACDB3 -a "RACDB2,RACDB3,RACDB4"
srvctl add service -d RACDB -s BATCH_SERVICE -r RACDB4 -a "RACDB1,RACDB4"
Jetzt müssen die Clients, das Webportal und die Web-/Batchservices nur noch entsprechend auf die Services zugreifen.
Das konfiguriert man z.B. in den jeweiligen tnsnames.ora.
Der Clientservice kann dann auf allen 4 Knoten, wird aber bevorzugt auf dem 1er laufen.
Das Webportal wird bevorzugt auf 2 und 3 ausgeführt, kennt aber außerdem noch den 4er.
Die Schnittstellen laufen wiederum auf dem 4er und notfalls dem 1er.