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的名字保留了下来。
对不起,这篇文章暂时关闭评论。