我理解的是,你的需求是将oracle中变化的数据同步到sqlserver中。
我提供的解决方案是使用oracle的ogg,就是goldengate来实现。
首先,这个需求是跨库跨平台的,一般sqlserver都装在win上,而oracle都装在linux上(当然,也有linux版的sqlserver,oracle也能装在win上,但是实现的方法和结果是一样的),但是对于ogg来讲无所谓,ogg的特点就是可以跨库跨平台跨版本来同步数据。
源端是oracle,目标端是sqlserver,可以使用11版本的ogg来同步数据,该版本功能够用,bug也相对少了,我做运维也经常用。
使用ogg的注意事项如下:
源端oracle库的同步表必须有主键。
源端oracle库必须是force logging,必须开附加日志。
初始化数据的时候,可以使用ogg自己的initload功能,省的还得用sqlserver的同步助手,费劲。
oracle和sqlserver支持的字段类型不要太特殊了,比如oracle的lob字段,sqlserver的各种text字段啥的,这些特有的字段,ogg支持不是很好,而对于int、varchar等通用的字段就没问题了。
最后,希望能帮到你,但是ogg这个东西对你来说可能是新的,所以你要用的话,得先学学,有问题可以问我。
--先在A中添加两个字段
alter table A add d varchar2(100);
alter table A add e varchar2(100);
insert into A (a,b,c,d,e) select a,b,c,d,e from B;
commit;
数据类型都一样的么,可以考虑用触发器实现 以oracle数据库为例 有两张表test和test01 字段有id name age sal
create or replace trigger TRIG_UPDATE_TEST
after insert or delete or update on test
for each row
declare
l_id varchar2(50);
l_name varchar2(50);
l_age number;
l_sal number;
begin
if(deleting or updating) then
delete test01
where id=:oldid;
if(deleting) then
return;
end if;
end if;
l_id:=:newid;
l_name:=:newname;
l_age:=:newage;
l_sal:=:newsal;
begin
insert into test01(id,name,age,sal) values(l_id,l_name,l_age,l_sal);
end;
end TRIG_UPDATE_TEST;
再简化点就是在触发器中不声明变量,直接用:new字段代替
哎,没分啊
1 SQLSERVER服务器上面安装oracle客户端,配置服务命名(假设为 test)
2 在SQLSERVER服务器上面建立链接服务器,脚本如下
SQL code
SQL code-- Adding linked server:
exec sp_addlinkedserver @server = 'test' ,
@srvproduct = 'ORACLE',
@provider = 'MSDAORA',
@datasrc = 'test'
-- Adding linked server login:
exec sp_addlinkedsrvlogin @useself='false ', @rmtsrvname = 'test',
@rmtuser = 'user', --数据库用户
@rmtpassword = 'password' --密码
3 建立一个作业,通过作业调度存储过程,存储过程使用类似的语句将oracle的数据插入到sqlserver表中
SQL code
insert into sqlserver表 select from testoracle表名
4 如果要球ORACLE数据是实时增加的,并且ORACLE记录上有递增的字段,可以在SQLSERVER上面建立一个表记录上次插入的id,然后下次可以从上次的ID+1开始继续插入
SQL code
insert into sqlserver表 select from testoracle表名 where id>@id
5 防止sqlserver同步的时候oracle仍在不断的插入,每次要取一个结束ID
SQL code
select @endid=max(id) from testoracle表名
首先为欲导出的数据库建立ODBC数据源,然后启动ACCESS,建立一个空库;然后在命令菜单选文件,获取外部数据,导入,文件类型选择ODBC database,定位ODBC数据源,选择所需数据表,在导入的表上点击右键,选择所需的格式。OK!
序列是Oracle i提供的用于按照设定的规则自动产生数据的方案对象 在某些数据表的结构中 有些字段需要这种特性 比如 对于某个学生数据表的学号关键字段 用户可以希望在录入数据时 能够自动在上一个记录的学号字段上自动加 等 由于Oracle i提供的 种基本数据类型并没有这样的功能 可以通过序列方案对象来实现 序列的创建 下面介绍在企业管理器中如何创建序列 ( )在企业管理器中选择myoracle mynet/方案/序列选项 单击鼠标右键 在出现的快捷菜单里选择创建选项 如图 所示 ( )出现如图 所示的创建序列的一般信息选项卡 在名称文本框里输入待定义的序列的名称 TEMPSEQUENCE 在方案下拉列表框里选择序列所属的用户名 SCOTT 序列类型参数有两个选项 若选择升序单选钮 则表示将创建从初始值向最大值递增的序列 这是创建序列时的默认设置 若选择降序单选钮 则表示将创建从初始值向最小值递减的序列 对值可以进行设置的参数如下 在最小值文本框里设置序列允许的最小值 创建序列时该字段最初为空 如果单击创建按钮时该字段为空 则对升序序列使用默认值 而对降序序列使用默认值 在最大值文本框里设置序列允许的最大值 创建序列时该字段最初为空 如果单击创建按钮后该字段为空 则将对升序序列使用默认值 而对降序序列使用默认值 在时间间隔文本框里设置递增序列递增的间隔数值(升序序列)或递减序列递减的间隔数值(降序序列) 创建序列时该字段最初为空 如果单击创建按钮后该字段为空 将使用默认值 该字段只能为正整数 在初始值文本框里设置序列的起始值 如果单击创建按钮后该字段为空 对升序序列将使用该序列默认的最小值 对降序序列将使用该序列默认的最大值 对选项可以设置的参数如下 若选择循环值复选框 则表示指定在达到序列最小值或最大值之后 序列应继续生成值 对升序序列来说 在达到最大值后将生成最小值 对降序序列来说 在达到最小值后将生成最大值 如果未选择该复选框 序列将在达到最小值或最大值后停止生成任何值 默认情况下是未选择状态 若选择排序值复选框 则指定序列号要按请求次序生成 默认情况下是未选择状态 在高速缓存中设置由数据库预分配并存储的值的数目参数 若选择默认值单选钮 则表示将设置默认值为 默认情况下选择此选项 若选择无高速缓存单选钮 则表示指定不预分配序列值 若选择大小单选钮 则表示在文本框里输入可接受的值 最小值为 对循环序列来说 该值必须小于循环中值的个数 如果序列能够生成的值数的上限小于高速缓存大小 则高速缓存大小将自动改换为该上限数 完成设置后单击创建按钮 ( )成功创建序列后 出现如图 所示界面 单击 确定 按钮 ( )读者也可以在SQLPlus Worksheet中执行下列SQL程序创建序列 ―――――――――――――――――――――――――――――――――――――CREATE SEQUENCE SCOTT TEMPSEQUENCE INCREMENT BY START WITH MAXVALUE E MINVALUE NOCYCLE CACHE NOORDER―――――――――――――――――――――――――――――――――――――配套程序位置 第 章\ createsequence sql 序列的使用 下面介绍在向数据表中插入数据时如何使用序列 ( )首先为实例建立一个数据表 SCOTT SEQUENCE_TABLE 为简化起见 该数据表仅包含一个类型为 NUMBER 的数据列 NO 在如图 所示的创建表的一般信息选项卡中进行如下设置 在名称文本框中输入 SEQUENCE_TABLE 在方案下拉列表框中选择 SCOTT 在表空间下拉列表框中选择 USERS 在名称单元格中输入 NO 在数据类型下拉列表框单元格中选择 NUMBER 完成设置后单击创建按钮 ( )读者也可以在SQLPlus Worksheet中执行下列SQL代码创建数据表 SCOTT SEQUENCE_TABLE ―――――――――――――――――――――――――――――――――――――CREATE TABLE SCOTT SEQUENCE_TABLE ( NO NUMBER( ) NOT NULL)TABLESPACE USERS ―――――――――――――――――――――――――――――――――――――配套程序位置 第 章\ createsequencetable sql ( )在插入新的记录时 使用刚创建的 TEMPSEQUENCE 序列来自动产生 NO 数据列的值 在SQLPlus Worksheet里执行下面的SQL代码 执行的结果如图 所示 ―――――――――――――――――――――――――――――――――――――INSERT INTO SCOTT SEQUENCE_TABLE(NO)VALUES(SCOTT TEMPSEQUENCE NEXTVAL);―――――――――――――――――――――――――――――――――――――配套程序位置 第 章\ insertsequencetable sql SCOTT TEMPSEQUENCE NEXTVAL 表分配下一个惟一的 可用的序列号 执行 SCOTT TEMPSEQUENCE NEXTVAL 后 可以使用 SCOTT TEMPSEQUENCE CURRVAL 来标识上一个已经存储的序列值 ( )在SQLPlus Worksheet中可以执行查询数据表 SCOTT SEQUENCE_TABLE 数据的语句 执行结果如图 所示 表明序列 SCOTT SEQUENCE 产生的值已经成功录入数据表中 ―――――――――――――――――――――――――――――――――――――select from scott sequence_table;―――――――――――――――――――――――――――――――――――――配套程序位置 第 章\ selectsequencetable sql 序列的删除 下面介绍在企业管理器中如何删除序列 ( )在创建好的序列 SEQUENCE 上用单击鼠标右键 在出现的快捷菜单里选择移去选项 如图 所示 ( )出现如图 所示的删除序列确认界面 单击是按钮 lishixinzhi/Article/program/Oracle/201311/17301
源表中有没有一个自然增长的、与写入顺序相关的字段,比如ID、写入时间?如果有,就做一个定时运行的JOB,如每小时或每6小时,间隔根据你的需要而定;再建一个同步记录表,记录每次同步时已经同步的数据,比如ID、时间,下次JOB运行时,从上次同步过的记录往后继续追加到新库。
如果是唯一的ID,可以在JOB启动时读取源表当前最大的ID,然后追加上次同步的ID+1到最大ID范围的数据到新库,成功后在同步记录里记录当前最大的ID,作为下次同步的起始依据。
如果有时间,那就根据你的JOB运行间隔,每次只追加在时间间隔内写入的数据,比如12:00:00000到12:00:00999时间范围内的数据,然后下次追加13:00:00000到13:00:00999。
如果啥都没有,那就只好定时全表刷新,先TRUNCATE目标表,然后源表整个复制过来,不过这样做随着时间推移数据激增,效率是相当可怕的。
以上就是关于SQL SERVER2012同步Oracle数据全部的内容,包括:SQL SERVER2012同步Oracle数据、oracle数据库中表a数据同步到、急,在线等!如何在两个oracle数据库之间的相同结构的两个表实现数据的同步更新,dblink已经建好了等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)