Oracle 12c DG新特性Far Sync(r10笔记第67天)
Oracle的Data Guard技术再11g中有了Active Data Guard,就产生了很多的技术解决方案,比如读写分离,多活的技术支撑等。
12c 中又有了一些改进,那就当属Far Sync。以下是来自官网提供的一张图,看起来很威武霸气。
这个Far Sync到底是个什么东东,主要就是为了解决远距离的数据传输延迟,而在中间节点创建的一个虚实例,这个实例很特别,只有参数文件,密码问价和控制文件,而且需要特别强调的是没有数据文件。
当然这个特性是一个补充,你如果使用原本的Active Data Guard也全然没有问题。而这个特性可以通过中间节点来过渡,达到了官方所宣称的0数据丢失。
这个特性是不是非常牛叉呢,其实如果大家了解Data Guard的一些知识,会发现其实这个Far Sync就是cascade standby的一个改进,所以我没有说是一个技术上很大的一个创新。
如果已经有了Active Data Guard的环境,启用Far Sync那就很简单了。
下面是一个典型的DG配置情况,使用了DG Broker来统一配置管理。主库是testdb,备库是testdb2
DGMGRL> show configuration
Configuration - dgb_testdb
Protection Mode: MaxPerformance
Members:
testdb - Primary database
testdb2 - Physical standby database
Fast-Start Failover: DISABLED
Configuration Status:
DISABLED
需要特别强调的是,Far Sync的添加一个关键就是控制文件,这个和备库控制文件有所区别。如果你使用的是备库控制文件,那很可能添加的时候得到下面的错误。
DGMGRL> add far_sync testdbf as connect identifier is testdbf;
Error: ORA-16831: operation not allowed on this member
查看错误信息,也是一头雾水,日志中也没有什么明显的信息。
[oracle@teststd ~]$ oerr ora 16831
16831, 00000, "operation not allowed on this member"
// *Cause: The Oracle Data Guard broker operation was not allowed for the
// specified member of the Oracle Data Guard broker configuration.
// *Action: Check the documentation for the Oracle Data Guard broker command
// and then reissue the command with the correct member.
我刚开始玩的时候大意了,结果因为这个问题给折腾了不少时间。需引以为戒。
正确的姿势是在主库生成Far Sync的控制文件:
SQL> ALTER DATABASE CREATE FAR SYNC INSTANCE CONTROLFILE AS '/tmp/controlfs01.ctl1';
Database altered.
然后拷贝到备库还原即可。
备库执行:
RMAN> restore controlfile from '/tmp/controlfs01.ctl1';
RMAN> alter database mount;
很重要的一个检查项就是检查v$database,输出全然不同
SQL> select database_role,name,db_unique_name from v$database
DATABASE_ROLE NAME DB_UNIQUE_NAME
------------------------------ --------------------------- -----------
FAR SYNC TESTDB testdbf
这样就对了,我们再次在主库添加:
添加Far Sync节点:
DGMGRL> add far_sync TESTDBF as connect identifier is TESTDBF;
far sync instance "testdbf" added
启用配置
DGMGRL> enable far_sync TESTDBF;
Enabled.
查看配置情况:
DGMGRL> DGMGRL> show configuration;
Configuration - dgb_testdb
Protection Mode: MaxPerformance
Members:
testdb - Primary database
testdb2 - Physical standby database
testdbf - Far sync instance
Fast-Start Failover: DISABLED
Configuration Status:
SUCCESS (status updated 5 seconds ago)
Far Sync的节点就这样搞定了。其实就是中间走了一层转接,而对于Far Sync而言,使用DG Broker搭建就是两条简单的命令即可。其实在后台日志中是设置归档路径参数:
Sat Oct 29 23:21:23 2016
ALTER SYSTEM SET log_archive_dest_3='service="testdbf"','ASYNC NOAFFIRM delay=0 optional compression=disable max_failure=0 max_connections=1 reopen=300 db_unique_name="testdbf" net_timeout=30','valid_for=(online_logfile,all_roles)' SCOPE=BOTH;
Sat Oct 29 23:21:23 2016
ALTER SYSTEM SET log_archive_dest_state_3='ENABLE' SCOPE=BOTH;
所以核心的部分就在于这儿,还有一个地方是Far Sync节点,Fal_server的设置
FAR SYNC节点:
SQL> show parameter fal
NAME TYPE VALUE
------------------------------------ ---------- -----------
fal_client string
fal_server string testdb, testdb2
我们可以简单测试一下Far Sync的影响范围:
直接shutdown abort Far Sync节点,主库会马上收到一条错误信息:
Sat Oct 29 23:29:18 2016
Errors in file /home/U01/app/oracle/diag/rdbms/testdb/testdb/trace/testdb_tt02_8451.trc:
ORA-03135: connection lost contact
这个时候测试节点的日志传输还是可以的,当然远距离还是会把影响放大。
而在Far Sync节点恢复之后,主库日志会发生变化:
ERROR: Shared memory area is accessible to instance startup process
prior to instance startup operation.
Sat Oct 29 23:32:17 2016
ALTER SYSTEM SET log_archive_dest_state_3='ENABLE' SCOPE=MEMORY SID='*';
再次查看DG Broker的配置就没有问题了。
DGMGRL> show configuration;
Configuration - dgb_testdb
Protection Mode: MaxPerformance
Members:
testdb - Primary database
testdb2 - Physical standby database
testdbf - Far sync instance
Fast-Start Failover: DISABLED
Configuration Status:
SUCCESS (status updated 41 seconds ago)
这个测试的过程还是比较流畅的,还有更多的细节,后续继续分享。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- GORM V2 自动迁移和迁移接口的方法
- Vue Nginx反向代理配置 解决生产环境跨域
- react的事件处理为什么要bind this 改变this的指向?
- 没有用到React,为什么我需要import引入React?
- JSON对象和JavaScript对象直接量的区别--不同之处
- (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
- 关于DOM的理解
- 关于闭包函数和递归函数的详细理解
- 新手怎么学JS?JavaScript基础入门
- 纯CSS制作加<div>制作动画版哆啦A梦
- Ubuntu 18.04 安装使用 Supervisor 进程守护并设置开机自动启动
- AWS CLI version 2 在 Windows 下的安装
- Vue事件绑定原理
- 组合
- 用navicat进行身份验证连接出现cannot connect to Mongodb authentication failed