quinta-feira, 3 de junho de 2010

Alterando local dos DATAFILES

Esses dias me deparei com um chamado pouco comum porém óbvio e que tem relação com o post anterior: por "FALTA DE ESPAÇO EM DISCO", o cliente solicitou/necessitou da alteração do local dos datafiles.

O banco cresceu e divide a mesma unidade de disco com outros arquivos importantes, tornando necessária a movimentação dos datafiles para outra unidade de disco. Vamos aos passos necessários, é bem simples:

- Primeiro temos que derrubar a base de dados, para que a cópia seja consistente e sem problemas. Como "/ as sysdba":
SQL> shutdown immediate

- Depois devemos mover todos os datafiles, ou por maior segurança inicialmente copiá-los para a nova unidade de discos:
# cp /oracle/oradata/orcl/*.dbf /u01/oradata/orcl/

- Se os controlfiles forem para a nova unidade de discos, devemos realizar a devida alteração no arquivo de parâmetros. Neste caso é interessante criar uma cópia do mesmo (ex: SQL> create pfile='/oracle/pfile.txt' from spfile;) por segurança, e alterar o caminho no pfile:

Alterar de:
*.control_files=/oracle/oradata/orcl/CONTROL01.CTL,
/oracle/oradata/orcl/CONTROL02.CTL, /oracle/oradata/orcl/CONTROL03.CTL

para:
*.control_files=/u01/oradata/orcl/CONTROL01.CTL,
/u01/oradata/orcl/CONTROL02.CTL, /u01/oradata/orcl/CONTROL03.CTL

- Feito isso, devemos subir a base em modo MOUNT e com o pfile criado e já alterado:
SQL> startup mount pfile='/oracle/pfile.txt';

Só para relembrar, de forma bem resumida e simples:
- modo nomount: lê o arquivo de parametros (spfile ou pfile) e sobe a instância somente
- modo mount: lê o controlfile
- modo open: lê os datafiles

Ou seja, se abrimos o banco em modo MOUNT, significa que o PFILE foi lido corretamente e que os CONTROLFILES estão corretos no local que indicamos ao copiá-los/movê-los e ao alterar o PFILE.

- Feito isso, devemos indicar para o CONTROLFILE a alteração do local dos DATAFILES que estamos modificando de lugar. O comando é simples, conforme o exemplo:

SQL> alter database rename file '/oracle/oradata/orcl/tsd_orcl_01.dbf' TO '/u01/oradata/orcl/tsd_orcl_01.dbf';

Este comando deve ser emitido para cada um dos DATAFILES.

- Caso precise se certificar de todos os caminhos e nomes dos DATAFILES, podemos utilizar a dba_data_files ainda com o banco em modo OPEN:
SQL> select file_name from dba_data_files;

- Após renomear todos os DATAFILES e com a certeza de que eles estão no caminho indicado, base abrir o banco:
SQL> alter database open;

Vale lembrar que desta forma podemos também mover somente alguns DATAFILES ou mesmo somente os CONTROLFILES. Isto é útil quando estamos buscando melhorar o desempenho de I/O no Oracle. Se tivérmos discos diferentes, podemos por exemplo separar tablespaces de índices e dados, ou separar dois datafiles que são mais requisitados, etc.