【同步流水表的问题】

时间:2022-02-20 03:53:45
现状:
a库:oracle
a库每天都会产生一张流水表,表名为L20031231,随日期不同表名不同,记录数为三十万条左右。
b库:sql server
b库尚未建立应用

要实现的目标:
在b库中同步当天的流水表,每隔五分钟同步一次。
要求不能更改a库及a库上的应用程序,也不能对a库上的已有程序运行造成很大的影响。
本来这属于sql server上的编程问题,在sql server版问过,没有得到满意的答案,在这里再尝试一下。

有朋友建议使用DTS,可是让管理员每天去修改一下这个DTS包,更改目标表名称是不现实的,这些应该由系统自动完成。本人已经在这个问题上花费了比较大的功夫:建立了DTS包;建立了调用包的windows服务;
但进行到这一步时对已做的产生了怀疑,不知这个方案究竟可不可行,或者有没有别的解决方案。

请高手指点。

7 个解决方案

#1


为什么要把oracle的表搞到sql server上呢??

#2


因为可能要对这些表进行进一步的处理,期望对这些表的操作不会影响到a和a上的应用。
也就是说,a扮演了数据源的角色,它对b和b上的应用一无所知。

#3


我也有这方面的问题MYSQL->Oracle
最后没办法只好写个程序解决了

#4


1、安装 Microsoft Data Access Components (MDAC)SDK ODBC driver
2、建立 SQL SERVER 数据源
test连接上我的test数据库
3、配置tnsnames.ora. (ORACLE_HOME\NETWORK\ADMIN)
   test=
      (DESCRIPTION=
        (ADDRESS=
           (PROTOCOL=tcp)
           (HOST=<IP地址>)
           (PORT=1521)
        )
        (CONNECT_DATA=
           (SID=test)
        )
        (HS=)
      )
4、配置listener.ora. (ORACLE_HOME\NETWORK\ADMIN)
   (SID_DESC=
      (SID_NAME=test)
      (ORACLE_HOME=c:\Oracle\iSuites)
      (PROGRAM=hsodbc)
   )
5、重启ORACLE监听.
   CMD
   LSNRCTL STOP
   LSNRCTL START
   LSNRCTL STATUS
6、添加网关配置文件. (ORACLE_HOME\HS\ADMIN)
   文件名为:inittest.ora
   文件内容:
   #
   # HS init parameters
   #
   HS_FDS_CONNECT_INFO = test
   HS_FDS_TRACE_LEVEL = 0
   #
   # Environment variables required for the non-Oracle system
   #
   #set <envvar>=<value>
7、进入ORACLE SQL*PLUS,建立数据库链.
  CREATE DATABASE LINK TOSQL USING 'test';

然后通过建立触发器。

#5


LGQDUCKY(飘):
不大了解您的意思...

#6


友情up...

#7


我的思路:

1、建立一个和L20031231相同结构的表用于同步,假定命名为L_TRANS
2、每次建立L20031231表时生成一个after insert触发器,把存取纪录到L表时同时存入L_TRANS
3、定时把L_TRANS表中的纪录传送到SQL SERVER数据库,可以通过定宽的文本文件传输,传输完成以后清空L_TRANS表

优点:
每次同步的数据量少,缩短同步时间,否则的话就必须每次读取整个大表,操作费时;简化数据传输的跟踪和维护
缺点:
为了保证每次传输之后TRUNCATE L_TRANS表之间没有新的数据写入,必须在开始传输以前锁定L_TRANS表(LOCK TABLE L_TRANS IN EXCLUSIVE MODE),这样就造成了在传输过程中系统对L_TRANS表和L20031231的写操作被禁止,在应用程序中必须考虑到这一点。

其他建议:
处理象L20031231这样每天增长很快的大表,个人认为用分区表比分成多个表更容易管理。比如建议一个叫做L的表,每天生成一个新的分区(事实上可以预先定义很多分区)来存储每天的数据,那样就只能一次性定义触发器而不需要每天生成。而且就统计角度来说也方便很多。当然这样必然牵涉到应用程序的修改,是否采用要看楼主自己的判断。

#1


为什么要把oracle的表搞到sql server上呢??

#2


因为可能要对这些表进行进一步的处理,期望对这些表的操作不会影响到a和a上的应用。
也就是说,a扮演了数据源的角色,它对b和b上的应用一无所知。

#3


我也有这方面的问题MYSQL->Oracle
最后没办法只好写个程序解决了

#4


1、安装 Microsoft Data Access Components (MDAC)SDK ODBC driver
2、建立 SQL SERVER 数据源
test连接上我的test数据库
3、配置tnsnames.ora. (ORACLE_HOME\NETWORK\ADMIN)
   test=
      (DESCRIPTION=
        (ADDRESS=
           (PROTOCOL=tcp)
           (HOST=<IP地址>)
           (PORT=1521)
        )
        (CONNECT_DATA=
           (SID=test)
        )
        (HS=)
      )
4、配置listener.ora. (ORACLE_HOME\NETWORK\ADMIN)
   (SID_DESC=
      (SID_NAME=test)
      (ORACLE_HOME=c:\Oracle\iSuites)
      (PROGRAM=hsodbc)
   )
5、重启ORACLE监听.
   CMD
   LSNRCTL STOP
   LSNRCTL START
   LSNRCTL STATUS
6、添加网关配置文件. (ORACLE_HOME\HS\ADMIN)
   文件名为:inittest.ora
   文件内容:
   #
   # HS init parameters
   #
   HS_FDS_CONNECT_INFO = test
   HS_FDS_TRACE_LEVEL = 0
   #
   # Environment variables required for the non-Oracle system
   #
   #set <envvar>=<value>
7、进入ORACLE SQL*PLUS,建立数据库链.
  CREATE DATABASE LINK TOSQL USING 'test';

然后通过建立触发器。

#5


LGQDUCKY(飘):
不大了解您的意思...

#6


友情up...

#7


我的思路:

1、建立一个和L20031231相同结构的表用于同步,假定命名为L_TRANS
2、每次建立L20031231表时生成一个after insert触发器,把存取纪录到L表时同时存入L_TRANS
3、定时把L_TRANS表中的纪录传送到SQL SERVER数据库,可以通过定宽的文本文件传输,传输完成以后清空L_TRANS表

优点:
每次同步的数据量少,缩短同步时间,否则的话就必须每次读取整个大表,操作费时;简化数据传输的跟踪和维护
缺点:
为了保证每次传输之后TRUNCATE L_TRANS表之间没有新的数据写入,必须在开始传输以前锁定L_TRANS表(LOCK TABLE L_TRANS IN EXCLUSIVE MODE),这样就造成了在传输过程中系统对L_TRANS表和L20031231的写操作被禁止,在应用程序中必须考虑到这一点。

其他建议:
处理象L20031231这样每天增长很快的大表,个人认为用分区表比分成多个表更容易管理。比如建议一个叫做L的表,每天生成一个新的分区(事实上可以预先定义很多分区)来存储每天的数据,那样就只能一次性定义触发器而不需要每天生成。而且就统计角度来说也方便很多。当然这样必然牵涉到应用程序的修改,是否采用要看楼主自己的判断。