1. 测试目标
2. 测试环境
2.1 测试数据库
2.2 创建测试表
2.3 开启数据库归档
2.4 s3建立同步用户
2.5 配置同步任务
2.5.1 安装BeeDI
2.5.2 全量任务
2.5.3 增量任务
3. 测试步骤
3.1 全量同步
3.2 实时同步
3.2.1 增删改合并
3.2.2 增删改分发
3.2.3 批量插入
3.2.4 大事务插入
3.2.5 顺序更新
3.2.6 断网
3.2.7 并发更新
3.2.8 批量更新
3.2.9 大事务更新
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;