.comment-link {margin-left:.6em;}

Monday, August 01, 2005

Multiplexar Controlfile - OMF

Sobre o artigo de ontem, um colega de trabalho me disse: "Marcio, o texto está legal até onde você fala da multiplexação do controlfile através do OMF, a partir daí ficou um pouco vago". Perguntei se o vago dizia respeito ao fato de que não havia demonstração e ele me respondeu que sim. Depois, recebi um comentário do próprio autor da dúvida que me motivou a investigar essa técnica. Então resolvi publicá-la.

Na verdade, eu não demonstrei por julgar perigosa a operação de multiplexação de controlfile através do OMF. Entretanto, a técnica é interessante. IMPORTANTE! Só siga os passos seguintes se entender o que está fazendo e NUNCA replique isso em produção sem antes estressar em ambiente de teste. É preciso o usuário SYS para o teste.

ops$marcio@ORA10GR1> connect / as sysdba
Connected.
sys@ORA10GR1> create pfile='c:\tmp\init.ora' from spfile;

File created.

Acima criei um pfile (init.ora) para trabalhar como baseline do que já está no ambiente atualmente. Esse passo é importante para preservar todos os ajustes finos que eventualmente tenham sido feitos através dos parâmetros. É necessário editar o init.ora e livrar-se do parâmetro CONTROL_FILES. Segue abaixo o init.ora usado no exemplo. Vale lembrar que usando este técnica (OMF), se no momento do startup do banco ele encontrar o parâmetro control_files definido, o Oracle levanta o erro:

CREATE CONTROLFILE REUSE DATABASE "ORA10GR1" NORESETLOGS ARCHIVELOG
*
ERROR at line 1:
ORA-01503: CREATE CONTROLFILE failed
ORA-01276: Cannot add file (...) File has an Oracle Managed Files file
name.

Se esse erro aparecer em seu exercício, sugiro ir até o init.ora e verificar se o control_files não está dando o ar da graça. Seguindo...

sys@ORA10GR1> host type c:\tmp\init.ora
*.background_dump_dest='C:\oracle\admin\ora10gr1\bdump'
*.compatible='10.1.0.2.0'
*.core_dump_dest='C:\oracle\admin\ora10gr1\cdump'
*.db_block_size=8192
*.db_cache_size=25165824
*.db_create_file_dest='C:\oracle\oradata'
*.db_create_online_log_dest_1='C:\oracle\oramplx'
*.db_create_online_log_dest_2='C:\oracle\oradata'
*.db_domain=''
*.db_file_multiblock_read_count=16
*.db_name='ora10gr1'
*.java_pool_size=0
*.job_queue_processes=10
*.large_pool_size=8388608
*.open_cursors=300
*.pga_aggregate_target=12582912
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.shared_pool_size=41943040
*.sort_area_size=65536
*.undo_management='AUTO'
*.undo_tablespace='UNDOTBS1'
*.user_dump_dest='C:\oracle\admin\ora10gr1\udump'
*.utl_file_dir='c:\tmp'

Agora necessitamos do controlfile propriamente dito, então faremos um trace, o arquivo estará em user_dump_dest. Este caminho pode ser obtido através do comando show parameter user_dump_dest. Uma vez gerado o trace, precisamos editar o arquivo para eliminar os comentários e comandos não aplicados à multiplexação. Mais abaixo encontra-se o arquivo já editado.

sys@ORA10GR1> alter database backup controlfile to trace;

Database altered.

sys@ORA10GR1> host type c:\tmp\multplx_ctl.sql
set echo on
STARTUP NOMOUNT pfile="c:\tmp\init.ora"
CREATE CONTROLFILE REUSE DATABASE "ORA10GR1" NORESETLOGS ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 454
LOGFILE
GROUP 1 'C:\ORACLE\ORAMPLX\ORA10GR1\ONLINELOG\O1_MF_1_1GCW7HLG_.LOG' SIZE 10M,
GROUP 2 'C:\ORACLE\ORAMPLX\ORA10GR1\ONLINELOG\O1_MF_2_1GCW7JQT_.LOG' SIZE 10M,
GROUP 3 'C:\ORACLE\ORAMPLX\ORA10GR1\ONLINELOG\O1_MF_3_1GCW7KOC_.LOG' SIZE 10M
-- STANDBY LOGFILE
DATAFILE
'C:\ORACLE\ORADATA\ORA10GR1\DATAFILE\O1_MF_SYSTEM_1GCW7ODG_.DBF',
'C:\ORACLE\ORADATA\ORA10GR1\DATAFILE\O1_MF_UNDOTBS1_1GCW99S4_.DBF',
'C:\ORACLE\ORADATA\ORA10GR1\DATAFILE\O1_MF_SYSAUX_1GCW9XS2_.DBF',
'C:\ORACLE\ORADATA\ORA10GR1\DATAFILE\O1_MF_USERS_1GCWDQ43_.DBF',
'C:\ORACLE\ORADATA\ORA10GR1\DATAFILE\O1_MF_PAY_TBSP_1GK8ZWPX_.DBF',
'C:\TMP\A.DBF'
CHARACTER SET WE8MSWIN1252
;
ALTER SYSTEM ARCHIVE LOG ALL;
ALTER DATABASE OPEN;

