TimesTen 数据库复制学习:8. 管理Active Standby Pair(带缓存组)_16265: this store is currently the standby-程序员宅基地

技术标签: TimesTen  内存数据库  TimesTen高可用  缓存组  TimesTen缓存组  In-Memory Computing Technology  数据库复制  

带缓存组的Active standby pairs(ASP)

在不带缓存组的ASP中,复制发生在TimesTen的表间;而在带缓存组的ASP中,复制发生在cache table之间。带缓冲组的复制仅支持只读和AWT缓存组。对于只读缓存组,复制的意义在于保持状态的连续,而对于AWT,复制可以保证数据不丢失。

设置带只读缓存组的ASP(例)

假设active master为cachedb1,standby master为cachedb2

  1. 在active上创建dynamic readonly缓存组
cachedb1>
CREATE DYNAMIC READONLY CACHE GROUP "RO" 
 AUTOREFRESH MODE INCREMENTAL INTERVAL 5 SECONDS
 STATE PAUSED
 FROM
  "TTHR"."A" (
    "ID"   NUMBER(38)        NOT NULL,
    "NAME" VARCHAR2(32 BYTE),
    PRIMARY KEY("ID")
  )

cachedb1> cachegroups;

Cache Group TTHR.RO:

  Cache Group Type: Read Only (Dynamic)
  Autorefresh: Yes
  Autorefresh Mode: Incremental
  Autorefresh State: Paused <- 确保此状态是paused
  Autorefresh Interval: 5 Seconds
  Autorefresh Status: ok
  Aging: LRU on

  Root Table: TTHR.A
  Table Type: Read Only

缓存组的状态必须为paused,否则后续操作会报错,可以使用alter cache group命令修改状态

5166: Autorefresh state ON for TTHR.RO is incompatible with replication store state Idle.  Autorefresh state should be PAUSED. Alter the autorefresh state and reexecute statement.
cachedb1> alter cache group ro set autorefresh state paused;
  1. 创建active standby pair,缺省是异步的传输
cachedb1> CREATE ACTIVE STANDBY PAIR cachedb1, cachedb2;
  1. 设置active数据库的状态为ACTIVE
cachedb1> call ttRepStateSet('ACTIVE');
cachedb1> call ttRepStateGet;
< ACTIVE, NO GRID >
  1. 启动复制代理并动态加载一条数据
cachedb1> call ttrepstart;

cachedb1> select * from a;
cachedb1> select * from a where id = 1;
< 1, beijing >
  1. 从active复制出standby, 注意-keepCG选项
cachedb1>create user repadmin identified by timesten;
cachedb1> grant admin to repadmin;

$ ttRepAdmin -duplicate -from cachedb1 -host $(hostname)  -uid repadmin -pwd timesten -keepCG cachedb2
Enter cache administrator UID: cacheadm
Enter cache administrator password: oracle
Waiting for the Duplicate operation to complete ...
  1. 登录cachedb2,启动缓存和复制代理,状态自动变为STANDBY
$ ttisql -v1 -e "set prompt 'cachedb2> '" "dsn=cachedb2;uid=tthr;pwd=timesten;oraclepwd=oracle"
cachedb2> call ttCacheStart;
cachedb2> call ttRepStateGet;
< IDLE, NO GRID >
cachedb2> call ttRepStart;
cachedb2> call ttRepStateGet;
< STANDBY, NO GRID >
  1. 缓存组的数据已经复制到standby,但standby是只读的,不能运行LOAD操作
cachedb2> select * from a;
< 1, beijing >
cachedb2> select * from a where id = 2; <-只读
 8151: TTHR.RO's replication role disallows the requested operation

cachedb1> select * from a where id = 2;
< 2, shanghai >

cachedb2> select * from a;
< 1, beijing >
< 2, shanghai > <- 可以看到cache group的数据已复制过来
目前一切正常

设置带AWT缓存组的ASP(例)

