Oracle Publisher 故障排除

適用於:SQL Server

本文列出了在設定和使用 Oracle Publisher 時可能出現的各種問題。

發生有關 Oracle 用戶端與網路軟體的錯誤

您必須將 Oracle 用戶端網路軟體安裝所在目錄及其所有子目錄的讀取與執行權限,授與在散發者上執行 Microsoft SQL Server 的帳戶。 如果你沒有授權權限,或 Oracle 用戶端元件安裝不正確,你會收到以下錯誤訊息:

使用 [Microsoft OLE DB Provider for Oracle] 連線至伺服器失敗。 找不到 Oracle 用戶端和網路元件。 這些元件由 Oracle 公司提供,是 Oracle 7.3.3 或更新版本用戶端軟體安裝的一部分。 在這些元件安裝前,Provider 無法運作」。

如果你在發行版安裝了合適的 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 Distributor 無法連接到 Oracle 資料庫實例

如果 SQL Server Distributor 無法連接到 Oracle Publisher,請確保:

  • 必要的 Oracle 軟體已安裝於分發端。

  • Oracle 資料庫是線上的,你可以用像 SQL*Plus 這類工具連接。

  • 複寫用來連線到 Oracle 發行者的登入具有足夠的權限。 如需詳細資訊,請參閱設定 Oracle 發行者。

  • tnsnames.ora 檔案列出了您在 Oracle Publisher 設定時所定義的 TNS 名稱。

  • 您使用的是正確的 Oracle Home 和路徑。 即使「SQL Server 散發者」上只安裝一組 Oracle 二進位編碼檔案,也請確定正確設定了與 Oracle 首頁相關的環境變數。 如果變更環境變數值,必須停止並重新啟動 SQL Server,才能使變更生效。

如需設定及測試連線能力的詳細資訊,請參閱設定 Oracle 發行者中的 <在 SQL Server 散發者上安裝與設定 Oracle 用戶端網路軟體>。

Oracle Publisher 與另一家發行商有關聯

一個「Oracle 發行者」只能與一個「SQL Server 散發者」相關聯。 如果 Oracle Publisher 已關聯到另一個發行者,請先將其移除,再使用其他發行者。 如果你沒有先移除分銷商,你會收到以下其中一種錯誤訊息:

  • 「Oracle 伺服器實例『<OraclePublisherName>』先前已設定為使用 'SQLServerDistributorName>' 作為其發行者。< 要開始使用 '<NewSQLServerDistributorName>' 作為其發行版,必須移除 Oracle 伺服器實例上的現有複寫設定,這將刪除該實例上的所有發佈。」

  • 「Oracle 伺服器『<OracleServerName>』已定義為發佈者 'OraclePublisherName>',並設定為發行商 '<<SQLServerDistributorName>'.<DistributionDatabaseName>'。 刪除發行者,或刪除公用同義詞 '<SynonymName>' 以重新建立。」

當你丟棄 Oracle Publisher 時,Oracle 資料庫中的複製物件會自動被清理。 不過,在某些情況下你需要手動清理 Oracle 的複製物件。 若要手動清除複寫建立的 Oracle 複寫物件:

  1. 使用 DBA 權限連線到 Oracle 發行者。

  2. 發出 SQL 命令 DROP PUBLIC SYNONYM MSSQLSERVERDISTRIBUTOR;。

  3. 發出 SQL 命令 DROP USER <replication_administrative_user_schema>``CASCADE;。

SQL Server 錯誤 21663 因缺少主鍵而被提出

交易式發行中的文章必須具有有效的主索引鍵。 如果他們沒有有效的主鍵,當你嘗試新增文章時,會收到以下錯誤訊息:

「找不到來源資料表 [<TableOwner>] 的有效主鍵。[<TableName>]」

關於主鍵需求的資訊,請參閱《 Oracle 出版商的設計考量與限制》一文中的「唯一索引與約束」章節。

SQL Server 錯誤 21642 因重複連結伺服器登入而被提出

當你最初設定 Oracle Publisher 時,該流程會建立一個連結伺服器條目,用於 Publisher 與 Distributor 之間的連線。 連結伺服器的名稱與 Oracle TNS 服務名稱相同。 如果你嘗試建立同名的連結伺服器,你會看到以下錯誤訊息:

異質發行者需要連結伺服器。 已有一台名為「<LinkedServerName>」的連結伺服器存在。 請移除已連結伺服器或選擇不同的發行者名稱」。

此錯誤可能發生在您嘗試直接建立連結伺服器,或您先前已斷開 Oracle Publisher 與 SQL Server Distributor 之間的關聯,現在嘗試重新設定時。 若在嘗試重新設定「發行者」時收到此錯誤,請使用 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。它通常安裝在 %ORACLE_HOME%/bin 裡。為了驗證 SQL PLUS 的路徑是否出現在系統路徑中,請檢查系統變數 Path 的值:

  1. 以滑鼠右鍵按一下 [我的電腦] ,然後再按 [內容] 。

  2. 按一下 [進階] 索引標籤,然後再按 [環境變數] 。

  3. 在 [環境變數] 對話方塊的 [系統變數] 清單中,選取 [Path] 變數,然後按一下 [編輯] 。

  4. 在 「編輯系統變數 」對話框中:如果包含 sqlplus.exe 的資料夾路徑不在 變數值 文字框中,請編輯該字串以包含它。

  5. 按一下每個開啟對話方塊上的 [確定] ,以結束並儲存變更。

