首页 » ORACLE, ORACLE [C]系列 » Oracle 12c R2 – 19C Instance_mode read-only(不是雪中须送炭,聊装风景要诗来。)

Oracle 12c R2 – 19C Instance_mode read-only(不是雪中须送炭,聊装风景要诗来。)

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的名字保留了下来。

打赏

, ,

对不起,这篇文章暂时关闭评论。