Oi, pessoal, neste artigo iremos aprender como realizar a conversão de um banco de dados em file system para ASM em hosts diferentes.
O Oracle 10g está consolidado há aproximadamente seis anos no mercado. No entanto, ainda existem várias empresas que utilizam seus bancos de dados com arquivos em modo file system, o que é o mais usual desde as versões anteriores.
A feature ASM (Automatic Storage Management) foi implementada na versão 10g, seus benefícios são muitos, entre eles:
- Permite adição e exclusão de discos sem downtime do banco
- Distribui I/O automaticamente
- Faz striping adequado ao tipo de arquivo
- O I/O é direto, não bufferizado
- Espelhamento com redundância a falhas dos discos, de fácil configuração.
Para realizarmos esse trabalho, temos que fazer algumas considerações: a versão utilizada para exemplificar este artigo foi a 10.2.0.3.0.
Nosso objetivo será migrar o banco “produção”, que roda no servidor serv10, para o servidor rac1 (que possui ASM já em execução). Uso máquinas virtuais, o virtualizador é o VMware Workstation 6.7, com Linux Red Hat 5 nas máquinas virtuais.
Nesse procedimento, será utilizado o RMAN para realizar a conversão dos datafiles. Esse procedimento deve ser feito com a base fora do ar.
Vamos para o step by step
1. No servidor serv10, faça o inventário de todos os arquivos que compõem o banco.
Procedimento:<br />export ORACLE_SID=producao<br />[oracle@serv10]$ sqlplus<br />SQL*Plus: Release 10.2.0.3.0 - Production on Mon Oct 11 21:02:22 2010<br />Copyright (c) 1982, 2006, Oracle. All Rights Reserved.<br />Enter user-name: sys as sysdba<br />Enter password:<br />Connected to:<br />Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Production<br />With the Partitioning, OLAP and Data Mining options<br />SQL> col file_name format a60<br />SQL> col tablespace_name format a30<br />SQL> set lines 300<br />SQL> set pages 300<br />SQL> select tablespace_name,file_name,round((bytes/1024/1024),0) as " TAM(MB)" from dba_data_files;<br />TABLESPACE_NAME FILE_NAME ROUND((BYTES/1024/1024),0)<br />------------------------------ ------------------------------------------------------------ --------------------------<br />SYSTEM /u02/base/producao/system01.dbf 410<br />UNDOTBS1 /u02/base/producao/undotbs01.dbf 295<br />SYSAUX /u02/base/producao/sysaux01.dbf 130<br />USERS /u02/base/producao/users01.dbf 5<br />TBSD_DADOS /u02/base/producao/tbsd_dados01.dbf 1024<br /><br />SQL> set lines 100<br />SQL> select name from v$controlfile;<br />NAME<br />----------------------------------------------------------------------------------------------------<br />/u02/base/producao/control01.ctl<br />/u02/base/producao/control02.ctl<br />/u02/base/producao/control03.ctl1.1. Depois, gere um pfile a partir do spfile para facilitar a alteração dos parametros no servidor rac1.
Procedimento:
SQL> create pfile='/u02/base/producao/pfile_producao.ora' from spfile; Note que todos os arquivos se encontram no diretório /u02/base/producao. Como essa base é teste, não me preocupei com a multiplexação dos controlfiles e dos redos.
Após a obtenção do inventário dos arquivos, faça um shutdown limpo, isto é, um shutdown no qual o banco sincroniza todos os datafiles com os mesmos scn (system change number) dos controlfiles. É importante lembrar que, se não houver um shutdown limpo, nossa conversão não
irá funcionar, pois o banco tentará fazer recuperação da instância.
Observação: Tipos de shutdow limpo
- shutdown;
- shutdown immediate;
- shutdown normal.
1.1 Fazendo o shutdown:
Procedimento:
[oracle@serv10]$ export ORACLE_SID=producao<br />[oracle@serv10]$ sqlplus<br /><br />SQL*Plus: Release 10.2.0.3.0 - Production on Mon Oct 11 21:02:22 2010<br /><br />Copyright (c) 1982, 2006, Oracle. All Rights Reserved.<br /><br />Enter user-name: sys as sysdba<br />Enter password:<br /><br />Connected to:<br />Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Production<br />With the Partitioning, OLAP and Data Mining options<br /><br />SQL> shutdown immediate;<br />Database closed.<br />Database dismounted.<br />ORACLE instance shut down.2. No servidor serv10, faça a cópia física do dos arquivos do banco (producao) para o servidor rac1 (ip 192.168.81.11).
Procedimento:
$ cd /u02/base/producao<br />[oracle@serv10]$ scp * oracle@192.168.81.11:/u01/backup/producao<br />oracle@192.168.81.11's password:<br />control01.ctl 100% 6896KB 6.7MB/s 00:00<br />control02.ctl 100% 6896KB 6.7MB/s 00:01<br />control03.ctl 100% 6896KB 6.7MB/s 00:00<br />redo01.log 100% 50MB 12.5MB/s 00:04<br />redo02.log 100% 50MB 12.5MB/s 00:04<br />redo03.log 100% 50MB 12.5MB/s 00:04<br />sysaux01.dbf 100% 130MB 10.8MB/s 00:12<br />system01.dbf 100% 410MB 13.7MB/s 00:30<br />tbsd_dados01.dbf 100% 1024MB 14.4MB/s 01:11<br />temp01.dbf 100% 20MB 20.0MB/s 00:01<br />undotbs01.dbf 100% 295MB 14.1MB/s 00:21<br />users01.dbf 100% 5128KB 5.0MB/s 00:00<br />pfile_producao.ora 100% 1032 1.0KB/s 00:003. No servidor rac1, crie os diretórios referentes a alert.log e a demais traces.
Procedimento:
[oracle@rac1]$ mkdir -p /u01/app/oracle/admin/producao/dpdump<br />[oracle@rac1]$ mkdir -p /u01/app/oracle/admin/producao/pfile<br />[oracle@rac1]$ mkdir -p /u01/app/oracle/admin/producao/udump<br />[oracle@rac1]$ mkdir -p /u01/app/oracle/admin/producao/bdump<br />[oracle@rac1]$ mkdir -p /u01/app/oracle/admin/producao/adump4. No servidor rac1, crie o arquivo de senha através do utilitário orapwd no banco produção.
Procedimento:
[oracle@rac1]$ echo $ORACLE_HOME <br />/u01/app/oracle/product/10.2.0/db_1 <br />[oracle@rac1]$ cd $ORACLE_HOME/dbs<br />[oracle@rac1]$ orapwd file=/u01/app/oracle/product/10.2.0/db_1/dbs/orapwproducao.ora entries=5 password=*******5. No servidor rac1:
Neste momento, iniciaremos a preparação do banco de produção para a conversão propriamente dita.
Inicialmente, é preciso definir o novo local do controlfile; neste exemplo, será o diskgroup dados, por isso faremos a devida alteração no parâmetro controlfile do arquivo /u01/backup/producao/pfile_producao.ora.
Alterado o parâmetro controlfile, precisaremos alterar o parâmetro db_recovery_file_dest para o valor +DADOS.
O parâmetro db_recovery_file_dest definirá a área de recuperação flash. É opcional manter FRA (Flash Recovery Area) dentro da ASM; outra opção é criar um diskgroup só para a FRA, normalmente as empresas usam dessa maneira.
O parâmetro db_create_file_dest deverá ser incluído e receberá o valor +DADOS, que especificará o diretório padrão para a criação dos novos datafiles do banco.
pfile_producao.ora do servidor serv10:<br />producao.__db_cache_size=159383552<br />producao.__java_pool_size=4194304<br />producao.__large_pool_size=4194304<br />producao.__shared_pool_size=109051904<br />producao.__streams_pool_size=0<br />*.audit_file_dest='/u01/app/oracle/admin/producao/adump'<br />*.background_dump_dest='/u01/app/oracle/admin/producao/bdump'<br />*.compatible='10.2.0.3.0'<br />*.control_files='/u02/base/producao/control01.ctl','/u02/base/producao/control02.ctl','/u02/base/producao/control03.ctl'<br />*.core_dump_dest='/u01/app/oracle/admin/producao/cdump'<br />*.db_block_size=8192<br />*.db_domain=''<br />*.db_file_multiblock_read_count=16<br />*.db_name='producao'<br />*.db_recovery_file_dest='/u02/flash_recovery_area'<br />*.db_recovery_file_dest_size=2147483648<br />*.dispatchers='(PROTOCOL=TCP) (SERVICE=producaoXDB)'<br />*.job_queue_processes=10<br />*.log_archive_format='%t_%s_%r.dbf'<br />*.open_cursors=300<br />*.pga_aggregate_target=92274688<br />*.processes=150<br />*.remote_login_passwordfile='EXCLUSIVE'<br />*.sga_target=277872640<br />*.undo_management='AUTO'<br />*.undo_tablespace='UNDOTBS1'<br />*.user_dump_dest='/u01/app/oracle/admin/producao/udump'<br /><br />pfile_producao.ora do servidor rac1:<br />producao.__db_cache_size=159383552<br />producao.__java_pool_size=4194304<br />producao.__large_pool_size=4194304<br />producao.__shared_pool_size=109051904<br />producao.__streams_pool_size=0<br />*.audit_file_dest='/u01/app/oracle/admin/producao/adump'<br />*.background_dump_dest='/u01/app/oracle/admin/producao/bdump'<br />*.compatible='10.2.0.3.0'<br />*.control_files='+DADOS'<br />*.core_dump_dest='/u01/app/oracle/admin/producao/cdump'<br />*.db_block_size=8192<br />*.db_domain=''<br />*.db_file_multiblock_read_count=16<br />*.db_name='producao'<br />*.db_recovery_file_dest='+DADOS'<br />*.db_recovery_file_dest_size=2147483648<br />*.dispatchers='(PROTOCOL=TCP) (SERVICE=producaoXDB)'<br />*.job_queue_processes=10<br />*.log_archive_format='%t_%s_%r.dbf'<br />*.open_cursors=300<br />*.pga_aggregate_target=92274688<br />*.processes=150<br />*.remote_login_passwordfile='EXCLUSIVE'<br />*.sga_target=277872640<br />*.undo_management='AUTO'<br />*.undo_tablespace='UNDOTBS1'<br />*.user_dump_dest='/u01/app/oracle/admin/producao/udump'<br />db_create_file_dest='+DADOS'6. No servidor rac1.
Após a alteração do pfile, deverá ser feito o startup nomount.
Procedimento:
[oracle@rac1]$ export ORACLE_SID=producao<br />[oracle@rac1]$ rman target / nocatalog<br /><br />Recovery Manager: Release 10.2.0.3.0 - Production on Tue Oct 12 09:14:04 2010<br /><br />Copyright (c) 1982, 2005, Oracle. All rights reserved.<br /><br />connected to target database (not started)<br /><br />RMAN> startup nomount pfile='/u01/backup/producao/pfile_producao.ora';<br /><br />Oracle instance started<br /><br />Total System Global Area 281018368 bytes<br /><br />Fixed Size 1261324 bytes<br />Variable Size 92274932 bytes<br />Database Buffers 180355072 bytes<br />Redo Buffers 7127040 bytesNa mesma sessão com o rman utilizado para fazer o startup nomount, deverá ser feito o restore do controlfile para o diskgroup dados.
Procedimento:
RMAN> restore controlfile from '/u01/backup/producao/control01.ctl';<br /><br />Starting restore at 11-OCT-10<br />allocated channel: ORA_DISK_1<br />channel ORA_DISK_1: sid=153 devtype=DISK<br /><br />channel ORA_DISK_1: copied control file copy<br />output filename=+DADOS/producao/controlfile/current.267.732145943<br />Finished restore at 11-OCT-10Para confirmar se o controfile está no diskgrouop dados, verifique a ferramenta asmcmd.
Procedimento:
[oracle@rac1]$ export ORACLE_SID=+ASM1 <br />[oracle@rac1]$ asmcmd <br />ASMCMD> ls <br />DADOS/ <br />DADOS2/ <br />DADOS3/ <br />ASMCMD> cd dados <br />ASMCMD> ls <br />DB1/ <br />PRODUCAO/ <br />ASMCMD> cd producao <br />ASMCMD> ls -ltr <br />Type Redund Striped Time Sys Name <br /> Y CONTROLFILE/ <br />ASMCMD> cd controlfile <br />ASMCMD> ls -ltr <br />Type Redund Striped Time Sys Name <br />CONTROLFILE UNPROT FINE OCT 11 21:00:00 Y current.267.732145943<br />ASMCMD> pwd <br />+dados/producao/controlfileComo você pode ver, o Oracle já criou, no diskgroup +DADOS, o diretório +DADOS/producao/controlfile, onde está nosso controlfile, que antes estava em /u02/base/producao, agora com o nome current.267.732145943. Existe a possibilidade de trabalharmos com alias no ASM, mas não é o foco deste artigo. Sendo assim, deixamos para o ASM definir a nomenclatura dos arquivos.
7. No servidor rac1.
Ainda na mesma sessão do rman, depois da restauração do controlfile, monte o banco.
Procedimento:
RMAN> alter database mount; <br />database mounted <br />released channel: ORA_DISK_18. No servidor rac1
Se você voltar no passo 1 (no inventário dos arquivos), verá que os arquivos do banco estavam no diretório serv10/u02/base/producao, mas em que lugar estão agora? Fisicamente, eles estão no caminho rac1/u01/backup/producao, mas nosso controlfile não sabe disso; aliás, nosso controlfile, que já está restaurado no diskgroup +DADOS, ainda aponta os datafiles para /u02/base/producao. Sendo assim, é preciso fazer o rename dos arquivos para indicar ao controlfile que os arquivos estão em /u01/backup/producao no servidor rac1, utilizando a mesma sessão já aberta no rman.
Procedimento:
sql "alter database rename file ''/u02/base/producao/system01.dbf'' to ''/u01/backup/producao/system01.dbf''";<br />sql "alter database rename file ''/u02/base/producao/undotbs01.dbf'' to ''/u01/backup/producao/undotbs01.dbf''";<br />sql "alter database rename file ''/u02/base/producao/sysaux01.dbf'' to ''/u01/backup/producao/sysaux01.dbf''";<br />sql "alter database rename file ''/u02/base/producao/users01.dbf'' to ''/u01/backup/producao/users01.dbf''"; <br />sql "alter database rename file ''/u02/base/producao/tbsd_dados01.dbf'' to ''/u01/backup/producao/tbsd_dados01.dbf''";<br />sql "alter database rename file ''/u02/base/producao/redo01.log'' to ''/u01/backup/producao/redo01.log''";<br />sql "alter database rename file ''/u02/base/producao/redo02.log'' to ''/u01/backup/producao/redo02.log''";<br />sql "alter database rename file ''/u02/base/producao/redo03.log'' to ''/u01/backup/producao/redo03.log''";<br />sql "alter database rename file ''/u02/base/producao/temp01.dbf'' to ''/u01/backup/producao/temp01.dbf''";Somente para constatar, faça os dois selects abaixo no servidor rac1.
[oracle@rac1 ~]$ export ORACLE_SID=producao<br />[oracle@rac1 ~]$ sqlplus<br /><br /><br />SQL*Plus: Release 10.2.0.3.0 - Production on Mon Oct 11 22:25:50 2010<br /><br />Copyright (c) 1982, 2006, Oracle. All Rights Reserved.<br /><br />Enter user-name: sys as sysdba<br />Enter password:<br /><br />Connected to:<br />Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Production<br />With the Partitioning, Real Application Clusters, OLAP and Data Mining options<br /><br />SQL> select name from v$datafile;<br /><br />NAME<br />--------------------------------------------------------------------------------<br />/u01/backup/producao/system01.dbf<br />/u01/backup/producao/undotbs01.dbf<br />/u01/backup/producao/sysaux01.dbf<br />/u01/backup/producao/users01.dbf<br />/u01/backup/producao/tbsd_dados01.dbf<br /><br />SQL> select instance_name,status from v$instance;<br /><br />INSTANCE_NAME STATUS<br />---------------- ------------<br />producao MOUNTEDRepare que o banco está apenas montado.
9. No servidor rac1, retorne à mesma sessão no rman em que houve o rename dos arquivos e emita o comando abaixo.
Procedimento:
RMAN> BACKUP AS COPY DATABASE FORMAT '+DADOS';<br /><br />Starting backup at 11-OCT-10<br />using channel ORA_DISK_1<br />channel ORA_DISK_1: starting datafile copy<br />input datafile fno=00005 name=/u01/backup/producao/tbsd_dados01.dbf<br />output filename=+DADOS/producao/datafile/tbsd_dados.279.732148445 tag=TAG20101011T223405 recid=6 stamp=732148523<br />channel ORA_DISK_1: datafile copy complete, elapsed time: 00:01:25<br />channel ORA_DISK_1: starting datafile copy<br />input datafile fno=00001 name=/u01/backup/producao/system01.dbf<br />output filename=+DADOS/producao/datafile/system.277.732148531 tag=TAG20101011T223405 recid=7 stamp=732148583<br />channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:55<br />channel ORA_DISK_1: starting datafile copy<br />input datafile fno=00002 name=/u01/backup/producao/undotbs01.dbf<br />output filename=+DADOS/producao/datafile/undotbs1.265.732148585 tag=TAG20101011T223405 recid=8 stamp=732148613<br />channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:35<br />channel ORA_DISK_1: starting datafile copy<br />input datafile fno=00003 name=/u01/backup/producao/sysaux01.dbf<br />output filename=+DADOS/producao/datafile/sysaux.272.732148621 tag=TAG20101011T223405 recid=9 stamp=732148637<br />channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:26<br />channel ORA_DISK_1: starting datafile copy<br />input datafile fno=00004 name=/u01/backup/producao/users01.dbf<br />output filename=+DADOS/producao/datafile/users.271.732148647 tag=TAG20101011T223405 recid=10 stamp=732148646<br />channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:01<br />channel ORA_DISK_1: starting datafile copy<br />copying current control file<br />output filename=+DADOS/producao/controlfile/backup.280.732148647 tag=TAG20101011T223405 recid=11 stamp=732148649<br />channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:03<br />Finished backup at 11-OCT-10O comando acima realiza a conversão dos arquivos que estão em file system para arquivos do tipo ASM.
Para confirmar as alterações, use a ferramenta asmcmd.
Procedimento:
[oracle@rac1]$ export ORACLE_SID=+ASM1<br />[oracle@rac1]$ asmcmd<br />ASMCMD> cd dados<br />ASMCMD> cd producao<br />ASMCMD> cd datafile<br />ASMCMD> ls -ltr<br />Type Redund Striped Time Sys Name<br />DATAFILE UNPROT COARSE OCT 12 09:00:00 Y SYSAUX.271.732188033<br />DATAFILE UNPROT COARSE OCT 12 09:00:00 Y SYSTEM.265.732187993<br />DATAFILE UNPROT COARSE OCT 12 09:00:00 Y TBSD_DADOS.277.732187937<br />DATAFILE UNPROT COARSE OCT 12 09:00:00 Y UNDOTBS1.272.732188019<br />DATAFILE UNPROT COARSE OCT 12 09:00:00 Y USERS.267.732188049Neste momento, os arquivos estarão em +dados/producao/datafile.
10. No servidor rac1, realize o switch database dos datafiles.
Antes de emitir o switch database, entre em uma sessão do Sql-Plus e emita o seguinte comando:
Procedimento:
[oracle@rac1]$ export ORACLE_SID=producao<br />[oracle@rac1]$ sqlplus<br />SQL*Plus: Release 10.2.0.3.0 - Production on Tue Oct 12 09:33:33 2010<br /><br />Copyright (c) 1982, 2006, Oracle. All Rights Reserved.<br /><br />Enter user-name: sys as sysdba<br />Enter password:<br /><br />Connected to:<br />Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Production<br />With the Partitioning, Real Application Clusters, OLAP and Data Mining options<br /><br />SQL> select name from v$datafile;<br /><br />NAME<br />--------------------------------------------------------------------------------<br />/u01/backup/producao/system01.dbf<br />/u01/backup/producao/undotbs01.dbf<br />/u01/backup/producao/sysaux01.dbf<br />/u01/backup/producao/users01.dbf<br />/u01/backup/producao/tbsd_dados01.dbfGuarde esse resultado e mantenha essa essão aberta.
Voltando à sessão do RMAN, faça o switch.
Procedimento:
RMAN> SWITCH DATABASE TO COPY;<br /><br />datafile 1 switched to datafile copy "+DADOS/producao/datafile/system.277.732148531"<br />datafile 2 switched to datafile copy "+DADOS/producao/datafile/undotbs1.265.732148585"<br />datafile 3 switched to datafile copy "+DADOS/producao/datafile/sysaux.272.732148621"<br />datafile 4 switched to datafile copy "+DADOS/producao/datafile/users.271.732148647"<br />datafile 5 switched to datafile copy "+DADOS/producao/datafile/tbsd_dados.279.732148445"<br /><br />Agora façam novamente o select no Sql-Plus.<br />SQL> select name from v$datafile;<br /><br />NAME<br />--------------------------------------------------------------------------------<br />+DADOS/producao/datafile/system.265.732187993<br />+DADOS/producao/datafile/undotbs1.272.732188019<br />+DADOS/producao/datafile/sysaux.271.732188033<br />+DADOS/producao/datafile/users.267.732188049<br />+DADOS/producao/datafile/tbsd_dados.277.732187937Notarou a diferença? Antes de emitir o comando switch database, o nosso controlfile ainda estava apontando os datafiles para o caminho /u01/backup/producao. Depois que emitimos o comando switch database, ele faz o rename internamente no controlfile, apontando os datafiles para o novo caminho.
11. No servidor rac1, agora precisamos fazer o apontamento do tempfile que está em file system para o ASM.
Antes de dar início ao procedimento, faça o select no Sql-Plus:
SQL> select name from v$tempfile;<br />NAME<br />--------------------------------------------------------------------------------<br />/u01/backup/producao/temp01.dbf<br /><br />Agora vamos para nossa sessão no RMAN<br />Procedimento:<br />RMAN> run {<br /> set newname for tempfile '/u01/backup/producao/temp01.dbf' to '+DADOS';<br /> switch tempfile all;<br /> }<br />executing command: SET NEWNAME<br /><br />renamed temporary file 1 to +DADOS in control file<br /><br />Voltem para a sessão do Sql-Plus<br />SQL> select name from v$tempfile;<br /><br />NAME<br />--------------------------------------------------------------------------------<br />+DADOSDepois do set newname, o Oracle fez o apontamento no controlfile, porém o arquivo ainda não existe na ASM.
Volte à sessão do RMAN para abrir o banco.
Procedimento:
RMAN> alter database open;<br /><br />database opened<br /><br />Novamente na sessão do Sql-Plus constatem<br />SQL> select name from v$tempfile;<br /><br />NAME<br />--------------------------------------------------------------------------------<br />+DADOS/producao/tempfile/temp.279.732190365Depois do alter database open, o arquivo da tablespace temporária foi criado na ASM. Uma outra opção é não levar os arquivos da tablespace temporária, pois o banco Oracle não precisa desse tipo de arquivo para abrir um banco, é possível simplesmente criá-lo depois do alter database open.
12. No servidor rac1.
Nesse momento, nosso banco já está up and running, porém nossos redologs online não foram levados para a ASM, eles ainda permanecem em file system. Mas o Oracle permite isso? A resposta é sim, a ASM é uma feature, e mantém a compatibilidade para todos os arquivos montados nos outros tipo de devices já conhecidos.
Agora vamos levar os redologs online para a ASM.
Em uma sessão do Sql-Plus, faça o seguinte select:
SQL> col member format a70<br />SQL> set lines 400<br />SQL> set pages 400<br />SQL> select a.group#,b.member,a.status from v$log a,v$logfile b where a.group#=b.group# order by a.group#;<br /><br /> GROUP# MEMBER STATUS<br />---------- ---------------------------------------------------------------------- ----------------<br /> 1 /u01/backup/producao/redo01.log INACTIVE<br /> 2 /u01/backup/producao/redo02.log CURRENT<br /> 3 /u01/backup/producao/redo03.log INACTIVEFaremos a inclusão de um novo membro para a ASM e, a exclusão do membro que está em /u01/backp/producao.
Para podermos fazer a exclusão do membro, seu status precisa ser INACTIVE. Nesse momento, poderemos fazer o drop do membro /u01/backup/producao/redo01.log e do membro /u01/backup/producao/redo02.log, escolhi fazer do /u01/backup/producao/redo01.log.
Começaremos pelo grupo 1. Procedimento:
SQL> alter database add logfile member '+DADOS' to group 1;<br /><br />Database altered.<br /><br />SQL> select a.group#,b.member,a.status from v$log a,v$logfile b where a.group#=b.group# order by a.group#;<br /><br /> GROUP# MEMBER STATUS<br />---------- ---------------------------------------------------------------------- ----------------<br /> 1 /u01/backup/producao/redo01.log INACTIVE<br /> 1 +DADOS/producao/onlinelog/group_1.280.732191635 INACTIVE<br /> 2 /u01/backup/producao/redo02.log CURRENT<br /> 3 /u01/backup/producao/redo03.log INACTIVEAgora o grupo 3. Procedimento:
SQL> alter database add logfile member '+DADOS' to group 3;<br /><br />Database altered.<br /><br />SQL> select a.group#,b.member,a.status from v$log a,v$logfile b where a.group#=b.group# order by a.group#;<br /><br /> GROUP# MEMBER STATUS<br />---------- ---------------------------------------------------------------------- ----------------<br /> 1 /u01/backup/producao/redo01.log INACTIVE<br /> 1 +DADOS/producao/onlinelog/group_1.280.732191635 INACTIVE <br /> 2 /u01/backup/producao/redo02.log CURRENT<br /> 3 /u01/backup/producao/redo03.log INACTIVE<br /> 3 +DADOS/producao/onlinelog/group_3.283.732191745 INACTIVE Agora para o grupo 2:
SQL> alter database add logfile member '+DADOS' to group 2;<br /><br />Database altered.<br /><br />SQL> select a.group#,b.member,a.status from v$log a,v$logfile b where a.group#=b.group# order by a.group#;<br /><br /> GROUP# MEMBER STATUS<br />---------- ---------------------------------------------------------------------- ----------------<br /> 1 /u01/backup/producao/redo01.log INACTIVE<br /> 1 +DADOS/producao/onlinelog/group_1.280.732191635 INACTIVE<br /> 2 /u01/backup/producao/redo02.log CURRENT<br /> 2 +DADOS/producao/onlinelog/group_2.286.732191983 CURRENT<br /> 3 +DADOS/producao/onlinelog/group_3.283.732191745 INACTIVE<br /> 3 /u01/backup/producao/redo03.log INACTIVEEm seguida, precisamos validar nossos novos redologs, para isso basta fazer um switch logfile. Podemos fazer um switch quantas vezes quisermos, 4 switches são suficientes, pois temos 3 grupos de redos.
SQL> alter system switch logfile;<br /><br />System altered.<br /><br />SQL> alter system switch logfile;<br /><br />System altered.<br /><br />SQL> alter system switch logfile;<br /><br />System altered.<br /><br />SQL> alter system switch logfile;<br /><br />System altered.<br /><br />SQL> select a.group#,b.member,a.status from v$log a,v$logfile b where a.group#=b.group# order by a.group#;<br /><br /> GROUP# MEMBER STATUS<br />---------- ---------------------------------------------------------------------- ----------------<br /> 1 /u01/backup/producao/redo01.log INACTIVE<br /> 1 +DADOS/producao/onlinelog/group_1.280.732191635 INACTIVE<br /> 2 /u01/backup/producao/redo02.log CURRENT<br /> 2 +DADOS/producao/onlinelog/group_2.286.732191983 CURRENT<br /> 3 +DADOS/producao/onlinelog/group_3.283.732191745 INACTIVE<br /> 3 /u01/backup/producao/redo03.log INACTIVEAgora vamos dropar os membros que estão em file system. Vou dropar os membros dos grupos 1 e 3, pois o grupo 2 que é o atual.
Procedimento:
SQL> alter database drop logfile member '/u01/backup/producao/redo01.log';<br /><br />Database altered.<br /><br />SQL> alter database drop logfile member '/u01/backup/producao/redo03.log';<br /><br />Database altered.<br /><br />SQL> select a.group#,b.member,a.status from v$log a,v$logfile b where a.group#=b.group# order by a.group#;<br /><br /> GROUP# MEMBER STATUS<br />---------- ---------------------------------------------------------------------- ----------------<br /> 1 +DADOS/producao/onlinelog/group_1.280.732191635 INACTIVE<br /> 2 +DADOS/producao/onlinelog/group_2.286.732191983 CURRENT<br /> 2 /u01/backup/producao/redo02.log CURRENT<br /> 3 +DADOS/producao/onlinelog/group_3.283.732191745 INACTIVE<br /><br />Vejam, agora nosso banco não aponta mais os membros de redologs para o file system, mas está faltando o grupo 2<br />SQL> alter database drop logfile member '/u01/backup/producao/redo02.log';<br />alter database drop logfile member '/u01/backup/producao/redo02.log'<br />*<br />ERROR at line 1:<br />ORA-01609: log 2 is the current log for thread 1 - cannot drop members<br />ORA-00312: online log 2 thread 1: '/u01/backup/producao/redo02.log'<br />ORA-00312: online log 2 thread 1: '+DADOS/producao/onlinelog/group_2.286.732191983'Repare que o Oracle não permite dropar o membro /u01/backup/producao/redo02.log, pois ele é o atual (CURRENT), está em uso. Para isso:
SQL> alter system switch logfile;<br /><br />System altered.<br /><br />alter database drop logfile member '/u01/backup/producao/redo02.log';<br /><br />Database altered.<br /><br />SQL> select a.group#,b.member,a.status from v$log a,v$logfile b where a.group#=b.group# order by a.group#;<br /><br /> GROUP# MEMBER STATUS<br />---------- ---------------------------------------------------------------------- ----------------<br /> 1 +DADOS/producao/onlinelog/group_1.280.732191635 INACTIVE<br /> 2 +DADOS/producao/onlinelog/group_2.286.732191983 ACTIVE<br /> 3 +DADOS/producao/onlinelog/group_3.283.732191745 CURRENT<br /><br />Vejam, todos nossos redos apontam para o ASM.<br /><br />14º - Precisamos converter nosso spfile para ASM<br />No servidor rac1: Localizem o nome do controlfile<br />Procedimento:<br />[oracle@rac1]$ export ORACLE_SID=+ASM1<br />[oracle@rac1]$ asmcmd<br />ASMCMD> cd +dados/producao/controlfile<br />ASMCMD> ls<br />current.285.732190009Veja, o nome do arquivo é current.285.732190009. Em seguida, faça um shutdown da base.
Procedimento:
[oracle@rac1]$ export ORACLE_SID=producao<br />[oracle@rac1]$ sqlplus<br /><br />SQL*Plus: Release 10.2.0.3.0 - Production on Tue Oct 12 11:06:40 2010<br /><br />Copyright (c) 1982, 2006, Oracle. All Rights Reserved.<br /><br />Enter user-name: sys as sysdba<br />Enter password:<br /><br />Connected to:<br />Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Production<br />With the Partitioning, Real Application Clusters, OLAP and Data Mining options<br /><br />SQL> shutdown immediate;<br />Database closed.<br />Database dismounted.<br />ORACLE instance shut down.Em seguida, edite o arquivo /u01/backup/producao/pfile_producao.ora, alterando *.control_files de *.control_files=’+DADOS’ para *.control_files=’+dados/producao/controlfile/current.285.732190009′.
Salve o arquivo e faça um startup, novamente utilizando o pfile_producao.ora.
[oracle@rac1]$ export ORACLE_SID=producao <br />[oracle@rac1]$ sqlplus <br /><br />SQL*Plus: Release 10.2.0.3.0 - Production on Tue Oct 12 11:15:02 2010<br /><br />Copyright (c) 1982, 2006, Oracle. All Rights Reserved. <br /><br />Enter user-name: sys as sysdba <br />Enter password: <br />Connected to an idle instance. <br /><br />SQL> startup pfile='/u01/backup/producao/pfile_producao.ora'; <br />ORACLE instance started. <br /><br />Total System Global Area 281018368 bytes <br />Fixed Size 1261324 bytes <br />Variable Size 92274932 bytes <br />Database Buffers 180355072 bytes <br />Redo Buffers 7127040 bytes <br />Database mounted. <br />Database opened. Crie agora o spfile a partir do nosso pfile.
Procedimento:
SQL> create spfile='+dados/producao/spfileproducao.ora' from pfile='/u01/backup/producao/pfile_producao.ora';<br /><br />File created.<br /><br />Em seguida façam um shutdown da base<br />Procedimento:<br />SQL> shutdown immediate;<br />Database closed.<br />Database dismounted.<br />ORACLE instance shut down.No diretório $ORACLE_HOME/dbs, crie o arquivo initproducao.ora. Ele precisa ter obrigatoriamente esse nome, pois o Oracle procurará por esse nome no momento do startup, esse é o padrão de funcionamento do Oracle.
No arquivo $ORACLE_HOME/dbs/initproducao.ora, inclua a linha spfile=’+dados/producao/spfileproducao.ora’. Isso mesmo, esse arquivo só terá uma linha.
Quando você tentar startar o banco, o Oracle lerá o arquivo $ORACLE_HOME/dbs/initproducao.ora, que apontará para o spfile que está informado no parametro spfile=’+dados/producao/spfileproducao.ora’. Recomendo fortemente trabalhar com spfile em vez de pfile, pois o spfile facilita as atividades do DBA, e para a própria empresa é bom, pois elimina downtime da base para mudança permanente de parâmetros não estáticos.
[oracle@rac1]$ cat /u01/app/oracle/product/10.2.0/db_1/dbs/initproducao.ora<br />spfile='+dados/producao/spfileproducao.ora'Em seguida, faça o start do banco sem o arquivo /u01/backup/producao/pfile_producao.ora.
[oracle@rac1 dbs]$ sqlplus<br /><br />SQL*Plus: Release 10.2.0.3.0 - Production on Tue Oct 12 11:24:27 2010<br /><br />Copyright (c) 1982, 2006, Oracle. All Rights Reserved.<br /><br />Enter user-name: sys as sysdba<br />Enter password:<br />Connected to an idle instance.<br /><br />SQL> startup<br />ORACLE instance started.<br /><br />Total System Global Area 281018368 bytes<br />Fixed Size 1261324 bytes<br />Variable Size 92274932 bytes<br />Database Buffers 180355072 bytes<br />Redo Buffers 7127040 bytes<br />Database mounted.<br />Database opened.<br />SQL> show parameter spfile<br /><br />NAME TYPE VALUE<br />------------------------------------ ----------- -----------------------------------<br />spfile string +DADOS/producao/spfileproducao.oraVeja, o arquivo de parâmetro agora está apontando para o diskgroup +dados, no caminho +DADOS/producao/spfileproducao.ora.
Existem maneiras mais rápidas e até mais simples de fazer a conversão do spfile de file system para ASM, porém escolhi o caminho mais longo e manual de propósito, justamente para focar no conceito de administração de arquivos na ASM.
Procedimentos pós conversão
Depois disso, elimine todos os arquivos da pasta /u01/backup/producao, não precisaremos mais deles. Em seguida, faça imediatamente um backup da base.
Últimas considerações
Bom, pessoal, este artigo termina por aqui. ASM é um assunto para muitos artigos, não conseguiríamos demonstrar todas as suas funcionalidades em um único texto.
Lembre-se: não existe verdade absoluta, podemos chegar o mesmo lugar seguindo vários caminhos, este artigo é apenas um norte.







