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 ASM, ASM pra filesystem, filesystem 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…)
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.