該文是我連接oracle的總結
特別適合於程序開發人員與oracle菜鳥
如何配置才能使客戶端連到數據庫
要使一個客戶端機器能連接oracle數據庫
需要在客戶端機器上安裝oracle的客戶端軟件
唯一的例外就是java連接數據庫的時候
可以用jdbc thin模式
不用裝oracle的客戶端軟件
加入你在機器上裝了oracle數據庫
就不需要在單獨在該機器上安裝oracle客戶端了
因為裝oracle數據庫的時候會自動安裝oracle客戶端
用過sql server數據庫然後又用oracle的新手可能會有這樣的疑問
問什麼我用sql server的時候不用裝sql server的客戶端呢?原因很簡單
sql server也是microsoft的
它在操作系統中集成了sql server客戶端
如果microsoft與oracle有協議
將oracle客戶端也集成到操作系統中
那我們也就不用在客戶端機器裝oracle客戶端軟機就可訪問數據庫了
不過
這好像是不可能實現的事情
也有的人會問
為什麼在sql server中沒有偵聽端口一說
而在oracle中要配置偵聽端口?其實sql server中也有偵聽端口
只不過microsoft將偵聽端口固定為
不允許你隨便改動
這樣給你一個錯覺感覺sql server中沒有偵聽端口
咳
microsoft把太多的東西都封裝到黑盒子裡
方便使用的同時也帶來的需要副作用
而oracle中的偵聽端口直接在配置文件中
允許隨便改動
只不過無論怎樣改動
要與oracle服務器端設置的偵聽端口一致
好
言歸正傳
我們如何做才能使客戶端機器連接到oracle數據庫呢?
A. 安裝相關軟件
B. 進行適當的配置
A.在適當的位置安裝適當的軟件
在客戶端機器
.在客戶端機器上安裝ORACLE的Oracle Net通訊軟件
它包含在oracle的客戶端軟件中
.正確配置了sqlnet
ora文件
NAMES
DIRECTORY_PATH = (TNSNAMES
…
)
NAMES
DEFAULT_DOMAIN=DB_DOMAIN
一般情況下我們不用NAMES
DEFAULT_DOMAIN參數
如果想不用該參數用#注釋掉或將該參數刪除即可
對於NAMES
DIRECTORY_PATH參數采用缺省值即可
對於NAMES
DEFAULT_DOMAIN參數有時需要注釋掉
在下面有詳細解釋
.正確配置了tnsname
ora文件
在服務器端機器
.保證listener已經啟動
.保證數據庫已經啟動
如果數據庫沒有啟動
用
Oracle
i:
dos>sqlplus
/ as sysdba
sqlplus> startup
Oracle
i:
dos>svrmgrl
svrmgrl>connect internal
svrmgrl>startup
命令啟動數據庫
如果listener沒有啟動
用
lsnrctl start [listener name]
lsnrctl status [listener name]
命令啟動listener
B.進行適當的配置
如何正確配置tnsname
ora文件
可以在客戶端機器上使用oracle Net Configuration Assistant或oracle Net Manager圖形配置工具對客戶端進行配置
該配置工具實際上修改tnsnames
ora文件
所以我們可以直接修改tnsnames
ora文件
下面以直接修改tnsnames
ora文件為例
該文件的位置為
…\network\admin\tnsnames
ora (for windows)
…/network/admin/tnsnames
ora (for unix)
此處
假設服務器名為testserver
服務名為
使用的偵聽端口為
則tnsnams
ora文件中的一個test網絡服務名(數據庫別名)為
test =
(DESCRIPTION=
(ADDRESS_LIST=
(ADDRESS=(PROTOCOL=TCP)(HOST=testserver)(PORT=
))
)
(CONNECT_DATA=(SERVICE_NAME=)
)
)
紅色的內容為需要根據實際情況修改的內容
現解釋如下
PROTOCOL
客戶端與服務器端通訊的協議
一般為TCP
該內容一般不用改
HOST
數據庫偵聽所在的機器的機器名或IP地址
數據庫偵聽一般與數據庫在同一個機器上
所以當我說數據庫偵聽所在的機器一般也是指數據庫所在的機器
在UNIX或WINDOWS下
可以通過在數據庫偵聽所在的機器的命令提示符下使用hostname命令得到機器名
或通過ipconfig(for WINDOWS) or ifconfig(for UNIX)命令得到IP地址
需要注意的是
不管用機器名或IP地址
在客戶端一定要用ping命令ping通數據庫偵聽所在的機器的機器名
否則需要在hosts文件中加入數據庫偵聽所在的機器的機器名的解析
PORT
數據庫偵聽正在偵聽的端口
可以察看服務器端的listener
ora文件或在數據庫偵聽所在的機器的命令提示符下通過lnsrctl status [listener name]命令察看
此處Port的值一定要與數據庫偵聽正在偵聽的端口一樣
SERVICE_NAME
在服務器端
用system用戶登陸後
sqlplus> show parameter service_name命令察看
如何利用配置的網絡服務名連接到數據庫
用sqlplus程序通過test網絡服務名進行測試
如sqlplus system/manager@test
如果不能連接到數據庫
則在tnsname
ora文件中的test網絡服務名(net service)後面加上Oracle數據庫的DB_Domain參數值
通過用sqlplus> show parameter db_domain命令察看
此處db_domain參數值為
將其加到網絡服務名後面
修改後的tnsname
ora中關於該網絡服務名的內容為
=
(DESCRIPTION=
(ADDRESS_LIST=
(ADDRESS=(PROTOCOL=TCP)(HOST=testserver)(PORT=
))
)
(CONNECT_DATA=(SERVICE_NAME=)
)
)
用sqlplus程序通過網絡服務名測試
如sqlplus system/manager
關於為什們在網絡服務名後面加db_domain參數
需要了解sql*plus連接數據庫的原理
我在後面解決
常見故障中給出了詳細的說明
如果上面的招數還不奏效的話
只好用一下乾坤大挪移了
將客戶端的網絡服務名部分
=
(DESCRIPTION=
(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=testserver)(PORT=
))
)
(CONNECT_DATA=(SERVICE_NAME=)
)
)
拷貝到服務器的tnsnames
ora文件中
然後再服務器端用sqlplus system/manager連接到數據庫
如果能連接成功
說明你的客戶端與服務器端的網絡有問題
如果連接不成功
用前面的部分檢查網絡服務名部分部分是否正確
如果確信網絡服務名部分正確而且所有的客戶端都連不上數據庫則可能為系統TCP/IP或Oracle系統有問題
建議重新安裝數據庫
常見故障解決辦法
TNS
(ORA
)
TNS:could not resolve service name
該錯誤表示用於連接的網絡服務名在tnsnames
ora文件中不存在
如上面的tnsnames
ora中的網絡服務名只有test
假如用戶在連接時用sqlplus system/manager@test
則就會給出TNS
錯誤
要注意的是
有時即使在tnsnames
ora文件中有相應的網絡服務名
可是用該網絡服務名連接時還會出錯
出現這種情況的典型配置如下(在客戶端的機器上)
sqlnet
ora文件
NAMES
DIRECTORY_PATH = (TNSNAMES
…
)
NAMES
DEFAULT_DOMAIN =
tnsnames
ora文件:
test =
(DESCRIPTION=
(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=testserver)(PORT=
))
)
(CONNECT_DATA=(SERVICE_NAME=)
)
)
sql*plus運行基本機理
在用戶輸入sqlplus system/manager@test後
sqlplus程序會自動到sqlnet
ora文件中找NAMES
DEFAULT_DOMAIN參數
假如該參數存在
則將該參數中的值取出
加到網絡服務名的後面
即此例中你的輸入由sqlplus system/manager@test自動變為sqlplus system/man
然後再到tnsnames
ora文件中找網絡服務名
這當然找不到了
因為該文件中只有test網絡服務名
所以報錯
解決的辦法就是將sqlnet
ora文件中的NAMES
DEFAULT_DOMAIN參數注釋掉即可
如#NAMES
DEFAULT_DOMAIN =
假如NAMES
DEFAULT_DOMAIN參數不存在
則sqlplus程序會直接到tnsnames
ora文件中找test網絡服務名
然後取出其中的host
port
tcp
service_name
利用這些信息將連接請求發送到正確的數據庫服務器上
另外原則上tnsnames
ora中的配置不區分大小寫
但是我的確遇到區分大小寫的情況
所以最好將使用的網絡服務與tnsnames
ora中配置的完全一樣
ORA
: TNS:listener could not resolve SERVICE_NAME given in connect Descriptor
該錯誤表示能在tnsnames
ora中找到網絡服務名
但是在tnsnames
ora中指定的SERVICE_NAME與服務器端的SERVICE_NAME不一致
解決的辦法是修改tnsnames
ora中的SERVICE_NAME
易混淆術語介紹
Db_name
對一個數據庫(Oracle database)的唯一標識
該數據庫為第一章講到的Oracle database
這種表示對於單個數據庫是足夠的
但是隨著由多個數據庫構成的分布式數據庫的普及
這種命令數據庫的方法給數據庫的管理造成一定的負擔
因為各個數據庫的名字可能一樣
造成管理上的混亂
為了解決這種情況
引入了Db_domain參數
這樣在數據庫的標識是由Db_name和Db_domain兩個參數共同決定的
避免了因為數據庫重名而造成管理上的混亂
這類似於互連網上的機器名的管理
我們將Db_name和Db_domain兩個參數用
連接起來
表示一個數據庫
並將該數據庫的名稱稱為Global_name
即它擴展了Db_name
Db_name參數只能由字母
數字
_
#
$
組成
而且最多
個字符
Db_domain
定義一個數據庫所在的域
該域的命名同互聯網的
域
沒有任何關系
只是數據庫管理員為了更好的管理分布式數據庫而根據實際情況決定的
當然為了管理方便
可以將其等於互聯網的域
Global_name
對一個數據庫(Oracle database)的唯一標識
oracle建議用此種方法命令數據庫
該值是在創建數據庫是決定的
缺省值為Db_name
Db_domain
在以後對參數文件中Db_name與Db_domain參數的任何修改不影響Global_name的值
如果要修改Global_name
只能用ALTER DATABASE RENAME GLOBAL_NAME TO <db_name
db_domain>命令進行修改
然後修改相應參數
Service_name
該參數是oracle
i新引進的
在
i以前
我們用SID來表示標識數據庫的一個實例
但是在Oracle的並行環境中
一個數據庫對應多個實例
這樣就需要多個網絡服務名
設置繁瑣
為了方便並行環境中的設置
引進了Service_name參數
該參數對應一個數據庫
而不是一個實例
而且該參數有許多其它的好處
該參數的缺省值為Db_name
Db_domain
即等於Global_name
一個數據庫可以對應多個Service_name
以便實現更靈活的配置
該參數與SID沒有直接關系
即不必Service name 必須與SID一樣
Net service name
網絡服務名
又可以稱為數據庫別名(database alias)
是客戶端程序訪問數據庫時所需要
屏蔽了客戶端如何連接到服務器端的細節
實現了數據庫的位置透明的特性
Trackback: x?PostId=
From:http://tw.wingwit.com/Article/program/Oracle/201311/17463.html