利用MSSQL復(fù)制功能實(shí)現(xiàn)與Oracle數(shù)據(jù)庫(kù)同步
來(lái)源:易賢網(wǎng) 閱讀:869 次 日期:2014-12-04 14:55:20
溫馨提示:易賢網(wǎng)小編為您整理了“利用MSSQL復(fù)制功能實(shí)現(xiàn)與Oracle數(shù)據(jù)庫(kù)同步”,方便廣大網(wǎng)友查閱!

一 概述

默認(rèn)情況下,SQL Server 代理創(chuàng)建錯(cuò)誤日志來(lái)記錄警告和錯(cuò)誤。日志中顯示下列警告和錯(cuò)誤:

警告消息,提供有關(guān)潛在問(wèn)題的信息,例如“作業(yè) 在執(zhí)行時(shí)被刪除”。

錯(cuò)誤消息,通常需要系統(tǒng)管理員干預(yù),例如“無(wú)法啟動(dòng)郵件會(huì)話”??梢酝ㄟ^(guò) net send 將錯(cuò)誤消息發(fā)送給特定用戶或計(jì)算機(jī)。

默認(rèn)情況下,執(zhí)行跟蹤消息不寫(xiě)入 SQL Server代理日志錯(cuò)誤,因?yàn)樗鼈儠?huì)將日志填滿。如果錯(cuò)誤日志已滿,會(huì)降低選擇和分析更嚴(yán)重的錯(cuò)誤的能力。因?yàn)槿罩緯?huì)增加服務(wù)器的處理負(fù)荷,所以請(qǐng)務(wù)必仔細(xì)考慮是否值得將執(zhí)行跟蹤消息捕獲到錯(cuò)誤日志中。通常,最好僅在調(diào)試某個(gè)特定問(wèn)題時(shí)捕獲所有消息。

二 錯(cuò)誤日志的存放目錄和個(gè)數(shù)

SQL Server 最多可以維護(hù) 1個(gè)當(dāng)前錯(cuò)誤日志記錄 和 9個(gè) SQL Server 代理錯(cuò)誤日志歷史記錄。每個(gè)存檔日志都有一個(gè)擴(kuò)展名,指示該日志的相對(duì)存在時(shí)間。例如,擴(kuò)展名 .1 表示最新的存檔錯(cuò)誤日志,而擴(kuò)展名 .9 表示最舊的存檔錯(cuò)誤日志。

SQL Server 代理停止后,可以修改 SQL Server 代理錯(cuò)誤日志的位置。如果錯(cuò)誤日志為空,則無(wú)法打開(kāi)日志??梢噪S時(shí)循環(huán)訪問(wèn) SQL Server 代理日志,無(wú)需停止 SQL Server 代理。

三 基本管理任務(wù)

查看 SQL Server 代理錯(cuò)誤日志 :企業(yè)管理器;通過(guò)openrowset讀取文件;xp_cmdshell下執(zhí)行dos輸出的type命令等;xp_cmdshell下bcp進(jìn)入數(shù)據(jù)庫(kù)系統(tǒng)的表中;exec xp_cmdshell 'type "C:Program FilesMicrosoft SQL ServerMSSQL.1MSSQLLOGSQLAGENT.out"'

重命名 SQL Server 代理錯(cuò)誤日志 ,重啟sql代理后生效 :企業(yè)管理器;EXEC msdb.dbo.sp_set_sqlagent_properties @errorlog_file=N'C:Program FilesMicrosoft SQL ServerMSSQL.1MSSQLLOGSQLAGENT.OUT'

發(fā)送 SQL Server 代理錯(cuò)誤消息 ,使用net send 發(fā)送消息,依賴于windows的messenges 服務(wù) :企業(yè)管理器;EXEC msdb.dbo.sp_set_sqlagent_properties @error_recipient=N'jinsen'

將執(zhí)行跟蹤消息寫(xiě)入到 SQL Server 代理錯(cuò)誤日志中 :配置sql代理,記錄跟蹤內(nèi)容;

