Oracle RMAN – Creazione e configurazione di un recovery database

di Andrea Tassotti

Introduzione

Oracle DB

Un RMAN Recovery Catalog è uno schema di database che mantiene dei metadati dettaglianti le operazioni per il backup eseguite da RMAN su un database obiettivo. I metadati includono le seguenti informazioni riguardo il database gestito: struttura, configurazione RMAN, i backup dei datafile e degli archive log (backup sets, pieces e copie), i redo logs archiviati e le loro copie.

Creazione istanza separata

Per creare una nuova istanza che contenga il catalogo dei database da salvare mediante RMAN usiamo DBCA:

# export DISPLAY=... # dbca
  • Creare una istanza di nome preferibilmente assonante con il suo ruolo (es: RMANCAT, CATDB).
  • Creare da un modello generico.
  • Non serve configurare l’Enterprise Manager.
  • Configurare le password per utenti SYS e SYSTEM.
  • Selezionare un meccanismo di memorizzazione secondo vostra infrastruttura: File system è un meccanismo che può andare più che bene, dato che l’occupazione disco per questa istanza è abbastanza contenuta.
  • Quindi definire un percorso per i datafile per questa istanza.

Verificare i valori delle variabili definite per poi passare alla selezione delle opzioni di recupero per questo database.

Per una istanza per la gestione di un catalogo di recupero non è necessario attivare il log transazionale e l’area di recupero (flash_recovery_area), ma è bene comunque procedere ad un backup periodico dello schema di catalogo di recupero.

Evitare che vengano installati gli schemi di esempio.

Per la configurazione della memoria un 15% va bene, ma non si può scendere sotto questa soglia.

Per la configurazione del dimensionamento è necessario specificare almeno 50 processi e 60 sessioni.

Verificare i percorsi, in particolare per adump, bdump, cdump, udump e flash_recovery_area.

In particolare verificare nelle schermate successive i parametri di inizializzazione, in modo che percorsi e configurazioni siano aderenti ai requisiti. Qualora fosse necessario modificare il file di parametri (vedi configurazione file parametri).

A questo punto l’installazione ha inizio:

Attivazione istanza e configurazione listener

L’istanza non è configurata per attivazione assieme al sistema; occorre modificare il file /etc/oratab secondo:

RMANCAT:/opt/oracle/product/10.2.0/db_1:Y

Per quanto riguarda il listener (necessario in fase di produzione) occorre riconfigurare il file:

${ORACLE_HOME}/network/admin/listener.ora

ove nella sezione:

SID_LIST_LISTENER =

occorre aggiungere: (SID_DESC = (GLOBAL_DBNAME = $ORACLE_SID) (ORACLE_HOME = ${ORACLE_HOME}) (SID_NAME = $ORACLE_SID) ) ove le variabili sono solo esplicative (devono essere copiati esattamente i valori). Utilizzare dbshut/dbstartper attivare istanze e listener secondo nuova configurazione e verificare il funzionamento.

Configurazione file parametri

Di norma una istanza costruita con dbca non rilascia una versione testuale del file di parametri (detto pfile, tipicamente denominato: init$SID.ora), ma solo la versione binaria (spfile: spfile$SID.ora). Per modificare qualcuno di questi parametri è necessario fermare l’istanza, creare il pfile, modificarlo, generare l’spfile e riavviare l’istanza. Per costruire il pfile occorre accedere all’istanza come amministratore: export ORACLE_SID=RMANCAT sqlplus / as sysdba fermare l’istanza e creare il file SQL> shutdown immediate SQL> create pfile 'initRMANCAT.ora' from spfile; SQL> exit Modifichiamo come necessario con un editor di testo; creiamo nuovamente l’spfile e ripartiamo: SQL> create spfile from pfile 'initRMANCAT.ora'; SQL> startup SQL> exit Per verificare il valore dei parametri server possiamo usare il comando: SHOW PARAMETERS oppure SHOW PARAMETERS <nome parametro> I parametri importanti per questa configurazione sono:

  • audit_file_dest
  • background_dump_dest
  • core_dump_dest
  • db_recovery_file_dest
  • db_recovery_file_dest_size
  • user_dump_dest
  • processes
  • log_archive_start

