中國(guó)最大的web開(kāi)發(fā)資源網(wǎng)站及技術(shù)社區(qū),
在csdn上寫(xiě)了一篇關(guān)于mts的文章后收到了一些網(wǎng)友的mail或是留言,他們還有好多關(guān)乎于mts的一些問(wèn)題。與piner,fenng,biti及其它的一些網(wǎng)友在聊天中,他們都對(duì)使用mts有些不贊同,那天與oracle的工程師交流中他也是有些反對(duì),不過(guò)在我的實(shí)際應(yīng)用過(guò)程中雖遇到了一些問(wèn)題,但總體mts還是讓我很滿意的,使我的一臺(tái)oracle server在peak time的內(nèi)存利用率由95%降到了78%,而且應(yīng)用的速度還很不錯(cuò)。如下我便以問(wèn)題的形式對(duì)mts再進(jìn)行幾點(diǎn)補(bǔ)充。
1、在oracle server調(diào)整為mts方式后,一些客戶端出現(xiàn)了連不上oracle server的狀況,大部分報(bào)的錯(cuò)為tns-12509,如何解決?
回答:
在實(shí)際過(guò)程中是存在著這方面的情況,我總結(jié)了一下,大部是由oracle8 的client引起的,就是那些配服務(wù)名還得掛著個(gè).world的那種客戶端,其實(shí)解決起來(lái)很簡(jiǎn)單,只需要把tnsname.ora這個(gè)文件中你的那個(gè)服務(wù)名配置的"sid="改成"service_name=",這就ok了。
2、我使用了成都邁普公司的"隧道網(wǎng)關(guān)"這種產(chǎn)品,以前在dedicated方式是好好的,可是改成mts后,為什么client死活連不是oracle的server呢?
回答:
其實(shí)我們公司也用了這種產(chǎn)品,在mts應(yīng)用之初也遇到了這個(gè)問(wèn)題。出現(xiàn)這個(gè)問(wèn)題的原因?yàn)檫~普的這種產(chǎn)品只為監(jiān)測(cè)靜態(tài)的端返回,它認(rèn)為oracle的監(jiān)聽(tīng)端口即為返回端口,實(shí)際在mts中不是這樣的,多進(jìn)行幾次連接,用netstat -n在客戶端觀看一下就會(huì)明白,mts返回的端口是動(dòng)態(tài)的,所以邁普的這個(gè)產(chǎn)品就不好用了。解燃眉之急的辦法可以這樣:在mts客戶端配置"服務(wù)名"時(shí),請(qǐng)求個(gè)dedicate的連接,即使用server = dedicated選項(xiàng),這就把問(wèn)題解決了。
3、如何跟蹤一下mts的dispatcher和shared server進(jìn)程?
回答:
這需用到診斷事件了,dispatcher的診斷事件號(hào)為10248,shared server的為10249,如下以shared server為例簡(jiǎn)單說(shuō)一下,假定s015的操作系統(tǒng)的進(jìn)程號(hào)為13161.
sql>conn sys/pass as sysdba
sql>oradebug setospid 13161
sql>oradebug tracefile_name --看一下跟蹤文件的名稱
sql>oradebug event 10249 trace name context forever, level 10
也可以在init<sid>.ora中加入如下兩行完成trace:
event="10248 trace name context forever, level x" -- dispatchers
event="10249 trace name context forever, level x" -- shared servers
4、如何在mts中設(shè)置ipc
回答:
如下的配置樣例來(lái)自metalink
listener.ora:
=============
listener=
(address_list=
(address=
(protocol=ipc)
(key=<sid name>)
)
(address=
(protocol=ipc)
(key=<alias in tnsnames.ora for the sid>)
)
)
connect_timeout_listener=10
startup_wait_time_listener=0
sid_list_listener=
(sid_list=
(sid_desc=
(sid_name=<sid name>)
(oracle_home=<home directory path for oracle>)
)
)
地址列表中可以使用其它的協(xié)議,加入應(yīng)的地址。這個(gè)例子完全是一個(gè)ipc的例子
tnsnames.ora:
=============
<alias>=
(description=
(address=
(protocol=ipc)
(key=<sid name>)
)
(connect_data=
(sid=<sid name>)
)
)
init.ora entries for mts:
=========================
mts_dispatchers="ipc,2"
mts_servers=1
mts_max_dispatchers=6
mts_max_servers=3
mts_service=<sid name>
mts_listener_address="(address=(protocol=ipc)(key=<sid name>))"
5、如何查看一下某個(gè)shared_server正在忙什么?
回答:
其實(shí)這與dedicated方式的查看方法是一樣的,還以s015為例,它的spid為13161,使用如下的sql便可查
出:
select a.username,
a.machine,
a.program,
a.sid,
a.serial#,
a.status,
c.piece,
c.sql_text
from v$session a,
v$process b,
v$sqltext c
where b.spid=13161
and b.addr=a.paddr
and a.sql_address=c.address(+)
order by c.piece
6、我在unix看到一個(gè)shared server的進(jìn)程占用了大量的cpu資源,通過(guò)select addr from v$process where spid=<os process pid>查到進(jìn)程的address,而select * from v$session where paddr=<paddr>確沒(méi)的結(jié)果,所以我無(wú)法得知我的這個(gè)shared server在忙什么,我該怎么辦呢?
回答:
select status from v$circuit
where circuit in
(
select circuit from v$shared_server
where paddr=<your paddr>
)
如果status的返回是eof,說(shuō)明實(shí)際這個(gè)shared server已經(jīng)掉死了,你可以把它在操作系統(tǒng)上清除掉了:
eg:
oracle$kill -9 <shared server's pid>
你不用擔(dān)心kill掉會(huì)有什么大的影響,其它幾分鐘之后,pmon會(huì)為你把這個(gè)shared server進(jìn)程給重新啟動(dòng)的。
7、如何在非down庫(kù)的情況下恢復(fù)到dedicate的連接方式,及啟用更多的dispatcher?
回答:
7.1關(guān)掉:
sql>alter system set mts_dispatchers='tcp,0';
7.2啟用更多的dispatcher
sql>alter system set mts_dispatchers='tcp,40';
部分內(nèi)容參照metalink的note:47684.1