DBA之路---Stream数据共享同步机制与配置方法

oracle的Stream解析–数据共享

在g版本常用,如果是c版本项目一般都会选择goldengate,比stream靠谱多了
Oracle中的stream是消息队列一种应用形式,原理如下:

收集oracle中的事件,将事件保存在队列里,然后将事件发布给不同的订阅者。从管理员角度就是,捕获oracle的redo日志,然后将其通过网络传递到其他数据库来进行一种复制变化,进而完成库级数据同步。 主要目的为数据共享,不是灾容备份

#stream的实现方式
  #采取guard的logical standy标准,但是在进行日志恢复阶段时不会将redo记录还原成sql语句,而是还原成LCR进行发送,然后再target端再执行LCR语句。可以保证数据的完整性。
  #限制
    #因为不是标准的logcial standy进行还原发送,所以需要在两端分别查看stream是否支持将要发送的数据类型
    select * from dba_streams_newly_supported; #或者all开头
    select * from dba_streams_unsupported; #所有者,表名,不支持的原因

#Stream环境下进行数据同步,分为启动数据库 source database与终点数据库Target Database.在两恶搞数据库上各自创建队列,source作为发送端,target作为接收端
#队列创建后source端发起CP捕获进程,使用logminer从日志中提取ddl dml语句创建并存储与逻辑变记录(LCR)。source会将LCR内同保存到本地发送队列中,最后由pp传播进程发送到Target端

streams使用前的注意点

  • 确定复制集等级(共三种复制等级,表级、用户级、库级。用户最麻烦)
  • 决定复制站点
  • LCR的捕获方式
    • 本地捕获 : 从source进行,在联机日志与归档日志中取得LCR
    • **下游捕获 ** : 在target进行,尽在归档日志中获取LCR
  • 决定拓扑复制结构

stream数据共享创建实操—(用户级复制)

由于数据共享需要分成主库与从库,所以本次创建测试环境,本地不同global_name相同版本的11g数据库两套,实例名称主库prince,从库prince2(安装时设置),使用两个端口两套监听。假定使用同步的是tbbb用户。

下面是最重要的先看好了

#装配错误处理--消除本次配置所有信息(不知道配到哪里?出现了错误?不小心敲错?我允许你从头开始)
 #主从执行(需要先取消掉已经创建的进程 捕获、传播和应用进程至少不是enabled状态)
  exec DBMS_STREAMS_ADM.remove_streams_configuration();

不要本地装两套数据库去设置实验环境,笔者一开始就是这样老是失败出现各种问,最后弄个虚拟机有条件干脆再弄个电脑,无痛安装,我下面就不改流程纯粹图省事)

