Standby Database per Oracle Standard Edition

Mercoledì 17 Dicembre 2008 at 17:58 | In Backup and Recovery, Installation and Configuration | 17 Comments
Tags: , , ,

Alcuni giorni fa ho scritto un post in cui descrivevo un’implementazione artigianale ed ingenua di una soluzione di “alta affidabilità” o “disaster recovery”. La soluzione da me implementata si basava su export/import dello schema database di interessa da una macchina all’altra.  Sono contento di aver scritto tale post, ma soprattuto sono grato ad Alessandro per avermi segnalato un link a un documento  di Niall Lichtfield (il documento sta ancora sul vecchio sito di Niall) in cui si parla di una soluzione “Data Guard” per Oracle Standard Edition.

Confesso che tempo fa gia un’altra persona mi aveva detto di aver messo in piedi una soluzione Data Guard “manuale” su Oracle database Standard Edition. Non ho mai approfondito la cosa perchè mi sembrava una cosa poco pulita (nel senso al limite della “legalità”). L’accenno al fatto che una implementazione manuale di “Data Guard” può essere fatta su Standard Edition nella presentazione di Niall mi  ha spinto a fare una ricerca approfondita. Sono partito dal listino dove in realtà non ho trovato niente.  Alla fine sono andato sulla documentazione e con mia grande soddisfazione ho trovato questo.  Quindi Oracle dichiara espressamente che l’implementazione manuale di uno Standby Database è possibile su Standard Edition. A questo punto ho deciso si fare dei test, essendo una cosa che sicuramente sul lavoro mi servirà.

Siccome sulla documentazione Oracle si da spazio solo all’implementazione “Enterprise” di “Data Guard” ho cercato su internet qualche documento ed ho trovato questo interessante articolo su www.databasejournal.com.

Sospesi i test con Oracle 11g ho clonato la macchina virtuale con Oracle 10gR2 che ho usato per altri test e seguito le semplici istruzioni riportate sull’articolo, ho fatto un po’ di controlli incrociati con il documento e gli script di Niall Lichtfield e la documentazione della 10gR2. Ad esempio nell’articolo c’è l’indicazione di eseguire il comando

ALTER SYSTEM ARCHIVE LOG START;

cosa che con 10g non è più necessaria e deprecata (il comando non da errore ma non fa nulla, rif)

Una cosa che mi capita è che il “recover” dell’istanza di standby da sempre errore:

SQL> alter database recover automatic standby database until cancel;
alter database recover automatic standby database until cancel
*
ERROR at line 1:
ORA-00279: change 16718544 generated at 12/17/2008 12:00:44 needed for thread 1
ORA-00289: suggestion : /opt/oracle/oradata/inarchivelogs/1_619_645973149.dbf
ORA-00280: change 16718544 for thread 1 is in sequence #619
ORA-00278: log file ‘/opt/oracle/oradata/inarchivelogs/1_619_645973149.dbf’ no
longer needed for this recovery
ORA-00308: cannot open archived log
‘/opt/oracle/oradata/inarchivelogs/1_619_645973149.dbf’
ORA-27037: unable to obtain file status
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3

Il numero di sequenza che cerca è quello del log corrente sull’istanza primaria. Credo che sia normale, perchè per il resto funziona tutto, infatti, prima di questo recorery (e dopo aver creato l’istanza di standby, tra l’altro con un backup a freddo copiando semplicemente tutti i datafile) ho lanciato sull’istanza principale

SQL> @?/rdbms/admin/utlsampl.sql

Che crea lo schema SCOTT e dopo il recovery sulla istanza di standby:

SQL> alter database recover cancel;

Database altered.

SQL> alter database open read only
2  /

Database altered.

SQL> conn scott/tiger
Connected.
SQL> select count(*) from user_tables;

COUNT(*)
———-
4

Infine ho fatto una prova di “switch-over”, infatti il segreto di ogni buona politica di backup è un test di ripristino. Nell’articolo di Databasejournal.com la fa facile, dicendo che basta applicare tutto il redo mancante e poi aprire in modalità read write. Io non ho trovato subito  un modo diretto per aprire in modalità read write il datbase. Seguendo le indicazioni del manuale non funziona  (credo dipenda sempre dal fatto che nel manuale è descritta solo la gestione automatica):

SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;

SWITCHOVER_STATUS
——————–
NOT ALLOWED

Ci sono riuscito ripristinando i controlfile di partenza, facendo un recovery incompleto e aprendo con l’opzione RESETLOGS (gli online redolog non li avevo copiati).

Tutti gli altri tentativi di aprire il database in modalità read write con i controlfile usati per lo standby mi davano:

ORA-01666: control file is for a standby database

Cercando meglio ho trovato la soluzione, qui.

SQL> alter database ACTIVATE STANDBY DATABASE;

Database altered.

SQL> alter database open;

Database altered.

SQL> conn scott/tiger
Connected.
SQL> create table pluto (a number);

Table created.

Qui, dice che è meglio non usare ALTER DATABASE ACTIVATE STANDBY DATABASE perché si rischia di perdere dati, ma sospetto che nella gestione manuale non vi siano molte alternative.

L’unico difetto di questa tecnica di “alta affidabilità” o “disaster recovery” come la si vuole classificare, è secondo me il fatto che la seconda istanza non può essere usata, se non in modalità read-only.  Non ho indagato a fondo, ma immagino che sia possibile usare solo physical standby database e non logical standby database con la Standard Edition.

I BACKUP SET di RMAN

Giovedì 30 Ottobre 2008 at 30:46 | In Backup and Recovery | Leave a Comment
Tags: , , , , ,

In questi giorni ho un po’ approfondito la mia conoscenza di RMAN. I dettagli di questo potente strumento di backup fornito da Oracle sono veramente tanti e infatti per anni ho utilizzato una consolidata procedura di backup senza conoscere alcuni dettagli di cui in questo post parlerò e soprattuto senza avere problemi.

RMAN è ingrado di produrre due tipi di backup, le copie e i backup set. Le copie sono copie identiche dei datafile o degli archivelog o del control file che non sono ottimizzate. Le copie hanno due vantaggi, uno è che possono essere ripristinate anche senza RMAN (vantaggio da poco direi) e il loro ripristino è più efficente perché consiste solo in una copia. Al contrario i backup set sono in formato proprietario, quindi leggibili e ripristinabili solo con RMAN, essi però sono ottimizzati nel senso che Oracle non include nei backup set quei blocchi dei datafile mai utilizzati; quindi un backup set di un database con file grandi ma con pochi dati (perchè nuovo, in genere) può risultare molto piccolo. Questo vantaggio probabilmente si paga un pochino con una minor efficenza nel ripristino, infatti oracle deve “ricostruire” i datafile.

