詳解Oracle的連線模式:專有模式和共享模式

wangyiou1988發表於2016-07-18

oracle的網路連線模式

         專有服務和共享服務模式

         專有模式

                  

                   每個使用者程式和服務程式間透過監聽器建立連線

                   程式資訊存放於PGA,也就是說有多少個使用者程式就有多少個PGA產生

                   單單隻有程式連線還不足以運算元據庫,還需要產生的會話資訊

                   會話資訊儲存在UGA,UGA在專有模式中存在於PGA

                   因為程式和程式間是相互隔離的,所以會話資訊也相對獨立

                   這就導致了服務程式只能獲知當前使用者程式的會話請求資訊只能為當前使用者程式服務

                  

         共享模式

                   使用者程式的請求被監聽器接收,監聽器不委派伺服器程式,而是將排程器資訊返回給客戶端

                   排程器將使用者程式的請求放入請求佇列

                   多個服務程式中的一個服務程式從佇列中獲取使用者程式的請求,並處理這個使用者程式的請求

                   服務程式處理完後將處理結果放入響應佇列,每個排程器都有自己的響應佇列

                   響應佇列的資訊反饋給對應的排程器

                   排程器再把服務程式處理的結果返回給使用者程式

                  

                   共享模式中的使用者程式的會話資訊對每一個伺服器程式來說都是可見的.

                   因為共享模式的UGA資訊存在於SGA,所以此時一個使用者程式的請求可以由多個服務程式來完成.

監聽器的特點

         監聽程式程式可監聽多個資料庫

         多個監聽程式可為一個資料庫進行監聽,以實現負載均衡,可以透過每個監聽協議地址上的負載序列值來判斷使用負載最低的監聽。

         可以實現連線時的故障轉移,如果第1個監聽失敗,可以請求第2個監聽

         監聽程式可監聽多個協議

         Oracle Net 中的監聽程式的預設名稱是LISTENER

         每個listener.ora檔案中的監聽程式的名稱必須唯一

專有伺服器配置

oracle的網路配置分為伺服器端和客戶端

         伺服器端監聽器listener

                   主要是$ORACLE_HOME/network/admin/listener.ora檔案

                   描述了監聽的網路連線型別 TCP ICP LDAP

                   例如:

                   LISTENER =

                     (DESCRIPTION_LIST =

                       (DESCRIPTION =

                         (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))

                         (ADDRESS = (PROTOCOL = TCP)(HOST = dba.up.com)(PORT = 1521))

                       )

                     )

                   透過lsnrctl命令來啟動/停止/檢視/過載監聽器/服務

                   lsnrctlstart|stop|status|reload|service                                                                          

         客戶端

                   主要是$ORACLE_HOME/network/admin/tnsname.ora檔案

                   對具體的資料庫連線資訊濃縮成別名

                   例如:

                   ORA10G =

                     (DESCRIPTION =

                       (ADDRESS = (PROTOCOL = TCP)(HOST = dba.up.com)(PORT = 1521))

                       (CONNECT_DATA =

                         (SERVER = DEDICATED)

                         (SERVICE_NAME = ora10g)

                       )

                     )

客戶端申請連結的過程
詳解Oracle的連線模式:專有模式和共享模式

connscott/seker@ora10g

         1.客戶端透過@ora10g的名字去tnsname.ora檔案獲取伺服器的具體連線資訊

         2.客戶端透過tnsname.ora中的描述向伺服器發出連結請求伺服器端

         3.伺服器的監聽器接收到連線請求後,驗證請求的服務的有效性

         4.伺服器端產生一個服務程式和客戶端程式建立連線

        

客戶端配置tnsname.ora

ORA10G =

  (DESCRIPTION =

    (ADDRESS = (PROTOCOL = TCP)(HOST = dba.up.com)(PORT = 1522))

    (CONNECT_DATA =

      (SERVER = DEDICATED)

      (SERVICE_NAME = ora10g)

    )

  )

ORACLE NET服務端配置

         例項透過註冊讓監聽器得知伺服器執行的資訊

         註冊分兩種

                   靜態註冊

                            LISTENER主動去找要支援的例項資訊,叫靜態註冊

                   動態註冊

                            PMON程式將例項資訊告訴listener,叫動態註冊

靜態註冊和動態註冊

         什麼是靜態註冊

                   就是監聽器的配置檔案中寫明瞭監聽哪個例項需要配置SID_DESC欄位

                   定位例項的方式可以使用SID_NAME或者SERVICE_NAME來定位

         什麼是動態註冊

                   就是監聽器的配置檔案中沒寫明監聽哪個例項

                   要透過PMON告知監聽器要監聽的具體例項

                   PMON是將SERVER_NAME告訴給監聽器這個過程就是註冊

                   預設一分鐘PMON註冊一次也就是說啟動監聽還沒註冊時是無法連線的

         區分靜態註冊和動態註冊

                   lsnrctl status

                   ready 就是動態

                   unknow就是靜態

                  

靜態註冊listener.ora檔案資訊:

[oracle@dba admin]$ catlistener.ora

SID_LIST_LISTENER =

  (SID_LIST =

(SID_DESC =

                   (ORACLE_HOME = /u01/oracle/product/10.2.0)

                   (SID_NAME =orcl)

         )

         (SID_DESC =

                   (ORACLE_HOME = /u01/oracle/product/10.2.0)

                   (SID_NAME =ora10g)

         )

  )

LISTENER =

  (DESCRIPTION_LIST =

    (DESCRIPTION =

      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))

      (ADDRESS = (PROTOCOL = TCP)(HOST = dba.up.com)(PORT = 1522))

    )

  )

[oracle@dba admin]$

[oracle@dba admin]$ lsnrctl start

.....

Services Summary...

Service "ora10g" has 1 instance(s).

  Instance "ora10g", status UNKNOWN, has 1 handler(s) for this service...

Service "orcl" has 1 instance(s).

  Instance "orcl", status UNKNOWN, has 1 handler(s) for this service...

The command completed successfully

[oracle@dba admin]$

狀態總是顯示未知的,當有請求時,監聽器才去確認資料是否存在

動態註冊

         Oracle9i起例項使用動態服務註冊來通知監聽程式有關其資料庫服務的資訊。

         服務註冊依賴PMON 程式向監聽程式註冊例項資訊註冊間隔為1分鐘左右

         手動註冊命令 alter system register;

         無需在listener.ora檔案中設定任何資訊此檔案可以不存在

                  

[oracle@dba admin]$ rm -rflistener.ora

[oracle@dba admin]$

[oracle@dba admin]$ lsnrctl start

....

Listening Endpoints Summary...

  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=dba.up.com)(PORT=1521)))

The listener supports no services

The command completed successfully

[oracle@dba admin]$

[oracle@dba admin]$ sqlscott/seker@ora10g

SQL*Plus: Release 10.2.0.1.0 - Production on Sat Apr 2 15:59:20 2011

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

ERROR:

ORA-12514: TNS:listener does not currently know of service requested in connect

descriptor

Enter user-name:

[oracle@dba admin]$  因為沒有註冊所以不能連線

手動註冊一次

SQL> alter system register;

System altered.

SQL>

[oracle@dba admin]$ sqlscott/seker@ora10g

SQL*Plus: Release 10.2.0.1.0 - Production on Sat Apr 2 15:59:42 2011

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>連線成功

如果listener.ora中定義了監聽埠(1521)

此時還想使用動態註冊需要設定local_listener引數

[oracle@dba admin]$ catlistener.ora

# listener.ora Network Configuration File: /u01/oracle/product/10.2.0/network/admin/listener.ora

# Generated by Oracle configuration tools.

SID_LIST_LISTENER =

  (SID_LIST =

    (SID_DESC =

      (SID_NAME = PLSExtProc)

      (ORACLE_HOME = /u01/oracle/product/10.2.0)

      (PROGRAM = extproc)

    )

  )

LISTENER =

  (DESCRIPTION_LIST =

    (DESCRIPTION =

      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))

      (ADDRESS = (PROTOCOL = TCP)(HOST = dba.up.com)(PORT = 1522))

    )

  )

[oracle@dba admin]$

[oracle@dba admin]$ lsnrctl start

......

Listening Endpoints Summary...

  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1)))

  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=dba.up.com)(PORT=1522)))

Services Summary...

Service "PLSExtProc" has 1 instance(s).

  Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...

The command completed successfully

[oracle@dba admin]$

手動註冊無效  PMON預設只能註冊預設埠1521

SQL> alter system register;

System altered.

SQL>

Listening Endpoints Summary...

  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1)))

  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=dba.up.com)(PORT=1522)))

Services Summary...

Service "PLSExtProc" has 1 instance(s).

  Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...

The command completed successfully

[oracle@dba admin]$

修改引數local_listener註冊成功

SQL> alter system set local_listener='ORxx';

System altered.

SQL> alter system register;

System altered.

SQL>

[oracle@dba admin]$ lsnrctl status

....

Services Summary...

Service "PLSExtProc" has 1 instance(s).

  Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...

Service "ora10g" has 1 instance(s).

  Instance "ora10g", status READY, has 1 handler(s) for this service...

Service "ora10gXDB" has 1 instance(s).

  Instance "ora10g", status READY, has 1 handler(s) for this service...

Service "ora10g_XPT" has 1 instance(s).

  Instance "ora10g", status READY, has 1 handler(s) for this service...

The command completed successfully

[oracle@dba admin]$

local_listener='ORxx' 是什麼?

local_listener的值一定要在tnsname.ora中設定否則報錯

[oracle@dba admin]$ grep -A 7 'ORxx' tnsnames.ora

ORxx =

  (DESCRIPTION =

    (ADDRESS = (PROTOCOL = TCP)(HOST = dba.up.com)(PORT = 1522))

    (CONNECT_DATA =

      (SERVER = DEDICATED)

      (SERVICE_NAME = ora10g)

    )

  )

[oracle@dba admin]$ grep -A 7 'ORnn' tnsnames.ora

[oracle@dba admin]$

SQL> alter system set local_listener='ORnn';

alter system set local_listener='ORnn'

*

ERROR at line 1:

ORA-02097: parameter cannot be modified because specified value is invalid

ORA-00119: invalid specification for system parameter LOCAL_LISTENER

ORA-00132: syntax error or unresolved network name 'ORnn'

SQL>

共享伺服器

在專有模式的基礎上又增加了一個排程器(dispatcher)來管理使用者

請求連線不再直接和服務程式聯絡而是先被排程器放到請求列隊裡排隊

詳解Oracle的連線模式:專有模式和共享模式

1.使用者程式發起請求

2.排程器接收

3.放到請求佇列裡

4.服務程式從隊裡獲取使用者的請求

5.服務程式向例項請求使用者資料

6.將請求的資料反饋給使用者程式

銀行取錢排隊叫號的例子

共享伺服器的配置透過初始化引數dispatchers來配置

可以透過DBCA來修改很方便

排程器設定中不同協議走不同佇列

         排程器的數量 (好比發號機的數量)

         每個排程器的最大分配數量 (發號機能發出去的號的最大數)

         最大的session

排程器引數

*.dispatchers='(protocol=TCP)(disp=2)(con=200)(sess=789)'

*.max_dispatchers=5

*.max_shared_servers=4

*.shared_servers=2

SQL> show parameter dispatchers

NAME                                        TYPE       VALUE

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

dispatchers                              string     (PROTOCOL=TCP) (SERVICE=ora10g

                                                         XDB)

max_dispatchers                   integer

SQL>

SQL> show parameter shared_server

NAME                                        TYPE       VALUE

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

max_shared_servers                     integer

shared_server_sessions               integer

shared_servers                                integer   1

SQL>

SQL> show parameter dispa

NAME                                        TYPE       VALUE

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

dispatchers                              string     (protocol=TCP)(disp=2)(con=200)(sess=789)

max_dispatchers                   integer   5

SQL>

SQL> show parameter shared_server

NAME                                        TYPE       VALUE

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

max_shared_servers                     integer   3

shared_server_sessions               integer

shared_servers                                integer   2

SQL>

[oracle@dbabdump]$ lsnrctl service

....

服務 "ora10g" 包含 1 個例程。

例程 "ora10g", 狀態 READY, 包含此服務的 3 個處理程式...

處理程式:

      "DEDICATED" 已建立:0 已拒絕:0 狀態:ready

         LOCAL SERVER

      "D001" 已建立:0 已被拒絕:0 當前: 0 最大: 200 狀態: ready

         DISPATCHER <machine: dba.up.com, pid: 3541>

         (ADDRESS=(PROTOCOL=tcp)(HOST=dba.up.com)(PORT=54306))

      "D000" 已建立:0 已被拒絕:0 當前: 0 最大: 200 狀態: ready

         DISPATCHER <machine: dba.up.com, pid: 3539>

         (ADDRESS=(PROTOCOL=tcp)(HOST=dba.up.com)(PORT=26395))

....

告警日誌中啟動資訊

Mon Apr  4 00:32:12 2011

starting up 2 dispatcher(s) for network address '(ADDRESS=(PARTIAL=YES)(PROTOCOL=TCP))'...

starting up 2 shared server(s) ...

Mon Apr  4 00:32:12 2011

ALTER DATABASE   MOUNT

專有模式和共享模式是可以相容在一起使用的

此時看使用者如何選擇

tnsname.ora

ORA10G =

  (DESCRIPTION =

    (ADDRESS = (PROTOCOL = TCP)(HOST = dba.up.com)(PORT = 1521))

    (CONNECT_DATA =

      (SERVER = DEDICATED) # 不寫這個值就是按伺服器的模式來匹配

                               # shared 指定使用共享方式連線

                               # DEDICATED 指定使用專有模式連線

      (SERVICE_NAME = raw10g)

    )

  )

測試三種模式

ORA10G_noset =

  (DESCRIPTION =

    (ADDRESS = (PROTOCOL = TCP)(HOST = dba.up.com)(PORT = 1521))

    (CONNECT_DATA =

      (SERVICE_NAME = ora10g)

    )

  )

ORA10G_ded =

  (DESCRIPTION =

    (ADDRESS = (PROTOCOL = TCP)(HOST = dba.up.com)(PORT = 1521))

    (CONNECT_DATA =

      (SERVER = DEDICATED)

      (SERVICE_NAME = ora10g)

    )

  )

ORA10G_shd =

  (DESCRIPTION =

    (ADDRESS = (PROTOCOL = TCP)(HOST = dba.up.com)(PORT = 1521))

    (CONNECT_DATA =

      (SERVER = SHARED)

      (SERVICE_NAME = ora10g)

    )

  )

SQL> select USERNAME,SID,SERVICE_NAME,SERVER,PROGRAM from v$session where USERNAME='SYS';

USERNAME         SID SERVICE_NA SERVER    PROGRAM

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

SYS               136 SYS$USERS  DEDICATED OMS

SYS               137 ora10g           SHARED    sqlplus@dba.up.com (TNS V1-V3)

SYS               144 ora10g           SHARED    sqlplus@dba.up.com (TNS V1-V3)

SYS               145 ora10g           DEDICATED sqlplus@dba.up.com (TNS V1-V3)

SYS               159 SYS$USERS  DEDICATED sqlplus@dba.up.com (TNS V1-V3)

SQL> select USERNAME,SID,SERVICE_NAME,SERVER,PROGRAM from v$session where USERNAME='SCOTT';

USERNAME         SID SERVICE_NA SERVER    PROGRAM

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

SCOTT                   133 ora10g           NONE       sqlplus@dba.up.com (TNS V1-V3)

SCOTT                   146 ora10g           DEDICATED sqlplus@dba.up.com (TNS V1-V3)

SCOTT                   153 ora10g           NONE       sqlplus@dba.up.com (TNS V1-V3)

SQL>普通使用者並不能顯示

限制IP訪問

限制IP訪問:SQLNET.ora

tcp.validnode_checking=yes

tcp.invited_nodes=(ip1,ip2......)  # 被邀請IP

tcp.excluded_nodes=(ip1,ip2......) # 被限制IP

重新啟動監聽器設定才生效

想要動態註冊自己的IP必須在被邀請的列表裡






來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25116248/viewspace-2122141/,如需轉載,請註明出處,否則將追究法律責任。

相關文章