如果你在發行商找不到 sqlplus.exe,可以在發行商安裝最新版本的 Oracle 用戶端軟體。 如需詳細資訊,請參閱設定 Oracle 發行者。

發生 SQL Server 錯誤 21620

如果你連接的是 Oracle 版本 8.1 之前的資料庫,Oracle 發佈時會要求 Distributor 上安裝的 Oracle 用戶端軟體必須是第 9 版。 如果你連接的是 Oracle 版本 8.1 或更新的資料庫,請使用 Oracle 用戶端軟體版本 10 或更新。

嘗試設定「Oracle 發行者」之前,Oracle 發行會確認可透過「散發者」上系統路徑存取的 SQL*PLUS 版本是不是 9 版或更新版本。 如果沒有,會顯示以下錯誤訊息:

「可透過系統 Path 變數存取的 SQL*PLUS 版本,目前不足以支援 Oracle 發行。 請確認散發者端已安裝目前版本的 Oracle 用戶端程式碼」。

如果你在發行版安裝了多個版本的 Oracle 用戶端軟體,請確保最新版本至少是第 9 版,且系統路徑變數首先指向該版本(只要最新版本先出現,其他版本的參考仍可出現)。 欲了解更多關於編輯系統路徑變數的資訊,請參閱本文前述的「SQL Server is Raised」章節。

發生 SQL Server 錯誤 21624 或錯誤 21629

對於 64 位元的 Distributor,Oracle 發行作業會使用 Oracle OLEDB Provider for Oracle (OraOLEDB.Oracle)。 確保 Oracle OLEDB 供應商已安裝並註冊於分發商。 如果該服務提供者尚未安裝並註冊,你會看到以下其中一項或兩種錯誤訊息:

  • 在散發者 '%s' 端找不到已註冊的 Oracle OLEDB 提供者 (OraOLEDB.Oracle)。 請確認已安裝目前版本的 Oracle OLEDB 提供者,並在散發者端註冊」。

  • 散發者端不存在用來指出 Oracle 的 Oracle OLEDB Provider(OraOLEDB.Oracle)已註冊的 CLSID 登錄機碼。 請確認散發者端已安裝並註冊 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 OLEDB 服務提供者,請確保它已註冊。 要註冊提供者 DLL,請從安裝 DLL 的目錄執行以下指令,然後停止並重新啟動 SQL Server 實例:

  1. regsvr32 OraOLEDB10.dll 或 regsvr32 OraOLEDB.dll。

發生 SQL Server 錯誤 21626 或 21627

為了驗證 Oracle 發佈環境的設定是否正確,SQL Server 會嘗試使用你在設定時指定的登入憑證連接到 Oracle Publisher。 如果 SQL Server Distributor 無法連接到 Oracle Publisher,你會看到以下錯誤訊息:

  • 「無法使用 Oracle OLEDB 提供者 (OraOLEDB.Oracle) 連接到 Oracle 資料庫伺服器 '%s'。」

如果你看到這個錯誤訊息,請直接使用你在設定 Oracle Publisher 時指定的登入帳號和密碼,直接執行 SQL*PLUS 來驗證與 Oracle 資料庫的連結。 更多資訊請參閱本文前半部分的「SQL Server Distributor 無法連接 Oracle 資料庫實例」。

SQL Server 錯誤 21628 被提出

對於 64 位元的 Distributor,Oracle 發行作業會使用 Oracle OLEDB Provider for 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 的設定就會失敗。

若要檢視和修改登錄設定:

  1. 選取 [開始],然後選取 [執行]。

  2. 在 執行 對話框中,輸入 regedit,然後選擇 確定。

  3. 瀏覽至 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\<InstanceName>\Providers。

    在 提供者中,找到一個名為 OraOLEDB.Oracle. 的資料夾。 在此資料夾中,找到 DWORD 值名稱 AllowInProcess ,值為 1。

  4. 如果你發現 AllowInProcess 設為 0,請將登錄檔條目更新為 1:

    1. 右鍵點擊該條目,然後選擇 修改。

    2. 在 [編輯字串] 對話方塊的 [值資料] 欄位中輸入 [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 發行者上使用游標。 在此程序中,可能會超出 Publisher 上可用的最大游標數量。 如果發生此種情形,則會產生下列錯誤:

「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 作業中的目錄或檔案不存在」

需要重新設定 Publisher 的變更

如果您對複製的元資料表或程序做了變更,必須丟棄並重新設定 Publisher。 要重新設定 Publisher,你必須先丟掉 Publisher,然後用 SQL Server Management Studio、Transact-SQL 或 RMO 重新設定。 欲了解更多關於配置 Publisher 的資訊,請參閱「配置 Oracle Publisher」。

要丟棄 Oracle Publisher(SQL Server Management Studio)

  1. 在 SQL Server Management Studio 中,連線到 Oracle 發行者的散發者,然後展開伺服器節點。

  2. 以滑鼠右鍵按一下 [複寫] ,然後按一下 [散發者屬性] 。

  3. 在 [散發者屬性] 對話方塊的 [發行者] 頁面上,清除「Oracle 發行者」的核取方塊。

  4. 按一下 [確定]。

刪除 Oracle 發行者 (Transact-SQL)