Vi sono altre due differenze fra le copie immagine e i backup set: i backup set possono essere creati sia su disco che su tape e da Oracle 10g (solo Enterprise Edition) possono essere compressi; le copie possono essere fatte solo su disco e la loro compressione non è supportata da RMAN.

Un backup set, stando al manuale, è la più piccola unità di un backup, nel senso che se la crezione di un backup set fallisce tale backup set non è valido. Una procedura di backup può creare più backup set ed ogni backup set consiste in uno o più file, chiamati backup piece.

Una delle caratteristiche dei Backup Set è che contengono solo file con dimensione del blocco omogeneo, quindi, ad esempio se nel database vi sono tablespace con dimensione del blocco diverse, ad esempio 8k e 16k  vengono creati due backup set distinti.  Sui manuali non ho trovato riferimento a questa caratteristica, ma solo un riferimento al caso del control file; da questo e da un mio test ho desunto quanto ho detto.

RMAN utilizza il concetto di “channel” la cui definizione per me non è mai stata chiara. Credo che sia il modo di chiamare lato RMAN i processi server che fisicamente scrivono i backup. RMAN permette di migliorare le prestazioni dei backup parallelizzando le operazioni sfruttando più channel. In sostanza nella creazione di un backup, attraverso algoritmi suoi RMAN crea tanti backup set quanti sono i channel allocati e li scrive in parallelo. L’utilità è facilmente comprensibile se si pensa all’utilizzo di due tape drive. Qui devo devo dire che non avendo mai approfondito prima pensavo che tale parallelizzazione avvenisse a livello di backup piece invece RMAN non è in grado di parallelizzare la scrittura di più backup piece per un backup set. Credo che l’unica vera utilità del backup piece sia quella di poter spezzare il backpup in file di dimensione arbitrariamente piccola. Infatti la dimensione di un backup set può essere limitata con la configurazione del parametro MAXSETSIZE (configurazione che può essere memorizzata con il comando CONFIGURA MAXSETSIZE …) il valore di questo limite però non può essere inferiore alla dimensione di alcun datafile, altrimenti la creazione del backup set fallisce.

RMAN> backup datafile 4 maxsetsize 500 M;

Starting backup at 30-OCT-08
using channel ORA_DISK_1
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of backup command at 10/30/2008 16:41:38
RMAN-06183: datafile or datafile copy larger than MAXSETSIZE: file# 4 /opt/oracle/oradata/test102/users01.dbf

RMAN fa un controllo prima di iniziare.

Come di vede dall’esempio il maxsetsize può essere anche specificato direttamente con il comando di backup. Stando al manuale questo parametro può essere utile se si vuole avere garanzia che ogni backup set stia su una cassetta.

Più interessante (e per un po’ è stato misterioso per me) è il parametro FILESPERSET, che purtroppo però non è configurabile in modo permanente con il comando CONFIGURE di RMAN. Esso è solo utilizzabile come parametro del comando backup, limita il numero di file del database che vengono inclusi in un backup set. La prima conseguenza di ciò è quella di limitare l’uso di risorse di RMAN limitando il “multiplexing” ovvero la caratteristica per cui Oracle legge contemporanemante da più file quando crea un backup set e “mischia” i blocchi dei vari file dentro il backup set. Questa caratteristica in teoria è un po’ obsoleta in quanto superata dal parametro RATE e DURATION (che se non erro sono nuovi in 10g).

Per quanto rigurda la parallelizzazione, nei mie test di backup su disco, con allocazione automatica dei canali ho visto che l’unica configurazione che influisce è CONFIGURE DEVICE TYPE DISK PARALLELISM … per il resto rimando al manuale per i dettagli.

In diverse parti dei manuali, ad esempio qui e qui si dice che per default oracle mette 4 datafile per backup set e 16 archivelog per dataset. Però dai miei test ciò non risulta e nella definizione di FILESPERSET si parla di 64, non so se mi sfugge qualcosa o se c’è un errore nella documentazione.

Con questo post ho cercato di riordinarmi le idee su quello che ho appreso di nuovo riguardo i backup set di RMAN. Ripeto, i dettagli sulle configurazioni e sull’utilizzo di RMAN sono molti, non a caso vi sono migliaia di pagine di Manuali, però un passo alla volta si riesce ad avere una panoramica sempre più ampia.

I tempfile in Oracle 10gR2

Mercoledì 22 Ottobre 2008 at 22:33 | In Backup and Recovery, Diario | 3 Comments
Tags: , ,

Studiando per l’OCP ieri ho notato una cosa particolare che mi ha fatto accendere una lampadina. Sulla guida di studio, dove si parla del ripristino della tablespace TEMP c’è un estratto di un errore che fa riferimento a un file con id 201.

Oggi  ho fatto un paio di prove su un db preparato appositamente, la prima volta ho provato a spegnere il db, a a cancellare il file della tablespace TEMP e riaprire il db. Ciò che accade è molto bene, e in effetti lo avevo gia notato con le prove di ripristino di un backup: Oracle ricrea automaticamente il file, questo si vede dall’alert.log-

Wed Oct 22 15:51:51 2008
Re-creating tempfile /opt/oracle/oradata/test102/temp01.dbf

Volevo però simulare una corruzione del file, allora ho fatto la seguente operazione, a db fermo:

[oracle@testrman test102]$ dd if=/dev/zero of=/opt/oracle/oradata/test102/temp01.dbf bs=1024 count=12 skip=1
12+0 records in
12+0 records out

Ho riaperto il db e anche in questo caso non ho avuto segnalazioni:

SQL*Plus: Release 10.2.0.4.0 – Production on Wed Oct 22 15:58:04 2008

Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.

Connected to an idle instance.

SQL> startup
ORACLE instance started.

Total System Global Area  432013312 bytes
Fixed Size                  2084552 bytes
Variable Size             306184504 bytes
Database Buffers          117440512 bytes
Redo Buffers                6303744 bytes
Database mounted.
Database opened.

Qualcosa però è successo, infatti nell’alert:

Wed Oct 22 15:58:13 2008
Cannot re-create tempfile /opt/oracle/oradata/test102/temp01.dbf, the same name file exists
Wed Oct 22 15:58:13 2008
Errors in file /opt/oracle/admin/test102/bdump/test102_dbw0_3713.trc:
ORA-01157: cannot identify/lock data file 201 – see DBWR trace file
ORA-01110: data file 201: ‘/opt/oracle/oradata/test102/temp01.dbf’
ORA-27046: file size is not a multiple of logical block size
Additional information: 1

Insomma, Oracle si è accorto che il file era corrotto ma giustamente ha aperto comunque il database.

SQL> select * from dba_temp_files;
select * from dba_temp_files
*
ERROR at line 1:
ORA-01157: cannot identify/lock data file 201 – see DBWR trace file
ORA-01110: data file 201: ‘/opt/oracle/oradata/test102/temp01.dbf’