建立AWT缓存组, 这时active是cachedb2, standby是cachedb1, 整个过程如下:

cachedb2>
CREATE DYNAMIC ASYNCHRONOUS WRITETHROUGH CACHE GROUP "AWT" 
 FROM
  "TTHR"."A" (
    "ID"   NUMBER(38)        NOT NULL,
    "NAME" VARCHAR2(32 BYTE),
    PRIMARY KEY("ID")
  )
  AGING LRU ON
cachedb2> cachegroups;

Cache Group TTHR.AWT:

  Cache Group Type: Asynchronous Writethrough (Dynamic)
  Autorefresh: No
  Aging: LRU on

  Root Table: TTHR.A
  Table Type: Propagate

cachedb2> call ttcachestart;
cachedb2> CREATE ACTIVE STANDBY PAIR cachedb2, cachedb1;
cachedb2> call ttrepstart;
cachedb2> call ttrepstateset('active');
cachedb2> call ttrepstateget;
< ACTIVE, NO GRID >

cachedb2> insert into a values(1, 'beijing');
cachedb2> commit;
cachedb2> select * from a;
< 1, beijing >

$ ttRepAdmin -duplicate -from cachedb2 -host $(hostname)  -uid repadmin -pwd timesten -keepCG cachedb1
Enter cache administrator UID: cacheadm
Enter cache administrator password: 
Waiting for the Duplicate operation to complete ...

$ ttisql -v1 -e "set prompt 'cachedb1> '" "dsn=cachedb1;uid=tthr;pwd=timesten;oraclepwd=oracle"
cachedb1> call ttrepstart;
cachedb1> call ttcachestart;
cachedb1> call ttrepstateget;
< STANDBY, NO GRID >
cachedb1> select * from a;
< 1, beijing >
cachedb1> insert into a values(2, 'shanghai');
16265: This store is currently the STANDBY.  Change to TTHR.A not permitted.
cachedb2> insert into a values(2, 'shanghai');
cachedb1> select * from a;
< 1, beijing >
< 2, shanghai > <- 复制的数据


cachedb1> call ttrepstop;
cachedb1> call ttRepStateSet('ACTIVE');
cachedb1> call ttrepstateget;
< ACTIVE, NO GRID >
cachedb1> call ttRepStateSave('FAILED', 'cachedb2','timesten-hol');
$ ttdestroy cachedb2

$ ttRepAdmin -duplicate -from cachedb1 -host $(hostname)  -uid repadmin -pwd timesten -keepCG -recoveringNode cachedb2
$ ttisql -v1 -e "set prompt 'cachedb2> '" "dsn=cachedb2;uid=tthr;pwd=timesten;oraclepwd=oracle"
cachedb2> call ttrepstart;
cachedb2> call ttcachestart;
calcachedb2> call ttrepstateget;
< STANDBY, NO GRID >
cachedb2> select * from a;
< 1, beijing >
< 2, shanghai >
cachedb2> insert into a values(3, 'guangzhou');
16265: This store is currently the STANDBY.  Change to TTHR.A not permitted.
cachedb1> insert into a values(3, 'guangzhou');
cachedb2> select * from a;
< 1, beijing >
< 2, shanghai >
< 3, guangzhou >

active数据库失效时的恢复

当传输模式为return receipt或异步时

停止复制代理来模拟active失效,以下是缓存组为read-only的情形,如果是AWT,也是类似的

cachedb1> call ttrepstop;

将standby提升为active, 并标记之前的active为失效状态

cachedb2> call ttRepStateSet('ACTIVE');

cachedb2> call ttRepStateSave('FAILED', 'cachedb1','timesten-hol');

这时新的active可以LOAD数据了

cachedb2> select * from a;
< 1, beijing >
< 2, shanghai >
cachedb2> select * from a where id = 3;
< 3, guangzhou >

销毁原来的active,正常的情况下直接用ttdestroy即可