配置代理錯(cuò)誤日志的信息內(nèi)容類型(錯(cuò)誤 1、警告 2、信息(包含錯(cuò)誤跟蹤) 4),類型可以疊加:企業(yè)管理器;EXEC msdb.dbo.sp_set_sqlagent_properties @errorlogging_level={1|2|4|3|5|7|6}

配置代理錯(cuò)誤日志的信息 1.分別建立鏈接對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作,SQLServer可以用ADO.NET,操作Oracle可以用OLEDB或者用System.Data.OracleClient(需要添加引用才能用)

這種方案的優(yōu)點(diǎn)就是簡(jiǎn)單,各自寫(xiě)各自的數(shù)據(jù)庫(kù)操作代碼,缺點(diǎn)就是不能將兩個(gè)數(shù)據(jù)庫(kù)中的表直接進(jìn)行聯(lián)合查詢,鏈接Oracle的每臺(tái)機(jī)器必須安裝OracleClient才可以使用。

2.使用同義詞操作Oracle數(shù)據(jù)庫(kù)。

這種方法的具體操作我在以前的文章中已經(jīng)寫(xiě)清楚了,這樣做一來(lái)可以進(jìn)行表的聯(lián)合查詢二來(lái)不需要每臺(tái)機(jī)器都安裝OracleClient,但是還是有一個(gè)缺點(diǎn):效率低,比如對(duì)同義詞使用like去查找需要的數(shù)據(jù),如果是直接連Oracle數(shù)據(jù)庫(kù)也許只要0.1秒就可以找到答案,但是用同義詞可能就要等10秒20秒或更久。原來(lái)SQLServer并不是直接把查詢語(yǔ)句傳遞給Oracle,讓Oracle執(zhí)行操作,而是將所有數(shù)據(jù)都取到SQLServer服務(wù)器上,邊取數(shù)據(jù)邊分析,直到滿足查詢條件為止。其實(shí)這種數(shù)據(jù)放在兩個(gè)服務(wù)器上還有一個(gè)缺點(diǎn)就是一旦Oracle服務(wù)器宕機(jī),即使我們這邊的所有服務(wù)器都是好的,那么我們的程序中用到Oracle數(shù)據(jù)的地方就無(wú)法使用。

3.直接鏈接Oracle數(shù)據(jù)庫(kù)+同義詞+作業(yè)+異常跳轉(zhuǎn) 方式。

這種方法具體講就是我們的程序直接用OLEDB(OracleClient)鏈接Oracle數(shù)據(jù)庫(kù),同時(shí)SQLServer服務(wù)器也建立了同義詞指向Oracle,在SQLServer上建立作業(yè),將同義詞中的數(shù)據(jù)拷貝到SQLServer服務(wù)器的表中。一旦Oracle宕機(jī),程序中就會(huì)捕捉到異常,于是就使用SQLServer中的數(shù)據(jù)。這樣做比較復(fù)雜,需要一定的編程,效率也不是特別高,但是優(yōu)點(diǎn)也是明細(xì)的,平時(shí)鏈接Oralce服務(wù)器,異常情況下鏈接SQLServer中的備份數(shù)據(jù),保證了程序的正常運(yùn)行。

4.直接編寫(xiě)一個(gè)程序,以服務(wù)或自啟動(dòng)方式一直運(yùn)行,每隔一段時(shí)間將Oracle數(shù)據(jù)庫(kù)中的數(shù)據(jù)寫(xiě)到SQLServer數(shù)據(jù)庫(kù)中。

這種方法就是編程復(fù)雜,具有很大難度。

5.利用SQLServer2005的復(fù)制功能將Oracle數(shù)據(jù)庫(kù)中的數(shù)據(jù)同步到SQLServer服務(wù)器中,程序只操作SQLServer,不鏈接Oracle數(shù)據(jù)庫(kù)。

