Beiträge

Oracle APEX Ein Stolperstein im Upgrade auf Version 5.1

Oracle APEX: Ein Stolperstein im Upgrade auf Version 5.1

Beim Upgrade von Oracle APEX Applikationen auf die schon etwas ältere Version 5.1 wird gerne ein kleines Detail übersehen – vor allem auch deswegen weil die Auswirkungen nur dann sichtbar sind, wenn man alte und neue Version wirklich genau testet und vergleicht oder alternativ die Release Notes aufmerksam liest:

Im Abschnitt 1.4.4 der Release Notes befindet sich der Absatz:

End Date Displayed Inclusive — In release 5.0, the CSS calendar considered the end date of an all-day event as exclusive (similar to the jQuery FullCalendar Plugin).
In release 5.1, the end date is inclusive like all other Oracle Application Express components.

Das bedeutet, dass für die korrekte Darstellung eines mehrtägigen Termins in einer Calendar-Region in Version 5.0 folgende Abfrage notwendig war:

SELECT 'SomeCSSClass'         AS cal_class,
       t1.appointment_start   AS cal_date_from,
       t1.appointment_end + 1 AS cal_date_upto,
       'SomeLabel'            AS cal_label,
       'SomeLink'             AS cal_link
FROM   appointment_table t1

Mit dem Upgrade auf 5.1 entfällt die Notwendigkeit für das un-intuitive „+ 1“ und die Abfrage reduziert sich auf:

SELECT 'SomeCSSClass'         AS cal_class,
       t1.appointment_start   AS cal_date_from,
       t1.appointment_end     AS cal_date_upto,
       'SomeLabel'            AS cal_label,
       'SomeLink'             AS cal_link
FROM   appointment_table t1

Vor allem beim Überspringen von Applikations-Versionen kommt es dann mitunter vor, dass die Zwischenschritte ein wenig stiefmütterlich behandelt werden und sich Probleme wie dieses einschleichen.

Daher bietet es sich bei Oracle APEX Upgrades immer an, noch einmal einen kurzen Blick in die entsprechenden Release Notes zu werfen.

Oracle 19c DBMS_JOB Konvertierung mit Tücken

Unlängst machte ich bei einer Datenbank-Migration Bekanntschaft mit einer der vielen Verhaltensänderungen, wie sie bei Versionswechsel immer wieder vorkommen.

Der Kunde hatte sich entschieden seine bereits ans Herz gewachsene Oracle 11.2.0.4er Datenbank auf aktuellen Stand zu bringen und sich folgerichtig für die Oracle 19c Version entschieden, welche ja eine „Long Term Support“ Version ist.

Da die Applikationslogik bereits zuvor in einzelne Schemas aufgeteilt war, wählte ich als Migrationsmethode Datapump Export/Import.

DBMS_JOB konvertiert

Nach dem ersten Test-Import und der für Export/Import obligatorischen Analyse der Importfehler stellte ich mit Überraschung fest, dass die vorhandenen Datenbank Jobs, welche zuvor als klassische DBMS_JOB angelegt waren, nun automatisch in neue Scheduler-Jobs „konvertiert“ wurden.

Dieses Verhalten der automatischen Konvertierung kannte ich bisher nur bei einem klassischen Upgrade der Datenbank und es wird auch erst seit Version 19c so gehandhabt.

Das nun auch automatisch neue Scheduler-Jobs bei einem Datapump Import angelegt wurden, überraschte mich erstmal, war aber bei näherer Betrachtung durchaus logisch.

Wie inzwischen allgemein bekannt sein sollte, ist das bereits in die Jahre gekommene DBMS_JOB Package zur Verwaltung von klassischen Datenbank Jobs bereits seit Version 12.2.0.1 „deprecated“, was in der Praxis bedeutet, dass es zwar noch existiert, jedoch in zukünftigen Versionen jederzeit „desupported“ bzw. auch entfernt werden könnte.

Oracle empfiehlt daher komplett auf den „Scheduler“ (DBMS_SCHEDULER) umzusteigen, was in jedem Fall sinnvoll ist, bietet dieser doch wesentlich mehr Funktionalität.

Mit der Version 19c geht Oracle noch einen Schritt weiter und baut eine automatische Konvertierung für klassischen Jobs ein. Das bedeutet, dass das alte DBMS_JOB API noch wie gewohnt verwendet werden kann, Oracle jedoch im Hintergrund automatisch aus jedem neuen DBMS_JOB in Wirklichkeit einen Scheduler Job erzeugt. Das Package DBMS_JOB dient dabei nur mehr als Wrapper um die Rückwärtskompatibilität zu gewährleisten.

