Die gute alte TWO_TASK-Variable ..

15. März 2015 Aus Von Markus Flechtner

Die TWO_TASK-Variable oder – für Windows-Benutzer – die Registry-Einstellung “LOCAL”. Es gibt sie schon einige Jahre und diejenigen DBAs, die schon länger dabei sind, werden sich vielleicht erinnern. Was macht sie und warum kann sie in einem Oracle 12c-Umfeld hilfreich sein?

Was macht TWO_TASK?

Die TWO_TASK-Variable übersteuert einen eventuell vorhandenen Wert der Variablen ORACLE_SID. Sie muss – einfach ausgedrückt – ein gültiger Eintrag aus der tnsnames.ora-Datei sein. Oder allgemeiner formuliert, ein gültiger Oracle-Net-Connect-String.
Eine Anmeldung an eine Datenbank ohne “@TNS_ALIAS” führt dann nicht zu der mit ORACLE_SID angegebenen Instanz sondern zu der Datenbank, die in der Variablen TWO_TASK angegeben ist.
Wichtig ist aber, dass der Connect in diesem Fall nicht über das Bequeath-Protokoll, sondern über Oracle Net erfolgt (sprich: ein passender Listener muss laufen)!

Ein Beispiel:

Variante 1: ORACLE_SID gesetzt, TWO_TASK nicht gesetzt (der Normalfall)

oracle@training:~/ [TVD12CDB] echo $ORACLE_SID;echo $TWO_TASK
TVD12CDB

oracle@training:~/ [TVD12CDB] sqlplus system/manager
SQL*Plus: Release 12.1.0.2.0 Production on Mon Mar 16 07:42:24 2015
Copyright (c) 1982, 2014, Oracle. All rights reserved.
Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 – 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options

SQL> select name from v$database;
NAME
———
TVD12CDB

SQL> exit
Disconnected from Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 – 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options

Also alles wie erwartet.

Variante 2: ORACLE_SID und TWO_TASK gesetzt

oracle@training:~/ [TVD12CDB] export TWO_TASK=TVD12.markusdba.local
oracle@training:~/ [TVD12CDB] echo $ORACLE_SID;echo $TWO_TASK
TVD12CDB
TVD12.markusdba.local

oracle@training:~/ [TVD12CDB] sqlplus system/manager
SQL*Plus: Release 12.1.0.2.0 Production on Mon Mar 16 07:43:19 2015
Copyright (c) 1982, 2014, Oracle. All rights reserved.
Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 – 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
SQL> select name from v$database;
NAME
———
TVD12
SQL> exit
Disconnected from Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 – 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options

TWO_TASK hat offensichtlich Priorität.

Variante 3: ORACLE_SID nicht gesetzt, TWO_TASK gesetzt (nur der Vollständigkeit halber)

oracle@training:~/ [TVD12CDB] export ORACLE_SID=
oracle@training:~/ [] echo $ORACLE_SID;echo $TWO_TASK


TVD12.markusdba.local
oracle@training:~/ [] sqlplus system/manager

SQL*Plus: Release 12.1.0.2.0 Production on Mon Mar 16 07:47:30 2015
Copyright (c) 1982, 2014, Oracle. All rights reserved.
Last Successful login time: Wed Feb 11 2015 09:02:08 +01:00
Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 – 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options

SQL> select name from v$database;
NAME
———
TVD12
SQL> exit

Hinweis: OS-Authentication “sqlplus / as sysdba” funktioniert mit TWO_TASK nicht.

TWO_TASK und Oracle 12cMultitenant

Wie kann dieses Verhalten nun in einer Oracle 12c Multitenant-Umgebung helfen?

In einer Multitenant-Umgebung führt ein Connect über die ORACLE_SID immer in den Root-Container CDB$ROOT. Dies ist oft nicht sinnvoll, denn die Applikationsdaten liegen ja in den Pluggable Databases und nicht im Root-Container. Häufig machen auch Installationsskripte (historisch bedingt) einen “CONNECT SYSTEM/SYSTEM_PW” und landen dann im Root-Container. Dort werden dann z.B. Applikationsobjekte angelegt.

Hilfreich wäre in diesem Fall also:
export TWO_TASK=TNS_EINTRAG_DER_PDB

Das ist natürlich nur eine Übergangslösung; sinnvoller ist es sicherlich, die Skripte entsprechend anzupassen.

User, die nicht mit dem COMMON_USER_PREFIX beginnen, können übrigens defaultmäßig im Root-Container nicht angelegt werden. Dies ist also eine gewisse Absicherung gegen Installationsskripte, die (versehenlich) im Root-Container ausgeführt werden und als ersten Schritt einen Applikationsuser anlegen wollen.

TWO_TASK und Threaded Execution

Interessant kann TWO_TASK werden, wenn man mit Threaded Execution arbeitet. Einer der Nachteile von Threaded Execution ist ja, dass die OS-Authentisierung (“sqlplus / as sysdba”) nicht mehr funktioniert.
Wie kann TWO_TASK da helfen?

Wenn die Grid Infrastructure eine DB-Instanz starten möchte, die mit THREADED_EXECUTION=TRUE konfiguriert ist, dann macht der Agent der Grid Infrastructure einen Connect mit dem Connect-String “(ADDRESS=(PROTOCOL=BEQ)(PROGRAM=oracle)(ARGS='(ADDRESS=(PROTOCOL=BEQ))’))” (Dank an Robert Bialek für diesen Tipp).

Das können wir uns zunutze machen:

oracle@dbserver:~/ [TVD12] sqlplus sys/manager as sysdba

SQL*Plus: Release 12.1.0.2.0 Production on Thu Jan 15 12:38:26 2015
Copyright (c) 1982, 2014, Oracle. All rights reserved.

Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options

SQL> show parameter threaded

NAME TYPE
VALUE
------------------------------------ ----------- ------------------------------
threaded_execution boolean TRUE

SQL> exit
Disconnected from Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
oracle@dbserver:~/ [TVD12] export TWO_TASK="(ADDRESS=(PROTOCOL=BEQ)(PROGRAM=oracle)(ARGS='(ADDRESS=(PROTOCOL=BEQ))'))"
oracle@dbserver:~/ [TVD12] sqlplus / as sysdba

SQL*Plus: Release 12.1.0.2.0 Production on Thu Jan 15 12:38:58 2015
Copyright (c) 1982, 2014, Oracle. All rights reserved.

Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options

SQL> exit

Mit diesem Trick funktioniert “sqlplus / as sysdba” also auch mit Threaded Execution.

Links & MOS-Notes:

  • Tom Kyte zu TWO_TASK
  • MOS-Note 1015197.4 (ORACLE_SID VS TWO_TASK ON SQL*NET V2 FOR UNIX)
  • MOS-Note 112269.1 (How to set Unix environment variable TWO_TASK or the Windows counterpart, LOCAL)

Werbung (Amazon-Partner-Link)