cachedb1> call ttcachestop;
cachedb1> drop active standby pair;
cachedb1> drop cache group ro;
cachedb1> exit
$ ttdestroy cachedb1

从新的active克隆出standby,注意-keepCG -recoveringNode选项

$ ttRepAdmin -duplicate -from cachedb2 -host $(hostname)  -uid repadmin -pwd timesten -keepCG -recoveringNode cachedb1
Enter cache administrator UID: cacheadm
Enter cache administrator password: 
Waiting for the Duplicate operation to complete ...

启动standby的复制和缓存代理

$ ttisql -v1 -e "set prompt 'cachedb1> '" "dsn=cachedb1;uid=tthr;pwd=timesten;oraclepwd=oracle"
cachedb1> call ttrepstart;
cachedb1> call ttcachestart;
cachedb1> call ttrepstateget;
< STANDBY, NO GRID >

数据已复制到standby,但standby的缓存组不能进行LOAD操作

cachedb1> select * from a;
< 1, beijing >
< 2, shanghai >
< 3, guangzhou >
cachedb1> unload cache group ro;
16265: This store is currently the STANDBY.  Change to TTHR.A not permitted.

当传输模式为return twosafe时

这种情况比较简单,因为复制时,数据是先到standby然后在active上提交的。因此很多操作都是自动的。
大不了,从standby升级为active后,再克隆出新的standby即可

standby数据库失效时的恢复

如果复制是return twosafe, 以下是缓存组为read-only的情形

CREATE ACTIVE STANDBY PAIR cachedb1, cachedb2 return twosafe
cachedb2> unload cache group ro;
 8099: TWOSAFE operation not permitted with AutoCommit = 1.
cachedb2> set autocommit 0;
cachedb2> unload cache group ro;
cachedb2> commit;
cachedb2> select * from a;
cachedb2> select * from a where id = 1;
< 1, beijing >
cachedb1> call ttrepstateget;
< STANDBY, NO GRID >
cachedb1> select * from a;
< 1, beijing >
cachedb1> call ttrepstop;
cachedb2> select * from a where id = 2; <- HANG了一会,结果还是出来了,
< 2, shanghai >
cachedb1> select * from a;
< 1, beijing > <- 不过数据自然是不会复制过去的了

如果缓存组为AWT,并且传输模式为return twosafe,这时会阻止active端的事务提交,这时需要设置主端:

call ttRepSyncSet( null, null, 2);
commit;
ttRepStateSave('FAILED','standby_database','host_name')

然后再克隆standby

交换active和standby的角色

假设active为cachedb1,standby为cachedb2
首先停止应用更新数据库。
cachedb1> call ttRepSubscriberWait(NULL, NULL, 'cachedb2', 'timesten-hol', 10);
< 00 > <- 返回值必须为00
call ttRepDeactivate();
cachedb1> call ttrepstop;
cachedb1> call ttRepDeactivate();
cachedb1> call ttrepstateget;
< IDLE, NO GRID >

cachedb2> call ttRepStateSet('ACTIVE');
cachedb2> call ttrepstateget;
< ACTIVE, NO GRID >

cachedb1> call ttrepstart;
cachedb1> call ttrepstateget;
< IDLE, NO GRID >
过一小会
cachedb1> call ttrepstateget;
< STANDBY, NO GRID >
好了,角色换过了了

修改复制的用户名和口令

修改schema user的口令

这个比较简单,如果DDLReplicationLevel 是2,则口令的修改会自动复制到standby。否则就必须手工在每一个库中修改。例如:

cachedb2> alter user tthr identified by oracle;

User altered.

[oracle@timesten-hol ~]$ ttisql -v1 -e "set prompt 'cachedb1> '" "dsn=cachedb1;uid=tthr;pwd=timesten;oraclepwd=oracle"
 7001: User authentication failed
[oracle@timesten-hol ~]$ ttisql -v1 -e "set prompt 'cachedb1> '" "dsn=cachedb1;uid=tthr;pwd=oracle;oraclepwd=oracle"

