天天看點

【Oracle】-【TWO_TASK】-TWO_TASK環境變量的作用

楊大師(http://space.itpub.net/4227/viewspace-663069)介紹過TWO_TASK環境變量的作用,指出“在Unix和Linux環境下,可以設定TWO_TASK環境變量,當使用者連接配接資料庫且沒有指定服務名時,會自動利用TWO_TASK的設定作為環境變量連接配接資料庫。”,并用兩個本地資料庫為例說明了TWO_TASK的使用。

但TOM大師(http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:89412348059)也曾經回答過相關的問題,進一步指出TWO_TASK可以讓你通過SQLNet連接配接一個本地庫和一個遠端庫。

這裡我用一個本地庫與一個遠端庫的執行個體,再次驗證下。

目前配置的兩個連接配接串(一個本地資料庫,一個遠端資料庫):

[oracle@liu admin]$ more tnsnames.ora

BISAL =

  (DESCRIPTION =

    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))

    (CONNECT_DATA =

      (SERVER = DEDICATED)

      (SERVICE_NAME = bisal)

    )

  )

TEST =

    (ADDRESS_LIST =

      (ADDRESS = (PROTOCOL = TCP)(HOST = x.x.x.x)(PORT = 1524))

      (SERVICE_NAME = star)

目前TWO_TASK環境變量為空:

[oracle@liu Desktop]$ echo $TWO_TASK

[oracle@liu Desktop]$

當未指定服務名連接配接資料庫時,預設是bisal這個本地資料庫,即由系統的ORACLE_SID指定:

[oracle@liu Desktop]$ echo $ORACLE_SID

bisal

[oracle@liu Desktop]$ env | grep SID

ORACLE_SID=bisal

[oracle@liu Desktop]$ 

使用/的方式連接配接:

[oracle@liu Desktop]$ sqlplus / as sysdba

SQL*Plus: Release 10.2.0.1.0 - Production on Sun Aug 11 14:38:08 2013

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

Connected to:

Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production

With the Partitioning, OLAP and Data Mining options

SQL> select * from global_name;

GLOBAL_NAME

--------------------------------------------------------------------------------

BISAL

SQL> 

設定TWO_TASK=TESTTKT:

[oracle@liu Desktop]$ export TWO_TASK=TESTTKT

TESTTKT

使用TESTTKT的使用者名登陸,但不指定服務名:

[oracle@liu Desktop]$ sqlplus star/star

SQL*Plus: Release 10.2.0.1.0 - Production on Sun Aug 11 14:39:31 2013

Oracle9i Enterprise Edition Release 9.2.0.7.0 - 64bit Production

With the Partitioning, OLAP and Oracle Data Mining options

JServer Release 9.2.0.7.0 - Production

ALL9IT2

此時預設連接配接的就是TESTTKT這個遠端庫了。

此時關閉本地庫bisal的監聽:

LSNRCTL> stop bisal

驗證監聽狀态:

[oracle@liu Desktop]$ tnsping bisal

TNS Ping Utility for Linux: Version 10.2.0.1.0 - Production on 11-AUG-2013 15:06:18

Copyright (c) 1997, 2005, Oracle.  All rights reserved.

Used parameter files:

/opt/oracle/102/network/admin/sqlnet.ora

Used TNSNAMES adapter to resolve the alias

Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = bisal)))

TNS-12541: TNS:no listener

再次連接配接bisal庫:

[oracle@liu Desktop]$ sqlplus bisal/xxx@bisal

SQL*Plus: Release 10.2.0.1.0 - Production on Sun Aug 11 15:04:54 2013

ERROR:

ORA-12541: TNS:no listener

Enter user-name: 

打開監聽,再用@bisal的方式連接配接bisal本地庫:

SQL*Plus: Release 10.2.0.1.0 - Production on Sun Aug 11 14:40:08 2013

Error accessing PRODUCT_USER_PROFILE

Warning:  Product user profile information not loaded!

You may need to run PUPBLD.SQL as SYSTEM

但之前可以通過作業系統驗證登陸的本地庫sys賬戶:

SQL*Plus: Release 10.2.0.1.0 - Production on Sun Aug 11 14:40:37 2013

ORA-01031: insufficient privileges

禁止通路了。

隻能通過如下方式通路之前的本地庫sys賬戶:

[oracle@liu Desktop]$ sqlplus bisal/bisal@bisal

SQL*Plus: Release 10.2.0.1.0 - Production on Sun Aug 11 14:43:52 2013

SQL> conn sys/oracle as sysdba

Connected.

SQL> show user

USER is "SYS"

總結:

1、未設定TWO_TASK環境變量時,不指定服務名連接配接的預設是ORACLE_SID的值。

2、當設定TWO_TASK環境變量時,不指定服務名連接配接的預設是TWO_TASK的值。

3、當使用@服務名方式連接配接時,會忽略ORACLE_SID或TWO_TASK的值。

4、當使用TWO_TASK環境變量時,作業系統驗證登入資料庫的方式被禁止,提示ORA-01031: insufficient privileges。

5、因為TWO_TASK設定後,屏蔽了ORACLE_SID的作用,是以即使對于本地庫,也需要通過SQLNet的方式連接配接,也就是需要監聽,一般對于從本機通路本地庫可能不打開監聽,但此時需要打開監聽,才能通過@服務名的方式連接配接到本地庫。

6、補充:tnsnames.ora檔案預設采用的路徑如下:

$HOME(~)/.tnsnames.ora

$TNS_ADMIN/tnsnames.ora

/var/opt/oracle/tnsnames.ora or /etc/tnsnames.ora (depending on platform)

$ORACLE_HOME/network/admin/tnsnames.ora

7、關于TWO和TASK的來源,這個詞來源于20世紀80年代,TWO TASK表示兩個一起工作的含義,僅僅是意會,并不局限于兩個。

8、個人了解,設定TWO_TASK,能夠覆寫ORACLE_SID的作用,改變不帶@服務名預設連接配接的資料庫(本地or遠端),要求所有的sqlplus連接配接都是通過SQLNet的方式,禁止作業系統驗證。僅此而已。