DataARTIGO

Conversão de banco em file system para ASM

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.ctl

1.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

  1. shutdown;
  2. shutdown immediate;
  3. 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:00

3. 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/adump

4. 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 bytes

Na 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-10

Para 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/controlfile

Como 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_1

8. 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         MOUNTED

Repare 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-10

O 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.732188049

Neste 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.dbf

Guarde 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.732187937

Notarou 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 />+DADOS

Depois 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.732190365

Depois 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                                        INACTIVE

Faremos 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                                        INACTIVE

Agora 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                                        INACTIVE

Em 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                                        INACTIVE

Agora 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.732190009

Veja, 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.ora

Veja, 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.

é DBA Oracle Sr. Possui seis anos de experiência em administração de banco de dados Oracle em ambientes de missão crítica e alta disponibilidade nas plataformas AIX, HP, Solaris Sparc, Solaris, Linux Red Hat, Linux Debian, Windows Server 2008, Windows NT, Windows XP e Oracle OCP na versão 10g.

Ver perfil