Shared SPFILE is recommended strongly in RAC environment, and I want to tell you the reason in this post.
The test environment is Oracle 12c 12.1.0.2, and the installed PSU is 21948354.
- SQL> select PATCH_ID,PATCH_UID,BUNDLE_SERIES,BUNDLE_ID,STATUS from dba_registry_sqlpatch;
- PATCH_ID PATCH_UID BUNDLE_SERIES BUNDLE_ID STATUS
- ---------- ---------- ------------------------------ ---------- ---------------
- 21948354 19553095 PSU 160119 SUCCESS
To show the difference, I used a non-shared SPFILE in the node rac12-node1 intentionally:
- SQL> select INSTANCE_NAME,NAME,VALUE from gv$parameter gp, gv$instance gi
- 2 where gp.INST_ID=gi.INST_ID and gp.name='spfile' order by instance_name;
- INSTANCE_NAME NAME VALUE
- ---------------- -------------------- -----------------------------------
- rac12_1 spfile /tmp/aferpatch_ffile2.spfile
- rac12_2 spfile +DATA/rac12/spfilerac12.ora
- rac12_3 spfile +DATA/rac12/spfilerac12.ora
The parameter open_cursors is used during this test, and let me check its value in the DB and SPFILE before the test:
- SQL> select INSTANCE_NAME,NAME,VALUE from gv$parameter gp, gv$instance gi
- 2 where gp.INST_ID=gi.INST_ID and gp.name='open_cursors' order by instance_name;
- INSTANCE_NAME NAME VALUE
- ---------------- -------------------- -----------------------------------
- rac12_1 open_cursors 300
- rac12_2 open_cursors 300
- rac12_3 open_cursors 300
- SQL> select INSTANCE_NAME,gsp.SID, NAME,VALUE from gv$spparameter gsp, gv$instance gi
- 2 where gsp.INST_ID=gi.INST_ID and gsp.name='open_cursors' order by instance_name;
- INSTANCE_NAME SID NAME VALUE
- ---------------- --------------- -------------------- ------------------------------
- rac12_1 * open_cursors 300
- rac12_2 * open_cursors 300
- rac12_3 * open_cursors 300
Usually we change parameter using sid='*', and what will happen in such situation?
- SQL> select instance_name,host_name from v$instance;
- INSTANCE_NAME HOST_NAME
- ---------------- -----------------------------------
- rac12_1 rac12-node1.lunixdb.com
- SQL> alter system set open_cursors=800;
- System altered.
- SQL> select INSTANCE_NAME,NAME,VALUE from gv$parameter gp, gv$instance gi
- 2 where gp.INST_ID=gi.INST_ID and gp.name='open_cursors' order by instance_name;
- INSTANCE_NAME NAME VALUE
- ---------------- -------------------- ---------------------------------
- rac12_1 open_cursors 800
- rac12_2 open_cursors 800
- rac12_3 open_cursors 800
- SQL> select INSTANCE_NAME,gsp.SID, NAME,VALUE from gv$spparameter gsp, gv$instance gi
- 2 where gsp.INST_ID=gi.INST_ID and gsp.name='open_cursors' order by instance_name;
- INSTANCE_NAME SID NAME VALUE
- ---------------- ---------- -------------------- ---------------------------------
- rac12_1 * open_cursors 800
- rac12_2 * open_cursors 300
- rac12_3 * open_cursors 300
- SQL> select instance_name,host_name from v$instance;
- INSTANCE_NAME HOST_NAME
- ---------------- -----------------------------------
- rac12_2 rac12-node2.lunixdb.com
- SQL> alter system set open_cursors=900;
- System altered.
- SQL> select INSTANCE_NAME,NAME,VALUE from gv$parameter gp, gv$instance gi
- 2 where gp.INST_ID=gi.INST_ID and gp.name='open_cursors' order by instance_name;
- INSTANCE_NAME NAME VALUE
- ---------------- -------------------- ---------------------------------
- rac12_1 open_cursors 900
- rac12_2 open_cursors 900
- rac12_3 open_cursors 900
- SQL> select INSTANCE_NAME,gsp.SID, NAME,VALUE from gv$spparameter gsp, gv$instance gi
- 2 where gsp.INST_ID=gi.INST_ID and gsp.name='open_cursors' order by instance_name;
- INSTANCE_NAME SID NAME VALUE
- ---------------- ---------- -------------------- ---------------------------------
- rac12_1 * open_cursors 800
- rac12_2 * open_cursors 900
- rac12_3 * open_cursors 900
If we change one specific sid, then what we will get?
- SQL> select instance_name,host_name from v$instance;
- INSTANCE_NAME HOST_NAME
- ---------------- -----------------------------------
- rac12_1 rac12-node1.lunixdb.com
- SQL> alter system set open_cursors=700 sid='rac12_3';
- System altered.
- SQL> select INSTANCE_NAME,NAME,VALUE from gv$parameter gp, gv$instance gi
- 2 where gp.INST_ID=gi.INST_ID and gp.name='open_cursors' order by instance_name;
- INSTANCE_NAME NAME VALUE
- ---------------- -------------------- ---------------------------------
- rac12_1 open_cursors 900
- rac12_2 open_cursors 900
- rac12_3 open_cursors 700
- SQL> select INSTANCE_NAME,gsp.SID, NAME,VALUE from gv$spparameter gsp, gv$instance gi
- 2 where gsp.INST_ID=gi.INST_ID and gsp.name='open_cursors' order by instance_name;
- INSTANCE_NAME SID NAME VALUE
- ---------------- ---------- -------------------- ---------------------------------
- rac12_1 rac12_3 open_cursors 700
- rac12_1 * open_cursors 800
- rac12_2 * open_cursors 900
- rac12_3 * open_cursors 900
- SQL> select instance_name,host_name from v$instance;
- INSTANCE_NAME HOST_NAME
- ---------------- -----------------------------------
- rac12_2 rac12-node2.lunixdb.com
- SQL> alter system set open_cursors=600 sid='rac12_3';
- System altered.
- SQL> select INSTANCE_NAME,NAME,VALUE from gv$parameter gp, gv$instance gi
- 2 where gp.INST_ID=gi.INST_ID and gp.name='open_cursors' order by instance_name;
- INSTANCE_NAME NAME VALUE
- ---------------- -------------------- ---------------------------------
- rac12_1 open_cursors 900
- rac12_2 open_cursors 900
- rac12_3 open_cursors 600
- SQL> select INSTANCE_NAME,gsp.SID, NAME,VALUE from gv$spparameter gsp, gv$instance gi
- 2 where gsp.INST_ID=gi.INST_ID and gsp.name='open_cursors' order by instance_name;
- INSTANCE_NAME SID NAME VALUE
- ---------------- ---------- -------------------- ---------------------------------
- rac12_1 rac12_3 open_cursors 700
- rac12_1 * open_cursors 800
- rac12_2 * open_cursors 900
- rac12_2 rac12_3 open_cursors 600
- rac12_3 * open_cursors 900
- rac12_3 rac12_3 open_cursors 600
- 6 rows selected.
Do you find the difference?
Yes, seems the result is confusing, and let me summary the result as below:
- Try to use shared SPFILE in any conditions
- The value of the parameter will be changed always, whenever shared SPFILE is used or not.
- The change of the SPFILE will ONLY happen in the local SPFILE. So if the SPFILE is not shared, then other instances cannot find the changed value.
- In fact, every instance has its own SPFILE. If the SPFILE is shared, it will be read more then one time.