Die grösste Neuheit von Oracle 12c ist die Multitenant Option. Basierend auf einer sogenannten Containerdatenbank lassen sich beliebige viele Pluggable Databases - kurz PDBs – betreiben. Mit dieser neuen Technologie hat sich auch einiges geändert nicht nur im Zusammenhang mit Benutzer, Rollen und Funktionen. Oracle hat nun ein auf Oracle Application Express basierendes Webinterface veröffentlich, das Oracle Multitenant Self-Service Provisioning Portal. Damit kann der DBA mittels Browser PDBs anlegen, verschieben, ändern etc.

Als Zielgruppe für diese Umgebung nennt Oracle DBAs und Entwickler, welche sich mit dieser neuen Funktionalität vertraut machen wollen.

image

 

Wir installieren und konfigurieren das Oracle Multitenant Self-Service Provisioning Portal in einer Oracle Enterprise Linux 6 x86-64 Umgebung. Als Grundlage dient das readme.txt welches im Zip-File für das Portal enthalten ist und viele wertvolle Informationen beinhaltet.

 

Voraussetzungen – Software

Basis ist eine 12c Enterprise Edition Installation. Oracle Application Express wird bereits mitgeliefert und mit installiert. Für den Betrieb vom Portal ist aber ein Patch notwendig welcher via My Oracle Support bezogen werden kann.

Oracle Database 12c Release 1 

Oracle Application Express 4.2.3.00.08 

Oracle Application Express Listener 2.0.4

Oracle Multitenant Self-Service Provisioning Portal

 

Voraussetzungen – Datenbank

Mit dem DBCA wurde eine leere Containerdatenbank erstellt mit dem Zeichensatz AL32UTF8, der Listener läuft auf Port 1521. Wird mit dem DBCA eine Containerdatenbank erstellt, so installiert Oracle automatisch sämtliche Komponenten in die Datenbank, wie bspw. Oracle Application Express, Oracle Text etc. Das ist zwar praktisch, dauert aber doch eine Weile.

Bei der folgenden Installation wurde die Datenbank MSSP01.trivadis.com auf dem Server srv12c.trivadis.com erstellt.

image

Screenshot DBCA – “Create an Empty Container Database” – klicken zum vergrössern

SQL> SELECT value$
  2  FROM sys.props$
  3  WHERE name = 'NLS_CHARACTERSET';

VALUE$
------------------------------------------------------------------------
AL32UTF8

Oracle Application Express – Patch für Version 4.2.3.00.08

Wie bereits erwähnt erfüllt die mit Oracle 12c ausgelieferte APEX Version die Mindestandforderung für das Portal nicht. Es muss zuerst der Patch 17347169 eingespielt werden. Nach dem Download und dem extrahieren in ein temporäres Verzeichnis auf dem Server wird der Patch mit SQL*Plus eingespielt.

image

Screenshot My Oracle Support – Patch - klicken zum vergrössern

Die installierte mitgelieferte Version 4.2.0.00.27:

SQL> SELECT con_id, comp_id, version,status
  2  FROM cdb_registry
  3  WHERE comp_id='APEX';

    CON_ID COMP_ID    VERSION                        STATUS
---------- ---------- ------------------------------ ----------
          1 APEX       4.2.0.00.27                    VALID
     

Applizieren vom Patch

Setzen der Umgebungsgvariablen, Login als SYSDBA und applizieren vom Patch 17347169 mit dem Script apxpatch_con.sql:

# export ORACLE_HOME=/u00/app/oracle/product/12.1.0.1

# export ORACLE_SID=MSSP01

# cd /u00/app/oracle/tmp/patch

# sqlplus / as sysdba

SQL> @apxpatch_con.sql

PL/SQL procedure successfully completed.

Die Installation erstellt Logfiles, welche kurz auf ORA-Fehler zu durchsuchen sind.

  • syspatch_con*.log
  • ddlpatch_con*.log
  • deppatch_con*.log
  • corepatch_con*.log

