In a Real Application Clusters (RAC) environment, having multiple copies of control files is a critical best practice. Control files contain the most vital metadata of a database and their loss can lead to serious recovery scenarios. This post demonstrates how to multiplex control files in a running 12c RAC database using ASM disk groups.
Environment Details
- Database: TESTSERV
- Version: Oracle 12.1.0.2.0
- Nodes: ORACLEDBASECRETS01 & ORACLEDBASECRETS02
- Storage: ASM (+DG_DATA, +DG_REDO01, +DG_REDO02)
Step 1: Verify RAC Database Status
Confirm both instances are running:
[oracle@ORACLEDBASECRETS01 ~]$ srvctl status database -db testserv
Instance testserv1 is running on node ORACLEDBASECRETS01
Instance testserv2 is running on node ORACLEDBASECRETS02
Step 2: Check Existing Control File
Connect to SQL*Plus and check current control file location:
[oracle@ORACLEDBASECRETS01 ~]$ sqlplus / as sysdba SQL*Plus: Release 12.1.0.2.0 Production on Thu Jun 17 01:46:01 2025 Copyright (c) 1982, 2014, Oracle. All rights reserved. Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP, Advanced Analytics and Real Application Testing options SQL> select name from v$controlfile; NAME ----------------------------------------------------- +DG_DATA/TESTSERV/CONTROLFILE/current.261.1075057951
Step 3: Modify CONTROL_FILES Parameter
Add two more ASM disk groups for control file multiplexing:
SQL> alter system set control_files='+DG_DATA/TESTSERV/CONTROLFILE/current.261.1075057951','+DG_REDO01','+DG_REDO02' scope=spfile;
System altered.
Since this parameter is static, the database must be restarted.
Step 4: Restart Database in NOMOUNT
Stop the RAC database:
[oracle@ORACLEDBASECRETS01 ~]$ srvctl status database -db testserv Instance testserv1 is running on node ORACLEDBASECRETS01 Instance testserv2 is running on node ORACLEDBASECRETS02 [oracle@ORACLEDBASECRETS01 ~]$ [oracle@ORACLEDBASECRETS01 ~]$ srvctl stop database -db testserv
Start database in NOMOUNT mode:
[oracle@ORACLEDBASECRETS01 ~]$ srvctl status database -db testserv Instance testserv1 is not running on node ORACLEDBASECRETS01 Instance testserv2 is not running on node ORACLEDBASECRETS02 [oracle@ORACLEDBASECRETS01 ~]$ [oracle@ORACLEDBASECRETS01 ~]$ [oracle@ORACLEDBASECRETS01 ~]$ srvctl start database -db testserv -o nomount
Step 5: Restore Control Files using RMAN
Connect to RMAN and restore control files:
[oracle@ORACLEDBASECRETS01 ~]$ rman target / Recovery Manager: Release 12.1.0.2.0 - Production on Thu Jun 17 01:49:35 2025 Copyright (c) 1982, 2014, Oracle and/or its affiliates. All rights reserved. connected to target database: TESTSERV (not mounted) RMAN> restore controlfile from '+DG_DATA/TESTSERV/CONTROLFILE/current.261.1075057951'; Starting restore at 17-JUN-21 using target database control file instead of recovery catalog allocated channel: ORA_DISK_1 channel ORA_DISK_1: SID=394 instance=testserv1 device type=DISK channel ORA_DISK_1: copied control file copy output file name=+DG_DATA/TESTSERV/CONTROLFILE/current.261.1075057951 output file name=+DG_REDO01/TESTSERV/CONTROLFILE/current.268.1075427393 output file name=+DG_REDO02/TESTSERV/CONTROLFILE/current.268.1075427395 Finished restore at 17-JUN-21 RMAN> exit Recovery Manager complete. [oracle@ORACLEDBASECRETS01 ~]$
Step 6: Verify Parameter
Check control_files parameter:
[oracle@ORACLEDBASECRETS01 ~]$ sqlplus / as sysdba SQL*Plus: Release 12.1.0.2.0 Production on Thu Jun 17 01:49:59 2025 Copyright (c) 1982, 2014, Oracle. All rights reserved. Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP, Advanced Analytics and Real Application Testing options SQL> SQL> show parameter control NAME TYPE VALUE ------------------------------ ------- ------------------------------ control_file_record_keep_time integer 7 control_files string +DG_DATA/TESTSERV/CONTROLFILE/c urrent.261.1075057951, +DG_RED O01/TESTSERV/CONTROLFILE/curren t.268.1075427393, +DG_REDO02/ TESTSERV/CONTROLFILE/current.268 .1075427395 control_management_pack_access string DIAGNOSTIC+TUNING SQL> SQL> exit Disconnected from Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP, Advanced Analytics and Real Application Testing options [oracle@ORACLEDBASECRETS01 ~]$
Step 7: Start Database Normally
[oracle@ORACLEDBASECRETS01 ~]$ srvctl status database -db testserv Instance testserv1 is not running on node ORACLEDBASECRETS01 Instance testserv2 is not running on node ORACLEDBASECRETS02 [oracle@ORACLEDBASECRETS01 ~]$ [oracle@ORACLEDBASECRETS01 ~]$ srvctl start database -db testserv [oracle@ORACLEDBASECRETS01 ~]$ [oracle@ORACLEDBASECRETS01 ~]$ srvctl status database -db testserv Instance testserv1 is running on node ORACLEDBASECRETS01 Instance testserv2 is running on node ORACLEDBASECRETS02 [oracle@ORACLEDBASECRETS01 ~]$
Final Validation
Verify all control files:
[oracle@ORACLEDBASECRETS01 ~]$ sqlplus / as sysdba SQL*Plus: Release 12.1.0.2.0 Production on Thu Jun 17 01:52:13 2025 Copyright (c) 1982, 2014, Oracle. All rights reserved. Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP, Advanced Analytics and Real Application Testing options SQL> SQL> select name from v$controlfile; NAME --------------------------------------------------------- +DG_DATA/TESTSERV/CONTROLFILE/current.261.1075057951 +DG_REDO01/TESTSERV/CONTROLFILE/current.268.1075427393 +DG_REDO02/TESTSERV/CONTROLFILE/current.268.1075427395
Check both RAC instances:
SQL> set lines 165
SQL> col host_name for a20
SQL> select inst_id, instance_number, instance_name, status, host_name, to_char(startup_time, 'DD-MM-YY HH24:MI:SS') "startup_time", version from gv$instance;
INST_ID INSTANCE_NUMBER INSTANCE_NAME STATUS HOST_NAME startup_time VERSION
------- --------------- ------------- ------- -------------------- ----------------- -----------
2 2 testserv2 OPEN ORACLEDBASECRETS02 17-06-25 01:51:50 12.1.0.2.0
1 1 testserv1 OPEN ORACLEDBASECRETS01 17-06-25 01:51:47 12.1.0.2.0
Why This is Important
Control file multiplexing protects your database from single-point failure. By storing copies across multiple ASM disk groups, you ensure higher availability and faster recovery in case of storage corruption.
Conclusion
This exercise shows a safe and practical method to add extra control files in an Oracle RAC environment without recreating the database. It is a simple yet powerful technique every DBA should implement.
Toufique Khan

No comments:
Post a Comment