這種方法不需要編寫(xiě)任何代碼,由于只對(duì)SQLServer進(jìn)行查詢,所以查詢效率高可以做多表鏈接,開(kāi)發(fā)人員也不需要再裝OracleClient,也不用害怕Oracle服務(wù)器宕機(jī)導(dǎo)致我們的相關(guān)程序無(wú)法使用。優(yōu)點(diǎn)倒是很多,那么有沒(méi)有缺點(diǎn)拉?缺點(diǎn)還是有的,主要是取得的數(shù)據(jù)不是實(shí)時(shí)的數(shù)據(jù),Oracle那邊的數(shù)據(jù)更新了,我們這邊還有可能是老數(shù)據(jù)。

前面的四種方法我就不用多講了,這次主要是講第五種方法的具體實(shí)現(xiàn):

1.安裝SQLServer復(fù)制功能。

在安裝SQLServer數(shù)據(jù)庫(kù)的時(shí)候選上“復(fù)制”,將“復(fù)制”功能安裝到服務(wù)器。微軟說(shuō)如果第一次安裝的時(shí)候沒(méi)有裝,以后再想添加該功能只需要運(yùn)行安裝程序?qū)ⅰ皬?fù)制”選上就可以了,不過(guò)說(shuō)是這么說(shuō),我試了幾次都不行,我也不知道怎么回事,為了安裝上復(fù)制,所以將SQLServer卸載了,重新安裝!這種方法很笨,不過(guò)我實(shí)現(xiàn)想不出其他辦法了,希望高手指點(diǎn)。

2.設(shè)置Oracle服務(wù)器端的權(quán)限。

創(chuàng)建一個(gè)用于復(fù)制用的用戶,授予下列權(quán)限:

CREATE PUBLIC SYNONYM 和 DROP PUBLIC SYNONYM

CREATE PROCEDURE

CREATE SEQUENCE

CREATE SESSION

還必須直接為用戶授予下列權(quán)限(不是通過(guò)角色):

CREATE ANY TRIGGER。

CREATE TABLE

CREATE VIEW

同時(shí)該用戶還必須對(duì)要發(fā)布的表所在表空間有UNLIMITED的權(quán)限,還要針對(duì)每個(gè)要用于同步的表設(shè)置Select權(quán)限。

3.SQLServer服務(wù)器上安裝OracleClient10g

必須安裝了才可以鏈接Oracle服務(wù)器,不推薦安裝Oracle9i,即使我們要鏈接的Oracle是9i的。安裝完成以后重啟SQLServer服務(wù)器。用PLSQL或其他工具測(cè)試一下是否可以鏈接到Oracle服務(wù)器。

4.設(shè)置SQLServer Agent權(quán)限

在SQLServer服務(wù)器上 新建用戶,將該用戶加為管理員,在“服務(wù)”中找到“SQLServer Agent”,將其啟動(dòng)用戶改為該用戶,重啟該服務(wù)。

5.配置分發(fā)

打開(kāi)ManagementStudio右鍵“復(fù)制”節(jié)點(diǎn),選中“配置分發(fā)”,按向?qū)б徊揭徊讲僮?,將快照文件夾路徑指定為一個(gè)專門的共享文件夾,其他都不用修改,完成配置分發(fā)。

6.添加Oracle發(fā)布

右鍵“本地發(fā)布”->“新建Oracle發(fā)布”,啟動(dòng)Oracle發(fā)布向?qū)?,添加Oracle服務(wù)器,將在Oracle服務(wù)器上新建的用戶密碼輸入,一直下一步,選快照發(fā)布,選中需要發(fā)布的表,選中“立即創(chuàng)建快照發(fā)布”和“計(jì)劃運(yùn)行快照代理”,計(jì)劃時(shí)間就自己根據(jù)需要設(shè)定,“快照代理”選擇“代理服務(wù)帳戶”,發(fā)布名稱填寫(xiě)需要的名稱,比如“Test1”,然后點(diǎn)擊完成。這樣就完成了發(fā)布工作。

7.添加Oracle訂閱

右鍵“本地訂閱”->“新建訂閱”運(yùn)行向?qū)?,選中剛才新建的Test1發(fā)布,一般選中“推送訂閱”,指定要訂閱的數(shù)據(jù)庫(kù)(比如:mis),也就是要用來(lái)存儲(chǔ)Oracle數(shù)據(jù)的數(shù)據(jù)庫(kù),訂閱屬性中選中用SQLServer代理用戶運(yùn)行,代理計(jì)劃“連續(xù)運(yùn)行”,初始化時(shí)間“立即”,然后創(chuàng)建訂閱完成。