Configurazione base dati

Ad uso del recovery catalog da installare nell’istanza occorre creare:

  • un tablespace per lo schema di recovery
  • un utente con necessari ruoli e privilegi

Possiamo connetterci come SYSDBA variando il SID export ORACLE_SID=RMANCAT sqlplus / as sysdba oppure via listener: sqlplus /nolog SQL> CONNECT SYS/oracle@RMANCAT AS SYSDBA; SQL> CREATE TABLESPACE rman DATAFILE '/oradata/rmandata/RMANCAT/rman01.dbf' size 100m; Creiamo l’utente dandogli il nuovo tablespace come tablespace di default: SQL> CREATE USER rmanuser IDENTIFIED BY rmanuser DEFAULT TABLESPACE rman QUOTA UNLIMITED ON rman; Forniamolo dei giusti privilegi: GRANT CONNECT, RESOURCE TO rmanuser; GRANT RECOVERY_CATALOG_OWNER TO rmanuser;

  • Il privilegio RECOVERY_CATALOG_OWNER fornisce all’utente tutti i privilegi richiesti per mantenere e interrogare il catalogo di recovery

Creazione recovery catalog e registrazione database

La creazione del recovery manager catalog avviene attraverso il comando rman:

rman target / catalog rmanuser/rmanuser@RMANCAT

RMAN> CREATE CATALOG;

Occorre procedere alla registrazione del database che si intende mantenere con il recovery catalog, pertanto occorre connetterci contemporanamente al database da gestire (attraverso ORACLE_SID) e il database di recovery (attraverso stringa di connessione):

export ORACLE_SID=produzione

rman target / catalog rmanuser/rmanuser@RMANCAT

RMAN> REGISTER DATABASE;

Verifichiamo la configurazione facendosi elencare i datafile registrati:

RMAN> REPORT SCHEMA;

Esecuzione backup e ripristino

Configurazione

Il Recovery Manager agisce solo se il database è configurato in “logging mode”; per verificare questa condizione di configurazione sarà sufficiente la seguente:

SELECT log_mode FROM V$DATABASE;

Per modificare questa condizione di configurazione occorre porre il database in stato “montato esclusivo” e non aperto per le operazioni:

SHUTDOWN IMMEDIATE; -- se avviato

STARTUP MOUNT;

-- secondo necessità applicare una delle due:

-- ALTER DATABASE archivelog;

-- ALTER DATABASE noarchivelog;

ALTER DATABASE OPEN;

Esecuzione backup

L’esecuzione di un backup è operazione che può essere eseguita “a caldo”, ossia con il database in uso all’utenza; il compito è assegnato ancora una volta al comando rman.

Sarà sufficiente lanciare lo script per avere un backup full, oppure passare un argomento per determinare un backup incrementale (differenziale o cumulativo).

La configurazione però è più complessa tanto da necessitare la costruzione di uno script di supporto:

#!/bin/sh

ORACLE_HOME=/opt/oracle/product/10.2.0/db_1

export ORACLE_HOME

ORACLE_SID=...

export ORACLE_SID

ORACLE_USER=oracle

BACKUPDIR=/oradata/backup

target='target /' # default to "connect internal"

rcvcat='catalog rmanuser/rmanuser@RMANCAT' # default to nocatalog mode

cmdfile=/tmp/rman.rcv

msglog=/var/log/oracle/rman.out

RMAN_LOG_FILE=/var/log/oracle/rman.log

COMPRESS="as compressed backupset"

data=`date '+%Y-%m-%d_%H_%M'`

program=$(basename $0)

lockfile="/tmp/${program}.lock"

trap "rm -f $lockfile" 1 2 15 EXIT

