12c

Nas versões anteriores do Oracle, para migrar e/ou renomear um datafile eram necessários uma série de passos. Exemplo: colocar a tablespace em READ ONLY, alterar o datafile para offline, etc… A partir do 12cR1, um datafile pode ser renomeado ou movido online, simplesmente utilizando a instrução ALTER DATABASE MOVE DATAFILE. Enquanto o datafile estiver sendo trasnferido, o usuário final pode executar consultas, e instruções DML e DDL sem problema. Além disso, os datafile podem ser migrados entre armazenamentos. Ex. migrar de não-ASM para ASM ou vice-versa.

Para os nossos testes, irei utilizar uma VM com o seguinte cenário:

- Disco 1 /dev/sda com 50Gb
- Disco 2 /dev/sdb com 5Gb -> asm-disk1
- Disco 3 /dev/sdc com 5Gb -> asm-disk2
- 3Gb RAM
- 5Gb SWAP
- Oracle Linux Server Release 6.4 x86_64
- Oracle Database 12c R1 (rodando com ASM)

– Criando uma tablespace nova e um novo datafile:

SQL> create tablespace teste datafile '/u01/app/oracle/oradata/cdbrac1/teste1.dbf' size 100M;

Tablespace created.

SQL>

– Renomeando um datafile:

SQL> alter database move datafile '/u01/app/oracle/oradata/cdbrac1/teste1.dbf' to '/u01/app/oracle/oradata/cdbrac1/teste_11.dbf';

Database altered.

SQL>

– Que bonito, que beleza… vamos ver como ficou no s.o.:

[oracle@ol6-121-rac1-single ~]$ cd /u01/app/oracle/oradata/cdbrac1/
[oracle@ol6-121-rac1-single cdbrac1]$ ls -l *.dbf
-rw-r-----. 1 oracle dba 104865792 Jul 19 17:20 teste_11.dbf
[oracle@ol6-121-rac1-single cdbrac1]$

 

Mas olha só que bacana!!! Ele já faz a alteração no s.o., sem precisar aquela confusão toda… copia no s.o., altera no banco, blábláblá!

Mas como será que ele se porta no caso de ser um datafile da tbs SYSTEM por exemplo?

SQL> select file_name from dba_data_files where tablespace_name = 'SYSTEM';

FILE_NAME
----------------------------------------------------------------------------------------------------
+DATA/CDBRAC/DATAFILE/system.258.821204577

SQL> alter tablespace system add datafile '+DATA';

Tablespace altered.

SQL> select file_name from dba_data_files where tablespace_name = 'SYSTEM';

FILE_NAME
----------------------------------------------------------------------------------------------------
+DATA/CDBRAC/DATAFILE/system.258.821204577
+DATA/CDBRAC/DATAFILE/system.278.821210411

SQL> alter database move datafile '+DATA/CDBRAC/DATAFILE/system.278.821210411' to '/u01/app/oracle/oradata/cdbrac1/system02.dbf';

Database altered.

SQL> select file_name from dba_data_files where tablespace_name = 'SYSTEM';

FILE_NAME
----------------------------------------------------------------------------------------------------
+DATA/CDBRAC/DATAFILE/system.258.821204577
/u01/app/oracle/oradata/cdbrac1/system02.dbf

SQL> !ls -l /u01/app/oracle/oradata/cdbrac1/system02.dbf
-rw-r-----. 1 oracle dba 104865792 Jul 19 18:01 /u01/app/oracle/oradata/cdbrac1/system02.dbf

 

imagem1

 

– Agora vamos migrar o nosso datafile criado para o ASM. Primeiro vamos verificar a localização atual de todos os datafiles:

SQL> set pages 1000 lines 100
SQL> select name from v$datafile order by 1;

NAME
----------------------------------------------------------------------------------------------------
+DATA/CDBRAC/DATAFILE/sysaux.257.821204485
+DATA/CDBRAC/DATAFILE/system.258.821204577
+DATA/CDBRAC/DATAFILE/undotbs1.260.821204663
+DATA/CDBRAC/DATAFILE/users.259.821204661
+DATA/CDBRAC/DD7C48AA5A4404A2E04325AAE80A403C/DATAFILE/sysaux.266.821204723
+DATA/CDBRAC/DD7C48AA5A4404A2E04325AAE80A403C/DATAFILE/system.267.821204723
+DATA/CDBRAC/E1E394B92A631E0DE045000000000001/DATAFILE/sysaux.270.821205981
+DATA/CDBRAC/E1E394B92A631E0DE045000000000001/DATAFILE/system.271.821205981
+DATA/CDBRAC/E1E394B92A631E0DE045000000000001/DATAFILE/users.273.821206061
+DATA/CDBRAC/E1E3998A66DE1E57E045000000000001/DATAFILE/sysaux.275.821206063
+DATA/CDBRAC/E1E3998A66DE1E57E045000000000001/DATAFILE/system.274.821206063
+DATA/CDBRAC/E1E3998A66DE1E57E045000000000001/DATAFILE/users.277.821206149
/u01/app/oracle/oradata/cdbrac1/teste_11.dbf

13 rows selected.

 

– Migrando nosso datafile para o ASM:

SQL> alter database move datafile '/u01/app/oracle/oradata/cdbrac1/teste_11.dbf' to '+DATA';

Database altered.

SQL> select name from v$datafile where name like '%teste%';

NAME
----------------------------------------------------------------------------------------------------
+DATA/CDBRAC/DATAFILE/teste.278.821208689