# grep ORA- *.log
# grep PLS- *.log
 

Nach der erfolgreichen Installation vom Patch ist die neue Version ersichtlich. Wichtig: Der Status muss VALID sein.

SQL> SELECT con_id, comp_id, version,status
  2  FROM cdb_registry
  3  WHERE comp_id='APEX';
 
    CON_ID COMP_ID    VERSION                        STATUS
---------- ---------- ------------------------------ ----------
          1 APEX       4.2.3.00.08                    VALID
          2 APEX       4.2.3.00.08                    VALID

 

Warum sind zwei Einträge ersichtlich? APEX wurde sowohl in der Containerdatenbank als auch in der Pluggable Datenbank SEED initialisiert und aktualisiert.

Das Applizieren vom Patch dauert je nach System ca. 20 bis 30 Minuten. Da die Self-Service Plattform mit dem APEX Listener betrieben wird, werden statische Komponenten wie Bilder dynamisch aus einem lokalen Verzeichnis geladen (im Gegensatz zum Embedded PL/SQL Gateway wo die Webseite vollständig aus der Datenbank generiert wird).

Wir kopieren deshalb  den /image Ordner aus dem Patch-Verzeichis in das ORACLE_HOME/apex Verzeichnis. Damit haben wir nicht nur intern APEX auf den neusten Stand gebracht, sondern auch gleich die statischen Objekte am richtigen Ort aktualisiert.

# rm -rf $ORACLE_HOME/apex/images
# cp –r  /u00/app/oracle/tmp/patch/images $ORACLE_HOME/apex

RESTful Web Services in der CDB konfigurieren

Dieses Konfigurationsscript wird ebenfalls mit dem Patch mitgeliefert. Es muss für die Datenbankbenutzer APEX_LISTENER und APEX_REST_PUBLIC_USER ein Passwort gesetzt werden. Achtung: Die Passwörter werden später für die Konfiguration vom APEX Listener erneut benötigt.

# cd /u00/app/oracle/tmp/patch

# sqlplus / as sysdba

SQL> @apex_rest_config_con.sql

PL/SQL procedure successfully completed.

Enter a password for the APEX_LISTENER user              []
Enter a password for the APEX_REST_PUBLIC_USER user              []

Performing installation in multitenant container database in the background.
The installation progress is spooled into apex_rest_config_con*.log files.

Please wait...

 

Installation completed. Log files for each container can be found in:

apex_rest_config_con*.log

You can quickly scan for ORA errors or compilation errors by using a utility
like grep:

grep ORA- *.log
grep PLS- *.log

 

Unlock APEX_PUBLIC_USER und Passwort setzen

Achtung: Das gleiche Password wird später für die Konfiguration vom APEX Listener erneut benötigt.

SQL> alter user APEX_PUBLIC_USER identified by <PASSWORT> account unlock;

User altered.

 

Berechtigungen setzen

SQL> grant set container to APEX_PUBLIC_USER container=all;

Grant succeeded.

SQL> grant set container to APEX_REST_PUBLIC_USER container=all;

Grant succeeded.

SQL> grant set container to APEX_LISTENER container=all;

Grant succeeded.

Bereitstellen vom APEX Listener

Der APEX Listener wurde runtergeladen und auf den Server transferiert. Das Paket wurde entpackt und in das Verzeichnis $ORACLE_BASE/product/apexlistener kopiert:

oracle@srv12c:/u00/app/oracle/product/apexlistener/ [MSSP01] ll
total 27364
drwxr-xr-x. 4 oracle oinstall     4096 Oct 20 09:57 .
drwxr-xr-x. 4 oracle oinstall     4096 Oct 20 09:57 ..
-rw-r--r--. 1 oracle oinstall 27983807 Oct 20 09:57 apex.war
drwxr-xr-x. 2 oracle oinstall     4096 Oct 20 09:57 docs
drwxr-xr-x. 4 oracle oinstall     4096 Oct 20 09:57 javadoc
-rw-r--r--. 1 oracle oinstall    17060 Oct 20 09:57 readme.html