Unter der Haube werkt somit nur mehr der Scheduler (das Mapping zwischen „alten“ und „neuen“ Jobs findet man übrigens in der neuen Dictionary Tabelle: SCHEDULER$_DBMSJOB_MAP).

Damit ist auch das Verhalten während meines Datapump Imports erklärt: Da hier die Jobs ebenfalls neu angelegt wurden, erhalte ich auch sofort die dazugehörenden Scheduler Jobs.

SQL> select job,schema_user,what from dba_jobs where job=844;

JOB SCHEMA_USER WHAT
------------- ----------- -------------------------------------
844 DWH dbms_mview.refresh('"DWH"."MVIEW1"');


SQL> select job_name,owner,job_action from dba_scheduler_jobs 
where job_name like 'DBMS_JOB$_844';

JOB_NAME OWNER JOB_ACTION
------------- ---------- -------------------------------------
DBMS_JOB$_844 DWH dbms_mview.refresh('"DWH"."MVIEW1"');

Das Mapping zwischen „alten“ und „neuen“ Jobs findet man übrigens in der neuen Dictionary Tabelle: SCHEDULER$_DBMSJOB_MAP):

SQL> select * from SCHEDULER$_DBMSJOB_MAP where dbms_job_number=844;

DBMS_JOB_NUMBER JOB_OWNER JOB_NAME
--------------- --------- --------------
844 DWH DBMS_JOB$_844

Allgemeine DBMS_JOB Verhaltensänderungen

Trotz Automatismus dürfen folgende Änderungen nicht unerwähnt bleiben:

Berechtigungen

Da es sich nun immer um Scheduler Jobs handelt (auch wenn diese mittels DBMS_JOB angelegt werden) und damit um Datenbankobjekte, muss der User zwingend die Berechtigung zum Anlegen dieser Objekte über das „CREATE JOB“ Privileg erhalten, um weiterhin Jobs über DBMS_JOB anzulegen und zu verwalten.

Transaktionsverhalten

Verwendet man in einer früheren Version als 19c DBMS_JOB zur Verwaltung der Jobs, muss immer explizit ein „commit“ verwendet werden, um die jeweilige Transaktion abzuschließen.

Ab Oracle 19c ist dies nun nicht mehr notwendig – der Scheduler Job wird implizit angelegt.

Trotzdem bleibt die Transaktionsfunktionalität bei der Verwendung von DBMS_JOB erhalten.

Stolperstein NLS-Einstellungen

Nachdem die Jobs während meines Datapump Imports automatisch in Scheduler Jobs konvertiert wurden, war hier für mich als DBA eigentlich nichts weiter zu tun.

Die Freude währte allerdings nur kurz, denn der Kunde machte mich umgehend auf ein seltsames Phänomen aufmerksam: Einige Spalten in seinen Materialized Views hätten plötzlich seltsame Werte bekommen!

Zahlen, die in VARCHAR2 Feldern als Strings gespeichert waren, hatten nun wie von Geisterhand 6 Nullen als Nachkommastelle bekommen.

Meine erste Reaktion war natürlich sofort das Konstrukt „Zahlen in Strings zu speichern“ in Frage zu stellen, allerdings hatte dieser Umstand leider wie so oft eine historische Berechtigung und mit dem eigentlichen Problem gar nichts zu tun.

Lediglich die Auswirkungen eines ganz anderen Problems kamen aber genau an dieser Stelle glücklicherweise an die Oberfläche: Die Jobs, welche den Refresh dieser Materialized Views durchführten, waren genau jene Jobs welche beim Import automatisch konvertiert wurden.

Analyse

Nach einer kurzen Analyse war klar: Bei der Neuanlage der ursprünglichen Jobs während des Imports wurden offensichtlich geänderte NLS-Settings verwendet!

Durch die besondere Konstellation von mehreren verschachtelten Views, MViews und DB-Links führten diese NLS-Settings (konkret die Einstellung des Parameters NLS_NUMERIC_CHARACTERS) dazu, dass einige Zahlen nun in den MViews falsch dargestellt wurden.

Damit war das Problem erkannt und nach einigen Tests schnell behoben.
Das NLS-Environment für einen bestehenden Scheduler-Job lässt sich übrigens auch im Nachhinein einfach ändern (man muss also nicht den kompletten Job neu erstellen):

