暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 12c R2 – 19C Instance_mode read-only

原创 Anbob 2020-07-22
2556

Oracle数据库40年来还真是“急人所急 想人所想”,不断努力在一套软件中集成所有解决方案,以至于导致有人抱怨“她”太“胖”了。有没有想过oracle数据库中的读写分离场景?首先会想到使用Active DataGuard,但是如果不要DG,只在一套数据库RAC中不同节点实现呢?如一个节点写,其它节点只读呢。

前几天给LinuxONE的Oracle19c RAC巡检时发现spfile中instance_mode为read-only, 该库不是standby环境。(不一定是LinuxONE大机环境,适用于Oracle 12.2以后的RAC,单实例spfile默认不存在此参数)

什么是instance_mode

SQL> show parameter instance_mode

PARAMETER_NAME               TYPE        VALUE
-----------------------    -----------  ----------------------------------
instance_mode               string      READ-WRITE

SQL> select inst_id,name,value from gv$spparameter where name like 'instance_mode%';

   INST_ID NAME                 VALUE
---------- -------------------- ------------------------------
         2 instance_mode        read-only
         1 instance_mode        read-only

SQL> show spparameter instance_mode

SID      NAME                          TYPE        VALUE
-------- ----------------------------- ----------- ----------------------------
*        instance_mode                 string      read-only

SQL> select open_mode from v$database;

OPEN_MODE
--------------------
READ WRITE
复制

Note:
spfile中是instance_mode read-only, 当前内存里是read-write, 数据库也是以read-write打开, 如果因为spfile参数配置有问题,在实例重启后都是read-only打开那就是隐患了,在我的单实例测试了一下(其实这参数是有限制的). 注意这里的read-only批的是instance而不是database.

SQL> alter system set instance_mode="read-only" scope=spfile;
System altered.

SQL> startup force
ORACLE instance started.

Total System Global Area 1073738888 bytes
Fixed Size                  9143432 bytes
Variable Size             792723456 bytes
Database Buffers          268435456 bytes
Redo Buffers                3436544 bytes
Database mounted.
ORA-16005: database requires recovery


SQL> recover database;
ORA-12969: invalid alter database option for read-only instance
复制

Note:
如果实例是以read-only mode那数据库就无法启动了。注意默认如果没有像我这种显示修改,实际上是不会发生的。

官方文档
记录了instance_mode是从12cR2引入可以指定值,值INSTANCE_MODE = { READ-WRITE | READ-ONLY | READ-MOSTLY },默认READ-WRITE,可以把部分节点改为READ-ONLY或READ-MOSTLY值, 但是有限制:

  • 1, 至少RAC中有一个节点是READ-WRITE的,这样就不会发生上面的问题,数据库都无法打开。如果仅有的READ-WRITE实例crash,其它所有实例也会crash.
  • 2, instance_mode为READ-ONLY的实例不能是RAC中打开的第一个实例,要等read-write实例READY。
  • 3,不支持同一RAC中instance_mode为READ-ONLY 和 READ-MOSTLY并存
  • 4, Read-only 实例可以禁掉部分不需要的后台进程如ARCn、CKPT
  • 5, READ-ONLY 实例可以禁掉redo thread , read more

什么是family:dw_helper.instance_mode

回到原RAC环境,查看SPFILE

SQL> create pfile='/tmp/pfile.ora' from spfile;
File created.

# vi /tmp/pfile.ora
...
*.inmemory_query='DISABLE'
family:dw_helper.instance_mode='read-only'
anbob2.instance_number=2
anbob1.instance_number=1
复制

注意:
这里的instance_mode参数并非常规实例参数, v$spparameter.FAMILY 同样值为dw_helper, 这是oracle内部使用的保留列,parameter “family:dw_helper.instance_mode=read-only” 通常是没有用的,猜测应该是用于FLEX CLUSTER架构的leaf nodes。 和Read-Only instances也是FLEX Cluster 12.2 的leaf Nodes使用。

所以这个参数是可以删除掉的,并也只是在RAC环境的SPfile中存在。

SQL> alter system reset instance_mode scope=spfile;
alter system reset instance_mode scope=spfile
*
ERROR at line 1:
ORA-32010: cannot find entry to delete in SPFILE


SQL> alter system reset "instance_mode" scope=spfile;
alter system reset "instance_mode" scope=spfile
*
ERROR at line 1:
ORA-32010: cannot find entry to delete in SPFILE


SQL> alter system reset instance_mode family='dw_helper' scope=spfile;

System altered.

SQL> create pfile='/tmp/pfile.ora' from spfile;
File created.
Tip:
 pfile中的参数family:dw_helper.instance_mode=read-only已经不存在。

SQL> select inst_id,name,value from gv$spparameter where name like 'instance_mode%';

   INST_ID NAME                 VALUE
---------- -------------------- ------------------------------
         2 instance_mode
         1 instance_mode
复制

什么是Flex CLUSTER

Flex Cluster在12C的新特性,同时还有Flex ASM, Flex cluster引入了leaf node、hub node, 打破了过去节点间都要通过interconnect 互联心跳,多个leaf node可以只于它的hub node互联,实现的是application tier节点扩展. hub节点是跑真正的db ,vip ,asm instance,需要与FLEX ASM连接。 flex ASM 在我之前的文章有介绍。

在12C R1时如果注意过,创建cluster时可以选择是pre-12的standard cluster和12c引入flex cluster. 也切换flex 和standard 模式的方法如下

crsctl set cluster mode {standard|flex}
复制

但是从12cR2开始上面的命令没有了,并且默认就是Flex cluster,无法再使用standard,与ORACLE 产品经理确认后, 12.2默认是在flex cluster,但并不是意味要求部署leaf node, 默认为hub node, 和之前的standard使用一样,只是强置使用FLEX ASM, 也是后续版本的标准,同时LEAF NODE已经逐渐淘汰,leaf node试水失败,但是hub node的名字保留了下来。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论