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上的应用一无所知。
也就是说,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';
然后通过建立触发器。
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、建立一个和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上的应用一无所知。
也就是说,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';
然后通过建立触发器。
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、建立一个和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的表,每天生成一个新的分区(事实上可以预先定义很多分区)来存储每天的数据,那样就只能一次性定义触发器而不需要每天生成。而且就统计角度来说也方便很多。当然这样必然牵涉到应用程序的修改,是否采用要看楼主自己的判断。