di Andrea Tassotti
Introduzione
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
eSYSTEM
. - 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
/dbstart
per 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).