O objetivo de Multiplexar os Controlfiles é totalmente importante para a segurança contra corrupção do arquivo e ou de disco.
Recomendado pela Oracle, estes devem ser multiplexados em diferentes discos e não em partições de um único disco. No ASM é sugerido que coloquemos em diferentes Grupos de Discos.
Segue abaixo o procedimento de como multiplexar o controlfile em ASM.
Vamos subir as instâncias (ASM e ORCL).
[oracle@serveroracle ~]$ export ORACLE_SID=+ASM [oracle@serveroracle ~]$ sqlplus /nolog
SQL*Plus: Release 10.2.0.1.0 - Production on Mon Oct 17 18:30:19 2011 Copyright (c) 1982, 2005, Oracle. All rights reserved. SQL> conn / as sysdba Connected to an idle instance. SQL> startup mount ASM instance started Total System Global Area 83886080 bytes Fixed Size 1217836 bytes Variable Size 57502420 bytes ASM Cache 25165824 bytes ASM diskgroups mounted SQL> exit Disconnected from Oracle Database 10g Release 10.2.0.1.0 - Production
[oracle@serveroracle ~]$ ps -ef | grep pmon oracle 2584 1 1 18:30 ? 00:00:00 asm_pmon_+ASM oracle 2604 2262 0 18:30 pts/1 00:00:00 grep pmon [oracle@serveroracle ~]$ export ORACLE_SID=orcl [oracle@serveroracle ~]$ sqlplus / as sysdba
SQL*Plus: Release 10.2.0.1.0 - Production on Mon Oct 17 18:30:50 2011 Copyright (c) 1982, 2005, Oracle. All rights reserved. Connected to an idle instance. SQL> startup ORACLE instance started. Total System Global Area 557842432 bytes Fixed Size 1220556 bytes Variable Size 155189300 bytes Database Buffers 398458880 bytes Redo Buffers 2973696 bytes Database mounted. Database opened. SQL>
Vamos visualizar os controlfiles e vamos multiplexar os mesmos.
SQL> select NAME from v$controlfile; NAME -------------------------------------------- +DGA/orcl/controlfile/current.260.764689167 SQL>
Vamos visualizar os nossos discos de grupo disponpíveis para a multiplexação dos controlfiles;
SQL> select name from v$asm_diskgroup; NAME ------------------------------ DGA DGB SQL>
Vamos multiplexar os controlfiles. Neste não iremos utilizar o RMAN para fazer a cópia dos controlfiles.
Vamos utilizar o próprio ASM para a realização do mesmo.
SQL> alter database backup controlfile to '+DGB'; Database altered. SQL> !
[oracle@serveroracle ~]$ export ORACLE_SID=+ASM [oracle@serveroracle ~]$ asmcmd
ASMCMD> ls -l +DGB Type Redund Striped Time Sys Name Y ORCL/ ASMCMD> cd +DGB/ORCL/ ASMCMD> ls -l Type Redund Striped Time Sys Name Y CONTROLFILE/ ASMCMD> cd CONTROLFILE/ ASMCMD> ls -l Type Redund Striped Time Sys Name CONTROLFILE UNPROT FINE OCT 17 18:00:00 Y Backup.256.764793571 ASMCMD> mkalias Backup.256.764793571 control02.ctl ASMCMD> exit [oracle@serveroracle ~]$
O que realizamos foi um procedimento de criar um backup do controlfile num outro disco de grupo e pelo ASM utilizamos o “mkalias” para linkar o arquivo criado com um outro nome de arquivo como por exemplo, control02.ctl.
OBS: Para saber mais sobre o comando “mkalias” entre em Documento Oracle ASM
Vamos agora então ajustar o nosso spfile para subir com os dois controlfiles.
[oracle@serveroracle ~]$ exit exit
SQL> show parameter control_files; NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ control_files string +DGA/orcl/controlfile/current. 260.764689167 SQL> alter system set control_files = '+DGA/orcl/controlfile/current.260.764689167','+DGB/orcl/controlfile/control02.ctl' scope=spfile; System altered. SQL> shutdown immediate Database closed. Database dismounted. ORACLE instance shut down. SQL> startup ORACLE instance started. Total System Global Area 557842432 bytes Fixed Size 1220556 bytes Variable Size 159383604 bytes Database Buffers 394264576 bytes Redo Buffers 2973696 bytes Database mounted. Database opened. SQL> show parameter control_files; NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ control_files string +DGA/orcl/controlfile/current. 260.764689167, +DGB/orcl/contr olfile/control02.ctl SQL> select NAME from v$controlfile; NAME --------------------------------------------- +DGA/orcl/controlfile/current.260.764689167 +DGB/orcl/controlfile/control02.ctl SQL>
Agora vamos realizar um teste para verificar se houve efeito na nossa Multiplexação dos Controlfiles.
Vou remover um dos controlfiles para realizarmos o teste do startup do banco de dados com apenas aquele controlfile criado no +DGB.
SQL> shutdown immediate Database closed. Database dismounted. ORACLE instance shut down. SQL> !
[oracle@serveroracle ~]$ export ORACLE_SID=+ASM [oracle@serveroracle ~]$ asmcmd
ASMCMD> ls -l +DGA/orcl/controlfile/current.260.764689167 Type Redund Striped Time Sys Name CONTROLFILE UNPROT FINE OCT 18 15:00:00 Y current.260.764689167 ASMCMD> rm -f +DGA/orcl/controlfile/current.260.764689167 ASMCMD> ls -l +DGA/orcl/controlfile/current.260.764689167 asmcmd: entry 'controlfile' does not exist in directory '+DGA/orcl/' ASMCMD> exit
[oracle@serveroracle ~]$ exit exit
SQL> startup nomount ORACLE instance started. Total System Global Area 557842432 bytes Fixed Size 1220556 bytes Variable Size 163577908 bytes Database Buffers 390070272 bytes Redo Buffers 2973696 bytes SQL> show parameter control_files NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ control_files string +DGA/orcl/controlfile/current. 260.764689167, +DGB/orcl/contr olfile/control02.ctl SQL> alter system set control_files='+DGB/orcl/controlfile/control02.ctl' scope=spfile; System altered. SQL> shutdown immediate ORA-01507: database not mounted ORACLE instance shut down. SQL>
Vamos iniciar a nossa instância com apenas o controlfile criado no +DGB.
SQL> startup nomount ORACLE instance started. Total System Global Area 557842432 bytes Fixed Size 1220556 bytes Variable Size 163577908 bytes Database Buffers 390070272 bytes Redo Buffers 2973696 bytes SQL> alter database mount; Database altered. SQL> alter database open; Database altered. SQL> select NAME from v$controlfile; NAME ------------------------------------ +DGB/orcl/controlfile/control02.ctl SQL>
Agora vamos realizar o procedimento acima e multiplexar o controlfile do +DGB para o +DGA.
SQL> alter database backup controlfile to '+DGA'; Database altered. SQL> !
[oracle@serveroracle ~]$ export ORACLE_SID=+ASM [oracle@serveroracle ~]$ asmcmd
ASMCMD> cd +DGA/orcl/controlfile ASMCMD> ls -l Type Redund Striped Time Sys Name CONTROLFILE UNPROT FINE OCT 18 18:00:00 Y Backup.260.764879511 ASMCMD> mkalias Backup.260.764879511 control01.ctl ASMCMD> ls -l Type Redund Striped Time Sys Name CONTROLFILE UNPROT FINE OCT 18 18:00:00 Y Backup.260.764879511 N control01.ctl => +DGA/ORCL/CONTROLFILE/Backup.260.764879511 ASMCMD> exit
[oracle@serveroracle ~]$ exit exit
SQL> alter system set control_files='+DGA/orcl/controlfile/control01.ctl','+DGB/orcl/controlfile/control02.ctl' scope=spfile; System altered. SQL> shutdown immediate Database closed. Database dismounted. ORACLE instance shut down. SQL> startup ORACLE instance started. Total System Global Area 557842432 bytes Fixed Size 1220556 bytes Variable Size 167772212 bytes Database Buffers 385875968 bytes Redo Buffers 2973696 bytes Database mounted. Database opened. SQL> select NAME from v$controlfile; NAME ------------------------------------ +DGA/orcl/controlfile/control01.ctl +DGB/orcl/controlfile/control02.ctl SQL>
Pronto seus controlfiles foram multiplexados em diferentes discos de grupo conforme recomendações e boas práticas da Oracle.

Autor: Maycon Tomiasi
Formado em Tecnologia da Informação na FIPP (Faculdade de Informática de Presidente Prudente), Analista DBA Oracle pela Teiko Soluções em Tecnologia da Informação, residente em Blumenau/ SC, Certificado OCP 10g/11g/12c, OCS 11g Implementation, OCE 11g Performance Tuning, OCE 11g RAC & GRID e OPN Specialist. Conhecimentos em PHP.