column ctl_files NEW_VALUE ctl_files;
select concat('control_files=''',
concat(replace(value, ', ', ''','''), '''')) ctl_files
from v$parameter
where name ='control_files';
host "echo &ctl_files >> c:\tmp\init.ora"

set echo off

A última query do controlfile é para alimentar o init.ora com os novos nomes dos recém criados arquivos de controle. Isto será usado mais adiante para atualizar o spfile. Abaixo limpo os diretórios onde os controlfiles serão criados.

sys@ORA10GR1> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
sys@ORA10GR1> host del c:\oracle\oradata\ora10gr1\controlfile\*.ctl

sys@ORA10GR1> host dir c:\oracle\oradata\ora10gr1\controlfile\*.*
Volume in drive C has no label.
Volume Serial Number is 4064-FF3B

Directory of c:\oracle\oradata\ora10gr1\controlfile

08/02/2005 01:02 AM <DIR> .
08/02/2005 01:02 AM <DIR> ..
0 File(s) 0 bytes
2 Dir(s) 4,911,177,728 bytes free

sys@ORA10GR1> host del c:\oracle\oramplx\ora10gr1\controlfile\*.*
c:\oracle\oramplx\ora10gr1\controlfile\*.*, Are you sure (Y/N)? y

sys@ORA10GR1> host dir c:\oracle\oramplx\ora10gr1\controlfile\*.*
Volume in drive C has no label.
Volume Serial Number is 4064-FF3B

Directory of c:\oracle\oramplx\ora10gr1\controlfile

08/02/2005 01:03 AM <DIR> .
08/02/2005 01:03 AM <DIR> ..
0 File(s) 0 bytes
2 Dir(s) 4,924,219,392 bytes free

SHOWTIME!

sys@ORA10GR1> @c:\tmp\multplx_ctl
sys@ORA10GR1> STARTUP NOMOUNT pfile="c:\tmp\init.ora"
ORACLE instance started.

Total System Global Area 79691776 bytes
Fixed Size 787548 bytes
Variable Size 53476260 bytes
Database Buffers 25165824 bytes
Redo Buffers 262144 bytes
sys@ORA10GR1> CREATE CONTROLFILE REUSE DATABASE "ORA10GR1" NORESETLOGS ARCHIVELOG
2 MAXLOGFILES 16
3 MAXLOGMEMBERS 3
4 MAXDATAFILES 100
5 MAXINSTANCES 8
6 MAXLOGHISTORY 454
7 LOGFILE
8 GROUP 1 'C:\ORACLE\ORAMPLX\ORA10GR1\ONLINELOG\O1_MF_1_1GCW7HLG_.LOG' SIZE 10M
9 GROUP 2 'C:\ORACLE\ORAMPLX\ORA10GR1\ONLINELOG\O1_MF_2_1GCW7JQT_.LOG' SIZE 10M
10 GROUP 3 'C:\ORACLE\ORAMPLX\ORA10GR1\ONLINELOG\O1_MF_3_1GCW7KOC_.LOG' SIZE 10M
11 -- STANDBY LOGFILE
12 DATAFILE
13 'C:\ORACLE\ORADATA\ORA10GR1\DATAFILE\O1_MF_SYSTEM_1GCW7ODG_.DBF',
14 'C:\ORACLE\ORADATA\ORA10GR1\DATAFILE\O1_MF_UNDOTBS1_1GCW99S4_.DBF',
15 'C:\ORACLE\ORADATA\ORA10GR1\DATAFILE\O1_MF_SYSAUX_1GCW9XS2_.DBF',
16 'C:\ORACLE\ORADATA\ORA10GR1\DATAFILE\O1_MF_USERS_1GCWDQ43_.DBF',
17 'C:\ORACLE\ORADATA\ORA10GR1\DATAFILE\O1_MF_PAY_TBSP_1GK8ZWPX_.DBF'
18 CHARACTER SET WE8MSWIN1252
19 ;

Control file created.

sys@ORA10GR1> ALTER SYSTEM ARCHIVE LOG ALL;

System altered.

sys@ORA10GR1> ALTER DATABASE OPEN;

Database altered.

sys@ORA10GR1>
sys@ORA10GR1> column ctl_files NEW_VALUE ctl_files;
sys@ORA10GR1> select concat('control_files=''',
2 concat(replace(value, ', ', ''','''), '''')) ctl_files
3 from v$parameter
4 where name ='control_files';

CTL_FILES
---------------------------------------------------------------------------
control_files='C:\ORACLE\ORAMPLX\ORA10GR1\CONTROLFILE\O1_MF_1GYFWKWV_.CTL',
'C:\ORACLE\ORADATA\ORA10GR1\CONTROLFILE\O1_MF_1GYFWLB3_.CTL'


1 row selected.

sys@ORA10GR1> host "echo &ctl_files >> c:\tmp\init.ora"

sys@ORA10GR1>
sys@ORA10GR1> set echo off
sys@ORA10GR1> create spfile from pfile='c:\tmp\init.ora';

File created.

sys@ORA10GR1> startup force
ORACLE instance started.

Total System Global Area 79691776 bytes
Fixed Size 787548 bytes
Variable Size 53476260 bytes
Database Buffers 25165824 bytes
Redo Buffers 262144 bytes
Database mounted.
Database opened.
sys@ORA10GR1> connect /
Connected.
ops$marcio@ORA10GR1>

No final do artigo anterior há um resumo dos passos acima.
Comments: Post a Comment



<< Home

This page is powered by Blogger. Isn't yours?