La cosa strana, almeno per me è il fatto che Oracle parli di “file 201″. Ho applicato una procedura di ripristino:

SQL> alter tablespace temp add tempfile  ‘/opt/oracle/oradata/test102/temp02.dbf’ size 128 m;

Tablespace altered.

SQL> alter tablespace temp drop tempfile ‘/opt/oracle/oradata/test102/temp01.dbf’;

Tablespace altered.

SQL> select * from dba_temp_files;

FILE_NAME
——————————————————————————–
FILE_ID TABLESPACE_NAME                     BYTES     BLOCKS STATUS
———- —————————— ———- ———- ———
RELATIVE_FNO AUT   MAXBYTES  MAXBLOCKS INCREMENT_BY USER_BYTES USER_BLOCKS
———— — ———- ———- ———— ———- ———–
/opt/oracle/oradata/test102/temp02.dbf
2 TEMP                            134217728      16384 AVAILABLE
2 NO           0          0            0  133169152       16256

A questo punto volevo verificare una cosa, allora ho ripetuto l’esperimento, ho ricorrotto il file a mano e riavviato il database:

SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> exit

[oracle@testrman test102]$ dd if=/dev/zero of=/opt/oracle/oradata/test102/temp02.dbf bs=1024 count=12 skip=1
12+0 records in
12+0 records out
[oracle@testrman test102]$ sqlplus / as sysdba

SQL*Plus: Release 10.2.0.4.0 – Production on Wed Oct 22 18:23:54 2008

Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.

Connected to an idle instance.

SQL> startup
ORACLE instance started.

Total System Global Area  432013312 bytes
Fixed Size                  2084552 bytes
Variable Size             306184504 bytes
Database Buffers          117440512 bytes
Redo Buffers                6303744 bytes
Database mounted.
Database opened.
SQL> !tail -40  /opt/oracle/admin/test102/bdump/alert_test102.log
LGWR: STARTING ARCH PROCESSES COMPLETE
ARC1 started with pid=16, OS id=5859
Wed Oct 22 18:24:02 2008
ARC0: Becoming the ‘no FAL’ ARCH
ARC0: Becoming the ‘no SRL’ ARCH
Wed Oct 22 18:24:02 2008
ARC1: Becoming the heartbeat ARCH
Wed Oct 22 18:24:02 2008
Thread 1 opened at log sequence 568
Current log# 2 seq# 568 mem# 0: /opt/oracle/oradata/test102/redo02.log
Successful open of redo thread 1
Wed Oct 22 18:24:02 2008
MTTR advisory is disabled because FAST_START_MTTR_TARGET is not set
Wed Oct 22 18:24:02 2008
SMON: enabling cache recovery
Wed Oct 22 18:24:03 2008
Successfully onlined Undo Tablespace 1.
Wed Oct 22 18:24:03 2008
SMON: enabling tx recovery
Wed Oct 22 18:24:03 2008
Cannot re-create tempfile /opt/oracle/oradata/test102/temp02.dbf, the same name file exists
Wed Oct 22 18:24:03 2008
Errors in file /opt/oracle/admin/test102/bdump/test102_dbw0_5837.trc:
ORA-01157: cannot identify/lock data file 202 – see DBWR trace file
ORA-01110: data file 202: ‘/opt/oracle/oradata/test102/temp02.dbf’
ORA-27046: file size is not a multiple of logical block size
Additional information: 1
Database Characterset is AL32UTF8
Opening with internal Resource Manager plan
where NUMA PG = 1, CPUs = 1
replication_dependency_tracking turned off (no async multimaster replication found)
Starting background process QMNC
QMNC started with pid=17, OS id=5861
Wed Oct 22 18:24:07 2008
Completed: ALTER DATABASE OPEN

Ebbene, la cosa per me curiosa è il fatto che in realtà interrogando DBA_TEMP_FILES o V$TEMPFILE viene indicato come id del file 1,2, ecc, ma in realtà sembra che internamente oracle sommi 200 a tale id.

La cosa mi ha interessato particolarmente perchè tempo fa su un database accadde che lato applicazione avevamo alle volte un errore Oracle che faceva appunto riferimento al file con id 201 e non riuscivamo a capire di cosa si trattasse. Il bello è che aprii anche una chiamata (TAR o SR) sul metalink, ma nessuno mi seppe dire che si trattava del tempfile.

Panoramica sulla tecnologie Flashback di Oracle

Lunedì 13 Ottobre 2008 at 13:24 | In Backup and Recovery, Installation and Configuration | Leave a Comment
Tags: , , ,

Nel mio percorso di studio e ripasso per l’OCP oggi scrivo un post di introduzione alle tecnologie di flashback implementate e disponibili nella versione 10gR2 del database Oracle.

Comincio con il spiegare di cosa si tratta: in sostanza si tratta di una serie di strumenti che ha come obbiettivo principale quello di facilitare le operazioni di ripristino di dati corrotti a causa di errori umani logici, ad esempio un drop table sbagliato o peggio errori applicativi che hanno fatto transazioni sbagliate. Questi strumenti vanno tutti sotto la categoria “flashback” in quanto permettono o di vedere come erano i dati nel passato, o come sono cambiati o di ripristinare i dati o l’intero database com’era nel passato.

Le tecnologie flashback sono cinque:

  1. Flashback Database (solo enterprise edition)
  2. Flashback Drop
  3. Flashback Versions (forse anche in standard, ma devo verificare)
  4. Flashback Transaction (solo enterprise edition)
  5. Flashback table (solo enterprise edition)

Flashback Database (Rif. Manuale: Concepts, Backup and Recovery Basics)

Va attivata esplicitamente, a database in stato mounted. Quando è attivata questa modalità un processo di background, chiamato “flashback writer (RVWR)” scrive nella flash recovery area (FRA) dei log che in sostanza registrano le modifiche al blocchi (tipo l’UNDO). La conservazione di questi log è basata sul parametro DB_FLASHBACK_RETENTION_TARGET che deve essere obbligatoriamente settato e serve ad indicare un obbiettivo (target) di tempo di flashback da manterenerein FRA. Quindi settando ad esempio DB_FLASHBACK_RETENTION_TARGET=1440 (il default, in minuti, pari a un giorno) si chiede al RVWR di aver come obbiettivo il mantenimento su disco dei log per poter riportare indietro il database fino al giorno prima.

Le possibilità di flashback hanno dei limiti, specificati nel manuale, però la potenzialità di questo strumento è alta. E’ da capire il reale impatto di questa caratteristica sulle prestazioni,  di sicuro non nullo.

Flashback DROP

