Movendo Datafiles com RMAN

moving 300x229 Movendo Datafiles com RMAN

Este artigo tem como objetivo demonstrar a utilização do  RMAN para fazer movimentação de datafiles. Aqui no oraclehome você encontra diversos artigos que usam essa técnica. Minha intenção foi criar um artigo específico e mais profundo sobre o tema.

Muitos DBAs não sabem que o RMAN pode ser utilizado para fazer movimentação de datafiles. Outros até sabem, mas acreditam que esse método só é válido para ambientes ASM. Temos também a categoria dos DBAs que simplesmente têm pavor de fazer qualquer coisa no RMAN.

Pretendo desmistificar esse procedimento por meio dessa ferramenta, apresentando vantagens (pelo menos na minha opinião) sobre o método convencional. Como já mencionado aqui no oraclehome, a partir da versão 12C, a movimentação já é realizada online, o que vai minimizar muito o impacto e o downtime dos ambientes. Como essa ainda não é a realidade da maioria dos DBAs, o enfoque desse artigo é sobre as versões 11.2.0.1 (apesar de ter utilizado o 12C para as demonstrações, o conceito é idêntico) ou inferiores, que precisam indisponiblisar a tablespace para que a atividade seja realizada.

Uma das principais vantagens dessa técnica é fazer todo o trabalho necessário dentro do próprio RMAN, enquanto que no procedimento convencional, temos que utilizar o SQLPLUS e comandos de sistema operacional para mover ou copiar e apagar datafiles.

Outra vantagem é a portabilidade que a operação oferece entre ambientes ASM e Filesystem. Você consegue movimentar datafiles de ASM pra ASMASM pra filesystemfilesystem pra ASM e filesystem pra filesystem.

Vou demonstrar a movimentação de datafile de um disco ASM para o filesystem, e depois fazer o procedimento inverso.
Conectado ao rman, peço um report dos SCHEMAS, para verificar localização, tamanho, tablespace e id do datafile:


oracle=DBPROD-> rman target /

Recovery Manager: Release 12.1.0.1.0 - Production on Fri Sep 6 13:49:15 2013

Copyright (c) 1982, 2013, Oracle and/or its affiliates. All rights reserved.

connected to target database: DBPROD (DBID=924498589)

RMAN> REPORT SCHEMA;

using target database control file instead of recovery catalog
Report of database schema for database with db_unique_name DBPROD

List of Permanent Datafiles
===========================
File Size(MB) Tablespace RB segs Datafile Name
---- -------- -------------------- ------- ------------------------
1 820 SYSTEM *** +DGDATA/DBPROD/DATAFILE/system.261.825418889
2 500 VETORH_DATA *** +DGDATA/DBPROD/DATAFILE/vetorh_data.271.825419913
3 690 SYSAUX *** +DGDATA/DBPROD/DATAFILE/sysaux.269.825418797
4 170 UNDOTBS1 *** +DGDATA/DBPROD/DATAFILE/undotbs1.268.825418997
5 400 VETORH_INDEX *** +DGINDEX/DBPROD/DATAFILE/vetorh_index.256.825419941
6 5 USERS *** +DGDATA/DBPROD/DATAFILE/users.272.825418995
7 100 TESTE_DATA *** +DGDATA/DBPROD/DATAFILE/teste_data.270.825428895
8 100 TESTE_INDEX *** /u02/oradata/teste_index.dbf

List of Temporary Files
=======================
File Size(MB) Tablespace Maxsize(MB) Tempfile Name
---- -------- -------------------- ----------- --------------------
1 60 TEMP 32767 +DGDATA/DBPROD/TEMPFILE/temp.274.825419069

O datafile que quero mover e o de id 7, que está no diskgroup DGDATA, para o filesystem “/u02/oradata“.
O primeiro procedimento é deixar o datafile ou a tablespace que utiliza o datafile a ser movido em modo offline. No nosso caso, estou deixando toda a tablespace em offline:

RMAN> sql 'alter tablespace TESTE_DATA offline';

sql statement: alter tablespace TESTE_DATA offline

Feito isso, vamos dar o comando para que o RMAN copie o datafile do diskgroup do ASM para o filesystem que desejamos:

RMAN> copy datafile 7 to '/u02/oradata/teste_data.dbf';

Starting backup at 06-SEP-13
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=49 device type=DISK
channel ORA_DISK_1: starting datafile copy
input datafile file number=00007 name=+DGDATA/DBPROD/DATAFILE/teste_data.270.825428895
output file name=/u02/oradata/teste_data.dbf tag=TAG20130906T135859 RECID=1 STAMP=825429548
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:15
Finished backup at 06-SEP-13

Pronto, a cópia está feita. Lembrando que nessa etapa, você pode mover todos os datafiles pertinentes à tablespace que forem necessários.
Agora vamos indicar ao banco que altere a localização do datafile movido dentro do controlfile. Novamente,
utilizo o próprio RMAN para fazer isso:

RMAN> switch datafile 7 to copy;

datafile 7 switched to datafile copy "/u02/oradata/teste_data.dbf"

Bem mais simples que emitir o comando rename datafile dentro do sqlplus, não acha?
Por fim, fazemos o recover da tablespace, e colocamos a mesma em modo online:

RMAN> recover tablespace TESTE_DATA;

Starting recover at 06-SEP-13
using channel ORA_DISK_1

starting media recovery
media recovery complete, elapsed time: 00:00:01

Finished recover at 06-SEP-13

