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:
export ORACLE_SID=producao
[oracle@serv10]$ sqlplus
SQL*Plus: Release 10.2.0.3.0 - Production on Mon Oct 11 21:02:22 2010
Copyright (c) 1982, 2006, Oracle. All Rights Reserved.
Enter user-name: sys as sysdba
Enter password:
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Production
With the Partitioning, OLAP and Data Mining options
SQL> col file_name format a60
SQL> col tablespace_name format a30
SQL> set lines 300
SQL> set pages 300
SQL> select tablespace_name,file_name,round((bytes/1024/1024),0) as " TAM(MB)" from dba_data_files;
TABLESPACE_NAME FILE_NAME ROUND((BYTES/1024/1024),0)
------------------------------ ------------------------------------------------------------ --------------------------
SYSTEM /u02/base/producao/system01.dbf 410
UNDOTBS1 /u02/base/producao/undotbs01.dbf 295
SYSAUX /u02/base/producao/sysaux01.dbf 130
USERS /u02/base/producao/users01.dbf 5
TBSD_DADOS /u02/base/producao/tbsd_dados01.dbf 1024
SQL> set lines 100
SQL> select name from v$controlfile;
NAME
----------------------------------------------------------------------------------------------------
/u02/base/producao/control01.ctl
/u02/base/producao/control02.ctl
/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
- shutdown;
- shutdown immediate;
- shutdown normal.
1.1 Fazendo o shutdown:
Procedimento:
[oracle@serv10]$ export ORACLE_SID=producao
[oracle@serv10]$ sqlplus
SQL*Plus: Release 10.2.0.3.0 - Production on Mon Oct 11 21:02:22 2010
Copyright (c) 1982, 2006, Oracle. All Rights Reserved.
Enter user-name: sys as sysdba
Enter password:
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Production
With the Partitioning, OLAP and Data Mining options
SQL> shutdown immediate;
Database closed.
Database dismounted.
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
[oracle@serv10]$ scp * oracle@192.168.81.11:/u01/backup/producao
oracle@192.168.81.11's password:
control01.ctl 100% 6896KB 6.7MB/s 00:00
control02.ctl 100% 6896KB 6.7MB/s 00:01
control03.ctl 100% 6896KB 6.7MB/s 00:00
redo01.log 100% 50MB 12.5MB/s 00:04
redo02.log 100% 50MB 12.5MB/s 00:04
redo03.log 100% 50MB 12.5MB/s 00:04
sysaux01.dbf 100% 130MB 10.8MB/s 00:12
system01.dbf 100% 410MB 13.7MB/s 00:30
tbsd_dados01.dbf 100% 1024MB 14.4MB/s 01:11
temp01.dbf 100% 20MB 20.0MB/s 00:01
undotbs01.dbf 100% 295MB 14.1MB/s 00:21
users01.dbf 100% 5128KB 5.0MB/s 00:00
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
[oracle@rac1]$ mkdir -p /u01/app/oracle/admin/producao/pfile
[oracle@rac1]$ mkdir -p /u01/app/oracle/admin/producao/udump
[oracle@rac1]$ mkdir -p /u01/app/oracle/admin/producao/bdump
[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
/u01/app/oracle/product/10.2.0/db_1
[oracle@rac1]$ cd $ORACLE_HOME/dbs
[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:
producao.__db_cache_size=159383552
producao.__java_pool_size=4194304
producao.__large_pool_size=4194304
producao.__shared_pool_size=109051904
producao.__streams_pool_size=0
*.audit_file_dest='/u01/app/oracle/admin/producao/adump'
*.background_dump_dest='/u01/app/oracle/admin/producao/bdump'
*.compatible='10.2.0.3.0'
*.control_files='/u02/base/producao/control01.ctl','/u02/base/producao/control02.ctl','/u02/base/producao/control03.ctl'
*.core_dump_dest='/u01/app/oracle/admin/producao/cdump'
*.db_block_size=8192
*.db_domain=''
*.db_file_multiblock_read_count=16
*.db_name='producao'
*.db_recovery_file_dest='/u02/flash_recovery_area'
*.db_recovery_file_dest_size=2147483648
*.dispatchers='(PROTOCOL=TCP) (SERVICE=producaoXDB)'
*.job_queue_processes=10
*.log_archive_format='%t_%s_%r.dbf'
*.open_cursors=300
*.pga_aggregate_target=92274688
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.sga_target=277872640
*.undo_management='AUTO'
*.undo_tablespace='UNDOTBS1'
*.user_dump_dest='/u01/app/oracle/admin/producao/udump'
pfile_producao.ora do servidor rac1:
producao.__db_cache_size=159383552
producao.__java_pool_size=4194304
producao.__large_pool_size=4194304
producao.__shared_pool_size=109051904
producao.__streams_pool_size=0
*.audit_file_dest='/u01/app/oracle/admin/producao/adump'
*.background_dump_dest='/u01/app/oracle/admin/producao/bdump'
*.compatible='10.2.0.3.0'
*.control_files='+DADOS'
*.core_dump_dest='/u01/app/oracle/admin/producao/cdump'
*.db_block_size=8192
*.db_domain=''
*.db_file_multiblock_read_count=16
*.db_name='producao'
*.db_recovery_file_dest='+DADOS'
*.db_recovery_file_dest_size=2147483648
*.dispatchers='(PROTOCOL=TCP) (SERVICE=producaoXDB)'
*.job_queue_processes=10
*.log_archive_format='%t_%s_%r.dbf'
*.open_cursors=300
*.pga_aggregate_target=92274688
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.sga_target=277872640
*.undo_management='AUTO'
*.undo_tablespace='UNDOTBS1'
*.user_dump_dest='/u01/app/oracle/admin/producao/udump'
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
[oracle@rac1]$ rman target / nocatalog
Recovery Manager: Release 10.2.0.3.0 - Production on Tue Oct 12 09:14:04 2010
Copyright (c) 1982, 2005, Oracle. All rights reserved.
connected to target database (not started)
RMAN> startup nomount pfile='/u01/backup/producao/pfile_producao.ora';
Oracle instance started
Total System Global Area 281018368 bytes
Fixed Size 1261324 bytes
Variable Size 92274932 bytes
Database Buffers 180355072 bytes
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';
Starting restore at 11-OCT-10
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=153 devtype=DISK
channel ORA_DISK_1: copied control file copy
output filename=+DADOS/producao/controlfile/current.267.732145943
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
[oracle@rac1]$ asmcmd
ASMCMD> ls
DADOS/
DADOS2/
DADOS3/
ASMCMD> cd dados
ASMCMD> ls
DB1/
PRODUCAO/
ASMCMD> cd producao
ASMCMD> ls -ltr
Type Redund Striped Time Sys Name
Y CONTROLFILE/
ASMCMD> cd controlfile
ASMCMD> ls -ltr
Type Redund Striped Time Sys Name
CONTROLFILE UNPROT FINE OCT 11 21:00:00 Y current.267.732145943
ASMCMD> pwd
+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;
database mounted
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''";
sql "alter database rename file ''/u02/base/producao/undotbs01.dbf'' to ''/u01/backup/producao/undotbs01.dbf''";
sql "alter database rename file ''/u02/base/producao/sysaux01.dbf'' to ''/u01/backup/producao/sysaux01.dbf''";
sql "alter database rename file ''/u02/base/producao/users01.dbf'' to ''/u01/backup/producao/users01.dbf''";
sql "alter database rename file ''/u02/base/producao/tbsd_dados01.dbf'' to ''/u01/backup/producao/tbsd_dados01.dbf''";
sql "alter database rename file ''/u02/base/producao/redo01.log'' to ''/u01/backup/producao/redo01.log''";
sql "alter database rename file ''/u02/base/producao/redo02.log'' to ''/u01/backup/producao/redo02.log''";
sql "alter database rename file ''/u02/base/producao/redo03.log'' to ''/u01/backup/producao/redo03.log''";
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
[oracle@rac1 ~]$ sqlplus
SQL*Plus: Release 10.2.0.3.0 - Production on Mon Oct 11 22:25:50 2010
Copyright (c) 1982, 2006, Oracle. All Rights Reserved.
Enter user-name: sys as sysdba
Enter password:
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Production
With the Partitioning, Real Application Clusters, OLAP and Data Mining options
SQL> select name from v$datafile;
NAME
--------------------------------------------------------------------------------
/u01/backup/producao/system01.dbf
/u01/backup/producao/undotbs01.dbf
/u01/backup/producao/sysaux01.dbf
/u01/backup/producao/users01.dbf
/u01/backup/producao/tbsd_dados01.dbf
SQL> select instance_name,status from v$instance;
INSTANCE_NAME STATUS
---------------- ------------
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';
Starting backup at 11-OCT-10
using channel ORA_DISK_1
channel ORA_DISK_1: starting datafile copy
input datafile fno=00005 name=/u01/backup/producao/tbsd_dados01.dbf
output filename=+DADOS/producao/datafile/tbsd_dados.279.732148445 tag=TAG20101011T223405 recid=6 stamp=732148523
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:01:25
channel ORA_DISK_1: starting datafile copy
input datafile fno=00001 name=/u01/backup/producao/system01.dbf
output filename=+DADOS/producao/datafile/system.277.732148531 tag=TAG20101011T223405 recid=7 stamp=732148583
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:55
channel ORA_DISK_1: starting datafile copy
input datafile fno=00002 name=/u01/backup/producao/undotbs01.dbf
output filename=+DADOS/producao/datafile/undotbs1.265.732148585 tag=TAG20101011T223405 recid=8 stamp=732148613
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:35
channel ORA_DISK_1: starting datafile copy
input datafile fno=00003 name=/u01/backup/producao/sysaux01.dbf
output filename=+DADOS/producao/datafile/sysaux.272.732148621 tag=TAG20101011T223405 recid=9 stamp=732148637
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:26
channel ORA_DISK_1: starting datafile copy
input datafile fno=00004 name=/u01/backup/producao/users01.dbf
output filename=+DADOS/producao/datafile/users.271.732148647 tag=TAG20101011T223405 recid=10 stamp=732148646
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:01
channel ORA_DISK_1: starting datafile copy
copying current control file
output filename=+DADOS/producao/controlfile/backup.280.732148647 tag=TAG20101011T223405 recid=11 stamp=732148649
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:03
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
[oracle@rac1]$ asmcmd
ASMCMD> cd dados
ASMCMD> cd producao
ASMCMD> cd datafile
ASMCMD> ls -ltr
Type Redund Striped Time Sys Name
DATAFILE UNPROT COARSE OCT 12 09:00:00 Y SYSAUX.271.732188033
DATAFILE UNPROT COARSE OCT 12 09:00:00 Y SYSTEM.265.732187993
DATAFILE UNPROT COARSE OCT 12 09:00:00 Y TBSD_DADOS.277.732187937
DATAFILE UNPROT COARSE OCT 12 09:00:00 Y UNDOTBS1.272.732188019
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
[oracle@rac1]$ sqlplus
SQL*Plus: Release 10.2.0.3.0 - Production on Tue Oct 12 09:33:33 2010
Copyright (c) 1982, 2006, Oracle. All Rights Reserved.
Enter user-name: sys as sysdba
Enter password:
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Production
With the Partitioning, Real Application Clusters, OLAP and Data Mining options
SQL> select name from v$datafile;
NAME
--------------------------------------------------------------------------------
/u01/backup/producao/system01.dbf
/u01/backup/producao/undotbs01.dbf
/u01/backup/producao/sysaux01.dbf
/u01/backup/producao/users01.dbf
/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;
datafile 1 switched to datafile copy "+DADOS/producao/datafile/system.277.732148531"
datafile 2 switched to datafile copy "+DADOS/producao/datafile/undotbs1.265.732148585"
datafile 3 switched to datafile copy "+DADOS/producao/datafile/sysaux.272.732148621"
datafile 4 switched to datafile copy "+DADOS/producao/datafile/users.271.732148647"
datafile 5 switched to datafile copy "+DADOS/producao/datafile/tbsd_dados.279.732148445"
Agora façam novamente o select no Sql-Plus.
SQL> select name from v$datafile;
NAME
--------------------------------------------------------------------------------
+DADOS/producao/datafile/system.265.732187993
+DADOS/producao/datafile/undotbs1.272.732188019
+DADOS/producao/datafile/sysaux.271.732188033
+DADOS/producao/datafile/users.267.732188049
+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;
NAME
--------------------------------------------------------------------------------
/u01/backup/producao/temp01.dbf
Agora vamos para nossa sessão no RMAN
Procedimento:
RMAN> run {
set newname for tempfile '/u01/backup/producao/temp01.dbf' to '+DADOS';
switch tempfile all;
}
executing command: SET NEWNAME
renamed temporary file 1 to +DADOS in control file
Voltem para a sessão do Sql-Plus
SQL> select name from v$tempfile;
NAME
--------------------------------------------------------------------------------
+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;
database opened
Novamente na sessão do Sql-Plus constatem
SQL> select name from v$tempfile;
NAME
--------------------------------------------------------------------------------
+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
SQL> set lines 400
SQL> set pages 400
SQL> select a.group#,b.member,a.status from v$log a,v$logfile b where a.group#=b.group# order by a.group#;
GROUP# MEMBER STATUS
---------- ---------------------------------------------------------------------- ----------------
1 /u01/backup/producao/redo01.log INACTIVE
2 /u01/backup/producao/redo02.log CURRENT
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;
Database altered.
SQL> select a.group#,b.member,a.status from v$log a,v$logfile b where a.group#=b.group# order by a.group#;
GROUP# MEMBER STATUS
---------- ---------------------------------------------------------------------- ----------------
1 /u01/backup/producao/redo01.log INACTIVE
1 +DADOS/producao/onlinelog/group_1.280.732191635 INACTIVE
2 /u01/backup/producao/redo02.log CURRENT
3 /u01/backup/producao/redo03.log INACTIVE
Agora o grupo 3. Procedimento:
SQL> alter database add logfile member '+DADOS' to group 3;
Database altered.
SQL> select a.group#,b.member,a.status from v$log a,v$logfile b where a.group#=b.group# order by a.group#;
GROUP# MEMBER STATUS
---------- ---------------------------------------------------------------------- ----------------
1 /u01/backup/producao/redo01.log INACTIVE
1 +DADOS/producao/onlinelog/group_1.280.732191635 INACTIVE
2 /u01/backup/producao/redo02.log CURRENT
3 /u01/backup/producao/redo03.log INACTIVE
3 +DADOS/producao/onlinelog/group_3.283.732191745 INACTIVE
Agora para o grupo 2:
SQL> alter database add logfile member '+DADOS' to group 2;
Database altered.
SQL> select a.group#,b.member,a.status from v$log a,v$logfile b where a.group#=b.group# order by a.group#;
GROUP# MEMBER STATUS
---------- ---------------------------------------------------------------------- ----------------
1 /u01/backup/producao/redo01.log INACTIVE
1 +DADOS/producao/onlinelog/group_1.280.732191635 INACTIVE
2 /u01/backup/producao/redo02.log CURRENT
2 +DADOS/producao/onlinelog/group_2.286.732191983 CURRENT
3 +DADOS/producao/onlinelog/group_3.283.732191745 INACTIVE
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;
System altered.
SQL> alter system switch logfile;
System altered.
SQL> alter system switch logfile;
System altered.
SQL> alter system switch logfile;
System altered.
SQL> select a.group#,b.member,a.status from v$log a,v$logfile b where a.group#=b.group# order by a.group#;
GROUP# MEMBER STATUS
---------- ---------------------------------------------------------------------- ----------------
1 /u01/backup/producao/redo01.log INACTIVE
1 +DADOS/producao/onlinelog/group_1.280.732191635 INACTIVE
2 /u01/backup/producao/redo02.log CURRENT
2 +DADOS/producao/onlinelog/group_2.286.732191983 CURRENT
3 +DADOS/producao/onlinelog/group_3.283.732191745 INACTIVE
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';
Database altered.
SQL> alter database drop logfile member '/u01/backup/producao/redo03.log';
Database altered.
SQL> select a.group#,b.member,a.status from v$log a,v$logfile b where a.group#=b.group# order by a.group#;
GROUP# MEMBER STATUS
---------- ---------------------------------------------------------------------- ----------------
1 +DADOS/producao/onlinelog/group_1.280.732191635 INACTIVE
2 +DADOS/producao/onlinelog/group_2.286.732191983 CURRENT
2 /u01/backup/producao/redo02.log CURRENT
3 +DADOS/producao/onlinelog/group_3.283.732191745 INACTIVE
Vejam, agora nosso banco não aponta mais os membros de redologs para o file system, mas está faltando o grupo 2
SQL> alter database drop logfile member '/u01/backup/producao/redo02.log';
alter database drop logfile member '/u01/backup/producao/redo02.log'
*
ERROR at line 1:
ORA-01609: log 2 is the current log for thread 1 - cannot drop members
ORA-00312: online log 2 thread 1: '/u01/backup/producao/redo02.log'
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;
System altered.
alter database drop logfile member '/u01/backup/producao/redo02.log';
Database altered.
SQL> select a.group#,b.member,a.status from v$log a,v$logfile b where a.group#=b.group# order by a.group#;
GROUP# MEMBER STATUS
---------- ---------------------------------------------------------------------- ----------------
1 +DADOS/producao/onlinelog/group_1.280.732191635 INACTIVE
2 +DADOS/producao/onlinelog/group_2.286.732191983 ACTIVE
3 +DADOS/producao/onlinelog/group_3.283.732191745 CURRENT
Vejam, todos nossos redos apontam para o ASM.
14º - Precisamos converter nosso spfile para ASM
No servidor rac1: Localizem o nome do controlfile
Procedimento:
[oracle@rac1]$ export ORACLE_SID=+ASM1
[oracle@rac1]$ asmcmd
ASMCMD> cd +dados/producao/controlfile
ASMCMD> ls
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
[oracle@rac1]$ sqlplus
SQL*Plus: Release 10.2.0.3.0 - Production on Tue Oct 12 11:06:40 2010
Copyright (c) 1982, 2006, Oracle. All Rights Reserved.
Enter user-name: sys as sysdba
Enter password:
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Production
With the Partitioning, Real Application Clusters, OLAP and Data Mining options
SQL> shutdown immediate;
Database closed.
Database dismounted.
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
[oracle@rac1]$ sqlplus
SQL*Plus: Release 10.2.0.3.0 - Production on Tue Oct 12 11:15:02 2010
Copyright (c) 1982, 2006, Oracle. All Rights Reserved.
Enter user-name: sys as sysdba
Enter password:
Connected to an idle instance.
SQL> startup pfile='/u01/backup/producao/pfile_producao.ora';
ORACLE instance started.
Total System Global Area 281018368 bytes
Fixed Size 1261324 bytes
Variable Size 92274932 bytes
Database Buffers 180355072 bytes
Redo Buffers 7127040 bytes
Database mounted.
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';
File created.
Em seguida façam um shutdown da base
Procedimento:
SQL> shutdown immediate;
Database closed.
Database dismounted.
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
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
SQL*Plus: Release 10.2.0.3.0 - Production on Tue Oct 12 11:24:27 2010
Copyright (c) 1982, 2006, Oracle. All Rights Reserved.
Enter user-name: sys as sysdba
Enter password:
Connected to an idle instance.
SQL> startup
ORACLE instance started.
Total System Global Area 281018368 bytes
Fixed Size 1261324 bytes
Variable Size 92274932 bytes
Database Buffers 180355072 bytes
Redo Buffers 7127040 bytes
Database mounted.
Database opened.
SQL> show parameter spfile
NAME TYPE VALUE
------------------------------------ ----------- -----------------------------------
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.