segunda-feira, 15 de dezembro de 2008

Oracle Incomplete Recover

Irei demonstrar como realizar um recovery incompleto no oracle, algumas vezes é a única maneira de recuperarmos dados, por exemplo, quando houve operações erroneas causadas por um usuário, ou durante um recover, e um dos archives não estava presente.

Vamos realizar o restore do banco utilizando o backup mais recente, porém em uma data anterior a qual desejamos recuperar o banco, iremos realizar o recovery até um determinado momento antes das alteração.

No nosso caso sabemos a data exata a qual realizaremos o restore, porém algumas vezes não há informações precisas e há a necessidade de ser investigado o momento certo das alterações.

Convenções:
Negrito: Passos a serem executados.
Fonte Azul: Comentários.

Ambiente

Antes de iniciarmos é preciso validar o ambiente, precisamos ter o banco em modo de archivelog, algumas variaveis de ambientes devem estar configuradas, e é claro devemos ter um backup válido via rman.

A parte do banco em archive e o backup do rman não será demonstrada, irei apenas demonstrar o restore e o recovery pelo rman.

Falhas

Salvar a data antes das alterações, e a seguir iremos remover o schema HR, assim, voltaremos o banco para antes do usuário HR ser removido do sistema e antes de ser perdido todas as informações do mesmo.


SQL> SELECT TO_CHAR(SYSDATE,'DD/MM/YYYY HH24:MI:SS') FROM DUAL;

TO_CHAR(SYSDATE,'DD
-------------------
15/12/2008 14:59:41

SQL> SELECT SUM(BYTES)/1024/1024 FROM DBA_SEGMENTS WHERE OWNER='HR';

SUM(BYTES)/1024/1024
--------------------
1.5625

SQL> DROP USER HR CASCADE;

User dropped.

SQL> SELECT SUM(BYTES)/1024/1024 FROM DBA_SEGMENTS WHERE OWNER='HR';

SUM(BYTES)/1024/1024
--------------------


SQL>

Restore

Vamos pegar as informações necessárias para setar as váriaveis de ambiente NLS_LANG e NLS_DATE_FORMAT, utilizadas para realizar o backup do rman.

Váriaveis necessárias:
NLS_LANG = language_territory.charset
NLS_DATE_FORMAT = Qualquer formato válido.


Variaveis de Ambiente

SQL> set line 120
SQL> set pagesize 30
SQL> col description format a40
SQL> col property_value format a40
SQL> select * from database_properties where property_name like '%NLS%';


PROPERTY_NAME PROPERTY_VALUE DESCRIPTION
------------------------------ ---------------------------------------- ----------------------------------------
NLS_LANGUAGE AMERICAN Language
NLS_TERRITORY AMERICA Territory
NLS_CURRENCY $ Local currency
NLS_ISO_CURRENCY AMERICA ISO currency
NLS_NUMERIC_CHARACTERS ., Numeric characters
NLS_CHARACTERSET AL32UTF8 Character set
NLS_CALENDAR GREGORIAN Calendar system
NLS_DATE_FORMAT DD-MON-RR Date format
NLS_DATE_LANGUAGE AMERICAN Date language
NLS_SORT BINARY Linguistic definition
NLS_TIME_FORMAT HH.MI.SSXFF AM Time format
NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM Time stamp format
NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR Time with timezone format
NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR Timestamp with timezone format
NLS_DUAL_CURRENCY $ Dual currency symbol
NLS_COMP BINARY NLS comparison
NLS_LENGTH_SEMANTICS BYTE NLS length semantics
NLS_NCHAR_CONV_EXCP FALSE NLS conversion exception
NLS_NCHAR_CHARACTERSET AL16UTF16 NCHAR Character set
NLS_RDBMS_VERSION 10.2.0.1.0 RDBMS version for NLS parameters

20 rows selected.

SQL> exit
Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options

Restore

1) Declaramos as variaveis de ambiente no SO
2) Chama-se o rman
3) Procedimento de recuperação

1) Variaveis de ambiente

[oracle@hodb01 logs]$export NLS_LANG=AMERICAN_AMERICA.AL32UTF8

[oracle@hodb01 logs]$ export NLS_DATE_FORMAT="DD/MM/YYYY hh24:mi:ss"

2) Rman

[oracle@hodb01 logs]$ rman


Recovery Manager: Release 10.2.0.1.0 - Production on Mon Dec 15 15:13:12 2008

Copyright (c) 1982, 2005, Oracle. All rights reserved.

RMAN> connect target /

connected to target database: ORCL (DBID=1201080710)

3) Procedimento de restore

Paramos o banco de dados, iniciamos ele em modo munted, determinamos a data a qual o banco irá voltar, realizamos o restore e o recover, e abrimos ele com resetlogs, o que faz com que o banco volte em uma nova incarnação.

RMAN> run {
2> shutdown immediate;
3> startup mount;
4> set until time '15/12/2008 14:59:41';
5> restore database;
6> recover database;
7> }

using target database control file instead of recovery catalog
database closed
database dismounted
Oracle instance shut down

connected to target database (not started)
Oracle instance started
database mounted

Total System Global Area 205520896 bytes

Fixed Size 1218532 bytes
Variable Size 79693852 bytes
Database Buffers 121634816 bytes
Redo Buffers 2973696 bytes

executing command: SET until clause

Starting restore at 15/12/2008 15:14:33
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=157 devtype=DISK
media recovery complete, elapsed time: 00:00:04
Finished recover at 15/12/2008 15:16:57

RMAN> alter database open restlogs;
RMAN> alter database open resetlogs;

database opened

RMAN> exit


Recovery Manager complete.
[oracle@hodb01 logs]$ sqlplus / as sysdba


SQL*Plus: Release 10.2.0.1.0 - Production on Mon Dec 15 15:19:21 2008

Copyright (c) 1982, 2005, Oracle. All rights reserved.


Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options


SQL> SELECT TO_CHAR(SYSDATE,'DD/MM/YYYY HH24:MI:SS') FROM DUAL;

TO_CHAR(SYSDATE,'DD
-------------------
15/12/2008 15:19:55

SQL> SELECT SUM(BYTES)/1024/1024 FROM DBA_SEGMENTS WHERE OWNER='HR';

SUM(BYTES)/1024/1024
--------------------
1.5625

SQL>


Bom esse artigo somente foi para demonstrar os procedimentos para um recover inclompleto, esse tipo de falha talves poderia ser recuperada de outra maneira um pouco mais eficente.
Como visto é simples realizar o restore incompleto pelo rman.
Postar um comentário