RMAN> sql 'alter tablespace TESTE_DATA online';

sql statement: alter tablespace teste_data online

Solicitando novo report dos SCHEMAS, verificamos que a alteração foi realizada com sucesso:

RMAN> REPORT SCHEMA;

Report of database schema for database with db_unique_name DBPROD

List of Permanent Datafiles
===========================
File Size(MB) Tablespace RB segs Datafile Name
---- -------- -------------------- ------- ------------------------
1 820 SYSTEM *** +DGDATA/DBPROD/DATAFILE/system.261.825418889
2 500 VETORH_DATA *** +DGDATA/DBPROD/DATAFILE/vetorh_data.271.825419913
3 690 SYSAUX *** +DGDATA/DBPROD/DATAFILE/sysaux.269.825418797
4 170 UNDOTBS1 *** +DGDATA/DBPROD/DATAFILE/undotbs1.268.825418997
5 400 VETORH_INDEX *** +DGINDEX/DBPROD/DATAFILE/vetorh_index.256.825419941
6 5 USERS *** +DGDATA/DBPROD/DATAFILE/users.272.825418995
7 100 TESTE_DATA *** /u02/oradata/teste_data.dbf
8 100 TESTE_INDEX *** /u02/oradata/teste_index.dbf

List of Temporary Files
=======================
File Size(MB) Tablespace Maxsize(MB) Tempfile Name
---- -------- -------------------- ----------- --------------------
1 60 TEMP 32767 +DGDATA/DBPROD/TEMPFILE/temp.274.825419069

O processo está quase concluído. Falta excluir o datafile antigo, que está armazenado no ASM e, após a cópia e renomeação do novo datafile, não será mais utilizado, e ficará apenas ocupando espaço no diskgroup do ASM. Isso vale para datafiles antigos armazenados no filesystem também, como veremos adiante. O RMAN oferece o comando DELETE DATAFILECOPY, que efetua a exclusão do datafile original que foi movido para outro local. O comando é emitido da forma como se segue:

RMAN> DELETE DATAFILECOPY "+DGDATA/DBPROD/DATAFILE/teste_data.270.825428895";

released channel: ORA_DISK_1
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=49 device type=DISK
List of Datafile Copies
=======================

Key File S Completion Time Ckp SCN Ckp Time
------- ---- - --------------- ---------- ---------------
2 7 A 06-SEP-13 2013903 06-SEP-13
 Name: +DGDATA/DBPROD/DATAFILE/teste_data.270.825428895
Do you really want to delete the above objects (enter YES or NO)? YES
deleted datafile copy
datafile copy file name=+DGDATA/DBPROD/DATAFILE/teste_data.270.825428895 RECID=2 STAMP=825429694
Deleted 1 objects

O RMAN pergunta se você têm certeza que deseja exluir o arquivo. Confirme com YES! Pronto, o processo está concluído.
O processo de copia de datafiles do filesystem para ASM é idêntico ao demonstrado acima.

RMAN> sql 'alter tablespace TESTE_INDEX offline';

sql statement: alter tablespace TESTE_INDEX offline

RMAN> copy datafile 8 to '+DGINDEX';

Starting backup at 06-SEP-13
using channel ORA_DISK_1
channel ORA_DISK_1: starting datafile copy
input datafile file number=00008 name=/u02/oradata/teste_index.dbf
output file name=+DGINDEX/DBPROD/DATAFILE/teste_index.257.825436665 tag=TAG20130906T155744 RECID=3 STAMP=825436674
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:15
Finished backup at 06-SEP-13

RMAN> switch datafile 8 to copy;

datafile 8 switched to datafile copy "+DGINDEX/DBPROD/DATAFILE/teste_index.257.825436665"

RMAN> recover tablespace TESTE_INDEX;

Starting recover at 06-SEP-13
using channel ORA_DISK_1

starting media recovery
media recovery complete, elapsed time: 00:00:00

Finished recover at 06-SEP-13

RMAN> sql 'alter tablespace TESTE_INDEX online';

sql statement: alter tablespace TESTE_INDEX online

RMAN> DELETE DATAFILECOPY "/u02/oradata/teste_index.dbf";

released channel: ORA_DISK_1
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=49 device type=DISK
List of Datafile Copies
=======================

Key File S Completion Time Ckp SCN Ckp Time
------- ---- - --------------- ---------- ---------------
4 8 A 06-SEP-13 2017678 06-SEP-13
 Name: /u02/oradata/teste_index.dbf
Do you really want to delete the above objects (enter YES or NO)?

Do you really want to delete the above objects (enter YES or NO)? yes
deleted datafile copy
datafile copy file name=/u02/oradata/teste_index.dbf RECID=4 STAMP=825436804
Deleted 1 objects

Perceba que em momento algum usei comandos de sistema operacional, nem pra excluir o datafile ao final do processo. Também não precisei utilizar o SQLPLUS. Esse procedimento é aplicável à qualquer plataforma (Linux, Windows, UNIX…)

%name Movendo Datafiles com RMAN

Autor: Bruno Zehetmeyr bruno.zehe

Bacharel em Ciência da Computação pela UNORP-SP, Pós-graduado em Administração de Sistemas de Informação pela UFLA-MG e pós-graduado em Administração de Banco de Dados Oracle pela VERIS-SP. Analista DBA na Teiko Soluções em TI e professor universitário no Centro Universitário de Brusque – UBIFEBE. Certificado OCP 10g e OCP 11g, OCE Linux. Residente em Blumenau-SC.