Beim ersten Start vom APEX Listener werden folgende Abfragen gemacht – diese werden dann in der Konfigurationsdatei gespeichert:

  • Pfad für die Konfiguationsdatei – bspw.  /u00/app/oracle/product/apexlistener/config
  • Hostname
  • Port
  • Servicename
  • Datenbankbenutzer (default lassen) / Passwort von vorhin
  • Übernahme vom Passwort für andere Benutzer

Wichtig: Nach der Konfiguration den Listener nicht starten sondern beenden mit [2] (exit).

oracle@srv12c:/u00/app/oracle/product/apexlistener/ [MSSP01] java -jar apex.war
This Listener instance has not yet been configured.
Please complete the following prompts

Enter the location to store configuration data:/u00/app/oracle/product/apexlistener/config
Oct 20, 2013 9:58:46 AM oracle.dbtools.common.config.cmds.ConfigDir execute
INFO: Set config.dir to /u00/app/oracle/product/apexlistener/config in: /u00/app/oracle/product/apexlistener/apex.war
Oct 20, 2013 9:58:50 AM oracle.dbtools.common.config.file.ConfigurationFolder logConfigFolder
INFO: Using configuration folder: /u00/app/oracle/product/apexlistener/config/apex
Enter the name of the database server [localhost]:srv12c
Enter the database listen port [1521]:1521
Enter 1 to specify the database service name, or 2 to specify the database SID [1]:1
Enter the database service name:MSSP01.trivadis.com
Enter the database user name [APEX_PUBLIC_USER]:APEX_PUBLIC_USER
Enter the database password for APEX_PUBLIC_USER:
Confirm password:
Enter 1 to enter passwords for the RESTful Services database users (APEX_LISTENER,APEX_REST_PUBLIC_USER), 2 to use the same password as used for APEX_PUBLIC_USER or, 3 to skip this step [1]:2
Oct 20, 2013 10:00:39 AM oracle.dbtools.common.config.file.ConfigurationFiles update
INFO: Updated configurations: defaults, apex, apex_al, apex_rt
Enter 1 if you wish to start in standalone mode or 2 to exit [1]:2

 

Konfiguration vom DB-Suffix für den APEX Listener

Für den APEX-Listener muss der Parameter db.serviceNameSuffix konfiguriert werden. Dieser entspricht der DB-Domain der Datenbank.

Als erstes muss die DB.Domain der Datenbank ermittelt werden:

SQL> show parameter DB_DOMAIN

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_domain                            string      trivadis.com

Danach wird im Installationsverzeichnis vom APEX listener eine Konfigurationsdatei patch.properties mit Angabe der DB_DOMAIN erstellt.

# cd /u00/app/oracle/product/apexlistener/

# echo db.serviceNameSuffix=.trivadis.com > patch.properties

Achtung: Der Parameter hat einen vorausgehenden Punkt. Hat die Datenbank den Parameter nicht gesetzt, muss die Konfigurationsdatei patch.properties trotzdem erstellt werden.

# echo db.serviceNameSuffix= > patch.properties

Nun wird der Listener auf den neusten Stand gebracht und gestartet:

oracle@srv12c:/u00/app/oracle/product/apexlistener/ [MSSP01] java -jar apex.war set-properties --conf apex patch.properties
Oct 20, 2013 10:07:53 AM oracle.dbtools.common.config.file.ConfigurationFolder logConfigFolder
INFO: Using configuration folder: /u00/app/oracle/product/apexlistener/config/apex
Oct 20, 2013 10:07:53 AM oracle.dbtools.rt.config.setup.SetProperties execute
INFO: Modified: /u00/app/oracle/product/apexlistener/config/apex/conf/apex.xml, updated properties: db.serviceNameSuffix