SQL> !ls -l /u01/app/oracle/oradata/cdbrac1/*
ls: cannot access /u01/app/oracle/oradata/cdbrac1/*: No such file or directory

SQL>

Feitoria! Datafile migrado para o DG +DATA e nem rastro do mesmo no filesystem!! 😀

imagem2

– Ao utilizar o parâmetro KEEP mantemos o datafile no local original e copiamos ele para um novo local. Movi o datafile novamente para o filesystem para facilitar a visualização:

SQL> select name from v$datafile where name like '%teste%';

NAME
----------------------------------------------------------------------------------------------------
/u01/app/oracle/oradata/cdbrac1/teste_12.dbf

SQL> alter database move datafile '/u01/app/oracle/oradata/cdbrac1/teste_12.dbf' 
  2 to '/u01/app/oracle/oradata/cdbrac1/teste_20.dbf' KEEP;

Database altered.

SQL> !ls -l /u01/app/oracle/oradata/cdbrac1/*           
-rw-r-----. 1 oracle dba 104865792 Jul 19 17:42 /u01/app/oracle/oradata/cdbrac1/teste_12.dbf
-rw-r-----. 1 oracle dba 104865792 Jul 19 17:42 /u01/app/oracle/oradata/cdbrac1/teste_20.dbf

Qual dos datafiles estamos utilizando afinal? O.o

SQL> select name from v$datafile where name like '%teste%';

NAME
----------------------------------------------------------------------------------------------------
/u01/app/oracle/oradata/cdbrac1/teste_20.dbf

SQL>

 

Show! Mas o que acontece se tentarmos mover pra cima daquele arquivo que já existe?

SQL> alter database move datafile '/u01/app/oracle/oradata/cdbrac1/teste_20.dbf' 
  2 to '/u01/app/oracle/oradata/cdbrac1/teste_12.dbf';
alter database move datafile '/u01/app/oracle/oradata/cdbrac1/teste_20.dbf' to '/u01/app/oracle/oradata/cdbrac1/teste_12.dbf'
*
ERROR at line 1:
ORA-01119: error in creating database file '/u01/app/oracle/oradata/cdbrac1/teste_12.dbf'
ORA-27038: created file already exists
Additional information: 1

SQL>

Eita… mas pra resolver, utilizamos o parâmetro REUSE:

SQL> alter database move datafile '/u01/app/oracle/oradata/cdbrac1/teste_20.dbf' 
  2 to '/u01/app/oracle/oradata/cdbrac1/teste_12.dbf' REUSE;

Database altered.

SQL> select name from v$datafile where name like '%teste%';

NAME
----------------------------------------------------------------------------------------------------
/u01/app/oracle/oradata/cdbrac1/teste_12.dbf

SQL>

imagem3

O progresso dessa movimentação de datafiles, no caso de demorar pois o datafile é muito grande, pode ser monitorada na v$session_longops. Além disso, podemos verificar no alert.log onde o Oracle deixa os detalhes das ações que estão sendo tomadas. Ex.:

SQL> show parameter dump

NAME				     TYPE	 VALUE
------------------------------------ ----------- ------------------------------
background_core_dump		     string	 partial
background_dump_dest		     string	 /u01/app/oracle/diag/rdbms/cdb
						 rac/cdbrac1/trace
core_dump_dest			     string	 /u01/app/oracle/diag/rdbms/cdb
						 rac/cdbrac1/cdump
max_dump_file_size		     string	 unlimited
shadow_core_dump		     string	 partial
user_dump_dest			     string	 /u01/app/oracle/diag/rdbms/cdb
						 rac/cdbrac1/trace
SQL> exit
Disconnected from Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
With the Partitioning, Automatic Storage Management, OLAP, Advanced Analytics
and Real Application Testing options
[oracle@ol6-121-rac1-single cdbrac1]$ cd /u01/app/oracle/diag/rdbms/cdbrac/cdbrac1/trace/
[oracle@ol6-121-rac1-single trace]$ file alert_cdbrac1.log 
alert_cdbrac1.log: ASCII English text, with very long lines
[oracle@ol6-121-rac1-single trace]$ tail alert_cdbrac1.log 
Fri Jul 19 17:46:41 2013
Moving datafile /u01/app/oracle/oradata/cdbrac1/teste_20.dbf (14) to /u01/app/oracle/oradata/cdbrac1/teste_12.dbf
Cleaning up online move operation for data file #14 ("/u01/app/oracle/oradata/cdbrac1/teste_12.dbf").
Clean up of move operation for fno 14 completed
ORA-1119 signalled during: alter database move datafile '/u01/app/oracle/oradata/cdbrac1/teste_20.dbf' to '/u01/app/oracle/oradata/cdbrac1/teste_12.dbf'...
alter database move datafile '/u01/app/oracle/oradata/cdbrac1/teste_20.dbf' to '/u01/app/oracle/oradata/cdbrac1/teste_12.dbf' REUSE
Fri Jul 19 17:47:40 2013
Moving datafile /u01/app/oracle/oradata/cdbrac1/teste_20.dbf (14) to /u01/app/oracle/oradata/cdbrac1/teste_12.dbf
Move operation committed for file /u01/app/oracle/oradata/cdbrac1/teste_12.dbf
Completed: alter database move datafile '/u01/app/oracle/oradata/cdbrac1/teste_20.dbf' to '/u01/app/oracle/oradata/cdbrac1/teste_12.dbf' REUSE
[oracle@ol6-121-rac1-single trace]$

imagem4

Buenas… essa foi a primeira postagem a respeito das new-features do 12c R1, inclusive, uma das que achei mais bacana! Isso é uma mão na roda quando lota um disco por exemplo, ou é necessário uma migração de storage, etc…