本主題列出設定和使用 Oracle 發行者時可能發生的一些問題。
Oracle 用戶端和網路軟體發生錯誤
在散發者上執行Microsoft SQL Server 的帳戶,必須授與安裝 Oracle 用戶端網路軟體之目錄(以及所有子目錄)的讀取和執行許可權。 如果未授與許可權,或 Oracle 用戶端元件未正確安裝,您會收到下列錯誤訊息:
與伺服器的連線失敗,[Microsoft OLE DB Provider for Oracle]出現錯誤。 找不到 Oracle 用戶端和網路元件。 這些元件是由 Oracle Corporation 提供,屬於 Oracle 7.3.3 版或更新版本的用戶端軟體安裝。 在安裝這些元件之前,提供者無法運作。
如果散發者端已安裝適當的 Oracle 用戶端,請確定 SQL Server 已停止,然後在用戶端安裝完成後重新啟動。 這是必要的,SQL Server 才能辨識用戶端元件。
如果您已確認已授與許可權並正確安裝元件,但此錯誤仍然存在,請確認 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSDTC\MTxOCI 的登錄設定正確:
針對 Oracle 10g,正確的設定為
OracleOciLib = oci.dll
OracleSqlLib = orasql10.dll
OracleXaLib = oraclient10.dll
針對 Oracle 9i,正確的設定為
OracleOciLib = oci.dll
OracleSqlLib = orasql9.dll
OracleXaLib = oraclient9.dll
SQL Server 散發者無法連線到 Oracle 資料庫實例
如果 SQL Server 發佈者無法連線到 Oracle 發行者,請確定:
必要的 Oracle 軟體會安裝在散發者上。
Oracle 資料庫已上線,您可以使用 SQL*Plus 之類的工具連線到它。
複寫登入用來連接到 Oracle 發行者,確保有足夠的許可權。 如需詳細資訊,請參閱設定 Oracle 發行者。
在設定 Oracle 發行者期間定義的 TNS 名稱會列在 tnsnames.ora 檔案中。
會使用正確的 Oracle 首頁和路徑。 即使您在 SQL Server 散發者上只安裝一組 Oracle 二進位檔,請確定已正確設定與 Oracle Home 相關的環境變數。 如果您變更環境變數值,您必須停止並重新啟動 SQL Server,變更才會生效。
如需設定及測試連線的詳細資訊,請參閱
Oracle 發行者與另一個經銷商相關聯
Oracle 發布者只能與一個 SQL Server 分發者相關聯。 如果不同的散發者與 Oracle 發行者相關聯,則必須卸除它,才能使用另一個散發者。 如果您未先卸除代理程式,您會收到下列其中一個錯誤訊息:
「Oracle Server 實例 '<OraclePublisherName>' 先前已設定為使用 '<SQLServerDistributorName>' 作為散發者。 若要開始使用『<NewSQLServerDistributorName>』作為其散發者,您必須移除 Oracle 伺服器實例上目前的復寫組態,這樣會刪除該伺服器實例上的所有發行集。
「Oracle 伺服器 '<OracleServerName>' 已在散發者 '<SQLServerDistributorName>.<DistributionDatabaseName>' 上定義為發行者 '<OraclePublisherName>'。」 卸除發行者,或卸除公用同義字 '<SynonymName>' 以重新建立。」
卸除 Oracle 發行者時,會自動清除 Oracle 資料庫中的複寫物件。 不過,在某些情況下,需要手動清除 Oracle 複寫物件。 若要手動清除複寫所建立的 Oracle 複寫物件:
使用 DBA 許可權連線到 Oracle 發行者。
傳送 SQL 指令
DROP PUBLIC SYNONYM MSSQLSERVERDISTRIBUTOR;。傳送 SQL 指令
DROP USER <replication_administrative_user_schema>``CASCADE;。
SQL Server 錯誤 21663 因缺少主鍵而引發
交易式發行集中的發行項必須具有有效的主鍵。 如果它們沒有有效的主鍵,當您嘗試新增發行項時,您會收到下列錯誤訊息:
找不到源數據表 [<TableOwner>].[<TableName>] 的有效主鍵。
如需有關主鍵需求的資訊,請參閱主題Oracle 發行者設計考慮和限制中的“唯一索引與限制”一節。
SQL Server 錯誤 21642 與重複的連結伺服器登入有關
最初配置 Oracle 發行者時,會為發行者與散發者之間的連接建立連接的伺服器條目。 鏈接的伺服器名稱與 Oracle TNS 服務名稱相同。 如果您嘗試建立具有相同名稱的連結伺服器,則會顯示下列錯誤訊息:
「異質發行者需要連結的伺服器。 名為 『<LinkedServerName>』 的連結伺服器已經存在。 請移除連結的伺服器,或選擇不同的發行者名稱。」
如果您嘗試直接建立連結的伺服器,或先前已卸除 Oracle 發行者與 SQL Server 散發者之間的關聯性,而且您現在正嘗試重新設定它,就會發生此錯誤。 如果您在嘗試重新設定發行者時收到此錯誤,請使用 sp_dropserver(Transact-SQL) 刪除連結的伺服器。
如果您需要透過連結的伺服器連線到 Oracle 發行者,請建立另一個 TNS 服務名稱,然後在呼叫 sp_addlinkedserver (Transact-SQL) 時使用此名稱。 如需建立 TNS 服務名稱的相關信息,請參閱 Oracle 檔。
SQL Server 錯誤 21617 已引發
Oracle 發行使用 Oracle 應用程式 SQL*PLUS,將發行者支援程式代碼套件下載到 Oracle 資料庫。 嘗試設定 Oracle 發行者之前,SQL Server 會先確認可透過散發者上的系統路徑存取 SQL*PLUS。 如果無法載入 SQL*PLUS,會顯示下列錯誤訊息:
「無法執行 SQL*PLUS。 請確定散發者端已安裝目前版本的 Oracle 用戶端程式代碼。
嘗試在分配器上尋找 SQL*PLUS。 針對 Oracle 10g 用戶端安裝,此可執行檔案的名稱 sqlplus.exe。 它通常會安裝在 /bin %ORACLE_HOME%。 若要確認 SQL*PLUS 的路徑出現在系統路徑中,請檢查系統變數 Path 的值:
在 [我的電腦] 上按一下滑鼠右鍵,然後按 [屬性]。
按兩下 [ 進階] 索引標籤,然後按兩下 [ 環境變數]。
在 [ 環境變數] 對話方塊的 [ 系統變數 ] 清單中,選取 [路徑 ] 變數,然後按兩下 [ 編輯]。
在 [ 編輯系統變數 ] 對話框中:如果包含 sqlplus.exe 的資料夾路徑不存在於 [ 變數值 ] 文字框中,請編輯字串以包含它。
按兩下每個開啟對話框上的 [確定 ] 以結束並儲存變更。
如果您在散發者上找不到 sqlplus.exe,請在散發者端安裝目前版本的 Oracle 客戶端軟體。 如需詳細資訊,請參閱設定 Oracle 發行者。
引發 SQL Server 錯誤 21620
如果您要連線到早於8.1版的Oracle資料庫,Oracle發行會要求在散發者上安裝的Oracle客戶端軟體來自第9版。 如果您要連線到 8.1 版或更新版本的 Oracle 資料庫,建議 Oracle 用戶端軟體為 10 版或更新版本。
在嘗試設定 Oracle Publisher 之前,Oracle 發行會透過散發者上的系統路徑確認可存取的 SQL*PLUS 版本是否為 9 或更新的版本。 如果不是,則會顯示下列錯誤訊息:
「可透過系統 Path 變數存取的 SQL*PLUS 版本不足以支援 Oracle 發行。 請確定散發者端已安裝目前版本的 Oracle 用戶端程式代碼。
如果您在散發者上安裝多個版本的 Oracle 用戶端軟體,請確定最新的版本至少為第 9 版,而且系統路徑變數會先參考此版本(只要最近出現第一個版本,系統路徑變數就會顯示其他版本的參考)。 如需編輯系統路徑變數的詳細資訊,請參閱本主題中之前提到的「引發 SQL Server 錯誤 21617」的一節。
引發 SQL Server 錯誤 21624 或錯誤 21629
針對 64 位元分發商,Oracle 發行使用 Oracle OLEDB 提供者 (OraOLEDB.Oracle)。 請確定 Oracle OLEDB 提供者已安裝並註冊在散發者上。 如果未安裝並註冊提供者,則會顯示下列其中一個或兩個錯誤訊息:
「無法在發佈者『%s』中找到已註冊的 Oracle OLEDB 提供者 OraOLEDB.Oracle。」 請確定已在散發者端安裝並註冊目前版本的 Oracle OLEDB 提供者。
「CLSID 登錄機碼,指出 Oracle OLEDB Provider for Oracle OraOLEDB.Oracle 尚未在散發者端註冊。 請確定 Oracle OLEDB 提供者已安裝並在發行者註冊。
如果您使用 Oracle 用戶端軟體 10g 版,則提供者為 OraOLEDB10.dll;而針對 9i 版,則為 OraOLEDB.dll。 提供者會安裝在 %ORACLE_HOME%\BIN 中(例如 C:\oracle\product\10.1.0\Client_1\bin)。 如果您判斷散發者上未安裝 Oracle OLEDB 提供者,請從 Oracle 提供的 Oracle 用戶端軟體安裝光碟進行安裝。 如需詳細資訊,請參閱設定 Oracle 發行者。
如果已安裝 Oracle OLEDB 提供者,請確定它已註冊。 若要註冊提供者 DLL,請從安裝 DLL 的目錄中執行下列命令,然後停止並重新啟動 SQL Server 實例:
-
regsvr32 OraOLEDB10.dll或regsvr32 OraOLEDB.dll。
SQL Server 錯誤 21626 或引發錯誤 21627
若要確認 Oracle 發行環境已正確設定,SQL Server 會嘗試使用您在設定期間指定的登入認證連線到 Oracle 發行者。 如果 SQL Server 散發者無法連線到 Oracle 發行者,則會顯示下列錯誤訊息:
- 「無法使用 Oracle OLEDB 提供者 OraOLEDB.Oracle 連線到 Oracle 資料庫伺服器 '%s'。
如果顯示此錯誤訊息,請使用 Oracle 發行者設定期間指定的相同登入和密碼,直接執行 SQL*PLUS 來確認 Oracle 資料庫的連線能力。 如需詳細資訊,請參閱本主題稍早的
出現 SQL Server 錯誤 21628
針對 64 位元分發版,Oracle 發行使用 Oracle OLEDB 提供者 適用於 Oracle (OraOLEDB.Oracle)。 SQL Server 會建立註冊表項目,允許 Oracle 提供者在與 SQL Server 相同的進程中運行。 如果讀取或寫入此登入項目時發生問題,則會顯示下列錯誤訊息:
無法更新散發者 “%s” 的登錄檔,以允許 Oracle OLEDB 提供者 OraOLEDB.Oracle 作為與 SQL Server 一起運行的進程。 請確定目前的登入已獲授權修改 SQL Server 擁有的登錄機碼。」
Oracle 發行需要登錄專案存在,且必須針對64位散發者設定為 1 。 如果專案不存在,SQL Server 會嘗試建立它。 如果條目存在,但設為 0,則不會變更設定,Oracle Publisher 的配置將失敗。
若要檢視及修改登錄設定:
點擊開始,然後點擊執行。
在 [ 執行 ] 對話框中,輸入 regedit,然後按兩下 [ 確定]。
流覽至 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\<InstanceName>\Providers。
[提供者] 底下應包含名為 OraOLEDB.Oracle 的資料夾。 在此資料夾中應該有值名為 AllowInProcess 的 DWORD,其值為 1。
如果您判斷 AllowInProcess 設定為 0,請將登錄專案更新為 1:
以滑鼠右鍵按兩下項目,然後按兩下 [ 修改]。
在 [編輯字串] 對話框中,於 [值數據] 字段中輸入 1。
SQL Server 錯誤 21684 被引發
如果系統管理使用者帳戶沒有足夠的許可權,則會顯示下列錯誤訊息:
「與 Oracle 發行者 '%s' 的系統管理員登入相關聯的許可權是不夠的。
若要確認授與用戶的許可權,請執行下列查詢: SELECT * from session_privs。 輸出應如下所示:
PRIVILEGE
------------------
CREATE SESSION
CREATE TABLE
CREATE PUBLIC SYNONYM
DROP PUBLIC SYNONYM
CREATE VIEW
CREATE SEQUENCE
CREATE PROCEDURE
CREATE TRIGGER
您遇到複寫使用者架構的許可權問題
複寫使用者架構必須具有設定 Oracle 發行者中「手動建立用戶架構」中所述的許可權。
Oracle 錯誤 ORA-01000
在將文章新增至發行集的過程中,複製會在 Oracle 發行者上使用游標。 在此過程中,可能會超過發行者可用游標的數目上限。 如果發生這種情況,就會引發下列錯誤:
“ORA-01000:最大開啟游標數超過”
若要避免這個問題,請確定 Oracle 資料庫中 的max_open_cursors 設定設為足夠高的數位(至少 1000 個)。 如需此設定的詳細資訊,請參閱 Oracle 檔。
Oracle 錯誤 ORA-01555
下列 Oracle 資料庫錯誤與快照式複寫無關;它與 Oracle 如何建構數據的讀取一致檢視有關:
“ORA-01555:快照太舊”
使用稱為復原區段的物件,Oracle 會在發出 SQL 語句的時間點時建構數據的讀取一致檢視。 當其他並行會話覆寫回復資訊時,可能會發生「快照集太舊」錯誤。 在 Oracle 9i 之前,降低此錯誤頻率的建議方法是增加回復區段的大小和/或數目,以及將大型交易指派給特定的回復區段。
在 Oracle 9i 中,Oracle 引進了 UNDO 數據表空間概念,以取代復原區段。 若要防止 Oracle 9i 中的「快照集太舊」錯誤,建議您:
建立具有適當可用空間量的 UNDO 資料表空間。
在數據表空間上設定保留保證 (Oracle 10G 和更新)。
設定 Oracle 初始化參數UNDO_MANAGEMENT和UNDO_RETENTION。
如需進一步了解如何避免「快照太舊」錯誤,請參閱 Oracle 文件。
Oracle 錯誤 ORA-22285
如果數據表包含 BFILE 資料行,則數據行的數據會儲存在檔案系統中。 複寫系統管理使用者帳戶必須獲得使用下列語法來儲存資料的目錄存取權:
GRANT READ ON DIRECTORY <directory_name> TO <replication_administrative_user_schema>
如果未授與存取權,記錄讀取器代理程式就會引發下列錯誤:
“ORA-22285:FILEOPEN 作業不存在的目錄或檔案”
已進行的變更需要重新設定發行者
復寫元數據數據表或程序的變更需要卸除並重新設定發行者。 若要重新設定發行者,您必須卸除發行者,並使用 SQL Server Management Studio、Transact-SQL 或 RMO 再次設定它。 如需設定發行者的相關信息,請參閱 設定 Oracle 發行者。
卸除 Oracle 發行者(SQL Server Management Studio)
在 SQL Server Management Studio 中連接到 Oracle 發行者的散發者,然後展開伺服器節點。
以滑鼠右鍵按兩下 [ 複寫],然後按兩下 [ 散發者屬性]。
在 [散發者屬性] 對話框的 [發行者] 頁面上,清除 Oracle 發行者的複選框。
按一下 [確定]。
移除 Oracle 發行者 (Transact-SQL)
- 執行 sp_dropdistpublisher。 如需詳細資訊,請參閱 sp_dropdistpublisher (Transact-SQL) 。
另請參閱
設定 Oracle 發行者
Oracle 發行概觀