Recuperação de datafiles e tablespaces

Wagner Pinheiro (e-mail) é OCP DBA Oracle 9i 10g, com atuação pela IFactory.

Boas novas a todos! Conforme mencionado no artigo anterior, trataremos agora da recuperação de datafiles e tablespaces, ainda através de backups gerenciados pelo usuário.

Para que possamos implementar uma recuperação de datafile ou tablespace gerenciado pelo usuário, temos, é claro, que ter um backup do banco de dados, seja ele COLD (banco fora) ou HOT (banco no ar e utilizando archives).

Como iremos simular a recuperação de apenas uma tablespace ou datafile, faremos um backup apenas da tablespace USERS.

Uma das formas para se fazer esse backup é utilizando as técnicas mostradas no artigo anterior, ou seja, BEGIN BACKUP e END BACKUP. Então, vamos lá!

01. Coloque a tablespace no modo BEGIN BACKUP
  ALTER TABLESPACE USERS BEGIN BACKUP;

02. Copie o datafile da tablespace USERS utilizando os comandos do sistema operacional (COPY do WINDOWS, ou cp do Linux...)
  COPY D:\Oracle\Oradata\USERS01.DBF E:\Backup\Oracle\USERS01.DBF

  1 arquivo(s) copiado(s).

03. Coloque a tablespace no modo END BACKUP
  ALTER TABLESPACE USERS END BACKUP;

De forma a confirmar os dados que existem nas tabelas dessa tablespace, vamos fazer um select de forma a visualizar alguns dados.

SQL> select * from scott.emp;
truncando (conforme solicitado) antes da coluna DEPTNO

EMPNO
ENAME
JOB
MGR
HIREDATE
SAL
COMM
7369
SMITH
CLERK
7902
17/12/80
800
7499
ALLEN
SALESMAN
7698
20/02/81
1600
300
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
7902
FORD
ANALYST
7566
03/12/81
3000
7934
MILLER
CLERK
7782
23/01/82
1300


14 linhas selecionadas.

SQL> select to_char(sysdate,'dd/mm/yyyy hh:mi:ss') from dual;

TO_CHAR(SYSDATE,'DD
-------------------
25/05/2006 09:50:44

Perceba que às 09:50:44 do dia 25/05/2006, tabela EMP do usuário SCOTT possuia 14 linhas.

SQL> select tablespace_name, status
  2  from dba_tablespaces;

TABLESPACE_NAME       STATUS
------------------------------ ---------
SYSTEM                           ONLINE
UNDOTBS1                      ONLINE
SYSAUX                          ONLINE
TEMP                                ONLINE
USERS                             ONLINE
EXAMPLE                         ONLINE

6 linhas selecionadas.

Perceba que a tablespace USERS está online e, portanto, as tabelas podem ser acessadas.

Alguns minutos depois, o disco onde a tablespace estava armazenada apresentou um problema e você vai precisar fazer a recuperação novamente.

ERRO na linha 1:
ORA-01157: nÒo Ú possÝvel identificar/bloquear arquivo de dados 4 - consulte
arquivo de anßlise DBWR
ORA-01110: 4 do arquivo de dados:
'D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\USERS01.DBF'

SQL> select tablespace_name, status
  2  from dba_tablespaces;

TABLESPACE_NAME       STATUS
------------------------------ ---------
SYSTEM                           ONLINE
UNDOTBS1                      ONLINE
SYSAUX                          ONLINE
TEMP                                ONLINE
USERS                             OFFLINE
EXAMPLE                        ONLINE

6 linhas selecionadas.

A tablespace agora se encontra offline, e os dados contidos nela não podem ser acessados.

E agora, o que fazer?

Após reconstruir o file system, seja ele Windows ou Linux, você vai restaurar o datafile que sofreu o crash a partir de um backup(USERS01.DBF), e executar o comando de RECOVER TABLESPACE.

Execute a recuperação da tablespace que apresentou problema:

SQL> RECOVER TABLESPACE USERS;
Recuperaþòo De Mýdia Concluýda.

Depois, coloque a tablespace em modo ONLINE

SQL> ALTER TABLESPACE USERS ONLINE;
Tablespace alterado.

Consultando DBA_TABLESPACES, você poderá verificar que a tablespace está novamente disponível para uso.

SQL> SELECT TABLESPACE_NAME, STATUS
  2  FROM DBA_TABLESPACES;

TABLESPACE_NAME       STATUS
------------------------------ ---------
SYSTEM                           ONLINE
UNDOTBS1                      ONLINE
SYSAUX                          ONLINE
TEMP                                ONLINE
USERS                             ONLINE
EXAMPLE                        ONLINE

6 linhas selecionadas.

Fizemos um exemplo recuperando uma tablespace. Agora, imagine que essa tablespace fosse formada de dois datafiles, um datafile na unidade D e outro na unidade E. Da mesma forma com que você recuperou a tablespace, é possível também recuperar o datafile.

Imagine que o datafile existente na unidade D apresentou problemas de leitura no disco, e está corrompido.

Para isso, após corrigir o problema físico do disco, restaure o ultimo backup válido disponível no path determinado pela consulta:

SQL> SELECT FILE_ID, FILE_NAME
   2 FROM DBA_DATA_FILES;

   FILE_ID FILE_NAME
---------- ---------------------------------------------------
         4 D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\USERS01.DBF
         3 D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\SYSAUX01.DBF
         2 D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\UNDOTBS01.DBF
         1 D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\SYSTEM01.DBF
         5 D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\EXAMPLE01.DBF

Perceba o número de identificação do datafile USERS01.DBF(4), após identificar o número do arquivo, execute o seguinte comando

SQL> RECOVER DATAFILE 4;
RECUPERAÞÒO DE MÝDIA CONCLUÝDA.

Com esse, encerramos mais um artigo referente à recuperação do banco de dados.

Espero ter desmistificado um pouco o processo de recuperação gerenciado pelo usuário. Claro que ainda existem N possibilidades a serem exploradas.

Lembraça a todos! Bons Tuning´s