目录
1. 测试目标
多地分公司数据实时同步到集团中心数据库中,然后在集团中心库对指定数据进行修改,修改后的数据可以实时推回到对应分公司数据库中。
2. 测试环境
2.1 测试数据库
3台Oracle服务器s1、s2和s3,其中s1和s2代表分库,s3代表中心库。
2.2 创建测试表
在服务器s1创建测试表t_share_pool_s1
create table scott.t_share_pool_s1(ID NUMBER(15) NOT NULL, COMPANY_CODE VARCHAR2(10) NOT NULL,WORK_F1 VARCHAR2(10), WORK_F2 VARCHAR2(10),LAST_TIME DATE,PRIMARY KEY(ID,COMPANY_CODE))
插入测试数据
declare
count2 int := 1;
begin
while count2<=1000 loop
insert into scott.t_share_pool_s1 (ID, COMPANY_CODE, WORK_F1, WORK_F2, LAST_TIME) values(count2,'S1','w1_0','w2_0',sysdate);
count2 := count2+1;
end loop;
commit;
end;
在服务器s2创建测试表t_share_pool_s2
create table scott.t_share_pool_s2(ID NUMBER(15) NOT NULL, COMPANY_CODE VARCHAR2(10) NOT NULL,WORK_F1 VARCHAR2(10),WORK_F2 VARCHAR2(10), LAST_TIME DATE,PRIMARY KEY(ID,COMPANY_CODE))
插入测试数据
declare
count2 int := 1;
begin
while count2<=1000 loop
insert into scott.t_share_pool_s2 (ID, COMPANY_CODE, WORK_F1, WORK_F2, LAST_TIME) values(count2,'S2','w1_0','w2_0',sysdate);
count2 := count2+1;
end loop;
commit;
end;
在服务器s3创建测试表t_share_pool
create table scott.t_share_pool(ID NUMBER(15) NOT NULL, COMPANY_CODE VARCHAR2(10) NOT NULL,WORK_F1 VARCHAR2(10),WORK_F2 VARCHAR2(10),LAST_TIME DATE, PRIMARY KEY(ID,COMPANY_CODE))
2.3 开启数据库归档
依次在s1、s2、s3数据库执行以下SQL
sqlplus / as sysdba
shutdown immediate;
startup mount;
alter database archivelog;
alter database open;
alter database add supplemental log data (primary key ,unique index) columns;
2.4 s3建立同步用户
-- Create the user
create user BEEDI identified by BEEDI default tablespace USERS temporary tablespace TEMP;
-- Grant/Revoke role privileges
grant connect to BEEDI;
grant resource to BEEDI;
-- Grant/Revoke system privileges
grant delete any table to BEEDI;
grant insert any table to BEEDI;
grant select any table to BEEDI;
grant unlimited tablespace to BEEDI;
grant update any table to BEEDI;
2.5 配置同步任务
2.5.1 安装BeeDI
运行BeeDI SE安装程序,依次选择【下一步】按钮,直到弹出软件注册窗口,如下图示:
点击窗口中的 按钮,弹出软件注册对话框,如下图示:
点击【查找】按钮,导入BeeDI授权文件,然后选择【确认】按钮关闭【软件注册】对话框,安装向导弹出界面如下图示:
选择软件安装目录后,点击【下一步】按钮,安装程序开始拷贝文件到安装目录,之后出现完成安装窗口,如下图示:
启动BeeDI后,弹出登录对话框,如下图所示。
提示:BeeDI 安装后,默认创建两个用户admin和guest,其密码均为空。
输入正确的用户和密码后,点击[确定],进入BeeDI
2.5.2 全量任务
全量同步任务用于将s1和s2中现有数据同步合并到数据库s3,操作如下:
选择工具栏[新建文件]按钮,在[新建作业]对话框的[作业名称]输入sync_full,[类型]选择ETL模板,点击[确定]按钮创建作业文件。
依次建立到s1、s2、s3的数据库连接,,其中s1和s2可使用sys连接,s3使用beedi连接。从s1拖拽表节点scott.t_share_pool_s1到s3的表节点scott.t_share_pool上释放鼠标,再从s2拖拽表节点scott.t_share_pool_s2到s3的表节点scott.t_share_pool上释放鼠标,结果如下:
选择工具栏[启动]按钮执行作业sync_full,结果如下:
2.5.3 增量任务
增量同步任务用于实时同步分库数据变化到中心库,同时对于中心库的数据变化,根据数据来源推回到对应分库。
选择工具栏[新建文件]按钮,在[新建作业]对话框的[作业名称]输入sync_log_up,[类型]选择ETL模板,点击[确定]按钮创建分库到中心库的增量同步作业文件。
依次建立到s1、s2、s3的数据库连接,其中s1和s2可使用sys连接,s3使用beedi连接。从s1拖拽表节点scott.t_share_pool_s1到s3的表节点scott.t_share_pool上释放鼠标,再从s2拖拽表节点scott.t_share_pool_s2到s3的表节点scott.t_share_pool上释放鼠标,结果如下:
点击scott.t_share_pool_s1对应抽取组件窗口的[选项]按钮,弹出[选项]对话框,点击[增量抽取]复选框,弹出[增量抽取设置]对话框,操作如下图:
选择[日志]按钮,拖拽主键列ID和COMPANY_CODE到逻辑主键窗口,[解析点]使用默认时间,取消[分解UPDATE]复选,完成后的界面配置如下:
点击[返回]按钮关闭[增量抽取设置]对话框,显示界面如下:
点击[确定]按钮关闭抽取组件[选项]对话框。
点击scott.t_share_pool_s2抽取组件窗口的[选项]按钮,重复以上步骤,完成基于日志的增量设置。
选择工具栏[启动]按钮执行作业sync_log_up,结果如下:
选择工具栏[新建文件]按钮,在[新建作业]对话框的[作业名称]输入sync_log_down,[类型]选择ETL模板,点击[确定]按钮创建中心库到分库的增量同步作业文件。
依次建立到s3、s1、s2的数据库连接,其中s3、s1和s2可使用sys连接。从s3拖拽表节点scott.t_share_pool到模板建立抽取组件,操作如下:
右键点击s1表结点scott.t_share_pool_s1,从快捷菜单选择[装载]命令在模板建立装载组件,操作如下:
右键点击s2表结点scott.t_share_pool_s2,从快捷菜单选择[装载]命令在模板建立装载组件,操作结果如下:
拖拽scott.t_share_pool对应抽取组件的映射拖拽点到scott.t_share_pool_s1对应的装载组件窗口,弹出[全表映射模式设置]对话框,选择[列名匹配映射],点击[确定]按钮完成抽取组件到装载组件的列映射,操作结果如下:
再次拖拽scott.t_share_pool对应抽取组件的映射拖拽点到scott.t_share_pool_s2对应的装载组件窗口,选择[列名匹配映射],建立scott.t_share_pool抽取组件到scott.t_share_pool_s2装载组件的列映射,完成后界面如下:
点击scott.t_share_pool对应抽取组件窗口的[选项]按钮,弹出[选项]对话框,点击[增量抽取]复选框,弹出[增量抽取设置]对话框,操作如下图:
选择[日志]按钮,拖拽主键列ID和COMPANY_CODE到逻辑主键窗口,[解析点]使用默认时间,取消[分解UPDATE]复选,[忽略用户]输入beedi,完成后的界面配置如下:
点击[返回]按钮关闭[增量抽取设置]对话框,显示界面如下:
点击[确定]按钮关闭抽取组件[选项]对话框。
点击scott.t_share_pool_s1对应装载组件窗口的[选项]按钮,弹出[选项]对话框,点击[过滤表达式]输入按钮,弹出[过滤表达式脚本设置]对话框,在其中输入过滤脚本equals(query_15.COMPANY_CODE,"S1"),操作如下图:
(注:此处query_15表示抽取组件名,可用实际组件名替换)
点击[确定]按钮关闭[过滤表达式脚本设置]对话框,显示界面如下:
点击[确定]按钮关闭装载组件[选项]对话框。
点击scott.t_share_pool_s2装载组件窗口的[选项]按钮,重复以上操作设置过滤表达式equals(query_15.COMPANY_CODE,"S2"),结果如下。
(注:此处query_15表示抽取组件名,可用实际组件名替换)
选择工具栏[启动]按钮执行作业sync_log_down,结果如下:
右键点击调度窗口的作业sync_full,在快捷菜单中选择[删除]命令将该作业从调度窗口删除。
使用CTRL键,选中调度窗口的作业sync_log_up和sync_log_down,
选择 [定时]按钮,弹出[作业定时设置]对话框,点击[确定]按钮,操作结果如下图:
3. 测试步骤
3.1 全量同步
依次将s1和s2表数据同步到s3,查询观察中心库数据是否一致。
作业sync_full执行成功后,s1和s2分库数据与中心库数据一致
3.2 实时同步
3.2.1 增删改合并
分别对s1和s2的表进行5次增删改操作,查询观察中心库数据是否一致。
declare
count2 int := 1001;
begin
while count2<=1005 loop
insert into scott.t_share_pool_s1 (ID, COMPANY_CODE, WORK_F1, WORK_F2, LAST_TIME) values(count2,'S1','w1_0','w2_0',sysdate);
update scott.t_share_pool_s1 set work_f1 = 'w1_88',work_f2='w2_88' where ID = count2 and COMPANY_CODE = 'S1';
delete from scott.t_share_pool_s1 where ID = count2 and COMPANY_CODE = 'S1';
count2 := count2+1;
end loop;
commit;
end;
declare
count2 int := 1001;
begin
while count2<=1005 loop
insert into scott.t_share_pool_s2 (ID, COMPANY_CODE, WORK_F1, WORK_F2, LAST_TIME) values(count2,'S2','w1_0','w2_0',sysdate);
update scott.t_share_pool_s2 set work_f1 = 'w1_88',work_f2='w2_88' where ID = count2 and COMPANY_CODE = 'S2';
delete from scott.t_share_pool_s2 where ID = count2 and COMPANY_CODE = 'S2';
count2 := count2+1;
end loop;
commit;
end;
3.2.2 增删改分发
分别修改中心库对应s1和s2的5条数据,查询观察s1和s2数据是否一致。
declare
count2 int := 1;
begin
while count2<=5 loop
update scott.t_share_pool set work_f1 = 'w1_99',work_f2='w2_99' where ID = count2 and COMPANY_CODE = 'S1';
count2 := count2+1;
end loop;
commit;
end;
declare
count2 int := 1;
begin
while count2<=5 loop
update scott.t_share_pool set work_f1 = 'w1_77',work_f2='w2_77' where ID = count2 and COMPANY_CODE = 'S2';
count2 := count2+1;
end loop;
commit;
end;
3.2.3 批量插入
分别在s1和s2批量插入10000条数据,每500条提交一次,查询观察中心库数据是否一致。
declare
count2 int := 1001;
begin
while count2<=11000 loop
insert into scott.t_share_pool_s1 (ID, COMPANY_CODE, WORK_F1, WORK_F2, LAST_TIME)
values(count2,'S1','w1_0','w2_0',sysdate);
count2 := count2+1;
if mod(count2-1001,500)=0 then
commit;
end if;
end loop;
commit;
end;
declare
count2 int := 1001;
begin
while count2<=11000 loop
insert into scott.t_share_pool_s2 (ID, COMPANY_CODE, WORK_F1, WORK_F2, LAST_TIME)
values(count2,'S2','w1_0','w2_0',sysdate);
count2 := count2+1;
if mod(count2-1001,500)=0 then
commit;
end if;
end loop;
commit;
end;
3.2.4 大事务插入
在s1批量插入100000条数据,10000条提交一次,查询观察中心库数据是否一致。
declare
count2 int := 11001;
begin
while count2<=111000 loop
insert into scott.t_share_pool_s1 (ID, COMPANY_CODE, WORK_F1, WORK_F2, LAST_TIME)
values(count2,'S1','w1_0','w2_0',sysdate);
count2 := count2+1;
if mod(count2-11001,10000)=0 then
commit;
end if;
end loop;
commit;
end;
3.2.5 顺序更新
在s1修改某一记录,然后在中心库修改对应记录,查询观察s1和中心库数据是否一致。
update scott.t_share_pool_s1 set work_f1 = 'w1_99',work_f2='w2_99' where ID = 1001;
commit;
update scott.t_share_pool set work_f1 = 'w1_11',work_f2='w2_11' where ID = 1001 and COMPANY_CODE = 'S1';
commit;
3.2.6 断网
断网修改s1某一记录,恢复网络后查询比较中心库是否一致,断网修改中心库某一记录,恢复网络后查询比较s1是否一致。
update scott.t_share_pool_s1 set work_f1 = 'w1_99',work_f2='w2_99' where ID = 1002;
commit;
update scott.t_share_pool set work_f1 = 'w1_11',work_f2='w2_11' where ID = 1002 and COMPANY_CODE = 'S1';
commit;
3.2.7 并发更新
同时重复5次修改s1和中心库的同一记录,查询观察s1和中心库数据是否一致。
declare
count2 int := 1;
begin
while count2<=5 loop
update scott.t_share_pool_s1 set work_f1 = 'w1_99_'||count2,work_f2='w2_99_'||count2 where ID = 1003;
commit;
count2 := count2+1;
end loop;
end;
declare
count2 int := 1;
begin
while count2<=5 loop
update scott.t_share_pool set work_f1 = 'w1_11_'||count2,work_f2='w2_11_'||count2 where ID = 1003 and company_code = 'S1';
commit;
count2 := count2+1;
end loop;
end;
3.2.8 批量更新
修改中心库500条记录,每条提交一次,查询观察s1和中心库数据是否一致。
declare
count2 int := 1;
begin
while count2<=500 loop
update scott.t_share_pool set work_f1 = 'w1_99_'||count2,work_f2='w2_99_'||count2 where ID = count2 and company_code = 'S1';
commit;
count2 := count2+1;
end loop;
end;
3.2.9 大事务更新
修改中心库20000条记录后一次提交,查询观察s1和中心库数据是否一致。
declare
count2 int := 1;
begin
while count2<=20000 loop
update scott.t_share_pool set work_f1 = 'w1_7_'||count2,work_f2='w2_7_'||count2 where ID = count2 and company_code = 'S1';
count2 := count2+1;
end loop;
commit;
end;