Multiplexando os Controlfiles do Oracle em ASM

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.

%name Multiplexando os Controlfiles do Oracle em ASM

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.