这两天弄电子学籍的数据库比较头疼,oracle方面不太熟悉只能一点点摸索了,要学的东西太多了。
目前学籍的数据库设计虽然是临时决定稍带拼凑之嫌,不过我觉得还是比较合理的。以市州为分类用4台oracle作为分支数据库,用一台oracle做省级合并的数据库,由于学籍的数据操作主要集中在市州层面,这样的分布式比集中式更能加快处理速度,将来如果有需要数据下放也比较好操作。
但是,面临的主要问题也是明显的,部分跨库操作和数据合并的有效性就是两个问题。
今天基本解决的跨库操作的问题,通过dblink。
首先保证所有的oracle能够识别其他的host,编辑/etc/hosts做命名和IP的对应;
编辑所有的tnsname.ora,保证所有的oracle均能够通过统一的命名访问其他的oracle,这里是oracle3、oracle4、oracle5、oracle6,一台oracle做为数据整合,命名为oracle1。
在所有的oracle上创建DATABASE LINK,为了方面所有的当前数据库操用户的用户名和密码保持一致。
IDENTIFIED BY “xxxx”
USING 'ORACLE3';
CREATE PUBLIC DATABASE LINK “ORACLE4” CONNECT TO “user001”
IDENTIFIED BY “xxxx”
USING 'ORACLE4';
CREATE PUBLIC DATABASE LINK “ORACLE5” CONNECT TO “user001”
IDENTIFIED BY “xxxx”
USING 'ORACLE5';
CREATE PUBLIC DATABASE LINK “ORACLE6” CONNECT TO “user001”
IDENTIFIED BY “xxxx”
USING 'ORACLE6';
这样在某一台数据库上都能够操作其他的数据库,例如
oracle3 sql> select id,name from table1@oracle4;
做insert或者uptate操作类似
但是做数据合并还是存在问题,开始想用快照方式来做,但是4个市州级oracle的数据修改如何合并到oracle1的一张表中?oracle了解太少了。。
一个不伦不类的临时解决方法就是,在4台市州的oracle数据库上做一个crontab,定期用
insert into table1@oracle1(id,name) select id,name from table1;
来从本地将数据插入oracle1的表中,在表中加一个识别字段,只选取新插入或者update的数据。
这样解决还是觉得相当麻烦,表结构要修改,前端脚本也要修改,唉,是个问题。。。