#操作前注意事项,两端都要进行检查。sys用户进行,主从共用操作
 #1、启用oracle需要先确保两端安装logminer与开启归档日志
  #具体操作方式请参照其余文章,此处不再赘述
 #2、两端数据库参数确认与修改
 alter system set global_names=true scope = both; #global_name置为有效,可以先show parameter,确认下
 alter system set aq_tm_processes=2 scope=both;#本参数非必须,oracle默认一般就够,可以确认下
 #以下为检查参数,需要show parameter
 alter system set job_queue_processes = 10 scope=both;
 alter system set sga_target = 300m scope=spfile;
 alter system set open_links=4 scope=spfile;
 alter system set statistics_level='TYPICAL' scope=both #务必确认,处于性能统计模式
 
 #以下为logminer确认参数
 alter system set "_job_queue_interval"=1 scope=spfile; #确认提高检查队列所需检查时间
 alter system set aq_tm_processes=1;
 alter system set streams_pool_size=200m scope=both;
  #此参数一定要足够大,防止内存过小使stream信息没有数据即时被同步。
  
  #启用追加日志,如果数据库表段有主键就不被需要(logminer时已经开启。可以show检查一下)
  alter database add supplemental log data
   #只是同步部分表的表级同步可以进行追加
   alter table add supplement log group log_group_name(table_column_name) always;
 
 #3、预备条件
    #创建两个专门用于stream管理表空间和用户给予权限,在两个不同的主从库上分别进行
      #主库
      CREATE TABLESPACE streams_tbs DATAFILE 'E:/ORACLE/prince/streams_tbs001.dbf' SIZE 100M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED; 
      create user streamadmin1 identified by streamadmin1 DEFAULT TABLESPACE streams_tbs
      GRANT DBA to streamadmin1;#dba权限
      exec DBMS_STREAMS_AUTH.GRANT_ADMIN_PRIVILEGE('streamadmin1') #赋予stream管理权限
      
      #从库
      CREATE TABLESPACE streams_tbs DATAFILE 'E:/ORACLE/prince2/streams_tbs001.dbf' SIZE 100M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED; 
      create user streamadmin2 identified by streamadmin2 DEFAULT TABLESPACE streams_tbs
      GRANT DBA to streamadmin2;#dba权限
      exec DBMS_STREAMS_AUTH.GRANT_ADMIN_PRIVILEGE('streamadmin2') #赋予stream管理权限
   
   #在这两个数据库prince和prince2的tnsname.ora分别加上对端的链接实例名称,用于后续创建dblink使用
   prince2 = #假设prince主库使用1523端口,那主库下的tnsname.ora就添加如下配置
  (DESCRIPTION =
    (ADDRESS_LIST =
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1524))#对端使用的端口与ip,我是本地装了两套所以时localhost
      )
    (CONNECT_DATA =
      (SID = prince2)#连接实例名,对端实例名
      (SERVER = DEDICATED)#看情况指定
    )
  )
 #两端创建测试用户(已经有的就不用了)
  CREATE USER TBBB IDENTIFIED BY TBBB ;
   grant dba to tbbb;#这边本次测试没有限制,我直接dba省事
#生产环境的还需要额外将主库用户的数据和结构(主要是结构)导入到从库用户里去,千万注意,我这测试环境都是null用户所以无所谓
exp userid=tbb/tbb@prince file='E:\oracle' object_consistent=y rows=y
imp userid=tbb/tbb@prince2 file='E:\oracle' ignore=y commit=y log='E:\oracle\123.log' streams_instantiation=y fromuser=tbb touser=tbb #不同用户还需要做映射

请按照步骤同步进行创建

#stream创建流程-主库(source端)
#1、创建远程dblink
 #以之前创建的stream管理员账户登录
  create database link prince2 connect to streamadmin2 identified by streamadmin2 using 'prince2'; #对端的用户名密码 link指定最好与连接实例名称一致否则容易报错。使用tnsname的prince进行连接。
  #成功后进行如下方式确认是否成功
  conn streamadmin2/streamadmin2 #连接到从库
  select * from global_name#通过global_name确认是否到达从库,无误后exit重新进入主库
  
#2、创建stream队列-主库master流队列 
exec DBMS_STREAMS_ADM.SET_UP_QUEUE(queue_table => 'TBBBSOURCE_QUEUE_TABLE', queue_name  => 'TBBBSOURCE_QUEUE',queue_user  => 'STREAMADMIN1');
   #检查是否成功创建队列
   select owner,queue_table,name from dba_queues where owner='STREAMADMIN';
   
   
#3、主库创建捕获进程
exec dbms_streams_adm.add_schema_rules(schema_name => 'tbbb',streams_type => 'capture',streams_name => 'capture_tbbb',queue_name => 'STREAMADMIN1.TBBBSOURCE_QUEUE',include_dml => true,include_ddl => true,include_tagged_lcr => false,source_database => null,inclusion_rule => true);

select CAPTURE_NAME,QUEUE_NAME,START_SCN,STATUS,CAPTURE_TYPE from dba_capture;
select * from  ALL_CAPTURE_PREPARED_SCHEMAS; #确认进程是否创建成功

 exec DBMS_CAPTURE_ADM.START_CAPTURE(capture_name => 'CAPTURE_TBB');
  select capture_name,status from dba_capture;
 exec dbms_capture_adm.stop_capture(capture_name => 'CAPTURE_TBB'); #停止进程