# create lockfile

[ -f $lockfile ] && echo 'Locked' >&2 && exit 1

CUSER=`id |cut -d"(" -f2 | cut -d ")" -f1`

# Initiate the command string

if [ "$CUSER" != "oracle" ] ; then

echo Esegui come utente oracle

exit 1

fi

echo ==== started on `date` ==== >> $RMAN_LOG_FILE

echo >> $RMAN_LOG_FILE

echo "RMAN: $RMAN" >> $RMAN_LOG_FILE

echo "ORACLE_SID: $ORACLE_SID" >> $RMAN_LOG_FILE

echo "ORACLE_USER: $ORACLE_USER" >> $RMAN_LOG_FILE

echo "ORACLE_HOME: $ORACLE_HOME" >> $RMAN_LOG_FILE

case $1 in

differential|incremental)

echo "Differential incremental backup requested" >> $RMAN_LOG_FILE

BACKUP_TYPE="INCREMENTAL LEVEL=1"

;;

cumulative)

echo "Cumulative incremental backup requested" >> $RMAN_LOG_FILE

BACKUP_TYPE="INCREMENTAL LEVEL=1 CUMULATIVE"

;;

*)

echo "Default - Full backup requested" >> $RMAN_LOG_FILE

BACKUP_TYPE="INCREMENTAL LEVEL=0"

esac

cat > $cmdfile << EOF

RUN {

ALLOCATE CHANNEL ch00 TYPE disk;

ALLOCATE CHANNEL ch01 TYPE disk;

BACKUP $COMPRESS

$BACKUP_TYPE

SKIP INACCESSIBLE

TAG hot_db_bk_level0

FILESPERSET 5

FORMAT '$BACKUPDIR/data_%d-%I_%D-%M-%Y_%u'

DATABASE;

SQL 'alter system archive log current';

RELEASE CHANNEL ch00;

RELEASE CHANNEL ch01;

# backup all archive logs

ALLOCATE CHANNEL ch00 TYPE disk;

ALLOCATE CHANNEL ch01 TYPE disk;

BACKUP

filesperset 20

FORMAT '$BACKUPDIR/arch_%d-%I_%D-%M-%Y_%u'

ARCHIVELOG ALL DELETE INPUT;

RELEASE CHANNEL ch00;

RELEASE CHANNEL ch01;

# backup control file

ALLOCATE CHANNEL ch00 TYPE disk;

BACKUP

FORMAT '$BACKUPDIR/control_%d-%I_%U'

CURRENT CONTROLFILE;

RELEASE CHANNEL ch00;

}

EOF

$ORACLE_HOME/bin/rman $target $rcvcat cmdfile $cmdfile msglog $msglog >/dev/null 2>&1

RSTAT=$?

if [ $? -eq 0 ] ; then

LOGMSG="ended successfully"

else

LOGMSG="ended in error"

fi

echo ==== $LOGMSG on `date` ==== >> $RMAN_LOG_FILE

exit $RSTAT

Esecuzione ripristino

Sebbene il ripristino sia più semplice, la configurazione esige in ogni caso una semplificazione attraverso uno script ad hoc.

#!/bin/sh

ORACLE_HOME=/opt/oracle/product/10.2.0/db_1

export ORACLE_HOME

ORACLE_SID=...

export ORACLE_SID

ORACLE_USER=oracle

BACKUPDIR=/oradata/backup

target='target /' # default to "connect internal"

rcvcat='catalog rmanuser/rmanuser@RMANCAT' # default to nocatalog mode

cmdfile=/tmp/rman.rcv

msglog=/var/log/oracle/rman.out

RMAN_LOG_FILE=/var/log/oracle/rman.log

data=`date '+%Y-%m-%d_%H_%M'`

program=$(basename $0)

lockfile="/tmp/${program}.lock"

trap "rm -f $lockfile" 1 2 15 EXIT

# create lockfile

[ -f $lockfile ] && echo 'Locked' >&2 && exit 1