修改cache admin 用户的口令

这个其实是不常见的。
cache admin用户名在Oracle和TimesTen中必须是一样的,但口令可以不一样
所以改口令没什么特别的,alter user即可。例如

Command> ALTER USER cacheadmin IDENTIFIED BY newpwd;
Command> passthrough 3; 
Command> ALTER USER cacheadm IDENTIFIED BY newpwd;

如果改用户名,就比较麻烦了,必须先删除掉所有的缓存组,因此不建议。

创建灾备用的subscriber

目前为止,谈的都是数据中心内部的HA场景,我们也可以建立一个位于灾备端的subscriber ,在故障时使其成可以继续与Oracle同步数据,第二个Oracle数据库也位于灾备端。

大致过程如下,由于需要建立第二个Oracle数据库,这里就不演示了。

  1. 在主点建立AWT缓存组的ASP
  2. 建立灾备端的Oracle数据库
  3. 在灾备端建立一个subscriber, 这里关键是有一个ttRepAdmin -duplicate的-initCacheDR选项

参考

http://www.oracledistilled.com/linux/configuring-an-oracle-timesten-logical-server-name-on-unix-based-systems/

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/stevensxiao/article/details/51770108

智能推荐

同步和异步vs串行和并行_同步串行快还是异步-程序员宅基地

文章浏览阅读679次,点赞2次,收藏3次。同步所有的操作都做完,才返回给用户。这样用户在线等待的时间过长,用户体验不好,也就是会有一种卡死了的感觉(类似,你在一个购物页面点击了一个商品下单预购,界面就不动了,但是程序还在运行中,卡死了的感觉)。这种情况下,用户不能去关闭界面,如果关闭了,程序就停止执行了,即添加购物车失败。异步将用户请求放入消息队列,并反馈给用户,系统添加购物车程序已经启动,你可以关闭浏览器或者关闭应用程序了。后续程序会慢慢地去写入数据库中去。这就是异步和同步的差异。但是用户没有卡死的感觉,一般会有系统提示词,告诉你_同步串行快还是异步

Latex之竖排表格_latex 表格竖线-程序员宅基地

文章浏览阅读3.2k次,点赞3次,收藏3次。有的时候表格太大需要竖着排, 可以使用。_latex 表格竖线

图的广度与深度优先遍历(BFS,DFS)(Java)_图的深度优先遍历伪代码-程序员宅基地

文章浏览阅读242次。BFS基本就是按《算法导论伪代码实现》,DFS为通过栈实现,代码如下:import java.awt.Color;import java.util.HashMap;import java.util.LinkedList;import java.util.List;import java.util.Map;import java.util.Queue;import java.util.Stack;public class BFSandDFStest { public static int _图的深度优先遍历伪代码

(转)认识SAP SD销售模式之寄售销售_sap销售寄售ppt-程序员宅基地

文章浏览阅读2.4k次。寄售销售:首先将产成品发送到客户处,当客户消耗掉这些产品后,才算是销售过程,客户与我司进行结算。寄售子流程:1)寄售补货 假如收到客户的需求50箱,则可以创建寄售补货订单(订单类型KB),仓库发货50箱给客户,对寄售补货订单创建发货单并过账。过账完成后,客户寄售库存为50箱。2)寄售消耗 当月月底客户确认使用30箱,则可以创建寄售消耗订单(订单类型KE),对寄售销售订单创建发货单并过账,然后创建系统发票,此时客户寄售库存为20箱。3)寄售退货 隔月客户说开票错误,应该开票29箱。创建寄售退货销售订单_sap销售寄售ppt

软件开发常见模型汇总_软件开发模型-程序员宅基地

文章浏览阅读7.7k次,点赞7次,收藏50次。所谓的软件开发模型,其实就是开发软件所经历的各个阶段 ,一般都会包括:需求->设计->编码-测试-运行维护。当然,不同的开发模型会稍有不同 ,每个模型都有其使用场景以及对应的公司使用 ,每个模型都有其优缺点 ,同时每个模型所解决问题的侧重点不同。_软件开发模型

