TimesTen 数据库复制学习:8. 管理Active Standby Pair(带缓存组)
来源:互联网 发布:巨人网络私有化价格 编辑:程序博客网 时间:2024/04/20 07:45
带缓存组的Active standby pairs(ASP)
在不带缓存组的ASP中,复制发生在TimesTen的表间;而在带缓存组的ASP中,复制发生在cache table之间。带缓冲组的复制仅支持只读和AWT缓存组。对于只读缓存组,复制的意义在于保持状态的连续,而对于AWT,复制可以保证数据不丢失。
设置带只读缓存组的ASP(例)
假设active master为cachedb1,standby master为cachedb2
- 在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;
- 创建active standby pair,缺省是异步的传输
cachedb1> CREATE ACTIVE STANDBY PAIR cachedb1, cachedb2;
- 设置active数据库的状态为ACTIVE
cachedb1> call ttRepStateSet('ACTIVE');cachedb1> call ttRepStateGet;< ACTIVE, NO GRID >
- 启动复制代理并动态加载一条数据
cachedb1> call ttrepstart;cachedb1> select * from a;cachedb1> select * from a where id = 1;< 1, beijing >
- 从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 cachedb2Enter cache administrator UID: cacheadmEnter cache administrator password: oracleWaiting for the Duplicate operation to complete ...
- 登录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 >
- 缓存组的数据已经复制到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 operationcachedb1> 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 ONcachedb2> cachegroups;Cache Group TTHR.AWT: Cache Group Type: Asynchronous Writethrough (Dynamic) Autorefresh: No Aging: LRU on Root Table: TTHR.A Table Type: Propagatecachedb2> 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 cachedb1Enter cache administrator UID: cacheadmEnter 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 cachedb1Enter cache administrator UID: cacheadmEnter 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 twosafecachedb2> 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 > <- 返回值必须为00call 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数据库,这里就不演示了。
- 在主点建立AWT缓存组的ASP
- 建立灾备端的Oracle数据库
- 在灾备端建立一个subscriber, 这里关键是有一个ttRepAdmin -duplicate的-initCacheDR选项
参考
http://www.oracledistilled.com/linux/configuring-an-oracle-timesten-logical-server-name-on-unix-based-systems/
- TimesTen 数据库复制学习:8. 管理Active Standby Pair(带缓存组)
- TimesTen 数据库复制学习:7. 管理Active Standby Pair(无缓存组)
- TimesTen 数据库复制学习:2. 配置Active Standby Pair
- TimesTen 数据库复制学习:9. 更改Active Standby Pair
- TimesTen 数据库复制学习:4. 定义Active Standby Pair复制策略
- 如何搭建active standby pair (TimesTen)
- TimesTen 数据库复制学习:11. ASP带缓存组复制的几种固定架构模式
- TimesTen 数据库复制学习:12. Classic带缓存组复制的几种固定架构模式
- TimesTen 数据库复制学习:16. 一个缓存组,复制,客户端自动切换的串烧实验
- TimesTen 应用层数据库缓存学习:12. 管理缓存环境
- TimesTen 数据库复制学习:1. TimesTen复制概述
- 如何搭建active standby subscirber(TimesTen)
- TimesTen Active standby切换启停脚本
- TimesTen 应用层数据库缓存学习:15. TimesTen 缓存组autorefresh的原理
- TimesTen 应用层数据库缓存学习:21. AWT复制Oracle事务失败时的处理
- TimesTen 数据库复制学习:10. 定义classic复制
- TimesTen 数据库复制学习:13. 设置复制系统
- TimesTen 数据库复制学习:15. 监控复制系统
- RTSP协议转换RTMP直播协议
- ssh整合(上)
- Java继承执行顺序
- 新版本eclipse不支持旧版本的eclipse插件(Classpath Helper)
- Android的任务和回退栈
- TimesTen 数据库复制学习:8. 管理Active Standby Pair(带缓存组)
- javaScript学习基础篇(4)-(window,正则,eventListener)
- Hankerrank World CodeSprint #4 Gridland Provinces (字符串双hash )
- TestNg参数化测试之读取csv文件
- leetcode 罗马数字与整数的转换算法
- Java中对象的三种状态
- android中的Intent和intent filter
- socket.io 中namespace 和 room的概念。
- [git]如何删除在远程已被删除的本地分支(清理本地分支)