#4、创建传播进程
exec DBMS_STREAMS_ADM.ADD_SCHEMA_PROPAGATION_RULES(schema_name=> 'tbbb', streams_name=> 'capture_tbbb', source_queue_name=> 'STREAMADMIN1.TBBBSOURCE_QUEUE',destination_queue_name=> 'STREAMADMIN2.TBBBTARGET_QUEUE@prince2',include_dml => true,include_ddl=> true,source_database  => 'prince',inclusion_rule => true,queue_to_queue=> true);
  #指定的是从库target连接,建议在从库target创建完apply进程后进行,我有碰到报错
 select * from all_propagation #确认传播进程情况,报错信息和状态会在这里显示
 select PROPAGATION_NAME,SOURCE_QUEUE_NAME,DESTINATION_QUEUE_NAME,DESTINATION_DBLINK,STATUS from dba_propagation;
 exec dbms_propagation_adm.start_propagation('capture_tbbb');#启动传播进程(后续使用)
 exec dbms_propagation_adm.stop_propagation('capture_tbbb');#关闭传播进程
 
 exec dbms_aqadm.alter_propagation_schedule(queue_name => 'STREAMADMIN1.TBBBSOURCE_QUEUE',destination => 'prince2',latency =>0); #消除进程休眠时间,变为实时传播。有报错大概率dblink不对,我本地装两套有碰见oci导致的。

 
#stream创建流程-从库(target端)
#1、创建远程dblink
 #以之前创建的stream管理员账户登录
  create database link prince connect to streamadmin1 identified by streamadmin1 using 'prince';#提示成功即可,因为是从库,我们无法远程到主库
  
#2、创建stream队列-从库backup流队列  
 exec dbms_streams_adm.set_up_queue(queue_table=>'prince2_queue_table',queue_name=>'prince2_queue');
 #检查是否成功创建队列
 select owner,queue_table,name from dba_queues --name TCOPYTARGET_QUEUE
 select owner,queue_table,object_type from dba_queue_tables #两个必须都有,否则一定失败
 
#3、创建apply进程
 exec DBMS_STREAMS_ADM.ADD_SCHEMA_RULES(schema_name=> 'tbbb',streams_type=> 'apply',streams_name=> 'tbbb_apply_stream',queue_name=> 'STREAMADMIN2.TBBBTARGET_QUEUE',include_dml=> true,include_ddl=> true,include_tagged_lcr => false,source_database => 'prince',inclusion_rule => true);
 select apply_name,queue_name,status from dba_apply #确认状态
 
 exec dbms_apply_adm.start_apply(apply_name => 'tbbb_apply_stream');#进程启动与停止
 exec dbms_apply_adm.stop_apply(apply_name => 'tbbb_apply_stream');
#启动stream进程
 #从库启动 apply进程
   exec dbms_apply_adm.start_apply(apply_name => 'tbbb_apply_stream');
 #主库启动捕获进程和传播进程
  exec DBMS_CAPTURE_ADM.START_CAPTURE(capture_name => 'CAPTURE_TBB');
  exec dbms_propagation_adm.start_propagation('capture_tbbb');
#检验方式
  主库用户创建、crud等等操作完后去从库用户检查(不是实时的就先==
#dblink错误处理
select * from dba_db_links;
drop public database link name;
#name为语句查出的db_link名称,只能删除本用户创建dblink,其他用户的就算你是dba也动不了
  

stream数据共享创建实操—(库级复制)

#1、确认参数 且处于归档模式
alter system set aq_tm_processes=4 scope=spfile;
alter system set job_queue_processes=5 scope=spfile;
alter system set global_names=true scope=spfile;
alter system set streams_pool_size=51m scope=spfile;
#2、还是在主库和目标库创建连接,是改tnsname还是直接指定随你
#3、创建主从库的stream管理员
#4、主从库创建文件夹
create directory dir_DBA as 'D:/Stream/prince';
create directory dir_DBA2 as 'D:/Stream/prince2';
#5、主库source执行
dbms_streams_adm.maintain_global(source_directory_object =>'dir_DBA',destination_directory_object =>'dir_DBA2',source_database=>'prince',destination_database =>'prince2',perform_actions=>true,include_ddl=>true,instantiation=>DBMS_STREAMS_ADM.INSTANTIATION_FULL_NETWORK);
#6、然后就完了
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值