设为首页 收藏本站
查看: 1040|回复: 0

[经验分享] 利用oracle快照dblink解决数据库表同步

[复制链接]

尚未签到

发表于 2018-9-12 09:54:30 | 显示全部楼层 |阅读模式
  1、在目的数据库上,创建dblink
  drop public database link dblink_orc92_182;

  Create public DATABASE LINK dblink_orc92_182 CONNECT TO bst114>  --dblink_orc92_182 是dblink_name
  --bst114 是 username
  --password 是 password
  --''orc92_192.168.254.111'' 是远程数据库名
  2、在源和目的数据库上创建要同步的表(最好有主键约束,快照才可以快速刷新)
  drop table test_user;
  create table test_user(id number(10) primary key,name varchar2(12),age number(3));
  3、在目的数据库上,测试dblink
  select * from test_user@dblink_orc92_182;    //查询的是源数据库的表
  select * from test_user;
  4、在源数据库上,创建要同步表的快照日志
  Create snapshot log on test_user;
  5、创建快照,在目的数据库上创建快照
  Create snapshot sn_test_user as select * from test_user@dblink_orc92_182;
  6、设置快照刷新时间(只能选择一种刷新方式,推荐使用快速刷新,这样才可以用触发器双向同步)
  快速刷新
  Alter snapshot sn_test_user refresh fast Start with sysdate next sysdate with primary key;
  --oracle马上自动快速刷新,以后不停的刷新,只能在测试时使用.真实项目要正确权衡刷新时间.
  完全刷新
  Alter snapshot sn_test_user refresh complete Start with sysdate+30/24*60*60 next sysdate+30/24*60*60;
  --oracle自动在30秒后进行第一次完全刷新,以后每隔30秒完全刷新一次
  7、手动刷新快照,在没有自动刷新的情况下,可以手动刷新快照.
  手动刷新方式1
  begin
  dbms_refresh.refresh(''sn_test_user'');
  end;
  手动刷新方式2
  EXEC DBMS_SNAPSHOT.REFRESH(''sn_test_user'',''F'');  //第一个参数是快照名,第二个参数 F 是快速刷新 C 是完全刷新.
  8.修改会话时间格式
  ALTER SESSION SET NLS_DATE_FORMAT = ''YYYY-MM-DD HH24:MI:SS'';
  9.查看快照最后一次刷新时间
  SELECT NAME,LAST_REFRESH FROM ALL_SNAPSHOT_REFRESH_TIMES;
  10.查看快照下次执行时间
  select last_date,next_date,what from user_jobs order by next_date;
  11.打印调试信息
  dbms_output.put_line(''use ''||''plsql'');
  12.如果你只想单向同步,那么在目的数据库创建以下触发器(当源数据库表改变时,目的数据库表跟着改变,但目的数据库表改变时,源数据库表不改变).
  create or replace trigger TRI_test_user_AFR
  after  insert or update or delete on sn_test_user
  for each row
  begin
  if deleting then

  delete from test_user where>  end if;
  if inserting then
  insert into test_user(id,name)
  values(:new.id,:new.name);
  end if;
  if updating then

  update test_user set ;where>  end if;
  end TRI_test_user_AFR;
  13.如果你想双向同步,请在源数据库中执行前6步,并在双方都创建以下触发器(当源数据库表改变时,目的数据库表跟着改变,目的数据库表改变时,源数据库表也改变)
  CREATE OR REPLACE TRIGGER BST114.TRI_TEST_USER_AFR
  AFTER DELETE OR INSERT OR UPDATE
  ON BST114.SN_TEST_USER
  REFERENCING NEW AS NEW OLD AS OLD
  FOR EACH ROW
  declare
  tmp_id number(10):=-1;
  begin
  dbms_output.put_line(''begin'');
  if inserting then

  --select>
  for p in(select>  loop
  tmp_id:=p.id;
  end loop;
  dbms_output.put_line(tmp_id||''===------------'');
  if (tmp_id=-1) then
  insert into test_user(id,name,age)
  values(:new.id,:new.name,:new.age);
  end if;
  end if;
  if updating then
  dbms_output.put_line(''updated'');

  for p in(select name,age from test_user where>  loop
  if (p.name!=:new.name) or (p.age!=:new.age) then

  update test_user set name=:new.name,age=:new.age where>  end if;
  end loop;
  end if;
  if deleting then
  dbms_output.put_line(''deleted'');

  delete from test_user where>  end if;
  dbms_output.put_line(''end'');
  end TRI_test_user_AFR;
  --为防止双向同步触发器死循环,所以要在触发器中增加一些判断,阻止死循环.
  --以上同步原理
  1.首先创建一个dblink,可以访问远程数据库
  2.在本地创建一个快照,映射远程数据表,当远程数据表有变化时,会反应到快照中.
  3.由于快照类似于视图表,所以在本地为快照创建一个触发器,当快照有变化时,会触发相应事件.
  4.在触发器中写同步数据的代码.
  --附:快照刷新时间参数说明
  一天的秒数=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


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-573206-1-1.html 上篇帖子: oracle数据库审计设置 下篇帖子: oracle同步源表job脚本
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表