begin
sys.dbms_scheduler.set_attribute('"USER1"."DBMS_JOB$_1185"','NLS_ENV',
'NLS_LANGUAGE=''GERMAN'' NLS_TERRITORY=''GERMANY'' NLS_CURRENCY=''€'
'NLS_ISO_CURRENCY=''GERMANY'' NLS_NUMERIC_CHARACTERS='',.'
' NLS_DATE_FORMAT=''DD.MM.RR'' NLS_DATE_LANGUAGE=''GERMAN'
' NLS_SORT=''GERMAN''');
end;
/

Fazit:

  • DBMS_JOBs werden ab Oracle 19c automatisch in Scheduler Jobs „konvertiert“ (sowohl beim Upgrade wie auch beim Import) – das alte DBMS_JOB Interface bleibt vorerst vollständig erhalten.
  • Besser vor einem Upgrade alle DBMS_JOBs überprüfen und kontrolliert durch DBMS_SCHEDULER Jobs ersetzen.
  • Besonders beim Import vorab die NLS-Settings von Jobs überprüfen.

Mein persönlicher Tipp an dieser Stelle:

Auch wenn gute Automatismen vorhanden sind, sollte man sich immer schon im Vorfeld eines geplanten Versionswechsels mit bekannten Verhaltensänderungen auseinandersetzen und diese auch bereits vorab gelöst haben.

Dann gibt es auch keine unliebsamen Überraschungen mit unbekannten „Side-Effects“.

Oracle Datenbank Upgrade 12c

Upgrade auf Oracle 12c

Vieles scheint sich zu verändern: Ganze Datacenter wandern in die Cloud, neue Lösungsangebote wie Database as a Service betreten den Markt, der Trend zur Virtualisierung scheint ungebrochen, Solid State Drives werden herkömmliche Festplatten wohl bald gänzlich ersetzen, Big Data und Datamining sind in aller Munde.

Doch manches verändert sich nicht so schnell: Genauso wichtig wie unternehmerische Innovationen und technologische Paradigmenwechsel ist die Fortführung von bewährten Technologien. Entgegen mancher kurzzeitiger Moden bildet das relationale Datenmodell immer noch das stabile Fundament für viele Anwendungen.

Die IT-Landschaft verändert sich in rasendem Tempo, und Oracle bildet hier keine Ausnahme.
Im Gegenteil: Mit dem Release der Datenbankversion 12c ebnet Oracle diesen Ent-wicklungen den Weg und eröffnet neue und vielversprechende Perspektiven für den Betrieb von Datenbanken, ohne dabei die Stärken einer relationalen Datenbank aufzugeben.

Mit 12c ist es Oracle gelungen, beide Anforderungen zu erfüllen:
Mit der Entwicklung von Features wie Pluggable Database und InMemory wird ein zukunftsweisender Weg aufgezeigt, mit der kontinuierlichen Weiterentwicklung der Stärken der Release 11gR2 eine Erfolgsgeschichte weitergeschrieben.

Wie sich auch entscheiden, wir möchten Sie mit unserem Know-How auf ihrem Weg unterstützen. Doch bevor die Reise beginnt, werfen wir noch einen Blick auf die Gegenwart.

Roadmap 11gR2

Wie bereits über verschiedene Kanäle angekündigt, neigt sich die Unterstützung von Release 11gR2 dem Ende zu. Die Version 11gR2 wurde im Jahr 2009 erstmals veröffentlicht, seitdem erschienen mehrere Subreleases. Momentan ist die Version 11.2.0.4 aktuell, wobei diese Version auch die letzte sein wird (Oracle spricht hier vom terminal patchset).

Das Release 11gR2 wird zwar in Form von PSUs (Patch Set Updates) noch weiter gepflegt, aktuelle Entwicklung findet aber keine mehr statt.

Release  Patching End Date

11.2.0.1  13.09.2011
11.2.0.2  31.10.2013
11.2.0.3  27.08.2015
11.2.0.4  31.01.2018

Wie aus der Tabelle ersichtlich wird, endet das Patching für die Version 11.2.0.3 noch dieses Jahr, bei 11.2.0.4 bleibt noch ein wenig mehr Zeit. Dies betrifft jedoch nur die Bereitstellung von Patches und PSUs, nicht den Support. Hier sieht es anders aus.

 

Premier Support Ends

Achtung: Der Premier Support für 11gR2 ist mit Ende Jänner 2015 ausgelaufen!

Oracle bietet die Möglichkeit, für ein zusätzliches Jahr den sog. „Free Extended Support“ in Anspruch zu nehmen.

