Oracle 高级复制.docx
《Oracle 高级复制.docx》由会员分享,可在线阅读,更多相关《Oracle 高级复制.docx(16页珍藏版)》请在冰豆网上搜索。
Oracle高级复制
物化视图复制站点的配置步骤
主站点:
test.ncl(dbtest)
物化视图站点:
peixun.ncl(db58)
复制用户:
lis
复制表:
test_a
准备工作:
在站点创建将要被复制的表test_a
SQL>createtabletest_aasselect*fromuser_tables;
表已创建。
――创建主键
SQL>altertabletest_aadd(constraintpk_nameprimarykey(table_name));
表已更改。
SQL>commit;
提交完成。
复制开始
1.检查初始化参数:
参数global_names为true;job_queue_process大于0.
2.检查全局数据库名称
两个数据库的db_domain名称应该相同,只有db_name不同。
可以通过下面语句检查
Select*formglobal_name;
如果全局数据库名设置不符合规范,可以通过如下语句动态修改。
alterdatabaserenameglobal_nametotest.ncl
alterdatabaserenameglobal_nametopeixun.ncl;
3.检查tnsname
4.建立主体站点
--以system用户连接到主站点
CONNsystem@test
--建立复制管理用户repadmin并授权
SQL>connsystem/system@test
已连接。
--建立复制管理用户repadmin并授权
SQL>CREATEUSERrepadminIDENTIFIEDBYrepadmin;
用户已创建
SQL>BEGIN
2DBMS_REPCAT_ADMIN.GRANT_ADMIN_ANY_SCHEMA(username=>'repadmin');
3END;
4/
PL/SQL过程已成功完成。
SQL>commit;
提交完成。
SQL>GRANTCOMMENTANYTABLETOrepadmin;
授权成功。
SQL>GRANTLOCKANYTABLETOrepadmin;
授权成功。
SQL>GRANTSELECTANYDICTIONARYTOrepadmin;
授权成功。
--注册传播用户并授权,这里使用了管理用户repadmin,也可以分别建立用户
SQL>BEGIN
2DBMS_DEFER_SYS.REGISTER_PROPAGATOR(username=>'repadmin');
3END;
4/
PL/SQL过程已成功完成。
--注册接收用户,这里使用了管理用户repadmin
SQL>BEGIN
2DBMS_REPCAT_ADMIN.REGISTER_USER_REPGROUP(
3username=>'repadmin',
4privilege_type=>'receiver',
5list_of_gnames=>NULL);
6END;
7/
PL/SQL过程已成功完成。
--建立物化视图站点复制管理员的代理用户,出于简单考虑,这里也使用repadmin用户
SQL>BEGIN
2DBMS_REPCAT_ADMIN.REGISTER_USER_REPGROUP(
3username=>'repadmin',
4privilege_type=>'proxy_snapadmin',
5list_of_gnames=>NULL);
6END;
7/
PL/SQL过程已成功完成。
SQL>commit;
提交完成。
--设置代理刷新用户,并授权,这里仍然使用repadmin用户
--对于repadmin而言,不需要createsession权限
--但是这里如果新建用户的话,createsession权限则是必须的
SQL>GRANTCREATESESSIONTOrepadmin;
授权成功。
SQL>GRANTSELECTANYTABLETOrepadmin;
授权成功。
--设置清除延迟序列的job
--以复制管理员身份登陆到主站点
SQL>connrepadmin/repadmin
已连接。
SQL>BEGIN
2DBMS_DEFER_SYS.SCHEDULE_PURGE(
3next_date=>SYSDATE,
4interval=>'SYSDATE+1/8640',------------每10秒更新一次
5delay_seconds=>0);
6END;
7/
PL/SQL过程已成功完成。
SQL>commit;
提交完成。
5.设置物化视图站点
--以system用户连接到物化视图站点
SQL>connsystem/system@db58
已连接。
SQL>CREATEUSERmvadminIDENTIFIEDBYmvadmin;
用户已创建
SQL>BEGIN
2DBMS_REPCAT_ADMIN.GRANT_ADMIN_ANY_SCHEMA(
3username=>'mvadmin');
4END;
5/
PL/SQL过程已成功完成。
SQL>commit;
提交完成。
SQL>GRANTCOMMENTANYTABLETOmvadmin;
授权成功。
SQL>GRANTLOCKANYTABLETOmvadmin;
授权成功。
SQL>GRANTSELECTANYDICTIONARYTOmvadmin;
授权成功。
SQL>--建立传播者,并授权,这里使用mvadmin用户,也可以建立单独的用户
SQL>BEGIN
2DBMS_DEFER_SYS.REGISTER_PROPAGATOR(username=>'mvadmin');
3END;
4/
PL/SQL过程已成功完成。
SQL>commit;
提交完成。
SQL>--建立刷新者,并授权,这里使用mvadmin用户刷新物化视图
SQL>--对于mvadmin而言,不需要createsession权限
SQL>--但是这里如果新建用户的话,createsession权限则是必须的
SQL>GRANTCREATESESSIONTOmvadmin;
授权成功。
SQL>GRANTALTERANYMATERIALIZEDVIEWTOmvadmin;
授权成功。
SQL>--注册接受者
SQL>BEGIN
2DBMS_REPCAT_ADMIN.REGISTER_USER_REPGROUP(
3username=>'mvadmin',
4privilege_type=>'receiver',
5list_of_gnames=>NULL);
6END;
7/
PL/SQL过程已成功完成。
SQL>commit;
提交完成。
SQL>--建立PUBLIC数据库链
SQL>CREATEPUBLICDATABASELINKtest.nclUSING'dbtest';
数据库链接已创建。
SQL>--建立到主站点上代理物化视图管理员的数据库链
SQL>--以物化视图管理员身份连接到物化视图站点
SQL>CONNECTmvadmin/mvadmin@db58
已连接。
SQL>CREATEDATABASELINKtest.nclCONNECTTOrepadminIDENTIFIEDBY
2repadmin;
数据库链接已创建。
SQL>--设置清除延迟序列的job
SQL>--如果物化视图站点只包括只读物化视图,这一步可以省略
SQL>BEGIN
2DBMS_DEFER_SYS.SCHEDULE_PURGE(
3next_date=>SYSDATE,
4interval=>'SYSDATE+1/8640',
5delay_seconds=>0,
6rollback_segment=>'');
7END;
8/
PL/SQL过程已成功完成。
SQL>--设置将修改推入到主站点的job
SQL>--如果物化视图站点只包括只读物化视图,这一步可以省略
SQL>BEGIN
2DBMS_DEFER_SYS.SCHEDULE_PUSH(
3destination=>'test.ncl',
4interval=>'SYSDATE+1/8640',
5next_date=>SYSDATE,
6stop_on_error=>FALSE,
7delay_seconds=>0,
8parallelism=>0);
9END;
10/
PL/SQL过程已成功完成。
SQL>commit;
提交完成。
6.建立主体组
SQL>--建立名为rep_test的复制组
SQL>BEGIN
2DBMS_REPCAT.CREATE_MASTER_REPGROUP(
3gname=>'rep_test');
4END;
5/
PL/SQL过程已成功完成。
SQL>commit;
提交完成。
SQL>--将复制对象增加到复制组中
SQL>--主键所用的索引自动复制,其他索引需要明确添加到复制组中
SQL>BEGIN
2DBMS_REPCAT.CREATE_MASTER_REPOBJECT(
3gname=>'rep_test',
4type=>'TABLE',
5oname=>'test_a',
6sname=>'lis',
7use_existing_object=>TRUE,
8copy_rows=>FALSE);
9END;
10/
PL/SQL过程已成功完成。
SQL>BEGIN
2DBMS_REPCAT.CREATE_MASTER_REPOBJECT(
3gname=>'rep_test',
4type=>'INDEX',
5oname=>'pk_name',
6sname=>'lis',
7use_existing_object=>TRUE,
8copy_rows=>FALSE);
9END;
10/
PL/SQL过程已成功完成。
SQL>commit;
提交完成。
SQL>--生成复制支持
SQL>BEGIN
2DBMS_REPCAT.GENERATE_REPLICATION_SUPPORT(
3sname=>'lis',
4oname=>'test_a',
5type=>'TABLE',
6min_communication=>TRUE);
7END;
8/
PL/SQL过程已成功完成。
SQL>commit;
提交完成。
SQL>--开始复制
SQL>BEGIN
2DBMS_REPCAT.RESUME_MASTER_ACTIVITY(
3gname=>'rep_test');
4END;
5/
PL/SQL过程已成功完成。
SQL>commit;
提交完成。
7.建立物化视图
SQL>--以复制用户连接到主站点
SQL>CONNECTlis/lis
已连接。
SQL>--建立物化视图日志表,FAST刷新方式必须要求建立物化视图日志,COMPLETE则不
需要
SQL>CREATEMATERIALIZEDVIEWLOGONlis.test_a;
实体化视图日志已创建。
赋予lis用户权限
SQL>connsystem/system
已连接。
SQL>GRANT
2CREATESESSION,
3CREATETABLE,
4CREATEPROCEDURE,
5CREATESEQUENCE,
6CREATETRIGGER,
7CREATEVIEW,
8CREATESYNONYM,
9ALTERSESSION,
10CREATEMATERIALIZEDVIEW,
11ALTERANYMATERIALIZEDVIEW,
12CREATEDATABASELINK
13TOlis;
授权成功。
SQL>--建立复制用户到主站点代理刷新者的数据库链
SQL>CONNECTlis/lis@db58
已连接。
SQL>CREATEDATABASELINKtest.nclCONNECTTOrepadminIDENTIFIEDBY
2repadmin;
数据库链接已创建。
SQL>--物化视图组必须和复制站点上的复制组名称相同
SQL>BEGIN
2DBMS_REPCAT.CREATE_MVIEW_REPGROUP(
3gname=>'rep_test',
4master=>'test.ncl',
5propagation_mode=>'ASYNCHRONOUS');
6END;
7/
PL/SQL过程已成功完成。
SQL>commit;
提交完成。
SQL>--创建刷新组
SQL>--对于只包含只读物化视图的站点,不需要此步骤
SQL>BEGIN
2DBMS_REFRESH.MAKE(
3name=>'mvadmin.rep_refresh',
4list=>'',
5next_date=>SYSDATE,
6interval=>'SYSDATE+1/8640',
7implicit_destroy=>FALSE,
8rollback_seg=>'',
9push_deferred_rpc=>TRUE,
10refresh_after_errors=>FALSE);
11END;
12/
PL/SQL过程已成功完成。
SQL>commit;
提交完成。
SQL>--创建物化视图
SQL>--对于只读物化视图,省略FORUPDATE语句
SQL>CREATEMATERIALIZEDVIEWlis.test_a
2REFRESHFASTWITHPRIMARYKEYFORUPDATE
3ASSELECT*FROMlis.test_a@test.ncl;
实体化视图已创建。
SQL>--将物化视图添加到物化视图组
SQL>--对于只读物化视图,此步骤可以省略
SQL>BEGIN
2DBMS_REPCAT.CREATE_MVIEW_REPOBJECT(
3gname=>'rep_test',
4sname=>'lis',
5oname=>'test_a',
6type=>'SNAPSHOT',
7min_communication=>TRUE);
8END;
9/
PL/SQL过程已成功完成。
SQL>BEGIN
2DBMS_REPCAT.CREATE_MVIEW_REPOBJECT(
3gname=>'rep_test',
4sname=>'lis',
5oname=>'pk_name',
6type=>'INDEX',
7min_communication=>TRUE);
8END;
9/
PL/SQL过程已成功完成。
SQL>commit;
提交完成。
SQL>--将物化视图添加到刷新组
SQL>BEGIN
2DBMS_REFRESH.ADD(
3name=>'mvadmin.rep_refresh',
4list=>'lis.test_a',
5lax=>TRUE);
6END;
7/
PL/SQL过程已成功完成。
SQL>commit;
提交完成。
测试:
SQL>connlis/lis
已连接。
SQL>selectcount(*)fromtest_a;
COUNT(*)
----------
1766
SQL>deletefromtest_awhererownum<20;
已删除19行。
SQL>commit;
提交完成。
SQL>selectcount(*)fromtest_a;
COUNT(*)
----------
1747
SQL>connlis/lis@db58
已连接。
SQL>selectcount(*)fromtest_a;
COUNT(*)
----------
1766
――――――――――――――――――――――过段时间
SQL>selectcount(*)fromtest_a;
COUNT(*)
----------
1747
在复制站点上测试
SQL>connlis/lis@db58
已连接。
SQL>deletefromtest_awhererownum<20;
已删除19行。
SQL>commit;
提交完成。
SQL>selectcount(*)fromtest_a;
COUNT(*)
----------
1728
SQL>connlis/lis
已连接。
SQL>selectcount(*)fromtest_a;
COUNT(*)
----------
1747
――――――――――――――――――――――――――过段时间
SQL>selectcount(*)fromtest_a;
COUNT(*)
----------
1728
基本成功