经过对各种资料的整理,总结出的东西,
一、同步原理
1.首先创建一个dblink,可以访问远程数据库
2.在本地创建一个快照,映射远程数据表,当远程数据表有变化时,会反应到快照中.
3.由于快照类似于视图表,所以在本地为快照创建一个触发器,当快照有变化时,会触发相应事件.
4.在触发器中写同步数据的代码.
二、创建DBLink(在目标数据库)
drop public database link dblink_ora10g_exchange;
create public DATABASE LINK dblink_ora10g_exchange connect to zyh IDENTIFIED BY db123 USING ''ora10g_192.168.30.100'';
--dblink_ora10g_exchange 是dblink_name
--zyh 是 username
--db123 是 password
--'ora10g'是远程数据库名
三、创建要同步的表(源数据库和目标数据库都要)
create table user(); //省略
四、测试dblink
select * from user@dblink_ora10g_exchange ; //查询的是源数据库的表
select * from user;
五、创建要同步表的快照日志
create snapshot log on user; //如果不建立日志,则不能进行快速刷新
六、创建快照,在目的数据库上创建快照
create snapshot sn_user as select * from user@dblink_orca10g_exchange;
七、设置快照刷新时间
1.快速刷新 Alter snapshot sn_test_user refresh fast Start with sysdate next sysdate with primary key;
--oracle马上自动快速刷新,以后不停的刷新,只能在测试时使用.真实项目要正确权衡刷新时间.
2.完全刷新 Alter snapshot sn_test_user refresh complete Start with sysdate+30/24*60*60 next sysdate+30/24*60*60;
--oracle自动在30秒后进行第一次完全刷新,以后每隔30秒完全刷新一次
3.手动刷新快照,在没有自动刷新的情况下,可以手动刷新快照.
手动刷新方式1
begin
dbms_refresh.refresh(''sn_test_user'');
end;
手动刷新方式2
EXEC DBMS_SNAPSHOT.REFRESH(''sn_test_user'',''F'');
//第一个参数是快照名,第二个参数 F 是快速刷新 C 是完全刷新.
八、附录
1.时间
一天的秒数=24小时*60分钟*60钞
所以要想在30秒后刷新,参数应该这样写 sysdate+30/(24*60*60)
1分钟==sysdate+60/(24*60*60)
一天的分钟数=24小时*60分钟
一分钟也可以这样写 sysdate+1/(24*60)
30分钟==sysdate+30/(24*60)
60分钟==sysdate+60/(24*60)
以此类推
1小时==sysdate+1/24==sysdate+60/(24*60)
1天==sysdate+1
一个月==sysdate+30
2.修改会话时间格式
ALTER SESSION SET NLS_DATE_FORMAT = ''YYYY-MM-DD HH24:MI:SS'';
3.查看快照最后一次刷新时间
SELECT NAME,LAST_REFRESH FROM ALL_SNAPSHOT_REFRESH_TIMES;
4.查看快照下次执行时间
select last_date,next_date,what from user_jobs order by next_date;
5.打印调试信息
dbms_output.put_line(''use ''||''plsql'');