Questa funzionalità implementa un cestino delle tabelle. Da oracle 10g quando si fa DROP TABLE X; la tabella non viene realmente droppata ma viene messa in un cestino che funziona a livello di tablespace (ogni tablespace ha un suo cestino). Per eliminare direttamente una tabella la sintassi SQL di oracle è stata estesa e si deve scrivere DROP TABLE X PURGE; Il cestino è consultabile con le viste USER/DBA_RECYCLEBIN dove si vede che le tabelle vengono rinominati con nomi strani. Il cestino può essere svuotato con comandi come “PURGE RECYCLEBIN”. Vi sono poi varianti del comando purge come “PURGE TABLE x”, PURGE TABLESPACE y” ecc.

Flashback Transaction Query (Rif. Man. “Administrators Guide“)

Questa funzionalità si basa sul gia esistente UNDO e permette con una semplice estensione dell’SQL di interrogare i dati indietro nel tempo. La disponibilità di questi dati dipende dal’UNDO, quindi dai parametri UNDO_RETENTION ed eventualmente dal fatto che sulla tablespace di UNDO utilizzata sia configurato il “retention guarantee“. Un esempio di utilizzo di questa funzionalità, direttamente dal manuale è:

SELECT versions_startscn, versions_starttime,
       versions_endscn, versions_endtime,
       versions_xid, versions_operation,
       name, salary
  FROM employees
  VERSIONS BETWEEN TIMESTAMP
      TO_TIMESTAMP('2003-07-18 14:00:00', 'YYYY-MM-DD HH24:MI:SS')
  AND TO_TIMESTAMP('2003-07-18 17:00:00', 'YYYY-MM-DD HH24:MI:SS')
  WHERE name = 'JOE';

Come si vede dall’esempio oltre all’estensione della select con la parte … VERSIONS, ci sono anche delle pseudocolonne (versions_%) che danno informazione sulla “versione” del dato.

Flashback Transaction Query (Rif. Man. “Application Developers“)

Questa funzionalità permette di interrogare una vista di sistema, FLASHBACK_TRANSACTION_QUERY, dalla quale si ottengono tutte le informazioni relative alle ultime transazioni eseguite (i cui dati si trovano ancora nell’UNDO) compreso l’istruzione SQL per “annullare” ogni singola istruzione di ogni transazione (UNDO). Riporto sono un piccolo esempio di utilizzo, per maggiori approfondimenti rimando al manuale:

SELECT xid, logon_user FROM flashback_transaction_query
     WHERE xid IN (SELECT versions_xid FROM employees VERSIONS BETWEEN TIMESTAMP
      TO_TIMESTAMP('2003-07-18 14:00:00', 'YYYY-MM-DD HH24:MI:SS') AND
      TO_TIMESTAMP('2003-07-18 17:00:00', 'YYYY-MM-DD HH24:MI:SS'));

Flashback Query
Nel manuale su cui studio per l’OCP non se ne parla perchè evidentemente non fa parte del manuale, vi è però un’altra funzionalità di backup, già introdotto con Oracle 9, flashback query. Effettivamente forse non se ne parla perchè le nuove funzionalità l’hanno sorpassata, questa funzionalità è simile alla “flashback versions” in quanto permette di vedere i dati come erano nel passato con la sintassi SQL “SELECT… AS OF”, ad esempio:

SELECT * FROM employees AS OF TIMESTAMP
   TO_TIMESTAMP('2004-04-04 09:30:00', 'YYYY-MM-DD HH:MI:SS')
   WHERE last_name = 'Chung';

Conclusioni

Devo confessare che non ho mai avuto necessità di utilizzare veramente nessuna di tutte queste belle funzionalità. Quella più interessante mi pare quella di Flashback Database per la quale a dire il vero intravedo una possibilità di uso reale, ma sono perplesso su due aspetti, uno quello delle prestazioni, due quello della gestione dei log. Tempo fa su una installazione di test attivai la funzionalità di flashback database e mi trovai un po’ in difficoltà perchè non riuscivo a liberare rapidamente lo spazio occupato da questi log nella flash recovery area. Tramite RMAN è possibile salvarli solo su nastro e se non ricordo male non era possibile cancellarli se non erano stati salvati prima (era una 10.1, con ASM, poi non ho più provato). Quindi probabilmente il modo più veloce di fare spazio è abbassare drasticamente il parametro FLASHBACK_RETENTION_TARGET e lasciare che Oracle automaticamente liberi lo spazio che gli serve.

Esercitarsi con RMAN

Venerdì 11 Luglio 2008 at 11:05 | In Backup and Recovery | Leave a Comment
Tags: , , ,

Grazie agli incredibili consigli di “Google Reader“  (ma come farà? mi stupisce sempre) che da poche settimane uso con grande soddisfazione, ieri sono ricapitato dopo molto tempo sul blog di Alejandro Vargas . Consiglio a tutti di dare un’occhiata all’archivio del suo blog, vi si possono trovare un sacco di informazioni interessanti. In particolare, ricollegandomi ad un mio post di qualche giorno fa (“introduzione a oracle recovery manager (RMAN)“), se qualcuno ha voglia (o bisogno) di esercitarsi con RMAN consiglio di leggersi il post “Oracle Recovery Manager (RMAN) Hands On Practice“. In questo post Alejandro Vargas ribadisce il concetto che RMAN è uno strumento molto potente e complesso, che può essere facile da usare ma anche difficile. Soprattutto l’autore mette a disposizione un corposo documento PDF con una bella esercitazione pratica su RMAN. Manca solo purtroppo il link agli script per ricreare l’ambiente di esercitazione, ma con un po’ di sforzo mi sembra che nel pdf si trovi tutto il necessario.

Flash Recovery Area

Martedì 8 Luglio 2008 at 08:03 | In Backup and Recovery | Leave a Comment
Tags: , ,

La flash recovery area è una nuova caratteristica introdotta con Oracle 10g. Si tratta di una area sul disco, configurabile dinamicamente, dove Oracle per default mette tutti i file di backup e relativi alle funzionalità “flasback” (ad esempio i flashback logs). Ad esempio se viene configurata una flash recovery area (attraverso i parametri DB_RECOVERY_FILE_DEST E DB_RECOVERY_FILE_DEST_SIZE) il parametro LOG_ARCHIVE_DEST_10 implicitamente assume il valore di “USE_DB_RECOVERY_FILE_DEST” se non è stato settato esplicitamente alcun altro LOG_ARCHIVE_DEST_n.

Se la Flash recovery area viene definita durante la creazione del database DBCA mette in automatico anche una copia degli online redo log e del controlfile in essa.

La flash recovery area si basa su OMF (Oracle Managed Files) per l’organizzazione dei file al suo interno e può essere piazzata ovunque possa essere usato OMF, filesystem o ASM.