Beim Start wird nach dem statischen Verzeichnis gefragt. Da wird bereits beim Patchen die statischen Objekte in den APEX Unterordner im $ORACLE_HOME kopiert haben setzen wir den den Pfad auf $ORACLE_HOME/apex/images/.

Achtung: Am Ende vom Pfad muss ein / stehen, ansonsten wir beim Aufruf der Applikation eine leere Seite angezeigt.

Danach lassen wir den Listener in diesem Terminalfenster laufen und arbeiten in einem neuen Terminalfenster weiter. Wird das Fenster jetzt geschlossen so stoppt auch der APEX Listener.

oracle@srv12c:/u00/app/oracle/product/apexlistener/ [MSSP01] java -jar apex.war
Enter the APEX static resources location or Enter to skip:/u00/app/oracle/product/12.1.0.1/apex/images/
Enter the HTTP port [8080]:8080
Oct 20, 2013 10:09:33 AM oracle.dbtools.standalone.Standalone execute
INFO: NOTE:

 

Standalone mode is designed for use in development and test environments. It is not supported for use in production environments.

Oct 20, 2013 10:09:33 AM oracle.dbtools.standalone.Standalone execute
INFO: Starting standalone Web Container in:  /u00/app/oracle/product/apexlistener/config/apex
Oct 20, 2013 10:09:33 AM oracle.dbtools.standalone.Deployer deploy
INFO: Will deploy application path = /u00/app/oracle/product/apexlistener/config/apex/apex/WEB-INF/web.xml
Oct 20, 2013 10:09:34 AM oracle.dbtools.standalone.Deployer deploy
INFO: Deployed application path = /u00/app/oracle/product/apexlistener/config/apex/apex/WEB-INF/web.xml
Oct 20, 2013 10:09:34 AM oracle.dbtools.common.config.file.ConfigurationFolder logConfigFolder
INFO: Using configuration folder: /u00/app/oracle/product/apexlistener/config/apex
Configuration properties for: apex
cache.caching=false
cache.directory=/tmp/apex/cache
cache.duration=days
cache.expiration=7
cache.maxEntries=500
cache.monitorInterval=60
cache.procedureNameList=
cache.type=lru
db.hostname=srv12c
db.password=******
db.port=1521
db.servicename=MSSP01.trivadis.com
debug.debugger=false
debug.printDebugToScreen=false
error.keepErrorMessages=true
error.maxEntries=50
jdbc.DriverType=thin
jdbc.InactivityTimeout=1800
jdbc.InitialLimit=3
jdbc.MaxConnectionReuseCount=1000
jdbc.MaxLimit=10
jdbc.MaxStatementsLimit=10
jdbc.MinLimit=1
jdbc.statementTimeout=900
log.logging=false
log.maxEntries=50
misc.compress=
misc.defaultPage=apex
security.disableDefaultExclusionList=false
security.maxEntries=2000
db.serviceNameSuffix=
db.username=APEX_PUBLIC_USER
Using JDBC driver: Oracle JDBC driver version: 11.2.0.3.0
Oct 20, 2013 10:09:47 AM oracle.dbtools.rt.web.SCListener contextInitialized
INFO: Oracle Application Express Listener initialized
Application Express Listener version : 2.0.5.287.04.27
Application Express Listener server info: Grizzly/1.9.49

 

Oct 20, 2013 10:09:47 AM com.sun.grizzly.Controller logVersion
INFO: GRIZZLY0001: Starting Grizzly Framework 1.9.49 - 10/20/13 10:09 AM
Oct 20, 2013 10:09:47 AM oracle.dbtools.standalone.Standalone execute
INFO:
http://localhost:8080/apex started.

Test der APEX Applikation

Ist der Listener richtig konfiguriert, so kann die Oracle Application Einstiegsseite bereits via http://localhost:8080/apex erreicht werden. Die APEX Installation kann selbstverständlich auch für andere Applikation verwendet werden. Das Password für den INTERNAL Workspace und den ADMIN Benutzer kann mit dem Script apxchpwd.sql im Verzeichnis $ORACLE_HOME/apex gesetzt werden.

 

