Seiten

Freitag, 24. April 2015

APEX 5.0 und der Thoth-Gateway für den IIS

Das neue APEX-Release bringt ein paar Änderungen mit, die beim Aufruf über den IIS mit Thoth bis Version 1.4.0 beta zum solchen Fehlermeldungen führen:

X-ORACLE-IGNORE: IGNORE X-ORACLE-IGNORE: IGNORE X-ORACLE-IGNORE: IGNORE X-ORACLE-IGNORE: IGNORE Status:302 Location:f?p=110:1::::::

Beheben lässt sich das nur, indem man die aktuelle Thoth-Version (1.4.1) installiert, die Morten Braten bereits zur Verfügung stellt.
Mit der neuen Version (seit 1.4.0) ist es unter anderem nicht mehr notwendig, einen Oracle-Client auf dem Webserver zu installieren.

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.

Freitag, 6. Juni 2014

Die In-Memory-Option - Oracles Antwort auf HANA

Vor 1,5 Jahren habe ich mich das erste mal mit dem Phänomen HANA beschäftigt. Seitdem ist eine Menge passiert und Oracle hat reagiert.
Am vergangenen Dienstag war ich auf der DOAG 2014 Datenbank in Düsseldorf und kam wieder einmal mit dem Thema in Berührung. Günter Stürner (Oracle) hielt dort die Keynote.
Der Focus seiner Rede lag auf der kommenden In-Memory-Option („Turbo Boost für die Datenbank“) der Datenbank und der Abgrenzung zur HANA.
Ein paar Sachen haben mich an meinen Text erinnert. Zeit sich den alten Kram wieder anzusehen… ich kann behaupten, dass ich gar nicht einmal falsch lag. :)

Vieles, was zwischen SAP und Oracle zum Thema In-Memory ausgetauscht wurde und wird, ist natürlich reines Marketing. SAP will seine eigene DB verkaufen und Oracle seine Marktführerschaft ausbauen bzw. nicht verlieren.
Die Existenz von HANA ist dabei meiner Meinung nach an sich keine Gefahr für Oracle. HANA steht vielmehr für die Gefahr, dass Oracle aus Kundensicht die Fähigkeit verlieren könnte, die wichtigen technischen Trends zu setzen und als Saurier dasteht. 

Oracle versucht den In-Memory-Hype einerseits etwas abzuschwächen, indem sie darauf aufmerksam machen, dass dieses Thema nichts Neues ist. Andererseits wollen sie auf der Welle mitreiten. (Man ist SAP für die Marketingvorarbeit zu Thema In-Memory dankbar.)
Dabei wird dann noch klar gestellt, dass es weniger um In-Memory geht, sondern vielmehr und die Frage „Arbeitet die Datenbank der Zukunft zeilen- oder spaltenorientiert?“. (columnar)
Diese Frage hat Oracle für sich etwa so beantwortet:
Je nach Anwendungsfall ist die eine oder die andere Technologie sinnvoller. Oracle bietet beides in einem Produkt an. Auf dem Storage liegen die Daten zeilenorientiert und im Hauptspeicher werden sie auf Wunsch spaltenorientiert verarbeitet.
(So würde ich das zusammenfassen und ich kann nicht sagen, dass ich diesen Ansatz schlecht fände.)

Ganz nebenbei wuchert Oracle mit dem Pfund, eine ausgereifte, skalierbare Enterpriselösung (Backup, RAC, DataGuard, Vault…) anbieten zu können: SAP müsse schließlich erst noch aus HANA eine Enterpriselösung machen.

In der Keynote hat Günter Stürner dargestellt, wie einfach die Lösung implementiert ist. Ein einfaches „ALTER TABLE <tablename> INMEMORY;“ lädt die Tabelle „columnar“ in den Hauptspeicher. Der Zugriff soll sich bis um den Faktor 100 beschleunigen. Das soll auch mit Tablespaces, Partitionen und sogar der ganzen Datenbank funktionieren – falls die DB dort hineinpasst.

Ich denke, dass man sich um Oracle keine Sorgen machen muss. Am 11.06.2014 soll die In-Memory-Option für die 12c vorgestellt werden. (Am 17.06.2014 kann man sich das live in Frankfurt ansehen.) Wenn es tatsächlich so ist, dass die Option für die Applikation transparent nutzbar ist, kann Oracle sich zurücklehnen und sagen:
"Hey, SAP hat nur HANA, wir haben HANA on board - und wir lassen uns das ebenfalls sehr gut bezahlen." ;)

