These days I was testing some commands of the system parameters and the PFILE/SPFILE, and unfortunately, I encountered a really bad bug in my test environment.
My RAC DB is 12.1.0.2.0, and I did below tests about the 'create pfile/spfile' command:
The configuration of the database resource of test db:
[oracle@rac12-node1 OPatch]$ srvctl config database -db rac12 Database unique name: rac12 Database name: rac12 Oracle home: /u01/app/oracle/product/12.1.0 Oracle user: oracle Spfile: +DATA/rac12/spfilerac12.ora Password file: +DATA/RAC12/PASSWORD/pwdrac12.276.902472499 Domain: Start options: open Stop options: immediate Database role: PRIMARY Management policy: AUTOMATIC Server pools: racpool Disk Groups: DATA Mount point paths: Services: racdb Type: RAC Start concurrency: Stop concurrency: OSDBA group: dba OSOPER group: dba Database instances: Configured nodes: Database is policy managed
Please note the value of the parameter Spfile: +DATA/rac12/spfilerac12.ora.
SQL> create pfile='/tmp/ffile.ora' from spfile='+DATA/rac12/spfilerac12.ora'; File created. SQL> !srvctl config database -db rac12|grep -i 'spfile' Spfile: +DATA/rac12/spfilerac12.ora SQL> create spfile='/tmp/ffile.spfile' from pfile='/tmp/ffile.ora'; File created. SQL> !srvctl config database -db rac12|grep -i 'spfile' Spfile: /tmp/ffile.spfile SQL> create pfile='/tmp/fmem.ora' from memory; File created. SQL> !srvctl config database -db rac12|grep -i 'spfile' Spfile: /tmp/ffile.spfile SQL> create spfile='/tmp/fmem.spfile' from memory; File created. SQL> !srvctl config database -db rac12|grep -i 'spfile' Spfile: /tmp/fmem.spfile SQL> create pfile from spfile='+DATA/rac12/spfilerac12.ora'; File created. SQL> !srvctl config database -db rac12|grep -i 'spfile' Spfile: /tmp/fmem.spfile SQL> create spfile from pfile='/tmp/ffile.ora'; File created. SQL> !srvctl config database -db rac12|grep -i 'spfile' Spfile: +DATA/spfilerac12_1.ora SQL> create pfile='/tmp/ffile2.ora' from spfile; File created. SQL> !srvctl config database -db rac12|grep -i 'spfile' Spfile: +DATA/spfilerac12_1.ora SQL> create spfile='/tmp/ffile2.spfile' from pfile; File created. SQL> !srvctl config database -db rac12|grep -i 'spfile' Spfile: /tmp/ffile2.spfile SQL> create pfile from spfile; File created. SQL> !srvctl config database -db rac12|grep -i 'spfile' Spfile: /tmp/ffile2.spfile SQL> create spfile from pfile; File created. SQL> !srvctl config database -db rac12|grep -i 'spfile' Spfile: +DATA/spfilerac12_1.ora
Find what? Yes, every time I run the 'create spfile', then it would update the configuration of the database resource.
So it was easy that sometimes you found the DBs were using different SPFILE:
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'; INSTANCE_NAME NAME VALUE ---------------- -------------------- ---------------------------- rac12_3 spfile +DATA/rac12/spfilerac12.ora rac12_1 spfile /tmp/ffile.spfile rac12_4 spfile +DATA/rac12/spfilerac12.ora
I had to say it was a really stupid action, and I found bug:
Bug 18799993 CREATE SPFILE updates the DB resource by default as of 12.1
and got:
This bug is only relevant when using Real Application Clusters (RAC) As of 12c creating an spfile also updates the spfile location in the cluster. This is different to 11.2 behaviour and can affect scripts that create a local SPFILE that is not accessible to other RAC nodes. Rediscovery Notes After an spfile is created, the spfile location is updated in the cluster. Other nodes may then be unable to access the new spfile. Workaround None other than be sure to create SPFILE on a shared disk accessible to all nodes. Note: This fix extends the CREATE SPFILE syntax to add an "AS COPY" option. If 'AS COPY' is specified the cluster wide spfile location is not updated.
I patched my test DB soon, and run the tests again:
SQL> create spfile='/tmp/aferpatch_ffile.spfile' from pfile='/tmp/ffile.ora'; File created. SQL> !srvctl config database -db rac12|grep -i 'spfile' Spfile: /tmp/aferpatch_ffile.spfile SQL> create spfile='/tmp/aferpatch_fmem.spfile' from memory; File created. SQL> !srvctl config database -db rac12|grep -i 'spfile' Spfile: /tmp/aferpatch_ffile.spfile SQL> create spfile='/tmp/aferpatch_ffile2.spfile' from pfile; File created. SQL> !srvctl config database -db rac12|grep -i 'spfile' Spfile: /tmp/aferpatch_ffile2.spfile SQL> create spfile from pfile='/tmp/ffile.ora'; File created. SQL> !srvctl config database -db rac12|grep -i 'spfile' Spfile: /tmp/aferpatch_ffile2.spfile SQL> create spfile from memory; File created. SQL> !srvctl config database -db rac12|grep -i 'spfile' Spfile: /tmp/aferpatch_ffile2.spfile SQL> create spfile from pfile; File created. SQL> !srvctl config database -db rac12|grep -i 'spfile' Spfile: /tmp/aferpatch_ffile2.spfile
So I still could not specify the the path of the generated SPFILE.
Continued to test with 'as copy' option:
SQL> create spfile='/tmp/aferpatch_ffile.spfile' from pfile='/tmp/ffile.ora' as copy; File created. SQL> !srvctl config database -db rac12|grep -i 'spfile' Spfile: /tmp/aferpatch_ffile2.spfile SQL> create spfile='/tmp/aferpatch_ffile.spfile' from pfile as copy; File created. SQL> !srvctl config database -db rac12|grep -i 'spfile' Spfile: /tmp/aferpatch_ffile2.spfile SQL> create spfile='/tmp/aferpatch_ffile.spfile' from memory as copy; create spfile='/tmp/aferpatch_ffile.spfile' from memory as copy * ERROR at line 1: ORA-00933: SQL command not properly ended SQL> create spfile from pfile='/tmp/ffile.ora' as copy; File created. SQL> !srvctl config database -db rac12|grep -i 'spfile' Spfile: /tmp/aferpatch_ffile2.spfile SQL> create spfile from pfile as copy; File created. SQL> !srvctl config database -db rac12|grep -i 'spfile' Spfile: /tmp/aferpatch_ffile2.spfile SQL> create spfile from memory as copy; create spfile from memory as copy * ERROR at line 1: ORA-00933: SQL command not properly ended
So, in RAC DB environments, after version 12.1.0.2.0, I suggest:
- Install the corresponding patch or the latest PSU.
- Try to use the 'as copy' option for all your 'create spfile from pfile' command.