Il parametro DB_RECOVERY_FILE_DEST definisce dove questa area deve trovarsi, quindi può essere un percorso su filesystem (ad esempio /u01/oracle/fra) oppure un diskgroup ASM (ad esempio +DG_RECO). Il parametro DB_RECOVERY_FILE_DEST_SIZE definisce una dimensione massima (controllata da Oracle) per questa area. Attenzione, quando questa quota viene raggiunta Oracle cerca di liberare spazio, ad esempio cancellando backup che secondo le politiche di “retention” sono obsoleti. Se non è più in grado di liberare spazio gli archive log finiscono qua dentro il database ferma le transazioni.

RMAN prevede un comando per fare il backup completo della recovery area:

RMAN>BACKUP RECOVERY AREA;

Tale backup può essere fatto solo su tape.

Ricreazione del Controlfile e missing datafiles

Martedì 8 Luglio 2008 at 08:51 | In Backup and Recovery | Leave a Comment
Tags: , ,

Studiando per la certificazione (e si sono un po’ lungo)  ho scoperto un’altra cosa nuova. Se ricreo il controlfile e dimentico di mettere qualche datafile nello script di creazione, Oracle al momento dell’apertura del database fa un controllo incrociato tra le informazioni del controlfile e quelle del dizionario dati, in questa fase può essere che appunto trovi nel dizionario dati dei datafile che nel controlfile non ci sono. In questo caso quello che accade è ben descritto nell’alert.log:

“Tablespace ‘USERS16K’ #5 found in data dictionary,
but not in the controlfile. Adding to controlfile.
File #5 found in data dictionary but not in controlfile.
Creating OFFLINE file ‘MISSING00005′ in the controlfile.

Questa situazione è facilmente riscontrabile se si ricrea il controlfile usando lo script creato con l’istruzione “ALTER DATABASE BACKUP CONTROLFILE TO TRACE” mentre una o più tablespace sono in modalità “READ ONLY”: in questo caso Oracle non include nello script di creazione del controlfile i datafile appartenenti alla tablespace in modalità READ ONLY. Questo comportamente pare dovuto al fatto che oracle ritenga che essendo la tablespace in modalità  READ ONLY non abbia bisogno di recovery …

In ogni caso, nel mio ambiente di test (10.2.0.4) nel trace compare anche

ALTER DATABASE OPEN RESETLOGS;
– Files in read-only tablespaces are now named.
ALTER DATABASE RENAME FILE ‘MISSING00004′
TO ‘/opt/oracle/oradata/test102/users01.dbf’;
– Online the files in read-only tablespaces.
ALTER TABLESPACE “USERS” ONLINE;
– Commands to add tempfiles to temporary tablespaces.
– Online tempfiles have complete space information.
– Other tempfiles may require adjustment.
ALTER TABLESPACE TEMP ADD
TEMPFILE ‘/opt/oracle/oradata/test102/temp01.dbf’
SIZE 20971520  REUSE AUTOEXTEND ON NEXT 655360 ;

Facendo questo questi test mi sono trovato di fronte ad un’altra situazione interessante: ho simulato la perdita completa del database, e disponevo solo di un backup completo del database stesso fatto con RMAN  e di tutti gli archived logs. Inizialmente pensavo di poter ricreare i controlfile con lo script generato con il trace, ma non è così, infatti:

SQL> CREATE CONTROLFILE  DATABASE “TEST102″ RESETLOGS  ARCHIVELOG
2      MAXLOGFILES 16
3      MAXLOGMEMBERS 3
4      MAXDATAFILES 100
5      MAXINSTANCES 8
6      MAXLOGHISTORY 292
7  LOGFILE
8    GROUP 1 ‘/opt/oracle/oradata/test102/redo01.log’  SIZE 50M,
9    GROUP 2 ‘/opt/oracle/oradata/test102/redo02.log’  SIZE 50M,
10    GROUP 3 ‘/opt/oracle/oradata/test102/redo03.log’  SIZE 50M
11  — STANDBY LOGFILE
12  DATAFILE
13    ‘/opt/oracle/oradata/test102/system01.dbf’,
14    ‘/opt/oracle/oradata/test102/undotbs01.dbf’,
15    ‘/opt/oracle/oradata/test102/sysaux01.dbf’,
16    ‘/opt/oracle/oradata/test102/users01.dbf’,
17    ‘/opt/oracle/oradata/test102/users16k01.dbf’
18  CHARACTER SET AL32UTF8
19  ;
CREATE CONTROLFILE  DATABASE “TEST102″ RESETLOGS  ARCHIVELOG
*
ERROR at line 1:
ORA-01503: CREATE CONTROLFILE failed
ORA-01565: error in identifying file ‘/opt/oracle/oradata/test102/system01.dbf’
ORA-27037: unable to obtain file status
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3

Quindi ho capito perchè in automatico RMAN quando viene fatto il backup della tablespace SYSTEM include anche il controlfile.

Si tratta di cose che per chi è esperto possono essere banali, ma i dettagli e le situazioni che si possono presentare sono talmente tanti che qualcosa può sempre sfuggire. Per conto mio ho sempre cercato di essere superprevidente nelle mie politiche di backup, quindi vi è sempre un backup esplicito del controlfile. Anche perchè in 9i mi pare non vi fosse il modo (almeno documentato) di registrare un backup sul control file se questo era stato ricreato. Quindi perdendo il control file  si perdevano anche le info dei backup (a meno di non usare un recovery catalog come consigliato da Oracle). In 10g, anche ricreando un controlfile o ripristinandone uno vecchio, è possibile registrare i backup fatti e quindi utilizzarli. Ripeto: preferisco essere iperprevidente ed evitare di trovarmi in situazioni simili.

Introduzione a Oracle Recovery Manager (RMAN)

Venerdì 4 Luglio 2008 at 04:04 | In Backup and Recovery | 6 Comments
Tags: , , ,

Oracle Recovery Manager (comunemente chiamato con il nome dell’eseguibile RMAN) è il programma di gestione del backup dei database oracle fornito da Oracle stesso.

RMAN è stato introdotto da Oracle con la versione 8, nella versione 7 era presente un programma chiamato Enterprise Backup Utility (EBU).

Dalla versione 8 in poi RMAN è stato migliorato e corretto ed è arrivato ad essere uno strumento completo, potente e tutto sommato abbastanza facile da usare per gestire i backup (ed il loro eventuale ripristino) del database.

Sembra una banalità ma se si usa un database Oracle e si tiene un po’ ai dati in esso contenuti è assurdo non usare RMAN.  E’ assurdo non usare il database in modalità ARCHIVELOG, è assurdo non sfruttare la possibilità offerta da RMAN di fare backup a caldo. Per conto mio, a meno che non si abbia bisogno del massimo dellle prestazioni per grossi carimenti, il database deve essere in modalità ARCHIVELOG; è banale schedulare degli script che alla peggio cancellino brutalmente gli archive log che possono saturare lo spazio disco.

