Control file multiplexing



O control file é uma estrutura crucial para o funcionamento do banco de dados oracle. Ele é um pequeno arquivo binário que mantém metadados da estrutura física do oracle database, tais como:

  • Informações de checkpoint
  • Nome e local dos datafiles e redo log files
  • O nome do database
  • Número da sequência corrente do redo log
  • Timestamp da criação do banco

O control file é criado no momento da criação do database. O banco precisa de apenas um arquivo de controle para seu funcionamento. Contudo, por motivo de segurança, é importante que o DBA configure a multiplexação desse arquivo de modo que existam cópias dele em devices de armazenamento diferentes. Dessa forma, caso haja falha em algum dos discos ou um dos arquivos se torne indisponível por qualquer motivo, não estaremos refém de um único ponto de falha.

A seguir demonstro o processo de multiplexação dos arquivos de control files. Podemos fazer esse processo basicamente ajustando o parâmetro control_files . Contudo, antes de prosseguir vou criar um pfile from spfile para garantir uma cópia consistente da parametrização do meu banco antes das alterações.

SQL > CREATE PFILE='/home/oracle/initORCL.ora' FROM SPFILE;


Vou inicialmente listar a configuração de control file definida no banco

SQL> show parameter control_files
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
control_files                        string      /u02/oradata/ORCL/controlfile/
                                                 o1_mf_mlo6omb7_.ctl, /u02/fast
                                                 _recovery_area/ORCL/controlfil
                                                 e/o1_mf_mlo6omcz_.ctl
SQL>


Podemos observar que o banco já possui dois arquivos de control file.

Agora vamos adicionar o terceiro control file /home/oracle/controlfile/controlfile3.ctl . Para fazer a adição vamos ajustar o parâmetros control_files definindo os dois arquivos que já existem e adicionando nosso terceiro arquivo.

SQL> alter system set control_files='/u02/oradata/ORCL/controlfile/o1_mf_mlo6omb7_.ctl', '/u02/fast_recovery_area/ORCL/controlfile/o1_mf_mlo6omcz_.ctl','/home/oracle/controlfile/controlfile03.ctl' scope=spfile;

System altered.

SQL>


Observe que o parâmetro foi ajustado a nível de spfile, portanto a alteração só vai valer após o restart da instância.

É importante notar que fazer a alteração do parâmetro não vai criar o diretório e/ou o arquivo de forma automática. Precisamos garantir que ele exista no local indicado pelo parâmetro control_files . Caso não tenhamos providenciado uma cópia do control file para o local indicado, o processo de mount da instância irá falhar durante o reboot.

Vamos tentar reiniciar a instância para validar o ajuste.

SQL> shut immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> 
SQL> 
SQL> startup
ORACLE instance started.

Total System Global Area 1157627856 bytes
Fixed Size                  9134032 bytes
Variable Size             536870912 bytes
Database Buffers          603979776 bytes
Redo Buffers                7643136 bytes
ORA-00205: error in identifying control file, check alert log for more info

SQL>


Como dito anteriormente, a instância foi iniciada, mas o processo de mount falhou por não ter encontrado o arquivo de control file novo que informamos no control_files parameter.

Para resolver esse problema, vamos copiar um dos arquivos de control file já existentes para o novo endereço e na sequencia podemos abrir o database.

SQL> !cp /u02/oradata/ORCL/controlfile/o1_mf_mlo6omb7_.ctl /home/oracle/controlfile/controlfile03.ctl

SQL> alter database mount;

Database altered.

SQL> alter database open;

Database altered.

SQL>


Agora que reiniciamos o database podemos validar o parâmetro control_files para ver a relação de arquivos de controle que definimos.

SQL> show parameter control_files
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
control_files                        string      /u02/oradata/ORCL/controlfile/
                                                 o1_mf_mlo6omb7_.ctl, /u02/fast
                                                 _recovery_area/ORCL/controlfil
                                                 e/o1_mf_mlo6omcz_.ctl, /home/o
                                                 racle/controlfile/controlfile0
                                                 3.ctl
SQL>


Nesse momento temos três cópias do control file sendo usadas pelo banco de dados. O database escreve nos três arquivos, contudo apenas o primeiro arquivo é lido.

Caso qualquer dos arquivos definidos no parâmetro control_files fique indisponível teremos problemas e será necessário copiar um dos arquivos restantes para o local do arquivo que ficou indisponível.

Para exemplificar esse problema, vamos apagar a cópia indicada na primeira posição do parâmetro control_files .

SQL> show parameter control_files
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
control_files                        string      /u02/oradata/ORCL/controlfile/
                                                 o1_mf_mlo6omb7_.ctl, /u02/fast
                                                 _recovery_area/ORCL/controlfil
                                                 e/o1_mf_mlo6omcz_.ctl, /home/o
                                                 racle/controlfile/controlfile0
                                                 3.ctl
SQL> !rm /u02/oradata/ORCL/controlfile/o1_mf_mlo6omb7_.ctl


Mesmo após a perda do control file o banco não caiu e até podemos fazer algumas operações, contudo quando tentamos fazer alguma ação que requer acesso ao control file recebemos um erro.

Abaixo podemos ver que mesmo sem uma das cópias do control file eu consegui fazer consulta, criar uma tablespace e forçar um checkpoint. Contudo, não consigo baixar o banco de forma consistente. E precisei fazer um shutdown abort

SQL> !rm /u02/oradata/ORCL/controlfile/o1_mf_mlo6omb7_.ctl

SQL> create tablespace teste03;

Tablespace created.

SQL> alter system checkpoint;

System altered.

SQL> select status from v$instance;

STATUS
------------
OPEN

SQL> shut immediate
Database closed.
ORA-00210: cannot open the specified control file
ORA-00202: control file: '/u02/oradata/ORCL/controlfile/o1_mf_mlo6omb7_.ctl'
ORA-27041: unable to open file
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3

SQL> 
SQL> select status from v$instance;

STATUS
------------
MOUNTED

SQL> shut abort
ORACLE instance shut down.
SQL>


Caso eu tente abrir o banco novamente eu vou receber o erro ORA-00205: error in identifying control file, check alert log for more info .

Para evitar o erro já vou copiar um dos arquivos de control file para o local do arquivo perdido.

SQL> !cp /home/oracle/controlfile/controlfile03.ctl /u02/oradata/ORCL/controlfile/o1_mf_mlo6omb7_.ctl           

SQL> alter database mount;

Database altered.

SQL> alter database open;

Database altered.

SQL>


Em síntese, sem o control file o banco de dados não funciona. Para evitar problemas e dor de cabeça, é recomendado como boa prática, manter uma boa configuração de control file com arquivos multiplexados sobre discos distintos visando maior segurança deste arquivo tão importante.

Além da multiplexação, uma política de backup RMAN bem planejada ajuda a manter cópias deste arquivo para uso em caso de alguma falha nos discos ou mesmo do servidor de banco como um todo, mantendo cópias do backup do banco, não apenas do control file, em local fora do servidor de banco.

Postar um comentário

0 Comentários