当前位置: 首页 > news >正文

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 parameteralter 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_tbsGRANT 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_tbsGRANT 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_QUEUEselect 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、然后就完了
http://www.lryc.cn/news/9499.html

相关文章:

  • CF1790E Vlad and a Pair of Numbers 题解
  • 漏洞预警|Apache Kafka Connect JNDI注入漏洞
  • 企业小程序开发步骤【教你创建小程序】
  • 刚性电路板的特点及与柔性电路板的区别
  • 扫码过磅+车牌识别,内蒙古蒙维过磅实现信息化管理
  • 蒙特卡洛计算圆周率
  • 生物信息场景下的用户需求
  • linux su(switch user)和sudo(superuser do)的区别?(sudo su与su的区别)
  • PostgreSQL的学习心得和知识总结(一百二十三)|深入理解PostgreSQL数据库开源扩展pg_dirtyread的使用场景和实现原理
  • ubuntu清理挖矿病毒
  • 【代码随想录训练营】【Day16】第六章|二叉树|104.二叉树的最大深度|559.n叉树的最大深度|111.二叉树的最小深度|222.完全二叉树的节点个数
  • transformer总结
  • dart flutter入门教程,开发手册 分享
  • 教育舆情监测关键词有哪些,TOOM教育舆情监测系统流程?
  • MySQL高级(一)
  • 如何将Python项目部署到新电脑上运行?
  • JVM和JAVA体系结构
  • (十)、通过云对象修改阅读量+点赞功能的实现【uniapp+uinicloud多用户社区博客实战项目(完整开发文档-从零到完整项目)】
  • 刷力扣的第一天脑子要长出来的感觉(怎么有人大四才开始啊啊啊啊啊啊啊啊啊啊啊啊,又是等成绩的一天,)
  • Nuclei文*件上*传FUZZ POC
  • 完美解决方案-雪花算法ID到前端之后精度丢失问题
  • 工程管理系统源码之高效的工程项目管理软件
  • 390. 消除游戏
  • springBoot JPA代码生成器
  • 相同月利率条件下不同还款方式贷款的APR与IRR研究
  • 【论文】智能隧道检测车的现状及改进策略
  • 【代码随想录二刷】Day16-二叉树-C++
  • Lecture5 实现线性回归(Linear Regression with PyTorch)
  • Python与Matlab svd分解的差异
  • 2023年光模块行业发展趋势及未来前景