SNAGHTMLb793aab

Screenshot Browser – Oracle Application Express ist erreichbar – klicken zum vergrössern

 

Oracle Multitenant Self-Service Provisioning Installation

Das Oracle Multitenant Self-Service Provisioning Portal wurde runtergeladen und auf den Server transferiert. Die Installation der Anwendung erfolgt mit einem SQL-Script welches aus dem Pfad vom entpackten Paket ausgeführt wird. Es wird zudem eine Pluggable Database mit dem Namen APEX erstellt. Der Inhalt vom entpackten Verzeichnis:

oracle@srv12c:/u00/app/oracle/tmp/pdbss/ [MSSP01] ll
total 48
drwxr-xr-x. 4 oracle oinstall  4096 Sep 15 21:55 .
drwxr-xr-x. 3 oracle oinstall  4096 Oct 20 10:19 ..
-rw-r--r--. 1 oracle oinstall   147 Sep 15 21:55 build-info.txt
-rw-r--r--. 1 oracle oinstall 11918 Sep 15 21:55 pdbss_ins.sql
-rw-r--r--. 1 oracle oinstall  1621 Sep 15 21:55 pdbss_remove.sql
-rw-r--r--. 1 oracle oinstall 10126 Sep 15 21:55 readme.txt
drwxr-xr-x. 2 oracle oinstall  4096 Sep 15 21:55 source
drwxr-xr-x. 2 oracle oinstall  4096 Sep 15 21:55 utilities

Wechsel zum Installationsverzeichnis und starten vom Installationsscript. Diese Parameter müssen gesetzt oder der Default-Wert übernommen werden:

  • Allow demonstration mode [yes]
  • Enter destination for PDB data files [/u01/oradata/MSSP01]:
  • Enter the port used to access this database [1521]:
  • Enter the OS user that owns the Oracle installation [oracle]:
  • Enter the password for the OS user that owns the Oracle installation:
  • Enter a password for the self-service ADMIN user:

