Oracle 12c: Movendo ou renomeando um datafile online
Uma das novas características do Oracle Database 12c (12.1.0.1), entre outras, é a possibilidade de mover um datafile sem a necessidade de usar o RMAN, baixar o banco ou mesmo deixar uma tablespace em modo offline.
Nesse post vou mostrar como mover ou simplesmente mudar o nome de um datafile online.
Para esse pequeno teste foi usado a tablespace de exemplo do banco.
SQL> select name from v$dbfile where name like '%example%';
NAME
------------------------------------------------
/u01/app/oracle/oradata/orcl/example01.dbf
SQL>
Alterando o nome do datafile:
SQL> alter database move datafile '/u01/app/oracle/oradata/orcl/example01.dbf' -
> to '/u01/app/oracle/oradata/orcl/exemplo.dbf';
Database altered.
SQL>
Simples assim. No alert log, temos o seguinte:
Moving datafile /u01/app/oracle/oradata/orcl/example01.dbf (2) to /u01/app/oracle/oradata/orcl/exemplo.dbf
Thu Jul 18 10:47:48 2013
Move operation committed for file /u01/app/oracle/oradata/orcl/exemplo.dbf
Completed: alter database move datafile '/u01/app/oracle/oradata/orcl/example01.dbf' to '/u01/app/oracle/oradata/orcl/exemplo.dbf'
Agora uma segunda consulta para confirmar o resultado:
SQL> select name from v$dbfile where name like '%example%';
no rows selected
SQL>
** Ops…, errei! **
SQL> select name from v$dbfile where name like '%exemplo%';
NAME
-------------------------------------------------------
/u01/app/oracle/oradata/orcl/exemplo.dbf
SQL>
Agora que sabemos que é simples e fácil fazer essa alteração, será que, se mover um datafile para um diretório diferente (inexistente), dará certo?
SQL> !ls -l /u01/app/oracle/oradata/
total 20
drwxr-xr-x. 2 oracle oinstall 4096 Jul 18 10:53 orcl
SQL>
SQL> select name from v$dbfile where name like '%example%';
NAME
-------------------------------------------------------
/u01/app/oracle/oradata/orcl/example01.dbf
SQL>
SQL> alter database move datafile '/u01/app/oracle/oradata/orcl/example01.dbf' -
> to '/u01/app/oracle/oradata/hp/example01.dbf';
Database altered.
SQL>
SQL> !ls -l /u01/app/oracle/oradata/
total 20
drwxr-x---. 2 oracle oinstall 4096 Jul 18 10:53 hp
drwxr-xr-x. 2 oracle oinstall 4096 Jul 18 10:53 orcl
SQL>
SQL> select name from v$dbfile where name like '%example%';
NAME
-------------------------------------------------------
/u01/app/oracle/oradata/hp/example01.dbf
SQL>
Agora sabemos que o diretório é criado sem erros. Mas…, e se as permissões do diretório não me dão direito a gravar arquivos?
SQL> !chmod 0 /u01/app/oracle/oradata/hp
SQL> !ls -l /u01/app/oracle/oradata/
total 20
d---------. 2 oracle oinstall 4096 Jul 18 10:53 hp
drwxr-xr-x. 2 oracle oinstall 4096 Jul 18 10:53 orcl
SQL>
SQL> alter database move datafile '/u01/app/oracle/oradata/orcl/example01.dbf' -
> to '/u01/app/oracle/oradata/hp/example01.dbf';
alter database move datafile '/u01/app/oracle/oradata/orcl/example01.dbf' to '/u01/app/oracle/oradata/hp/example01.dbf'
*
ERROR at line 1:
ORA-01119: error in creating database file
'/u01/app/oracle/oradata/hp/example01.dbf'
ORA-27037: unable to obtain file status
Linux-x86_64 Error: 13: Permission denied
Additional information: 1
SQL>
E no alert log:
alter database move datafile '/u01/app/oracle/oradata/orcl/example01.dbf' to '/u01/app/oracle/oradata/hp/example01.dbf'
Thu Jul 18 10:55:20 2013
Moving datafile /u01/app/oracle/oradata/orcl/example01.dbf (2) to /u01/app/oracle/oradata/hp/example01.dbf
Cleaning up online move operation for data file #2 ("/u01/app/oracle/oradata/hp/example01.dbf").
WARNING: failed to remove the new file /u01/app/oracle/oradata/hp/example01.dbf during datafile move cleanup
Clean up of move operation for fno 2 completed
ORA-1119 signalled during: alter database move datafile '/u01/app/oracle/oradata/orcl/example01.dbf' to '/u01/app/oracle/oradata/hp/example01.dbf'...
Agora conclui-se que facilmente é possível mover, alterar, ajustar ou até mesmo criar uma nova estrutura do banco usando comandos simples.
Sucesso!