CUSER=`id |cut -d"(" -f2 | cut -d ")" -f1`

# Initiate the command string

if [ "$CUSER" != "oracle" ]

then

echo Esegui come utente oracle

exit 1

fi

echo Script $0 >> $RMAN_LOG_FILE

echo ==== started on `date` ==== >> $RMAN_LOG_FILE

echo >> $RMAN_LOG_FILE

echo "RMAN: $RMAN" >> $RMAN_LOG_FILE

echo "ORACLE_SID: $ORACLE_SID" >> $RMAN_LOG_FILE

echo "ORACLE_USER: $ORACLE_USER" >> $RMAN_LOG_FILE

echo "ORACLE_HOME: $ORACLE_HOME" >> $RMAN_LOG_FILE

echo $ORACLE_SID

echo $rcvcat

echo

echo Attendere shutdown e montaggio istanza:

echo 'shutdown immediate' | sqlplus -S / as sysdba >/dev/null 2>&1

echo

echo -n 'Attendere verifiche su SCN ... '

(

$ORACLE_HOME/bin/rman $target $rcvcat << EOF

startup nomount;

LIST BACKUP;

EOF

) | awk '/List of Archived Logs in backup set/{ getline; getline; getline; print $5 }' | tail -1 >/tmp/scn.number

REALSCN=$(cat /tmp/scn.number)

rm -f /tmp/scn.number

if [ $# -eq 0 ]

then

SCN=$REALSCN

echo Ultima SCN registrata: $SCN

exit 0

else

SCN=$1

fi

echo "User defined: $SCN (System defined: $REALSCN)"

EXISTS=

for file in $( echo -e "SET FEEDBACK OFF\nSET HEAD OFF\n select distinct FNAME from dfatt;" | sqlplus -S rmanuser/rmanuser@RMANCAT | grep dbf )

do

if [ -f $file ]; then

echo "ERRORE: Esiste il file $file!"

EXISTS=true

fi

done

[ "x$EXISTS" = "xtrue" ] && exit 1

cat > $cmdfile << EOF

run {

ALLOCATE CHANNEL ch00 TYPE disk;

ALLOCATE CHANNEL ch01 TYPE disk;

restore controlfile;

}

run {

ALLOCATE CHANNEL ch00 TYPE disk;

ALLOCATE CHANNEL ch01 TYPE disk;

set until scn $SCN;

restore database;

}

sql 'alter database mount';

run {

ALLOCATE CHANNEL ch00 TYPE disk;

ALLOCATE CHANNEL ch01 TYPE disk;

set until scn $SCN;

recover database;

}

sql 'alter database open resetlogs';

EOF

$ORACLE_HOME/bin/rman $target $rcvcat cmdfile $cmdfile msglog $msglog >/dev/null 2>&1

RSTAT=$?

if [ "$RSTAT" = "0" ]

then

LOGMSG="ended successfully"

else

LOGMSG="ended in error"

fi

echo >> $RMAN_LOG_FILE

echo Script $0 >> $RMAN_LOG_FILE

echo ==== $LOGMSG on `date` ==== >> $RMAN_LOG_FILE

echo >> $RMAN_LOG_FILE

exit $RSTAT

Esportazione catalogo

E’ necessario eseguire una copia del catalogo per aumentare la sicurezza dello strumento (il recovery manager) che ci consentirà di ripristinare la base dati di produzione.

Per far questo è sufficiente una esportazione del catalogo:

export ORACLE_HOME=...

export ORACLE_SID=RMANCAT

# export NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1

exp system/oracle file=RMANCAT.dmp log=RMANCAT.log owner=rmanuser buffer=1024000 feedback=10000 consistent=y

Porre con una certa frequenza questa operazione non è sufficiente: occorre conservare il suo stato dopo la certezza di una sua modifica; pertanto è preferibile legarlo ad attività di backup (full, incrementale o backup degli archive log).

 

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *