閱讀500 返回首頁    go 阿裏雲 go 技術社區[雲棲]


oracle網絡配置

當客戶端通過網絡以"connect 用戶名/密碼@連接字符串"的形式連接oracle數據庫時,需要監聽程序的協助,當連接建立後,即使監聽程序掛掉也不會影響已經建立好的連接。


用戶連接oracle數據庫服務器主要有兩種方式:專有服務器連接和共享服務器連接

  • 在專用服務器模式中,對於每個運行數據庫應用程序的用戶進程都由執行Oracle 數據庫服務器代碼的專用服務器進程提供服務。

每個服務器進程都有自己專用的PGA,這個PGA 在服務器進程啟動時創建,對PGA 的訪問權限僅限於該服務器進程,並且隻能由代表該服務器進程的Oracle 代碼對PGA 進行讀寫。

  • 在共享服務器模式中,不必為每個連接都提供一個專用服務器進程。分派程序將多個傳入網絡會話請求引到共享服務器進程池。共享服務器進程為所有客戶機請求提供服務。

多個客戶端用戶共享服務器進程,且UGA被轉移到SGA(如果配置了共享池或者大型池),PGA將隻剩下棧空間。


配置和管理Oracle Net 的工具主要有dbconsole、netca、netmgr、和命令行工具(vi)


Oracle Net支持多種連接解析方式:

  • Easy Connect(EZCONNECT)

   使用簡便連接時,可提供Oracle Net 連接所需的所有信息作為連接字符串的一部分。簡便連接的連接字符串采用以下形式:

   username/password@hostname[:port][/service_name]

   監聽程序端口和服務名為可選項。如果未提供監聽程序端口,Oracle Net 假定使用的是默認端口1521。如果未提供服務名,Oracle Net 假定連接字符串中提供的數據庫服務名與主機名是相同的。

   SQL> conn hr/hr@192.168.0.90:1521/orcl.example.com

  • 本地命名(TNSNAMES)

   使用本地命名時,用戶可提供Oracle Net 服務的別名。Oracle Net 會根據本地已知服務的列表來檢查別名,如果發現匹配名稱,會將別名轉換為主機、協議、端口和服務名。

   本地命名的一個優勢是,數據庫用戶僅需要記住簡便連接所需的短別名,而不必記住很長的連接字符串。

   如果組織的Oracle Net 服務配置不經常更改,則適合使用本地命名。

   SQL> conn hr/hr@orcl

  • 目錄命名和外部命名


Oracle 網絡相關的文件位於$TNS_ADMIN目錄下,其中主要有sqlnet.ora、listener.ora、tnsnames.ora三個文件

sqlnet.ora    :位於數據庫服務器上,用於定義連接解析方式(默認連接方式為TNSNAMES, EZCONNECT)

listener.ora  :位於數據庫服務器上,用於監聽器的配置文件

tnsname.ora   :位於客戶機上,包含網絡服務器名,並映射到連接字符串

默認可能不存在sqlnet.ora、listener.ora兩個文件,但監聽程序仍然可以以默認方式啟動。此時,Oracle將自動在解析地址為計算機主機名,端口為1521的地址上啟動一個名為"LISTENER"的監聽器。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
cat sqlnet.ora
NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)
ADR_BASE = /u01/app/oracle
cat listener.ora
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = ora11g.example.com)(PORT = 1521))
    )
  )
ADR_BASE_LISTENER = /u01/app/oracle
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER=ON              # line added by Agent
cat tnsnames.ora
ORCL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.90)(PORT = 1521))
    (CONNECT_DATA =
      (SERVICE_NAME = orcl.example.com)
    )
  )
$ lsnrctl service
LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 11-SEP-2013 22:11:58
Copyright (c) 1991, 2009, Oracle.  All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=ora11g.example.com)(PORT=1521)))
Services Summary...
Service "+ASM" has 1 instance(s).
  Instance "+ASM", status READY, has 1 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0 state:ready
         LOCAL SERVER
Service "orcl.example.com" has 1 instance(s).
  Instance "orcl", status READY, has 1 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0 state:ready
         LOCAL SERVER
Service "orclXDB.example.com" has 1 instance(s).
  Instance "orcl", status READY, has 1 handler(s) for this service...
    Handler(s):
      "D000" established:0 refused:0 current:0 max:972 state:ready
         DISPATCHER <machine: ora11g.example.com, pid: 5008>
         (ADDRESS=(PROTOCOL=tcp)(HOST=ora11g.example.com)(PORT=56668))
The command completed successfully


向數據庫注冊實例的方法分為靜態注冊和動態注冊。

注冊就是將數據庫作為一個服務注冊到監聽程序。客戶端不需要知道數據庫名和實例名,隻需要知道該數據庫對外提供的服務名就可以申請連接到數據庫。

在數據庫服務器啟動過程中,數據庫服務器會向監聽程序注冊相應的服務(無論何時啟動一個數據庫,默認地都有兩條信息注冊到監聽器中:數據庫服務器對應的實例名和服務名)

  • 靜態注冊就是實例啟動時讀取listener.ora文件的配置,將實例和服務注冊到監聽程序。無論何時啟動一個數據庫,默認地都有兩條信息注冊到監聽器中:數據庫服務器對應的實例和服務。

   靜態注冊時,listener.ora中的GLOBAL_DBNAME向外提供服務名,listener.ora中的SID_NAME提供注冊的實例名。

  • 動態注冊是在instance啟動的時候PMON進程根據init.ora中的instance_name,service_names兩個參數將實例和服務動態注冊到listener中。

   注冊到監聽器中的實例名從參數文件中的instance_name參數取得。如果該參數沒有設定值,那麼它將取參數文件中的db_name的值。

   注冊到監聽器中的服務名從參數文件中的參數service_names取得。如果該參數沒有設定值,數據庫將拚接參數文件中的 db_name和db_domain的值來注冊自己。

   由於動態注冊需要pmon進程,所以監聽必須在數據庫啟動之前啟動,否則動態注冊將失敗;在數據庫運行的過程中,如果重啟監聽也會造成動態注冊失敗。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
SQL> show parameter _listener
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
local_listener                       string                             //默認為空值,則找默認的監聽器LISTENER
remote_listener                      string                             //RAC中指定對端結點的監聽器
SQL> show parameter service_names
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
service_names                        string      orcl.example.com
$ cat listener.ora
# listener.ora Network Configuration File: /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora
# Generated by Oracle configuration tools.
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = ora11g.example.com)(PORT = 1521))
    )
  )
ADR_BASE_LISTENER = /u01/app/oracle
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER = ON


添加多個監聽器:

  • 動態注冊

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
vi $TNS_ADMIN/listener.ora                                            //添加監聽器"LISTENER1"的配置信息
LISTENER1 =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.90)(PORT = 1522))
    )
vi $TNS_ADMIN/tnsnames.ora                                            //添加連接到監聽器"LISTENER1"的連接字符串
APPLE =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.90)(PORT = 1522))
  )
SQL> alter system set local_listener='listener1';
alter system set local_listener='listener1'
*
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 'listener1'
SQL> alter system set local_listener='apple';                                    //修改默認監聽程序(必須使用監聽程序對應的連接字符串)
System altered.
$ lsnrctl start listener1                                               //啟動監聽程序"LISTENER1"
---------------省略輸出---------------
STATUS of the LISTENER
------------------------
Alias                     listener1
Version                   TNSLSNR for Linux: Version 11.2.0.1.0 - Production
Start Date                11-SEP-2013 14:18:13
Uptime                    0 days 0 hr. 0 min. 1 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /u01/app/oracle/product/11.2.0/dbhome_1//network/admin/listener.ora
Listener Log File         /u01/app/oracle/diag/tnslsnr/ora11g/listener1/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.0.90)(PORT=1522)))
The listener supports no services
The command completed successfully
$ lsnrctl status listener1                                              //查看"LISTENER1"監聽程序的狀態(動態注冊一般會有幾秒鍾的延遲)
---------------省略輸出---------------
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.0.90)(PORT=1522)))
Services Summary...
Service "orcl.example.com" has 1 instance(s).
  Instance "orcl", status READY, has 1 handler(s) for this service...
Service "orclXDB.example.com" has 1 instance(s).
  Instance "orcl", status READY, has 1 handler(s) for this service...
The command completed successfully
$ lsnrctl status                                                    //查看"LISTENER"監聽程序的狀態("LISTENER"監聽程序可省略指定)
---------------省略輸出---------------
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=ora11g.example.com)(PORT=1521)))
Services Summary...
Service "+ASM" has 1 instance(s).
  Instance "+ASM", status READY, has 1 handler(s) for this service...
The command completed successfully
$ sqlplus /nolog                
SQL> conn hr/hr@apple                                                //通過"LISTENER"監聽程序連接
Connected.
  • 靜態注冊

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
vi $TNS_ADMIN/listener.ora
LISTENER2 =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.90)(PORT = 1523))
    )
  )
SID_LIST_LISTENER2 =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = orcl.example.com)
      (ORACLE_HOME = /u01/app/oracle/product/11.2.0/dbhome_1/)
      (SID_NAME = orcl)
    )
  )
$ lsnrctl start listener2
---------------省略輸出---------------
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.0.90)(PORT=1523)))
Services Summary...
Service "orcl.example.com" has 1 instance(s).
  Instance "orcl", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully

使用靜態注冊還可以在遠程開啟數據庫實例,而動態注冊由於數據庫實例未啟動無法注冊,所以在數據庫開啟之前無法通過動態注冊監聽程序連接到數據庫

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$ sqlplus /nolog
SQL*Plus: Release 11.2.0.1.0 Production on Wed Sep 11 16:30:14 2013
Copyright (c) 1982, 2009, Oracle.  All rights reserved.
SQL> conn / as sysdba
Connected.
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> conn sys/oracle_4U@apple as sysdba                              //無法連接通過動態注冊的監聽
ERROR:
ORA-12514: TNS:listener does not currently know of service requested in connect
descriptor
SQL> conn sys/oracle_4U@apear as sysdba                              //成功連接靜態注冊的監聽,可實現遠程開啟數據庫
Connected to an idle instance.
SQL> startup
ORACLE instance started.
Total System Global Area  459304960 bytes
Fixed Size                  2214336 bytes
Variable Size             289408576 bytes
Database Buffers          159383552 bytes
Redo Buffers                8298496 bytes
Database mounted.
Database opened.

配置連接時客戶端故障轉移和負載均衡Failover和LoadBalance

可通過dbconsole進行配置,也可以直接修改tnsnames.ora文件

1
2
3
4
5
6
7
8
9
10
11
12
13
grep -A 11 ORCL tnsnames.ora
ORCL =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.90)(PORT = 1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.90)(PORT = 1522))
      (LOAD_BALANCE = yes)
    )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl.example.com)
    )
  )

其中隻有第二項“隨機嚐試每個地址,直到有一個地址成功”才同時達到故障轉移和負載均衡的作用。


第一項:隻有故障轉移的作用

ORCL =

 (DESCRIPTION =

   (ADDRESS_LIST =

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

     (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.90)(PORT = 1523))

   )

   (CONNECT_DATA =

     (SERVER = DEDICATED)

     (SERVICE_NAME = orcl.example.com)

   )

 )

第三項:隻有負載均衡的作用

ORCL =

 (DESCRIPTION =

   (ADDRESS_LIST =

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

     (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.90)(PORT = 1523))

     (LOAD_BALANCE = yes)

     (FAILOVER = false)

   )

   (CONNECT_DATA =

     (SERVER = DEDICATED)

     (SERVICE_NAME = orcl.example.com)

   )

 )

第四項:隻有源路由的作用

ORCL =

 (DESCRIPTION =

   (ADDRESS_LIST =

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

     (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.90)(PORT = 1523))

     (SOURCE_ROUTE = yes)

     (FAILOVER = false)

   )

   (CONNECT_DATA =

     (SERVER = DEDICATED)

     (SERVICE_NAME = orcl.example.com)

   )

 )

第五項:隻使用第一個地址

ORCL =

 (DESCRIPTION =

   (ADDRESS_LIST =

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

     (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.90)(PORT = 1523))

     (FAILOVER = false)

   )

   (CONNECT_DATA =

     (SERVER = DEDICATED)

     (SERVICE_NAME = orcl.example.com)

   )

 )



添加監聽程序到OHASD:

注:使用srvctl添加監聽器組件時,需先關閉欲添加的監聽器,否則會報錯

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
$ . oraenv
ORACLE_SID = [orcl] ? +ASM
The Oracle base for ORACLE_HOME=/u01/app/oracle/product/11.2.0/grid is /u01/app/oracle
$ lsnrctl stop listener1
$ lsnrctl stop listener2
$ srvctl add listener -h
Adds a listener configuration to be managed by Oracle Restart.
Usage: srvctl add listener [-l <lsnr_name>] [-s] [-p "[TCP:]<port>[, ...][/IPC:<key>][/NMP:<pipe_name>][/TCPS:<s_port>] [/SDP:<port>]"] [-o <oracle_home>]
    -l <lsnr_name>           Listener name (default name is LISTENER)
    -o <oracle_home>         ORACLE_HOME path (default value is CRS_HOME)
    -s                       Skip the checking of ports
    -p "[TCP:]<port>[, ...][/IPC:<key>][/NMP:<pipe_name>][/TCPS:<s_port>] [/SDP:<port>]"      Comma separated tcp ports or listener endpoints
    -h                       Print usage
$ srvctl add listener -l listener1 -p 1522 -o /u01/app/oracle/product/11.2.0/dbhome_1/
$ srvctl add listener -l listener2 -p 1523 -o /u01/app/oracle/product/11.2.0/dbhome_1/
$ srvctl start listener -l listener1
$ srvctl start listener -l listener2
$ crs_stat -t
Name           Type           Target    State     Host  
------------------------------------------------------------
ora.DATA.dg    ora....up.type ONLINE    ONLINE    ora11g
ora.FRA.dg     ora....up.type ONLINE    ONLINE    ora11g
ora....ER.lsnr ora....er.type ONLINE    ONLINE    ora11g
ora....R1.lsnr ora....er.type ONLINE    ONLINE    ora11g
ora....R2.lsnr ora....er.type ONLINE    ONLINE    ora11g
ora.asm        ora.asm.type   ONLINE    ONLINE    ora11g
ora.cssd       ora.cssd.type  ONLINE    ONLINE    ora11g
ora.diskmon    ora....on.type ONLINE    ONLINE    ora11g
ora.orcl.db    ora....se.type ONLINE    ONLINE    ora11g

最後更新:2017-04-03 15:21:46

  上一篇:go C語言鏈表在筆試麵試中常考問題總結
  下一篇:go 一致性hash算法的好文