本主题列出了配置和使用 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 才能使更改生效。
有关配置和测试连接的详细信息,请参阅“在 SQL Server 分发服务器上安装和配置 Oracle 客户端网络软件”中的 “配置 Oracle 发布服务器”。
Oracle 发布服务器与另一个分发服务器相关联
Oracle 发布服务器只能与一个 SQL Server 分发服务器相关联。 如果其他分发服务器与 Oracle 发布服务器关联,则必须将其删除,然后才能使用另一个分发服务器。 如果未首先删除分发服务器,将收到以下错误消息之一:
“Oracle 服务器实例”<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 将 Publisher 支持代码包下载到 Oracle 数据库。 在尝试配置 Oracle 发布服务器之前,SQL Server 会验证是否可通过分发服务器上的系统路径访问 SQL*PLUS。 如果无法加载 SQL*PLUS,将显示以下错误消息:
“无法运行 SQL*PLUS。 确保分发服务器上安装了 Oracle 客户端代码的当前版本。
尝试在分发服务器上查找 SQL*PLUS。 对于 Oracle 10g 客户端安装,此可执行文件的名称 sqlplus.exe。 它通常安装在 %ORACLE_HOME%/bin 中。 若要验证 SQL*PLUS 的路径是否显示在系统路径中,请检查系统变量 路径的值:
右键单击 “我的电脑”,再单击 “属性”。
单击“ 高级 ”选项卡,然后单击“ 环境变量”。
在“ 环境变量 ”对话框中的 “系统变量 ”列表中,选择 路径 变量,然后单击“ 编辑”。
在 “编辑系统变量 ”对话框中:如果“ 变量值 ”文本框中不存在包含 sqlplus.exe 的文件夹的路径,请编辑字符串以包含它。
在每个打开的对话框中单击 “确定 ”以退出并保存更改。
如果在分发服务器上找不到 sqlplus.exe,请在分发服务器上安装 Oracle 客户端软件的当前版本。 有关详细信息,请参阅 配置 Oracle 发布服务器。
SQL Server 出现错误 21620
如果您连接到版本低于 8.1 的 Oracle 数据库,Oracle 的发布功能要求分发服务器上安装的 Oracle 客户端软件必须是版本 9。 如果要连接到版本 8.1 或更高版本的 Oracle 数据库,我们建议 Oracle 客户端软件为版本 10 或更高版本。
在尝试配置 Oracle 发布程序之前,Oracle 会验证通过分发服务器上的系统路径访问的 SQL*PLUS 版本是否为版本 9 或更高。 如果未显示,将显示以下错误消息:
“可通过系统 Path 变量访问的 SQL*PLUS 版本不足以支持 Oracle 发布。 确保分发服务器上安装了 Oracle 客户端代码的当前版本。
如果在分发服务器上安装了多个版本的 Oracle 客户端软件,请确保最新版本至少为版本 9,并且系统路径变量首先引用此版本(只要最新版本首次出现,对其他版本的引用就可以显示)。 有关编辑系统路径变量的更多信息,请参阅本主题前面的“SQL Server 错误 21617 已触发”章节。
SQL Server 错误 21624 或错误 21629 出现
对于 64 位分发服务器,Oracle 发布使用 Oracle 的 Oracle OLEDB 提供程序(OraOLEDB.Oracle)。 请确保在分发服务器上安装并注册 Oracle OLEDB 提供程序。 如果未安装并注册提供程序,将显示以下一条或两条错误消息:
无法在分发服务器‘%s’找到已注册的 Oracle OLEDB 提供程序 OraOLEDB.Oracle。 请确保在分发服务器上安装并注册了 Oracle OLEDB 提供程序的当前版本。
CLSID 注册表项用于指示 Oracle OLEDB 提供程序 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 分发服务器无法连接到 Oracle 数据库实例”部分。
引发 SQL Server 错误 21628
对于 64 位分销商,Oracle 发布时使用 Oracle 的 Oracle OLEDB 提供程序(OraOLEDB.Oracle)。 SQL Server 创建一个注册表项,以允许 Oracle 提供程序与 SQL Server 并行运行。 如果读取或写入此注册表项时出现问题,将显示以下错误消息:
“无法更新分发服务器的注册表”%s“,以允许 Oracle OLEDB 提供程序 OraOLEDB.Oracle 在 SQL Server 中运行。 确保当前登录具有权限修改 SQL Server 拥有的注册表项。
Oracle 发布要求注册表项存在,并且对于 64 位分发者,需将注册表项设置为 1。 如果该条目不存在,SQL Server 将尝试创建它。 如果该条目存在,但设置为 0,则不会更改该设置;Oracle 发布服务器的配置将失败。
查看和修改注册表设置:
单击 开始,然后单击 运行。
在 “运行 ”对话框中,键入 regedit,然后单击“ 确定”。
导航到 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\<InstanceName>\Providers。
提供程序下应包含一个名为 OraOLEDB.Oracle 的文件夹。 此文件夹中应为 DWORD 值名称 AllowInProcess,值为 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 发布者上使用游标。 在此过程中,可能会超出 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操作时目录或文件不存在”
需要重新配置发布服务器的更改
对复制元数据表或过程的更改要求您删除并重新配置发布者。 若要重新配置发布服务器,必须删除发布服务器,然后使用 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)。