Ich freu mich schon darauf „ALTER DATABASE INMEMORY;“ testen zu können. Eine DB, die in den Hauptspeicher passt und mit einem suboptimalen Datenmodell glänzt, habe ich für den Performancetest. :)

Donnerstag, 6. März 2014

Powershell und Oracle-connect

Ein Testconnectskript

Die PowerShell ist ein tolles Werkzeug. Man kann Sie für ausgeklügelte Backupskripte benutzen, das Housekeeping damit automatisieren und auch auf die Oracle-DB zugreifen.
Der Zugriff ist manchmal nicht so einfach einzurichten. Gerade, wenn es mehrere ORACLE_HOMEs auf dem Rechner gibt, kann man eine Menge Zeit mit der Suche nach dem richtigen Connectionstring und dem genutzten ORACLE_HOME verschwenden - ich habe jedenfalls schon viel Zeit damit verschwendet.
Deshalb nutze ich seit einiger Zeit dieses Test-Skript, welches ich auf dem entsprechenden Rechner nur noch anpasse:



$AssemblyFile     = "D:\oracle\product\11.2.0.4\dbhome_1\ODP.NET\bin\2.x\Oracle.DataAccess.dll"
$ConnectionString = "Data Source=(DESCRIPTION=(ADDRESS=
                        (PROTOCOL=TCP)
                        (HOST=server01)
                        (PORT=1521))
                        (CONNECT_DATA=(SERVICE_NAME=orcl)));
                        User Id=oradba;
                        Password=orapwd"
$CommandText = "SELECT count(*) FROM all_users"
[Reflection.Assembly]::LoadFile($AssemblyFile)
$OracleConnection = ""
$OracleConnection = New-Object -TypeName Oracle.DataAccess.Client.OracleConnection
$OracleConnection.ConnectionString = $ConnectionString
$OracleConnection.Open()
$OracleCommand = New-Object -TypeName Oracle.DataAccess.Client.OracleCommand
$OracleCommand.CommandText = $CommandText
$OracleCommand.Connection = $OracleConnection
$OracleDataAdapter = New-Object -TypeName Oracle.DataAccess.Client.OracleDataAdapter
$OracleDataAdapter.SelectCommand = $OracleCommand
$DataSet = New-Object -TypeName System.Data.DataSet
$OracleDataAdapter.Fill($DataSet)
$OracleDataAdapter.Dispose()
$OracleCommand.Dispose()
$OracleConnection.Dispose()
$OracleConnection.Close()
$DataSet.Tables[0]

Hier müssen nur die Variablen $AssemblyFile und $ConnectionString angepasst werden. Wenn alles in Ordnung ist, sieht die Ausgabe so aus:

Powershell ISE ohne tnsnames.ora

Ich verwende sehr gern die PowerShell ISE. Beim Testen zickt sie aber gern.
Wenn man auf eine DB zugreifen möchte (korrekter Code, alles i.O....) und die DB ist in der tnsnames.ora nicht korrekt eingetragen, bekomme man einen Fehler.
Soweit korrekt.
Jetzt korrigiert man natürlich die tnsnames.ora und versucht den connect erneut.
Die überraschende Folge: Gleiche Fehlermeldung.

Wenn man jetzt aber die PS ISE schließt, erneut startet und den selben Code wieder ausführt: keine Fehlermeldung, alles läuft durch!?!

Meiner Meinung nach prüft die ISE die Systemumgebung nicht erneut oder hat einen Cache, der nicht geleert wird - was auch immer - und liest die aktualisierte tnsnames.ora nicht.
Das ist der Grund, warum ich oben genanntes Skript verwende. Es greift nicht auf die tnsnames.ora zu sondern  nutzt direkt den Connectionstring. (http://www.connectionstrings.com/oracle/)

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.


Dienstag, 5. November 2013

APEX - Passwort speichern in der Login-Form erlauben

Standardmäßig verhindert APEX das Abspeichern von Passwörtern im Browser. Die Suche nach der Einstellung, die geändert werden muss, war etwas mühselig. Damit der nächste nicht so lang wie ich suchen muss, hier die Lösung: Das Speichern des Passwortes wird durch den Parameter autocomplete der Login-Form von APEX verhindert, der immer auf "off" gesetzt ist. Den Parameter ändert man weder im Template, noch in der Region und auch nicht über irgend welche CSS/HTML-Spielereien am Item. Nein, man geht im Applicationbuilder auf die Loginseite der Application und über Edit Page -> Security -> Form Auto Complete ändert man den Wert "off" auf "on". Apply Changes. Fertig.
Die Lösung findet man auch im Application Builder User's Guide - wenn man weiß, wonach man suchen muss.