Cookie for PHP-程序员宅基地

文章浏览阅读795次。首先为什么要引入Cookie呢,因为B/S架构(浏览器/服务器)架构是居于HTTP协议,其特点是无状态的(即最简单的请求–响应模式(也就是我向你请求数据而你给我返回数据)),但是他不能存储数据(请求完就完了,我不记得我向你请求过什么,也不知道你回答了 我什么),即无状态的协议。 那么为何 不能存储到变量中:不行,变量脚本周期结束时,被自动销毁。 不能存储到常量中:不行,常量脚本周期结束时,被自动

随便推点

【搜索】[luoguP1162]填涂颜色-程序员宅基地

文章浏览阅读231次。题目一道很裸的搜索题 我们可以一开始把所有的零赋值成2 然后从四条边界往里搜 所有与边界相邻的2(能搜到的2)都赋值成0即可 最后输出整个矩阵代码如下#include#include#include using namespace std; #define in = read(); typedef long long ll

搞笑了-程序员宅基地

文章浏览阅读78次。我说: 你写博客吗?旁边的前端:不写我说:我写旁边的前端:还是多看点博客吧,你写的把能把别人带沟里我:哈哈哈哈哈哈哈

支付行业名词解释_银行 moto预授权-程序员宅基地

文章浏览阅读1k次。1、网关支付是支付形式,通常是指接口支付,因为通过接口进行支付要进过网关进行准入控制,流量控制,风险控制等,所以称之为网关支付;4、银行卡支付所以以银行卡支付的形式都是银行卡支付,这个属于支付媒介,只要不是支票支付、礼品卡支付之类都算。2.支付方式是指针对支付种类表现的一种归类,信用卡支付、储蓄卡支付、第三方支付、网银支付。5.支付形式是指接口接入上送支付信息,支付报文的形式,比如接口形式,网银支付,pos刷卡。1人赞同了该文章支付产品、支付方式、支付品牌、支付通道、支付形式、交易类型。..._银行 moto预授权

Matlab中的数据归一化_matlab 归一化为什么出现大于1-程序员宅基地

文章浏览阅读407次。归一化的具体作用是归纳统一样本的统计分布性。归一化在0-1之间是统计的概率分布,归一化在-1--+1之间是统计的坐标分布。归一化有同一、统一和合一的意思。无论是为了建模还是为了计算,首先基本度量单位要同一,神经网络是以样本在事件中的统计分别几率来进行训练(概率计算)和预测的,且sigmoid函数的取值是0到1之间的,网络最后一个节点的输出也是如此,所以经常要对样本的输出归一化处理。归一化是统一在0_matlab 归一化为什么出现大于1

python学习记录(4)-第三方库&IO-程序员宅基地

文章浏览阅读130次。八、第三方库主要是通过pip的方式安装:pip3 install PackageNamepython3 -m pip install PackageNamesudo pip install PackageNamepip install --upgrade pip #升级pippip uninstall flask #卸载库pip list #查看已安装库九、文件读写读文件:readfi..._open(args.input, 'r', encoding='utf-8') errors='ignore

Mybatis总结(5)---Mybatis输入输出映射_有关mybatis的输入输出映射: mybatis通过()指定输入参数类型,可以是简单类型-程序员宅基地

文章浏览阅读458次。Mybatis输入输出映射输入映射通过parameterType指定输入参数的类型,类型可以是简单类型、hashmap、pojo的包装类型。 1. 传递pojo的包装对象(1) 需求完成用户信息的综合查询,需要传入查询条件很复杂(可能包括用户信息、其它信息,比如商品、订单的)(2)定义包装类型pojo针对上边需求,建议使用自定义的包装类型的pojo。_有关mybatis的输入输出映射: mybatis通过()指定输入参数类型,可以是简单类型

推荐文章

热门文章

相关标签