Pare incredibile, ma in giro per il mondo vi sono persone che usano database Oracle in produzione, con dati a cui tengono, in modalità NOARCHIVELOG, mah!? RMAN comunque può essere usato anche in questi casi per backup a freddo.

Concluse le premesse con le mie opinioni sulla gestione del backup di un database oracle riassumo molto brevemente le caratteristiche di RMAN.

RMAN mantiene un catalogo dei backup effettuati

Questo catalogo si trova sempre sul controlfile, ma in questo caso le informazioni sono mantenute per un periodo limitato dal parametro CONTROL_FILE_RECORD_KEEP_TIME, per evitare la crescita eccessiva del control file. Per default il parametro è settato a 7 il che significa che le informazioni sui backup effettuati vengono mantenute nei controlfile per sette giorni, dopo di che lo spazio viene riusato in modo circolare per scrivere nuove informazioni. In alternativa è possibile usare il cosiddetto “Recovery Catalog” che in pratica è un catalogo memorizzato su un’altro database. I vantaggi dell’uso di un Recovery catalog sono almeno tre:

  1. La perdita dei control file non comporta la perdita delle informazioni sui backup
  2. si possono mantenere facilmente le informazioni sui backup per periodi lunghi
  3. si possono utilizzare script memorizzati nel recovery catalog

Lo svantaggio è dato da un piccolo sovraccarico di gestione.

RMAN gestisce in modo automatico backup, restore e recovery

Se non si hanno esigenze particolari gestire il backup e l’eventuale ripristino con RMAN è molto semplice, perchè è quasi tutto automatico. RMAN è principalmente una utility Command Line Interface (CLI) cioè un programma a linea di comando (una cosa senz’altro abominevole per il tipico utente winzoz, ma per noi geek è il pane quotidiano). Fare un backup completo di un database a caldo può essere fatto così:


RMAN>BACKUP DATABASE FORMAT '/usr/backup/full_%U'
PLUS ARCHIVELOG ALL FORMAT '/usr/backup/arch_%U'
DELETE INPUT;

L’informazione su questo backup verrà salvata nel catalog (sia controlfile che recovery catalog se configurato), in caso di necessità il ripristino è altrettanto facile:


RMAN>RESTORE DATABASE;
RMAN>RECOVER DATABASE;
RMAN>ALTER DATABASE OPEN;

Effettimente il ripristino completo dell’operatività richiede ben tre comandi, però secondo me non è così male.

RMAN può fare backup completi e backup incrementali

RMAN è un programma molto efficente, può essere usato per fare backup a caldo, ma per quanto efficente inevitabilmente incide sulle prestazioni del database e per questo può essere che le finestre temporali in cui può essere fatto il backup siano ristrette; se il database è molto grande questo è un problema, allora è possibile utilizzare i backup incrementali, che fanno il backup solo delle parti di database modificate rispetto all’ultimo backup. Questo, assieme alla nuova caratteristica di 10g (nuova ormai da quattro anni) chiamata BLOCK CHANGE TRACKING può rendere le operazioni di backup molto veloci.  Se poi ci mettiamo anche gli “INCREMENTALLY UPDATED BACKUPS” abbiamo raggiunto il massimo perchè si elimina il problema che i backup incrementali complicano le operazioni di ripristino.

RMAN si integra con le unità a nastro

RMAN può fare backup direttamente sulle unità a nastro. Precedentemente all’uscita di Oracle Secure Backup era necessario che il fornitore dell’unità a nastro fornisse delle librerie che implementavano delle API Oracle per permettere l’integrazione tra RMAN e l’unità a nastro. Ora Oracle Secure Backup realizza tale integrazione per molte unità a nastro. Io ho utililizzato una Oracle Secure Backup con una unità a nastro X che avevo a disposizione in laboratorio (prima che venisse fulminata da un incauto pseudo-sistemista) con successo.

Con questo credo di aver riassunto molto sinteticamente le principali caratteristiche di RMAN. Ribadisco che si tratta di uno strumento molto potente, completo e piuttosto complesso. Permette di fare cose semplici in modo semplice ma offre anche molte possibilità, per i dettaglio non posso fara altro che rimandare ai manuali:

- Basics

- Advanced

- Quick Start

ORA-01578: ORACLE data block corrupted

Giovedì 29 Maggio 2008 at 29:02 | In Backup and Recovery, Diario | 2 Comments
Tags: , , ,

Questo post è una continuazione del precedente. Nel mio ambiente di test su cui ho fatto le prove di recovery si è presentato un caso reale di corruzione non provocata artificialmente da me. Ecco l’output di DBVERIFY:

[oracle@testrman ~]$ dbv blocksize=8192
                 file=/opt/oracle/oradata/test102/users01.dbf

DBVERIFY: Release 10.2.0.4.0 - Production on Thu May 29 10:17:20 2008

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

DBVERIFY - Verification starting : FILE = /opt/oracle/oradata/test102/users01.dbf
Page 52147 is marked corrupt
Corrupt block relative dba: 0x0100cbb3 (file 4, block 52147)
Bad check value found during dbv:
Data in bad block:
 type: 6 format: 2 rdba: 0x0100cbb3
 last change scn: 0x0000.0023f56f seq: 0x1 flg: 0x04
 spare1: 0x0 spare2: 0x0 spare3: 0x0
 consistency value in tail: 0xf56f0601
 check value in block header: 0x4d0d
 computed block checksum: 0x8a2b

DBVERIFY - Verification complete

Total Pages Examined         : 119520
Total Pages Processed (Data) : 103631
Total Pages Failing   (Data) : 0
Total Pages Processed (Index): 1402
Total Pages Failing   (Index): 0
Total Pages Processed (Other): 6048
Total Pages Processed (Seg)  : 0
Total Pages Failing   (Seg)  : 0
Total Pages Empty            : 8438
Total Pages Marked Corrupt   : 1
Total Pages Influx           : 0
Highest block SCN            : 8762018 (0.8762018)

In quel blocco vi era una tabella; siccome si trattava di una tabella di test ho rifatto un test per verificare quanto descritto dalla nota metalink 336133.1, secondo cui dbverify finchè il blocco è inutilizzato continuerà a segnalarlo come corrotto. Come descritto nella nota ho provato allora a forzare la “riformattazione” del blocco, creando un oggetto e cominciando a riempirlo, ma quello che io ottengo è sempre:

SQL> begin
 for i in 1000000..2590154 loop
  insert into testformatter values (i,rpad(i,100,'P'),i,999,rpad(i,100,'H'),i,sysdate);
 end loop;
