自己想了一个方案,抛砖引玉:
鉴于使用程序直接访问这些数据库所不可避免的网络带宽及查询性能低下的问题,考虑使用在本地建立oracle数据库,然后通过同步策略将所有数据库需要的数据集中存储。这样就解决了以上的问题。查询性能会得到极大提升。具体实现如下:
1. 建立本地oracle数据库(注意字符集的合理设置),并建立连接到其它oracle数据库的dblink。
2. 对其它oracle数据库,如是大表则建立物化视图,并设置更新频率,如是小表,则直接通过dblink访问。
3. 对sybase数据库,在初次使用时,使用DBArtisan的数据迁移工具将所需表从sybase
迁移到本地oracle数据库,然后在sybase数据库的所需表上建立trigger,将这些表上的所有删除、插入以及更新操作记录在history表中。
如果这些表名都是大写的,则直接迁移即可,若表是小写的,直接迁移会出错,因为在迁移时,会对这些小写的表名前加引号,这会造成在oracle中创建的表对象强制小写,而数据库无法正常访问这些表(除了表名,还有字段名的大小写)。
如果系统允许的话,将这些小写的表名改为大写,这样在迁移时,会省掉许多麻烦。
所以,针对这种情况,在迁移数据之前,使用DBArtisan的抽取工具将表及索引的创建脚本抽取出来,然后在本地oracle的数据执行。在抽取时,有几个选项要设置:“Script If Not Exists=false”、“Include Views=false”、 “Include Rules=false”、 “Include Triggers=false”、 “Include Procedure=false”、“Script Use Statement=false”、“owner=Change Owner”、“Change Owner To=oracle user”。然后对脚本再做以下处理:将“LOCK ALLPAGES”、“LOCK DATAPAGES”、“LOCK DATAROWS”全部删除,将“GO”替换为“;”,将sybase的数据类型替换为oracle的数据类型,如varchar替换为varchar2。
在迁移时,有几个选项要设置:“Owner=Change Owner”、“Change Owner To=oracle user”、“Use Dependency Translators=False”、“Script Dependencies=False”、“Group Dependencies=False”、“”、、“Data Movement=Data Copy”(如果为“Insert Statements”,插入1W条记录大约要1分钟,但是如果使用“Data Copy”选项,插入100W条记录只需要大约30秒)
4. 对db2数据库,与sybase的处理类似。
5. 对sql server数据库,与sybase的处理类似。
6. 最后,在本地的oracle中加入job,定时通过java程序访问非oracle的数据库,将history表读取至本地并删除这些history表的记录(在读取记录时,可先将history表读取至history_tmp表(与history表结构一致),然后再将history_tmp表中的记录读取至本地数据库,然后再根据history_tmp的记录来删除history中的记录。因为读取过程也要花一些时间,在这段时间中,可能会有新的记录插入至history表,如果直接读取history表,然后删除所有记录,可能会造成数据丢失)。然后根据这些记录来更新本地数据库中的相应表。
注:为每张需要定时同步的表建立一张history表,history表结构与对应表一致,并增加两个字段:update_type(insert、delete、update),update_date