近来在工作遇到一些MTS问题,而且搜索网上发现提出此问题的朋友也不在少数。
所以根据网上现有的资料,所做的试验,metalink上的一些说明,我写了这个TIP,不足之处,望大家指证:
************************************************************
几个与MTS有关的动态视图
************************************************************
SELECT * FROM V$CIRCUIT;
SELECT * FROM V$DISPATCHER;
SELECT * FROM V$DISPATCHER_RATE;
SELECT * FROM V$QUEUE;
SELECT * FROM V$MTS;
SELECT * FROM V$SHARED_SERVER;
************************************************************
几个与MTS有关的Init参数
************************************************************
mts_dispatchers:指定dispathers的初始个数,监听地址,监听协议(需要显式设定)
mts_servers : 指定共享服务进程的实始个数,Oracle会在实际的使用过程中,动态调整个数(需要显式设定)
mts_max_dispatchers:最大的dispathers个数(有默认值)
mts_max_servers :最大的Servers个数(有默认值)
mts_service:dispathers监听的服务,等同于ORACLE SID(有默认值)
其中(1服务进程对应10个联接;1调度进程对应1000个联接)
典形设定:
MTS_DISPATCHERS="(ADDRESS=(PROTOCOL=TCP)(HOST=10.0.0.9))(DISPATCHERS=1)"
mts_servers = 50
************************************************************************
如何判断数据库是否配制为MTS方式,或client是以shared server方式联接DB
************************************************************************
1,查询上面几个动态视图
2,查询v$session,如果某个session在active状态下,其server字段一定要为shared
3, 在UNIX下查看当前ORACLE进程:$ps -fu oracle , 显示应包括:
后台进程-------ora_smon_SID,ora_dbwr_SID,ora_arcN_SID,ora_lgwr_SID,ora_ckpt_SID,ora_pmon_SID,ora_reco_SID
调度进程-------ora_dNNN_SID(个数根据mts_dispatcher参数决定)
共享服务进程---ora_Snnn_SID(个数根据mts_servers参数决定)
监听进程-------/export/home/u01/app/oracle/product/8.1.5/bin/tnslsnr LISTENER -inherit
部分通过delicated server方式联接上的进程(可选)oracleSID (DESCRIPTION=(LOCAL=no)(ADDRESS=(PROTOCOL=BEQ)))
4,查看lsnrctl状态,lsnrctl>service
PLSExtProc has 1 service handler(s)
DEDICATED SERVER established:0 refused:0
LOCAL SERVER
SID has 3 service handler(s)
DEDICATED SERVER established:2 refused:0
LOCAL SERVER
DISPATCHER established:76 refused:0 current:4 max:254 state:ready
D000
(ADDRESS=(PROTOCOL=tcp)(HOST=10.6.17.50)(PORT=57345))
DISPATCHER established:94 refused:0 current:3 max:254 state:ready
D001
(ADDRESS=(PROTOCOL=tcp)(HOST=10.6.17.50)(PORT=57346))
********************************************************************
在数据库配置为MTS,我如何通过delicated server方式联接上数据库
********************************************************************
在TNSNAME连接串中加上
(SERVER = DEDICATED)
如:
kkk.CNIBS.COM =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(PORT = 1521)(HOST = 10.6.17.50))
)
(CONNECT_DATA =
(SERVICE_NAME = kkk)
(SERVER = DEDICATED)
)
)
或在SQLNET.ora中加上:
user_dedicated_server=ON
****************************************************************************************************
问题一,因MTS_dispatcher参数设置错误,而引发的"ORA-12545 連接失敗是因為目標主機或物件不存在 "错误"
****************************************************************************************************
问题描述:
我的服務器安裝的是 red hat linux 6.2 + oracle8.1.6 ,
客戶端是 win2000 + PB6.5
我想將ORACLE配置為MTS(多線程服務器)﹐所以我在INITSID.ORA 中加入底下幾行要開啟MTS
mts_dispatchers = "(protocol=TCP) (DISP=1) (mul=OFF) (pool=OFF)"
mts_servers = 1
mts_max_servers = 20
重新啟動 ORACLE 以及TNS 後( 啟動都正常)
在LINUX 主機內 RUN SQLPLUS 都無誤
但是以PB 連或用TOOL TNS連線都會出現 ORA-12545 連接失敗是因為目標主機或物件不存在 。
但TNS 剛啟動時只有一條連線﹐此時PB能使用 . 經過約10秒後再啟動另一條線就會有錯誤 ora-12545 。
不知是我在 initsid.ora 中配置有誤還是另有其他設置﹐請各位大俠幫幫小弟看看是怎么回事 。 謝謝!!
问题解决办法:
1,分析client如何联接server的:
Delicated server联接方式:
客户端根据tnsname中的(主机名/IP地址,端口,服务名),把联接请求发送到LISTENER,如果数据库末配置成mts,或配置成mts但(SERVER = DEDICATED) 联接,则LISTENER分配/创建一个Deliacted server,将客户绑定在此Deliacted server上与db server进行通讯。
注意:Delicated server联接方式,只需一次connection
shared server联接方式:
客户端根据tnsname中的联接串,把联接请求发送到LISTENER,如果数据库配置成mts,则LISNTER根据一定规则选择合适的dispatcher,将dispatcher的信息(主机名,端口)组成一个包返发给客户端,让客户端关闭与LISNTER的联接,根据包的内容联接到对应的Dispather上去。
注意:shared server联接方式,需要二次connection;返回的包中,,一定会是dispatcher所在机器的主机名而不是IP地址
2,分析问题一
问题是由于init参数mts_dispatcher中的服务器标识为hostname,而此客户端无法解析此hostname
1)在LISTENER刚启动的时候,数据库还末向LISTENER注册其SERVICE,相当于这时数据库末运行在MTS上(因为找到对应服务的dispatcher),所以你的联接相当于Delicated server联接方式。当你的tnsname中服务器地址为IP地址时,联接成功。
2)等一段时间过后,数据库向LISTENER注册其SERVICE,如果客户端发出联接请求,LISNTER会以shared server方式处理联接。这样,返回一个一个包给客户端,并断开LISNTER与客户端的联接。客户端根据这个包中的Dispather的地址去接联目标dispatcher。由于你的INIT中的MTS_DISPATCHERS参数没有加上IP地址,所以,DISPATCHERS地址中包含是你的主机全名,如:(ADDRESS=(PROTOCOL=tcp)(HOST=rtcsol1.us.oracle.com)(PORT=59034))
而你的客户端由于没有配置DNS(即无法解析rtcsol1.us.oracle.com),所以会报出ORA-12545 错误。
3,如何解决,有几下几种:
1)在你的客户端的HOST文件中注册服务器的IP地址与带域名的机器名全称,使客户端能够ping 通rtcsol1.us.oracle.com
2)改shared server联接方式为Delicated server方式,在TNSNAME联接串中加上 (SERVER = DEDICATED)
收于JDBC THIN方式不使用TNSNAME联接串,则
将你的联接程序由:
"jdbc
racle:thin:@host
ort:sid"
改成:
"jdbc
racle:thin:@(DESCRIPTION=" +
"(ADDRESS_LIST=" +
"(ADDRESS=(PROTOCOL=TCP)" +
"(HOST=host)" +
"(PORT=port)" +
"
" +
"
" +
"(CONNECT_DATA=" +
"(SERVICE_NAME=sid)" +
"(SERVER=DEDICATED)" +
"
" +
"
"
3)将MTS_DISPATCHERS参数中加上HOST=IP地址。使Listener返回的DISPATCHERS地址包中不再使用计算名而改用IP地址。
4)在INIT中使用LOCAL_LISTENER参数,如
LOCAL_LISTENER=(ADDRESS=(PROTOCOL=TCP)(HOST=xxx.xxx.xxx.xxx)(PORT=xxxx))