end;
/  2    3    4    5    6
begin
*
ERROR at line 1:
ORA-01578: ORACLE data block corrupted (file # 4, block # 52147)
ORA-01110: data file 4: '/opt/oracle/oradata/test102/users01.dbf'
ORA-06512: at line 3

Nel test su cui mi sono basato nel post precedente sono riuscito a sanare la situazione solo dopo vari tentativi. C’è ancora qualcosa che mi sfugge. Alla fine sono riuscito anche stavolta ad uscirne, prima di ridroppare la tabella ho fatto un test con RMAN:

[oracle@testrman ~]$ rman target /

Recovery Manager: Release 10.2.0.4.0 - Production on Thu May 29 11:47:47 2008

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

connected to target database: TEST102 (DBID=4155113496)

RMAN> backup datafile 4;

Starting backup at 29-MAY-08
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=156 devtype=DISK
channel ORA_DISK_1: starting full datafile backupset
channel ORA_DISK_1: specifying datafile(s) in backupset
input datafile fno=00004 name=/opt/oracle/oradata/test102/users01.dbf
channel ORA_DISK_1: starting piece 1 at 29-MAY-08
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03009: failure of backup command on ORA_DISK_1 channel at 05/29/2008 11:48:24
ORA-19566: exceeded limit of 0 corrupt blocks for file /opt/oracle/oradata/test102/users01.dbf

Poi ho droppato la tabella e ho riprovato a fare il backup:

RMAN>  backup datafile 4;

Starting backup at 29-MAY-08
using channel ORA_DISK_1
channel ORA_DISK_1: starting full datafile backupset
channel ORA_DISK_1: specifying datafile(s) in backupset
input datafile fno=00004 name=/opt/oracle/oradata/test102/users01.dbf
channel ORA_DISK_1: starting piece 1 at 29-MAY-08
channel ORA_DISK_1: finished piece 1 at 29-MAY-08
piece handle=/opt/oracle/flash_recovery_area/TEST102/backupset/2008_05_29/o1_mf_nnndf_TAG20080529T114900_43wz0dgw_.bkp tag=TAG20080529T114900 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:07
Finished backup at 29-MAY-08

Questa volta non mi ha dato problemi, questo distingue il mio caso da quello descritto dalla nota 336133.1. A questo punto la situazione si è normalizzata, infatti ho ricreato l’oggetto e l’ho ripopolato senza ricevere più errori, anche dbverify non riporta più problemi:

;

[oracle@testrman ~]$ dbv blocksize=8192 file=/opt/oracle/oradata/test102/users01.dbf

DBVERIFY: Release 10.2.0.4.0 - Production on Thu May 29 11:58:44 2008

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

DBVERIFY - Verification starting : FILE = /opt/oracle/oradata/test102/users01.dbf

DBVERIFY - Verification complete

Total Pages Examined         : 119520
Total Pages Processed (Data) : 103758
Total Pages Failing   (Data) : 0
Total Pages Processed (Index): 1284
Total Pages Failing   (Index): 0
Total Pages Processed (Other): 6040
Total Pages Processed (Seg)  : 0
Total Pages Failing   (Seg)  : 0
Total Pages Empty            : 8438
Total Pages Marked Corrupt   : 0
Total Pages Influx           : 0
Highest block SCN            : 8839195 (0.8839195)

Corruzione Blocchi in Oracle 10g

Mercoledì 28 Maggio 2008 at 28:51 | In Backup and Recovery, Installation and Configuration | 5 Comments

In questi giorni ho fatto un po’ di ricerca e test sui metodi di ricerca e correzione dei problemi di corruzione dei dati in Oracle. Per corruzione intendo corruzione fisica e logica, ma non applicativa, nel senso che non parliamo ad esempio di dati non consistenti dal punto di vista applicativo (ad esempio un tabella righe ordine con record che puntano a testate non esistenti).
Escluse quindi le corruzioni di tipo applicative rimangono a livello oracle le corruzioni fisiche, ovvero le corruzioni dovute a problemi hardware, e le corruzioni logiche che possono essere dovute a bachi o malfunzionamenti di Oracle, o del sistema operativo, ma anche a malfunzionamenti hardware.
Oracle a livello di sistema prevede due tipi di controllo, attivati tramite due parametri:

  • DB_BLOCK_CHECKSUM
  • DB_BLOCK_CHECKING

DB_BLOCK_CHECKSUM

In breve questo parametro attiva un controllo volto a individuare per tempo corruzioni di tipo fisiche. Il controllo consiste nel calcolare un “checksum” sul contenuto di un blocco e salvarlo sull’header del blocco stesso quando questo viene scritto su disco. Poi alla lettura del blocco tale checksum viene ricontrollato. Il parametro può assumere i valori OFF (nessuno controllo), TYPICAL (il checksum viene ricontrollato ad ogni lettura del blocco dal disco), FULL (il checksum viene ricontrollato anche ad ogni modifica dei dati nel blocco. Il default secondo la documentazione è TYPICAL, ma sui miei database trovo sempre TRUE che però sempre secondo la documentazione è equivalente e viene mantenuto per compatibilità. Analogamente il valore FALSE è equivalente a OFF.

DB_BLOCK_CHECKING

Questo parametro permette di attivare dei controlli sulla consistenza logica dei blocchi. Credo che indirettamente questi controlli possano rilevare anche problemi fisici come quelli che rilava il controllo attivato tramite DB_BLOCK_CHECKSUM. DB_BLOCK_CHECKING accetta quattro possibili valori, corrispondenti a quattro livelli di controllo:

  • OFF (per compatibilità viene accettato anche FALSE) nessun controllo, a parte per la tablespace SYSTEM per cui è sempre attivo il controllo semantico sui blocchi
  • LOW vengono fatti dei controlli base ad ogni modifica del contenuto di un blocco (ad esempio conseguenti ad operazioni di INSERT o UPDATE).
  • MEDIUM vengono fatti gli stessi controlli attivati con LOW più un controllo semantico sui blocchi (quello sempre attivo per la tablespace SYSTEM) per tutti i blocchi delle tabelle che non siano di tipo IOT.
  • FULL (per compatibilità viene accettato anche TRUE) vengono fatti tutti i controlli fatti con le impostazioni LOW e MEDIUM più il controllo semantico anche per i blocchi degli indici.

Per default questo parametro è settato a FALSE (OFF). L’attivazione di questo controllo secondo Oracle porta un sovraccarico che va dall’1% al 10%.

DBVERIFY

Oracle fornisce un’utility, chiamata dbverify, che è esterna al database e quindi può lavorare anche a database fermo, per controllare l’integrità dei datafile. La documentazione non è molto dettagliata sul tipo di controlli effettuati da questa utility ma da alcuni test fatti da me pare che faccia sia i controlli effettuati di checksum che contolli sull’integrità logica dei blocchi.
Ecco un esempio:

[oracle@testrman udump]$ dbv blocksize=8192 file=/opt/oracle/oradata/test102/use        rs01.dbf

DBVERIFY: Release 10.2.0.4.0 - Production on Tue May 27 12:06:07 2008

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

DBVERIFY - Verification starting : FILE = /opt/oracle/oradata/test102/users01.dbf
Block Checking: DBA = 16881510, Block Type = KTB-managed data block
data header at 0x2a96f11264
kdbchk: the amount of space used is not equal to block size
        used=7356 fsc=0 avsp=847 dtl=8088
Page 104294 failed with check code 6110

DBVERIFY - Verification complete

Total Pages Examined         : 119520
Total Pages Processed (Data) : 103078
Total Pages Failing   (Data) : 1
Total Pages Processed (Index): 1753
Total Pages Failing   (Index): 0
Total Pages Processed (Other): 6084
Total Pages Processed (Seg)  : 0
Total Pages Failing   (Seg)  : 0
Total Pages Empty            : 8605
Total Pages Marked Corrupt   : 0
Total Pages Influx           : 0
Highest block SCN            : 8598290 (0.8598290)

Io ho fatto dei test brutali usando, su una macchina linux, il comando dd per corrompere un blocco. Ho dovuto disattivare DB_BLOCK_CHECKSUM, altrimenti:

SQL> select d, e from testbr where aid=1000151;
select d, e from testbr where aid=1000151
                 *
ERROR at line 1:
ORA-01578: ORACLE data block corrupted (file # 4, block # 104294)
ORA-01110: data file 4: '/opt/oracle/oradata/test102/users01.dbf'

DBMS_REPAIR

Un’altro strumento che Oracle fornisce per la gestione di corruzioni logiche di blocchi è il package PL/SQL DMBS_REPAIR. Per conto mio ha un’utilità molto limitata, ma fa parte della preparazione per l’esame OCP. Questo package comprende una serie di procedure che servono ad analizzare Oggetti di database, similmente ha quanto fa il database con il settaggio del parametro DB_BLOCK_CHECKING e DBVERIFY, ma qui il controllo viene fatto per oggetto (tabelle, indici, …).

Tramite la procedura CHECK_OBJECT si controlla lo stato di integrità di un oggetto. Il risultato dell’analisi fatta dalla procedura viene messo in una tabella. Ad esempio, la stessa corruzione individuata trami dbverify nell’esempio precedente:

CORRUPT_DESCRIPTION
---------------------------------------------------------------------
Block Checking: DBA = 16881510, Block Type = KTB-managed data block
data header at 0x70fa4064
kdbchk: the amount of space used is not equal to block size
        used=7356 fsc=0 avsp=847 dtl=8088
mark block software corrupt

Corruzioni del tipo sopra, in questo caso creata artificialmente da me possono provocare comportamenti anomali del database, nel mio caso:

SQL>  select d, e from testbr where aid=1000150;
ERROR:
ORA-03113: end-of-file on communication channel

no rows selected

ERROR:
ORA-03114: not connected to ORACLE

Con la stampa di errori sull’alert. Il package DBMS_REPAIR fornisce una procedura FIX_CORRUPT_BLOCK che marca come corrotti i blocchi precedentemente indivuduati. Dopo aver lanciato questa procedura:

SQL> select d, e from testbr where aid=1000150;
select d, e from testbr where aid=1000150
                 *
ERROR at line 1:
ORA-01578: ORACLE data block corrupted (file # 4, block # 104294)
ORA-01110: data file 4: '/opt/oracle/oradata/test102/users01.dbf'

Per evitare di beccarsi questo errore si può indicare a Oracle di saltare il blocco corrotto con la procedura SKIP_CORRUPT_BLOCKS. Questo non permette di recuperare i dati che erano contenuti nel blocco corrotto, quelli rimangono persi. Con queste procedure però si può continuare a interrogare il resto della tabella. Per questo motivo non reputo questo package molto interessante
BLOCKRECOVER
Questa funzionalità di RMAN è una vera procedura di recupero da una corruzione di blocchi in Oracle. Credo che si tratti di una funzionalità disponibile solo con Enterprise Edition e permette di ripristinare un blocco corretto, lo fa utilizzando i backup di RMAN.

Nei test da me fatti ho riscontrato delle difficoltà, in quanto dopo aver utilizzato le procedure di DBMS_REPAIR non riuscivo a recuperare i blocchi tramite BLOCKRECOVER. Nell’output di RMAN compariva il messaggio:
some blocks not recovered: See trace file for details

La cosa che mi ha lasciato perplesso è che droppando l’oggetto coinvolto nella corruzione e ricreandolo durante gli insert mi ritrovavo con l’errore di blocco corrotto:

SQL> DROP TABLE TESTBR PURGE;
create table testbr (
 aid number,
 descriz  varchar2(100),
 b number,
 X NUMBER,
 c varchar2(100),

Table dropped.

SQL>   2    3    4    5    6    7   d number,
  8   e date
  9  );

Table created.

SQL> SQL> begin
  2   for i in 1000000..1000154 loop
  3    insert into testbr values (i,rpad(i,100,'P'),i,999,rpad(i,100,'H'),i,sysdate);
  4   end loop;
  5  end;
  6  /
begin
*
ERROR at line 1:
ORA-01578: ORACLE data block corrupted (file # 4, block # 104294)
ORA-01110: data file 4: '/opt/oracle/oradata/test102/users01.dbf'
ORA-06512: at line 3

Cosa che a rigore non dovrebbe succedere perchè Oracle dovrebbe riformattare l’oggetto.

ANALYZE TABLE … VALIDATE STRUCTURE

Un altro strumento per fare controlli sulla consistenza logica di una tabella è il comando ANALYZE TABLE … VALIDATE STRUCTURE che fa controlli analoghi a quelli della procedura DBMS_REPAIR.CHECK_OBJECT

Conclusioni

In questo post ho fatto una rassegna non esaustiva e non dettagliata dei metodi di analisi delle corruzioni su un database Oracle. La conclusione dei miei test rafforza quello in cui già credevo: FARE SEMBRE DEI BACKUP CON RMAN. Anche non disponendo della Enterprise Edition e quindi di BLOCKRECOVER e sempre possibile ripristinare un intero datafile senza perdere un solo record. Chiaramente BLOCKRECOVER è molto potente perchè permette di fare la riparazione molto più velocemente. In ogni caso la mancanza di un backup comporta perdita di dati, compreso l’uso del package DBMS_REPAIR.

Nelle mie politiche di backup vi è anche l’export che assieme ad RMAN fa ulteriori controlli di integrità dei dati, per cui eventuali problemi emergono subito al verificarsi.

Riferimenti:

- Da metalink, necessitano di account:

Pagina Successiva »

Blog su WordPress.com. | Theme: Pool by Borja Fernandez.
Entries and comments feeds.