Dies ist für alle Kunden mit einem aufrechten Support-Vertrag möglich.

Um in den Genuss von „Free Extended Support“ zu kommen, ist es erforderlich, dass sie bei Oracle einen Vertrag anfordern. Sie bekommen dann eine Rechnung über den Betrag von 0 Euro ausgestellt, der die Aktivierung des „Free Extended Supports“ ausweist. Nach Ablauf des kostenlosen „Free Extended Support“erfolgt keine automatische Verlängerung des Supportvertrags. Ab dem zweiten Jahr (also nach 31.01.2016) würden die vollen Sup-portgebühren anfallen. Sofern sie den „Free Extended Support“ beantragen, ist nach Ablauf des Vertrags nichts mehr zu machen. Sie brauchen den Vertrag weder kündigen, noch wird dieser zu den regulären Supportpreisen verlängert.

Wie aus der Tabelle (siehe unten) ersichtlich wird, ist der „Free Extended Support“ nur für die Version 11.2.0.4 von Relevanz.

Für die Version 11.2.0.3 endet der Support bereits in wenigen Monaten.

Oracle Support Roadmap

 

Release  Free Extended Support Ends

11.2.0.1 No Extended Support available
11.2.0.2 No Extended Support available
11.2.0.3 27.08.2015
11.2.0.4 31.01.2016

Der „Free Extended Support“ für 11.2.0.4 endet mit Ende Jänner 2016. Ab diesem Zeitpunkt gibt es nur mehr den kostspieligen „Extended Support“, der maximal bis Ende Jänner 2018 verlängert werden kann.

 

Release 12c

Das Datenbank-Release 12c wurde am 22.06.2013 zum ersten Mal veröffentlicht. Mittlerweile (Stand: Februar 2015) steht die Release 12.1.0.2 zur Verfügung. Allerdings betrifft dies nur die Enterprise Edition der Datenbank, für die Standard Edition ist das letzte verfügbare Patchlevel 12.1.0.1.6.

 

Edition      Release and PSU-Level

Enterprise   12.1.0.2.2 (includes PSU Jan2015)

Standard      12.1.0.1.6 (includes PSU Jan2015)

 

Ein „Direct Upgrade“ auf 12c ist nur von folgenden Versionen aus möglich:

•             ≥ 10.2.0.5
•             ≥ 11.1.0.7
•             ≥ 11.2.0.2

Sollten sie eine ältere Version im Einsatz haben, ist ein Zwischenschritt notwendig. Doch auch hier gibt es wie immer mehrere Möglichkeiten.

Wir beraten sie gerne hinsichtlich der möglichen Upgrade-Szenarien und stimmen dieses gerne auf ihre Anforderungen hinsichtlich Downtime und Applikationstests ab.

 

Neben der in Verwendung befindlichen Version des RDBMS spielt das Client-Umfeld eine entscheidende Rolle für ein erfolgreiches Upgrade auf 12c.

  • Welche JDBC-Versionen sind im Einsatz?
  • Welche Client-Versionen verbinden sich zur Datenbank?
  • Wurde am Applikationsserver ein Connection Pool konfiguriert?
  • Und wie authentifizieren sich die Clients gegenüber der Datenbank?

Das sind nur einige der Fragen, die es im Vorfeld zu erheben gilt.

Wir unterstützen sie bei der Erfassung dieser Informationen und der möglicherweise notwendigen Konfigurationsänderungen.

 

Are you ready for Oracle 12c?

Um ihnen den Umstieg auf 12c so einfach wie möglich zu machen, bieten wir ihnen umfassende Prüfung ihrer Datenbanken und ihrer Clients im Vorfeld des Upgrades an.

 

Basierend auf unserer Erfahrung, die wir bei diversen Upgrades auf 12c sammeln konnten, haben wir einen Upgrade-Check erarbeitet, der in nicht-invasiver Weise die vorhandene Datenbank-Landschaft prüft und auf mögliche Stolpersteine beim Upgrade hinweist.

 

Am Ende des Prüfvorgangs erhalten Sie von uns einen detaillierten Bericht, wie sich ein Upgrade-Szenario darstellen würde, was hinsichtlich Datenbank und Client-Umfeld zu tun wäre und mit welchen Serviceeinschränk-ungen während des Upgrades zu rechnen wäre.

Dieser Check bildet die Grundlage für ein erfolgreiches Upgrade auf 12c.

Also: Sind sie dabei? Oder anders gefragt: Are you ready for 12c?