利用MSSQL复制功能实现与Oracle数据库同步

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一概述

默认情况下,SQL Server 代理创建错误日志来记录警告和错误。日志中显示下列警告和错误:

警告消息,提供有关潜在问题的信息,例如“作业在执行时被删除”。

错误消息,通常需要系统管理员干预,例如“无法启动邮件会话”。可以通过net send 将错误消息发送给特定用户或计算机。

默认情况下,执行跟踪消息不写入SQL Server代理日志错误,因为它们会将日志填满。如果错误日志已满,会降低选择和分析更严重的错误的能力。因为日志会增加服务器的处理负荷,所以请务必仔细考虑是否值得将执行跟踪消息捕获到错误日志中。通常,最好仅在调试某个特定问题时捕获所有消息。

二错误日志的存放目录和个数

SQL Server 最多可以维护1个当前错误日志记录和9个SQL Server 代理错误日志历史记录。每个存档日志都有一个扩展名,指示该日志的相对存在时间。例如,扩展名.1 表示最新的存档错误日志,而扩展名.9 表示最旧的存档错误日志。

SQL Server 代理停止后,可以修改SQL Server 代理错误日志的位置。如果错误日志为空,则无法打开日志。可以随时循环访问SQL Server 代理日志,无需停止SQL Server 代理。

三基本管理任务

查看SQL Server 代理错误日志:企业管理器;通过openrowset读取文件;xp_cmdshell 下执行dos输出的type命令等;xp_cmdshell下bcp进入数据库系统的表中;exec xp_cmdshell 'type "C:Program FilesMicrosoft SQL ServerMSSQL.1MSSQLLOGSQLAGENT.out"' 重命名SQL Server 代理错误日志,重启sql代理后生效:企业管理器;EXEC msdb.dbo.sp_set_sqlagent_properties @errorlog_file=N'C:Program FilesMicrosoft SQL ServerMSSQL.1MSSQLLOGSQLAGENT.OUT'

发送SQL Server 代理错误消息,使用net send 发送消息,依赖于windows的messenges 服务:企业管理器;EXEC msdb.dbo.sp_set_sqlagent_properties @error_recipient=N'jinsen' 将执行跟踪消息写入到SQL Server 代理错误日志中:配置sql代理,记录跟踪内容;

配置代理错误日志的信息内容类型(错误1、警告2、信息(包含错误跟踪) 4),类型可以叠加:企业管理器;EXEC msdb.dbo.sp_set_sqlagent_properties @errorlogging_level={1|2|4|3|5|7|6}

配置代理错误日志的信息 1.分别建立链接对数据库进行操作,SQLServer可以用,操作Oracle可以用OLEDB或者用System.Data.OracleClient(需要添加引用才能用) 这种方案的优点就是简单,各自写各自的数据库操作代码,缺点就是不能将两个数据库中的表直接进行联合查询,链接Oracle的每台机器必须安装OracleClient才可以使用。

2.使用同义词操作Oracle数据库。

这种方法的具体操作我在以前的文章中已经写清楚了,这样做一来可以进行表的联合查询二来不需要每台机器都安装OracleClient,但是还是有一个缺点:效率低,比如对同义词使用like去查找需要的数据,如果是直接连Oracle数据库也许只要0.1秒就可以找到答案,但是用同义词可能就要等10秒20秒或更久。原来SQLServer并不是直接把查询语句传递给Oracle,让Oracle执行操作,而是将所有数据都取到SQLServer服务器上,边取数据边分析,直到满足查询条件为止。其实这种数据放在两个服务器上还有一个缺点就是一旦Oracle服务器宕机,即使我们这边的所有服务器都是好的,那么我们的程序中用到Oracle数据的地

方就无法使用。

3.直接链接Oracle数据库+同义词+作业+异常跳转方式。

这种方法具体讲就是我们的程序直接用OLEDB(OracleClient)链接Oracle数据库,同时SQLServer服务器也建立了同义词指向Oracle,在SQLServer上建立作业,将同义词中的数据拷贝到SQLServer服务器的表中。一旦Oracle宕机,程序中就会捕捉到异常,于是就使用SQLServer中的数据。这样做比较复杂,需要一定的编程,效率也不是特别高,但是优点也是明细的,平时链接Oralce服务器,异常情况下链接SQLServer中的备份数据,保证了程序的正常运行。

4.直接编写一个程序,以服务或自启动方式一直运行,每隔一段时间将Oracle数据库中的数据写到SQLServer数据库中。

这种方法就是编程复杂,具有很大难度。

5.利用SQLServer2005的复制功能将Oracle数据库中的数据同步到SQLServer服务器中,程序只操作SQLServer,不链接Oracle数据库。

这种方法不需要编写任何代码,由于只对SQLServer进行查询,所以查询效率高可以做多表链接,开发人员也不需要再装OracleClient,也不用害怕Oracle服务器宕机导致我们的相关程序无法使用。优点倒是很多,那么有没有缺点拉?缺点还是有的,主要是取得的数据不是实时的数据,Oracle那边的数据更新了,我们这边还有可能是老数据。

前面的四种方法我就不用多讲了,这次主要是讲第五种方法的具体实现:

1.安装SQLServer复制功能。

在安装SQLServer数据库的时候选上“复制”,将“复制”功能安装到服务器。微软说如果第一次安装的时候没有装,以后再想添加该功能只需要运行安装程序将“复制”选上就可以了,不过说是这么说,我试了几次都不行,我也不知道怎么回事,为了安装上复制,所以将SQLServer卸载了,重新安装!这种方法很笨,不过我实现想不出其他办法了,希望高手指点。

2.设置Oracle服务器端的权限。

创建一个用于复制用的用户,授予下列权限:

CREATE PUBLIC SYNONYM 和DROP PUBLIC SYNONYM

CREATE PROCEDURE

CREATE SEQUENCE

CREATE SESSION

还必须直接为用户授予下列权限(不是通过角色):

CREATE ANY TRIGGER。

CREATE TABLE

CREATE VIEW

同时该用户还必须对要发布的表所在表空间有UNLIMITED的权限,还要针对每个要用于同步的表设置Select权限。

3.SQLServer服务器上安装OracleClient10g

必须安装了才可以链接Oracle服务器,不推荐安装Oracle9i,即使我们要链接的Oracle 是9i的。安装完成以后重启SQLServer服务器。用PLSQL或其他工具测试一下是否可以链接到Oracle服务器。

4.设置SQLServer Agent权限

在SQLServer服务器上新建用户,将该用户加为管理员,在“服务”中找到“SQLServer Agent”,将其启动用户改为该用户,重启该服务。

5.配置分发

相关文档
最新文档