Wir der Demonstration Mode erlaubt, so wird später bei den via Portal erstellten Datenbanken eine APEX Anwendung APPDEV mit ein paar Basisfunktionen erstellt um die Möglichkeiten von APEX zu zeigen.

    # cd /u00/app/oracle/tmp/pdbss

    # sqlplus / as sysdba

    SQL> @pdbss_ins.sql
    .
    . Oracle Multitenant Self-Service Provisioning
    ..............................................
    .
    ... Checking prerequisites
    .

    PL/SQL procedure successfully completed.


    PL/SQL procedure successfully completed.


    PL/SQL procedure successfully completed.

    .
    ... Prerequisite checks passed.
    .
    Allow demonstration mode [yes]:

    Enter destination for PDB data files [/u01/oradata/MSSP01]:
    Enter the port used to access this database [1521]:
    Enter the OS user that owns the Oracle installation [oracle]:
    Enter the password for the OS user that owns the Oracle installation:

    Enter a password for the self-service ADMIN user:
    .
    . Installing
    .

     

    Commit complete.

    timing for: Complete Install
    Elapsed: 00:02:12.94
    .
    . Done. Please review pdbss_ins.log for any errors.       
    .  

    Die neue Pluggable Database APEX

    Bei der Installation wurde eine neue PDB mit dem Namen APEX erstellt – diese ist auch am Listener angemeldet:

    SQL> SELECT con_id,name,open_mode
      2  FROM v$pdbs;

        CON_ID NAME                           OPEN_MODE
    ---------- ------------------------------ ----------
             2 PDB$SEED                       READ ONLY
             3 APEX                           READ WRITE

    oracle@srv12c:~/ [MSSP01] lsnrctl status

    LSNRCTL for Linux: Version 12.1.0.1.0 - Production on 20-OCT-2013 15:07:04

    Copyright (c) 1991, 2013, Oracle.  All rights reserved.

    Connecting to (ADDRESS=(PROTOCOL=TCP)(Host=srv12c)(Port=1521))
    STATUS of the LISTENER
    ------------------------
    Alias                     LISTENER
    Version                   TNSLSNR for Linux: Version 12.1.0.1.0 - Production
    Start Date                20-OCT-2013 13:28:29
    Uptime                    0 days 1 hr. 38 min. 34 sec
    Trace Level               off
    Security                  ON: Local OS Authentication
    SNMP                      OFF
    Listener Parameter File   /u00/app/oracle/network/admin/listener.ora
    Listener Log File         /u00/app/oracle/diag/tnslsnr/srv12c/listener/alert/log.xml
    Listening Endpoints Summary...
      (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=srv12c.ttc.trivadis.com)(PORT=1521)))
      (DESCRIPTION=(ADDRESS=(PROTOCOL=tcps)(HOST=srv12c.ttc.trivadis.com)(PORT=5500))(Security=(my_wallet_directory=/u00/app/oracle/admin/MSSP01/xdb_wallet))(Presentation=HTTP)(Session=RAW))
    Services Summary...
    Service "MSSP01.trivadis.com" has 1 instance(s).
      Instance "MSSP01", status READY, has 1 handler(s) for this service...
    Service "MSSP01XDB.trivadis.com" has 1 instance(s).
      Instance "MSSP01", status READY, has 1 handler(s) for this service...
    Service "apex.trivadis.com" has 1 instance(s).
      Instance "MSSP01", status READY, has 1 handler(s) for this service...

    The command completed successfully

    Login

    Das Login erfolgt über die URL mit dem /apex/f?p=PDBSS Suffix. Als Passwort wird das Passwort verwendet welches bei der Installation vom Oracle Multitenant Self-Service Provisioning Portal angegeben wurde – aufgepasst auf den doppelten /apex/apex Pfad:

    https://localhost:8080/apex/apex/f?p=PDBSS

    image 

    Screenshot Browser – Login in die Applikation– klicken zum vergrössern

     

    image

    Screenshot Browser – die Startseite - klicken zum vergrössern

    Sollte die Seite im Browser nicht angezeigt werden oder die Seite leer sein ohne 404 Fehlermeldung so kann es an der APEX Listener Konfiguration der statischen Files liegen. In diesem Fall am Besten den /config Folder im APEX Listener Verzeichnis löschen und eine neue Konfiguration anlegen. Die Fehlermeldung ist im Terminalfenster mit dem laufenden APEX Listener ersichtlich. Anschliessend ist der APEX Listener neu zu konfigurieren.

    1. java -jar apex.war
    2. java -jar apex.war set-properties --conf apex patch.properties
    3. java -jar apex.war

     

    Links

    http://www.oracle.com/technetwork/database/multitenant/downloads/multitenant-pdbss-2016324.html

    http://www.oracle.com/technetwork/developer-tools/apex/downloads/index.html

    http://www.oracle.com/us/products/database/options/multitenant/overview/index.html

     

    Summary

    Mit der Oracle Multitenant Self-Service Provisioning Applikation hat der DBA nun die Möglichkeit, auf einfache Weise Pluggable Datenbanken für Test- und Entwicklungszwecke zu erstellen. Das Ganze hat zur Zeit noch den BETA-Status. Das heisst da wird sich sicher noch einiges tun. Der APEX Listener läuftnach dieser Installation noch in einem Terminal-Fenster. Um den APEX Listener im Hintergrund oder als Service zu starten sind im Internet bereits zahlreiche Scripts erhältlich.

    Die Multitenant Option lässt sich Oracle teuer bezahlen, nebst einer Enterprise Edition benötigen Sie zusätzlich die Oracle Multitenant Option welche aktuell auf https://shop.oracle.com den Preis von 17.500 USD pro Prozessor hat.