读书人

ORACLE快照原理及兑现总结

发布时间: 2013-03-25 15:43:04 作者: rapoo

ORACLE快照原理及实现总结

转:http://blog.csdn.net/lingo00/article/details/5494299

需要将业务数据库里所有的数据同步到另外一个处理服务器上。在做方案的时候,想了很多方法,当然最快的办法还是使用物理热备的方式。
  但是我个人认为如果对于中大型数据库(我们的数据库有300G左右)最佳的选择还是使用SnapShot方式,即快照的方式。
  Oracle数据库的快照是一个表,它包含有对一个本地或远程数据库上一个或多个表或视图的查询的结果。也就是说快照根本的原理就是将本地或远程数据库上的一个查询结果保存在一个表中。
  以下是我建立的Snapshot,目的是从业务数据库上将数据Copy到处理数据库上,是不同的两个服务器之间对数据copy。
  第一步:在处理服务器上的Oracle终端,建立database link,业务数据库服务器SID为TEST
  create database link TEST_DBLINK.US.ORACLE.COM
  connect to AMICOS identified by AMICOS
  using ’test’;
  第二步:在业务数据库上对应的表建立快照日志
  Create snapshot log on A_Table;
  第三步:建立Snapshot 快照名称为:Test_SnapShot
  Create snapshot Test_SnapShot
  REFRESH COMPLETE START WITH SYSDATE NEXT SYSDATE+1/24
  as select * from A_Table@TEST_DBLINK
  说明:REFRESH是刷新方法
  刷新方式有:COMPLETE和FAST两种,而START WITH是说明开始执行的时间。
  Next是下次执行的时间
  而AS以后是构成快照的查询方法。
  相关的方法:
  更改快照
  ALTER SNAPSHOT Test_SnapShot
  REFRESH COMPLETE START WITH SYSDATE NEXT SYSDATE+1/2;
  手动刷新快照 在命令界面执行:
  EXEC DBMS_SNAPSHOT.REFRESH(’Test_SnapShot ’,’C’);
  第一个参数是要刷新的快照名
  第二个参数是刷新的方式,F----FAST, C---COMPLETE
  查看快照最后刷新的日期
  SELECT NAME,LAST_REFRESH
  FROM ALL_SNAPSHOT_REFRESH_TIMES;
  考试大整理最后非常的方案:
  1:为需要做Snapshot的表建立Snapshot日志
  create snapshot log on t1 with rowid; 这里使用ROWID建立日记的参数
  2:采用Fast的方式建立快照,使用rowid做为参考参数
  create snapshot fb_test_b refresh fast with rowid start with sysdate next sysdate+1/1440 as select * from fb_test_b@my_dblink;
  最好能按照rowid来建立快照。要不然就必须要为表建立Primary Key。

?

?

?

?

?????

--名词说明:源——被同步的数据库目的——要同步到的数据库前6步必须执行,第6以后是一些辅助信息.--1、在目的数据库上,创建dblinkdrop public database link dblink_orc92_182;Create public DATABASE LINK dblink_orc92_182 CONNECT TO bst114 IDENTIFIED BY password USING 'orc92_192.168.254.111';--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、在目的数据库上,测试dblinkselect * from ; //查询的是源数据库的表select * from test_user;--4、在源数据库上,创建要同步表的快照日志Create snapshot log on test_user;--5、创建快照,在目的数据库上创建快照Create snapshot sn_test_user as select * from ;--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、手动刷新快照,在没有自动刷新的情况下,可以手动刷新快照.手动刷新方式1begindbms_refresh.refresh(''sn_test_user'');end;手动刷新方式2EXEC 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_AFRafter insert or update or delete on sn_test_userfor each rowbeginif deleting thendelete from test_user where > end if;if inserting theninsert into test_user(id,name)values(:new.id,:new.name);end if;if updating thenupdate test_user set where > end if;end TRI_test_user_AFR;--13.如果你想双向同步,请在源数据库中执行前6步,并在双方都创建以下触发器(当源数据库表改变时,目的数据库表跟着改变,目的数据库表改变时,源数据库表也改变)CREATE OR REPLACE TRIGGER BST114.TRI_TEST_USER_AFRAFTER DELETE OR INSERT OR UPDATEON BST114.SN_TEST_USER REFERENCING NEW AS NEW OLD AS OLDFOR EACH ROWdeclaretmp_id number(10):=-1;begindbms_output.put_line(''begin'');if inserting then--select id into tmp_id from test_user where for p in(select id from test_user where > looptmp_id:=p.id;end loop;dbms_output.put_line(tmp_id||''===------------'');if (tmp_id=-1) theninsert into test_user(id,name,age)values(:new.id,:new.name,:new.age);end if;end if;if updating thendbms_output.put_line(''updated'');for p in(select name,age from test_user where > loopif (p.name!=:new.name) or (p.age!=:new.age) thenupdate test_user set where > end if;end loop;end if;if deleting thendbms_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

?

?http://blog.chinaunix.net/uid-9789791-id-3351599.html

读书人网 >其他数据库

热点推荐