技术需求:
数据库服务器A同步数据库服务器B中的T_JBPM_DBSY(待办事项)表数据,在数据库服务器B中数据发生变化时,A数据库的数据同时也跟着变化,并且记录下变化的数据。
数据库(oracle)数据同步之物化视图
概念:当我们跨本地数据库,访问另外一个数据库表的数据时,本地数据库就必须创建远程数据库的DBLINK
概念:物化视图是包括一个查询结果的数据库对象,它是远程数据的本地副本,或者用来生成基于数据表求和的汇总表,物化视图日志则是记录物化视图在执行时的记录
概念:是表、索引、视图等模式对象的一个别名,是数据库对象的一个代名词
0、在数据服务器中创建用户1或者用户2,可以模拟两个数据库实例 ,创建用户的脚本这里就不写了哈
1、连接数据库服务器B,创建测试表002_T_JBPM_DBSY.sql
2、连接数据库服务器A,创建数据库A和数据库B的连接
createdatabase link DBLINK_A2B
connectto zuo2 identified by "123" using '(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST =192.168.3.65 )(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME =ltxxxt) ))';
3、连接数据库服务器A,测试是否连接通常
SELECT *FROM T_JBPM_DBSY@DBLINK_A2B
4、连接数据库服务器A,创建同义词(非必须)
create synonym T_JBPM_DBSY for T_JBPM_DBSY@DBLINK_A2B
5、连接数据库服务器B,创建物化视图日志,用于记录该表同步日志
create materialized view log on T_JBPM_DBSY
6、连接数据库服务器A,创建物化视图
CREATEMATERIALIZED VIEW T_JBPM_DBSY_A
REFRESHFAST ON DEMAND
STARTWITH TO_DATE('01-01-2014 10:17:18', 'DD-MM-YYYY HH24:MI:SS') NEXTSYSDATE+1/(24*60)
AS
SELECT * FROM"T_JBPM_DBSY"@"DBLINK_A2B" "T_JBPM_DBSY";
7、在数据库服务器B中插入一条数据,等待一分钟….然后查看数据库服务器A中对应的数据
SELECT*FROM T_JBPM_DBSY_A
我们也可以自己通过任务管理系统来同步数据数据
1、在数据库服务器A中创建可执行的刷新数据存储过程
create or replace procedure auto_refresh_materialized_job
as
begin
DBMS_MVIEW.refresh('T_JBPM_DBSY_A',‘C');
end;
2、在数据库服务器A中创建Oracle Job定时执行刷新任务 1分钟秒执行一次
variable jobnonumber;
begin
dbms_job.submit(:jobno,'auto_refresh_materialized_job;', SYSDATE,'SYSDATE+1/(24*60) ');
commit;
end;
3、可以使用给物化视图上加上触发器来获取同步时改变的数据
Create or replace trigger TR_T_JBPM_DBSY_A
after insert or delete or update onT_JBPM_DBSY_A
declare
BEGIN
CASE
WHERE INSERTING THEN
insert intoXXXXX();
WHERE DELETEING THEN
NULL;
WHERE UPDATEING THEN
NULL;
END CASE;
END TR_T_JBPM_DBSY_A_IN
新增(修改、删除)数据库服务器B的T_JBPM_DBSY的数据
在数据库B中查看物化视图日志
select*from mlog$_t_jbpm_dbsy
在数据库服务器中A命令行中手动执行刷新F表示增量C表示全量
execDBMS_MVIEW.refresh('T_JBPM_DBSY_A',‘C');
在需要时候,也可以直接用物化视图中的自动刷新功能
查看数据库正在执行的Job
SELECT*FROM USER_JOBS;
create materialized view log on T_JBPM_DBSY WITH PRIMARY KEY
删除物化视图日志
DROP materialized VIEW log on T_JBPM_DBSY