Im Normalbetrieb ist es heutzutage fast unmöglich, die Datenbank beispielsweise für einen Exportjob für sich alleine zu haben. Ein stoppen des Listeners kommt nicht in Frage wenn sich mehrere Oracle Datenbanken auf dem gleichen Server einen Listener teilen. Hintergrund-Jobs für Monitoring, Backup etc. sollten weiter laufen. Und trotzdem möchte man für bestimmte Aktionen Änderungen von Clients unterbinden können.

Die Lösung bietet sich mit dem RESTRICTED Modus an. Eine Oracle-Datenbank kann unmittelbar beim Starten oder im laufenden Betrieb in den RESTRICTED Modus gesetzt werden. In diesem Modus sind nur Benutzer SYS und Benutzer mit dem administrativen Privileg RESTRICTED SESSION ermächtigt, neue Verbindungen zur Datenbank herzustellen. Bestehende Verbindungen bleiben erhalten.

Klassische Anwendungsgebiete für diesen Modus:

  • Datenbank Export / Import
  • Data Load mit dem SQL*Loader
  • Zwischenzeitliches Aussperren der Applikationsbenutzer / Clients für Wartungsarbeiten
  • Migrations- oder Update-Aktion

Starten der Datenbank im RESTRICTED Modus

SQL> STARTUP RESTRICT

Der gesetzte Modus lässt sich in der DBA-View v$instance überprüfen:

SQL> SELECT instance_name,logins
  2  FROM v$instance;

INSTANCE_NAME    LOGINS
---------------- ----------
dev502           RESTRICTED

Neue SQL*Net-Verbindungen von Clients werden ab sofort geblockt.

C:\Users\mbg>sqlplus scott/tiger@DEV502.trivadistraining.com

SQL*Plus: Release 11.2.0.4.0 Production on Sun Feb 23 15:56:25 2014

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

ERROR:
ORA-12526: TNS:listener: all appropriate instances are in restricted mode^

Auch am Listener ist der Status RESTRICTED ersichtlich:

LSNRCTL for 64-bit Windows: Version 11.2.0.4.0 - Production on 23-FEB-2014 16:40:47

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

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=LTMBG01.trivadis.com)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for 64-bit Windows: Version 11.2.0.4.0 - Production
Start Date                23-FEB-2014 13:14:42
Uptime                    0 days 3 hr. 26 min. 4 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   C:\oracle\network\admin\listener.ora
Listener Log File         c:\oracle\diag\tnslsnr\LTMBG01\listener\alert\log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=LTMBG01.trivadis.com)(PORT=1521)))
Services Summary...
Service "DEV502.trivadistraining.com" has 1 instance(s).
  Instance "dev502", status RESTRICTED, has 1 handler(s) for this service...
Service "DEV502XDB.trivadistraining.com" has 1 instance(s).
  Instance "dev502", status RESTRICTED, has 1 handler(s) for this service...
The command completed successfully

Sämtliche Remote-Verbindungen sind geblockt

Damit kann sich allerdings auch der Benutzer SYS nicht mehr Remote verbinden. Der Neuaufbau wird bereits bei der Anfrage beim Listener geblockt. Um sich trotzdem mit einem Client als SYS oder einem Benutzer mit dem RESTRICTED SESSION Privileg verbinden zu können, ist eine Anpassung im Client-seitigen TNSNAMES.ORA notwendig – UR = A.

DEV502.TRIVADISTRAINING.COM =
  (DESCRIPTION =
     (ADDRESS = (PROTOCOL = TCP)(HOST = LTMBG01)(PORT = 1521))
    (CONNECT_DATA =
      (SERVICE_NAME = DEV502.TRIVADISTRAINING.COM)
      (UR = A)
    )
  )

Die offizielle Beschreibung von My Oracle Support was UR=A bedeutet:

(UR=A) comes from USERS with RESTRICTED session privilege (privileged or administrative user) are ALLOWED to connect via the listener even when the service handler is blocking connections for nonprivileged users or database is opened in restrict mode.

Damit wird der Verbindungsaufbau nicht bereits beim Listener geblockt sondern es wird geprüft, ob der Benutzer das RESTRICTED SESSION Privileg besitzt. Der Verbindungsaufbau beispielsweise von  SYS ist wieder möglich:

C:\Users\mbg>sqlplus sys/manager@DEV502.trivadistraining.com as SYSDBA

SQL*Plus: Release 11.2.0.4.0 Production on Sun Feb 23 16:22:03 2014

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


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

Das administrative Privileg RESTRICTED SESSION

Will man einem nicht-SYS-Benutzer die Möglichkeit geben sich in eine Datenbank zu verbinden welche sich im RESTRICTED Modus befindet, muss das Privileg erteilt werden:

SQL> GRANT RESTRICTED SESSION TO appl_admin;

Das Privileg entziehen:

SQL> REVOKE RESTRICTED SESSION FROM appl_admin;

Läuft die Datenbank im RESTRICTED Modus aber dem Benutzer fehlt das Privileg, wird dank dem TNSNAMES.ORA Eintrag UR=A der Aufbau zwar nicht schon am Listener geblockt, die Verbindung kommt aber trotzdem nicht zustande.

C:\Users\mbg>sqlplus appl_admin/***@DEV502.trivadistraining.com

SQL*Plus: Release 11.2.0.4.0 Production on Sun Feb 23 15:55:31 2014

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

ERROR:
ORA-01035: ORACLE only available to users with RESTRICTED SESSION privilege

Datenbank-Operationen im laufenden Betrieb

Eine Datenbank kann im laufenden Betrieb in den RESTRICTED Modus und auch wieder zurück gesetzt werden:

SQL> ALTER SYSTEM ENABLE RESTRICTED SESSION;

SQL> ALTER SYSTEM DISABLE RESTRICTED SESSION;

Die Aktion wird im Alertlog der Datenbank eingetragen – hier beim Einschalten:

Sun Feb 23 16:43:49 2014
MMNL started with pid=16, OS id=20720
ALTER SYSTEM enable restricted session;

Der RESTRICTED Modus– eine praktische Sache

Mit diesem Modus kann der DBA ungestört von Client-Aktionen seinen Tätigkeiten nachgehen und die Datenbank ist weiterhin “up-and-running”. Zu bedenken sind lediglich dass beim aktivieren im laufenden Betrieb bestehende Verbindungen weiterhin bestehen bleiben – hier hilft nur ein sauberes SHUTDOWN IMMEDIATE und dann STARTUP RESTRICT -  und das Ausschalten nicht vergessen!