這個(gè)時(shí)候我們打開(kāi)訂閱的數(shù)據(jù)庫(kù)mis,我們可以看到其中添加了Oracle發(fā)布出來(lái)的表,而且這些內(nèi)容會(huì)按照計(jì)劃隔段時(shí)間同步Oracle數(shù)據(jù)一次。

到此我們的同步完成。

8.測(cè)試是否同步成功

用PLSQL往Oracle中寫(xiě)入數(shù)據(jù),修改數(shù)據(jù),刪除數(shù)據(jù),如果發(fā)布時(shí)候選中的是每一分鐘運(yùn)行快照代理一次,那么隔一分鐘后,我們?cè)偃ゴ蜷_(kāi)SQLServer中的表,我們可以看到其中的內(nèi)容和Oracle一樣進(jìn)行了變化。

PS:在“本地發(fā)布”下選中我們的發(fā)布,右鍵,“查看代理運(yùn)行狀態(tài)”可以看到我們的發(fā)布是否成功。內(nèi)容的編碼類型 :企業(yè)管理器;EXEC msdb.dbo.sp_set_sqlagent_properties @oem_errorlog={0|1}

回收錯(cuò)誤日志的空間 :使用企業(yè)管理器;EXEC msdb.dbo.sp_cycle_agent_errorlog

配置代理錯(cuò)誤日志文件記錄數(shù)的大小(行數(shù)):企業(yè)管理器;EXEC msdb.dbo.sp_set_sqlagent_properties @jobhistory_max_rows=1000,

配置代理錯(cuò)誤日志文件記錄每個(gè)作業(yè)的最大記錄的大小(行數(shù)):企業(yè)管理器;EXEC msdb.dbo.sp_set_sqlagent_properties @jobhistory_max_rows_per_job=100

四 常見(jiàn)問(wèn)題

q:為什么sql代理錯(cuò)誤日志文件的內(nèi)容始終為空,無(wú)法進(jìn)行錯(cuò)誤信息的日志記錄?

a:重新配置sql代理錯(cuò)誤日志文件的編碼格式為非oem——即配置為unicode編碼,可以解決問(wèn)題

q:為什么在使用企業(yè)管理器查看sql代理錯(cuò)誤日志時(shí),日志查看器出現(xiàn)異常,“unicode file expected”?

a:重新配置sql代理錯(cuò)誤日志文件的編碼格式為非oem——即配置為unicode編碼,可以解決問(wèn)題

q:為什么企業(yè)管理器、sms 無(wú)法回收sql2000的sql代理錯(cuò)誤日志文件?

a:sqlserver2000的sql 代理錯(cuò)誤日志的文件 不支持回收!

更多信息請(qǐng)查看IT技術(shù)專欄

更多信息請(qǐng)查看數(shù)據(jù)庫(kù)
由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請(qǐng)考生以權(quán)威部門公布的正式信息和咨詢?yōu)闇?zhǔn)!

2025國(guó)考·省考課程試聽(tīng)報(bào)名

  • 報(bào)班類型
  • 姓名
  • 手機(jī)號(hào)
  • 驗(yàn)證碼
關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡(jiǎn)要咨詢 | 簡(jiǎn)要咨詢須知 | 加入群交流 | 手機(jī)站點(diǎn) | 投訴建議
工業(yè)和信息化部備案號(hào):滇ICP備2023014141號(hào)-1 云南省教育廳備案號(hào):云教ICP備0901021 滇公網(wǎng)安備53010202001879號(hào) 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號(hào)
云南網(wǎng)警備案專用圖標(biāo)
聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關(guān)注公眾號(hào):hfpxwx
咨詢QQ:526150442(9:00—18:00)版權(quán)所有:易賢網(wǎng)
云南網(wǎng)警報(bào)警專用圖標(biāo)