<3>問(wèn)題排查與更多查詢(xún)方式
當(dāng)我們?cè)趯?shí)際編程中進(jìn)行訪問(wèn)遠(yuǎn)程數(shù)據(jù)時(shí) 因?yàn)椴煌僮鳝h(huán)境會(huì)引發(fā)各種各樣的異常,如下我會(huì)提出一種常見(jiàn)的異常方式解決辦法和關(guān)于遠(yuǎn)程數(shù)據(jù)操作更多查詢(xún)方式.
<3.1>無(wú)法建立遠(yuǎn)程連接
其實(shí)這個(gè)問(wèn)題在做分布式查詢(xún)時(shí)極其常見(jiàn). 而引起這個(gè)問(wèn)題的因素過(guò)多. 我們一時(shí)無(wú)法判斷真正引發(fā)這個(gè)異常地方. 只能通過(guò)逐個(gè)排查方式來(lái)進(jìn)行設(shè)置:
例如我們?cè)诮㈥P(guān)聯(lián)關(guān)系后 進(jìn)行查詢(xún)時(shí)會(huì)遇到:
提示是: 在進(jìn)行遠(yuǎn)程連接時(shí)超時(shí), 引起這個(gè)問(wèn)題原因可能是遠(yuǎn)程服務(wù)器積極拒絕訪問(wèn)!
首先要在Sql Server Configuation Manager中保證你服務(wù)已經(jīng)運(yùn)行 且是開(kāi)機(jī)自動(dòng)運(yùn)行.
再次檢查SQl2005外圍配置DataBaseEngine允許遠(yuǎn)程連接:
設(shè)置完成后.我們還需要設(shè)置Sql Server Analysis Services分析服務(wù)也支持遠(yuǎn)程數(shù)據(jù)查詢(xún):
在遠(yuǎn)程服務(wù)器上如果啟用了防火墻則可能對(duì)目前SQl Server方位實(shí)例進(jìn)行攔截. 所以在服務(wù)器端啟用防火墻情況下要為SQl DAtaBase創(chuàng)建例外.防止客戶(hù)端請(qǐng)求被攔截.
<3.2>進(jìn)程被其他用戶(hù)占用
當(dāng)我們?cè)谶h(yuǎn)程分布式查詢(xún)中有創(chuàng)建動(dòng)作或是類(lèi)似創(chuàng)建一個(gè)新的數(shù)據(jù)庫(kù). 有時(shí)會(huì)提示 “該數(shù)據(jù)庫(kù)無(wú)法操作 已經(jīng)別其他進(jìn)程占用”異常. 導(dǎo)致我們無(wú)法訪問(wèn)數(shù)據(jù)庫(kù). 或是執(zhí)行我們要做的創(chuàng)建操作.
遇到這種情況我們可以利用SA權(quán)限查詢(xún)到Master數(shù)據(jù)庫(kù)對(duì)應(yīng)數(shù)據(jù)庫(kù)被占用的進(jìn)程 并殺掉Kill Process.查詢(xún):
1: -- [sysprocesses 表中保存關(guān)于運(yùn)行在 Microsoft® SQL Server™ 上的進(jìn)程的信息。
2: -- 這些進(jìn)程可以是客戶(hù)端進(jìn)程或系統(tǒng)進(jìn)程。sysprocesses 只存儲(chǔ)在 master 數(shù)據(jù)庫(kù)中]
4: use Master
5: go
7: SELECT * FROM sysprocesses ,sysdatabases WHERE sysprocesses.dbid=sysdatabases.dbid AND sysdatabases.Name='CustomerDB'
9: select * from sysprocesses
11: select * from sysdatabases
13: -- 殺死占用進(jìn)程
14: kill 5
當(dāng)我們對(duì)進(jìn)程占用清除時(shí)有可能訪問(wèn)數(shù)據(jù)庫(kù)被系統(tǒng)進(jìn)程占用. 則這時(shí)用Sa無(wú)法殺死.這時(shí)提示:
“Only use Process can be Kill ”在SQl2005 只有只有用戶(hù)進(jìn)程才能Kill掉.
<3.3>更多的查詢(xún)操作
往往我們?cè)趯?shí)際操作中需要對(duì)數(shù)據(jù)讀寫(xiě)有更多要求. 例如從遠(yuǎn)程連接多個(gè)服務(wù)器進(jìn)行數(shù)據(jù)讀取或是把本地?cái)?shù)據(jù)提交到服務(wù)器上. 為了提高效率和性能采用分布式事務(wù)來(lái)進(jìn)行批量操作等等. 如下簡(jiǎn)單介紹在分布式查詢(xún)中多中數(shù)據(jù)操作:
把遠(yuǎn)程數(shù)據(jù)導(dǎo)入本地:
1: -- 導(dǎo)入數(shù)據(jù)操作
2: select top(3) * into TestDB.dbo.CopyDb from [192.168.10.76].wl.dbo.Users
導(dǎo)入時(shí)使用Into方式 自動(dòng)在本地創(chuàng)建CopyDB表完全復(fù)制遠(yuǎn)程服務(wù)器上Users表的數(shù)據(jù)結(jié)構(gòu).但是要注意在進(jìn)行后 的CopyDB將不包含原表的主鍵和索引約束. 雖然能快構(gòu)建 但是主鍵和索引設(shè)置都會(huì)丟失.
本地?cái)?shù)據(jù)導(dǎo)入遠(yuǎn)程:
-- 把本地表導(dǎo)入遠(yuǎn)程表 [openWset方式]
insert openrowset( 'SQLOLEDB ', 'sql服務(wù)器名 '; '用戶(hù)名 '; '密碼 ',數(shù)據(jù)庫(kù)名.dbo.表名) select *from 本地表
-- 把本地表導(dǎo)入遠(yuǎn)程表 [open Query方式]
insert openquery(ITSV, 'SELECT * FROM 數(shù)據(jù)庫(kù).dbo.表名 ')
更新本地表數(shù)據(jù):
1: -- 把本地表導(dǎo)入遠(yuǎn)程表 [opendataSource方式]
2: insert opendatasource( 'SQLOLEDB ', 'Data Source=ip/ServerName;User ID=登陸名;Password=密碼 ').數(shù)據(jù)庫(kù).dbo.表名
3:
4: -- 更新本地表 [openowset方式]
5: update b set b.列A=a.列A from openrowset( 'SQLOLEDB ', 'sql服務(wù)器名 '; '用戶(hù)名 '; '密碼 ',數(shù)據(jù)庫(kù)名.dbo.表名)
6: as a inner join 本地表 b on a.column1=b.column1
當(dāng)然還有更多方式來(lái)操作分布式查詢(xún)操作.各位都可以嘗試.
如上是我最近在項(xiàng)目中處理關(guān)于分布式查詢(xún)涉及到方方面面. 從系統(tǒng)架構(gòu)到分部是查詢(xún)具體操作細(xì)節(jié).基本都是一些非?;A(chǔ)運(yùn)用.當(dāng)然也參考不少資料.以及動(dòng)手來(lái)驗(yàn)證整個(gè)過(guò)程出現(xiàn)問(wèn)題原因所在. 篇幅有限 寫(xiě)的有些倉(cāng)促. 難免有紕漏地方 還望各位指正.
聯(lián)系客服