RMAN – ściąga

Jeżeli robimy bckp bez trybu arch, to niestety odpalamy bazę w mouncie i dopiero wtedy FULL + INCrementale

Jeżeli mamy w trybie arch, to na spokojnie możemy robić full + inc + arch w trybie open ale! jeżeli mamy tabele, indexy nologging to dupa – lepiej na czas migracji (o ile chcemy 1:1 bez utraty danych) włączyć force logging-a: ALTER DATABASE force logging; – weryfikacja select name, force_logging from v$database; i dopiero teraz full, inc teoretycznie powinien dociągnąć od ostatniego scn-a, ale komu chce się bawić i sprawdzać pliki które są w nologgingu i od jakiego scn-a są, no ale w razie czego to weryfikujemy:

SELECT file#, name, unrecoverable_change# FROM v$datafile where unrecoverable_change# > 0;

jeżeli nie zweryfikujemy to niestety możemy zostać zbluzgani przy pierwszym lepszym select (który odnośi się akurat do nolooginngowej tabeli albo indexu), oczywiście jeżeli został zmodyfikowany po full-u i nawet kolejnych incrementalach (będzie komunikat o tym, że należy zrobić recovery pliku, ale nie ma na bckp)

— bckp full

$ORACLE_HOME/bin/rman target /
connect catalog rman/x@rcat;
run
{
ALLOCATE CHANNEL ch1 DEVICE TYPE DISK MAXPIECESIZE 1000G;
ALLOCATE CHANNEL ch2 DEVICE TYPE DISK MAXPIECESIZE 1000G;
BACKUP INCREMENTAL LEVEL 0 DATABASE FORMAT '/backuprman/rman_DB/%d_0_%U’;
RELEASE CHANNEL ch1;
RELEASE CHANNEL ch2;
ALLOCATE CHANNEL ch1 DEVICE TYPE DISK;
BACKUP FORMAT '/backuprman/rman_DB/%d_c_%U’ CURRENT CONTROLFILE;
RELEASE CHANNEL ch1;
}
EOF

— bckp inc

$ORACLE_HOME/bin/rman target / << EOF
connect catalog rman/x@rcat;
run
{
ALLOCATE CHANNEL ch1 DEVICE TYPE DISK MAXPIECESIZE 1000G;
ALLOCATE CHANNEL ch2 DEVICE TYPE DISK MAXPIECESIZE 1000G;
BACKUP INCREMENTAL LEVEL 1 DATABASE FORMAT '/backuprman/rman_DB/%d_1_%Y%M%D_%s_%t’; #filesperset 100
RELEASE CHANNEL ch1;
RELEASE CHANNEL ch2;
ALLOCATE CHANNEL ch1 DEVICE TYPE DISK;
BACKUP FORMAT '/backuprman/rman_DB/%d_c_%Y%M%D_%s_%u’ CURRENT CONTROLFILE;
RELEASE CHANNEL ch1;
}
EOF

— bckp arch

$ORACLE_HOME/bin/rman target / << EOF
connect catalog rman/x@rcat;
run
{
ALLOCATE CHANNEL ch1 DEVICE TYPE DISK MAXPIECESIZE 1000G;
ALLOCATE CHANNEL ch2 DEVICE TYPE DISK MAXPIECESIZE 1000G;
BACKUP ARCHIVELOG ALL format '/backuprman/rman_DB/%d_a_%U’ SKIP INACCESSIBLE;
#DELETE NOPROMPT ARCHIVELOG ALL BACKED UP 1 TIMES TO DISK;
RELEASE CHANNEL ch1;
RELEASE CHANNEL ch2;
ALLOCATE CHANNEL ch1 DEVICE TYPE DISK;
BACKUP FORMAT '/backuprman/rman_DB/%d_c_%U’ CURRENT CONTROLFILE;
RELEASE CHANNEL ch1;
}
EOF

— restor (klasycznie przygotowanie init-a, restor controlfile-a, db)

— init

— start z pfile

export ORACLE_SID=DB1
sqlplus / as sysdba << EOF
startup nomount pfile=’/u01/app/oracle/product/12xx/dbhome_1/dbs/initDB1.ora’
quit
EOF

— restor controlfile (list backup of controlfile)

rman target / << EOF
connect catalog rman/x@rcat;
set dbid 123456;
run {
restore controlfile to '+dbdata’ from tag TAG2000….;
}
EOF

sqlplus / as sysdba << EOF
shutdown immediate
quit
EOF

— zmiana w init na controlfile-a, który został odtworzony z bckp

vi /u01/app/oracle/product/12xx/dbhome_1/dbs/initDB1.ora
+dbdata/DB/controlfile/current.xxx

— odpalamy DB w mouncie i lecimy z restorem

sqlplus / as sysdba << EOF
startup nomount pfile=’/u01/app/oracle/product/12.xx/dbhome_1/dbs/initDB1.ora’
alter database mount;
quit
EOF

— przy samym restorze możemy się pobawić np. jeżeli chcemy odtworzyć do innej lokalizacji to używamy dodatkowo set newname, switch datafile i warto pocisnąć również tempy:

time rman target / << EOF
connect catalog rman/x@rcat;
run {
ALLOCATE CHANNEL ch1 DEVICE TYPE DISK;
ALLOCATE CHANNEL ch2 DEVICE TYPE DISK;
set newname for database to '+DBDATA’;
restore database from tag TAG202xxx;
switch datafile all;
switch tempfile all;
recover database;
RELEASE CHANNEL ch1;
RELEASE CHANNEL ch2;
}
EOF

— można dorzucić też zamiast restor db from tag np. restor do punktu w czasie:

set until time „to_date(’2022-05-16 06:00:00′,’YYYY-MM-DD HH24:MI:SS’)”;

— a jak chcemy konkretnie do scn-a to:

recover database until SCN xxx;

— klasycznie bez udziwnień

time rman target / << EOF
connect catalog rman/x@rcat;
run {
ALLOCATE CHANNEL ch1 DEVICE TYPE DISK;
ALLOCATE CHANNEL ch2 DEVICE TYPE DISK;
restore database;
recover database;
RELEASE CHANNEL ch1;
RELEASE CHANNEL ch2;
}
EOF







— gdy chcemy się pobawić w ręcznego DG i dociągamy DB na innej maszynie z różnymi zasobami bckp to:

  • bckp full
  • restor
  • na źródle ponownie inc + arch
  • kopiujemy pliki (rsync nieźle się sprawdza)
  • przesuwamy DB i tak można śmiało w nieskończoność – jak wywali, że musisz restorować dbfile-a 1 czy tam któregoś, to olać, położyć DB, odpalić i lecisz dalej)

rsync -avh –progress /backuprman/* [email protected]:/backuprman –delete
time rman target / << EOF
connect catalog rman/x@rcat;
run {
ALLOCATE CHANNEL ch1 DEVICE TYPE DISK;
ALLOCATE CHANNEL ch2 DEVICE TYPE DISK;
set until time „to_date(’2022-05-01 13:00:00′,’YYYY-MM-DD HH24:MI:SS’)”;
recover database;
DELETE noprompt ARCHIVELOG all;
RELEASE CHANNEL ch1;
RELEASE CHANNEL ch2;
}
EOF

— jak już skończyliśmy zabawę z dociąganiem to dorzucamy DB do clustra (wcześniej badamy czy bazka elegancko wstaje itp.)

alter database open resetlogs;

— jak będą błędy z onlinelogami, to czyścimy:

alter database clear logfile group x; # grupa będzie w alercie podana (czasem nie wystarczy wyczyścić jednej)

— kładziemy, odpalamy ponownie z pfile, montujemy, otwieramy, dociągamy patche i kładziemy:

shutdown immediate;
startup nomount pfile=’/u01/app/oracle/product/12.xx/dbhome_1/dbs/initDB1.ora’
alter database mount;
alter database open;
./datapatch -verbose

— w inicie robimy konfig pod DB clustrową (nazwa instancji1,2,3. parametr itp.) +

*.cluster_database=true

— startujemy DB i robimy spfile-a z pfile-a na ASM-ie (albo na dysku) – kładziemy

create spfile=’+DBDATA’ from pfile=’/u01/app/oracle/product/12.xx/dbhome_1/dbs/initDB1.ora’;
shutdown immediate;

— dorzucamy do clustra

srvctl add database -d DB-o /u01/app/oracle/product/12.xx/dbhome_1
srvctl add instance -d DB-i DB1-n NOD1
srvctl add instance -d DB-i DB2-n NOD2

— jak sie nie chcemy bawić w edycje parametrow CRS-a to dorzucamy po prostu inity na 2ch nodach tak aby kierowały na spfile na ASM:

vi /u01/app/oracle/product/12.xx/dbhome_1/dbs/initDB1.ora
vi /u01/app/oracle/product/12.xx/dbhome_1/dbs/initDB2.ora

spfile=’+dbdata/DB/PARAMETERFILE/spfile.xxxx’

— odpalamy – sprawdzamy czy instancje śmigają:

srvctl start database -d DB
srvctl stop database -d DB

— można dorzucić jeszcze pw file-a
orapwd file=$ORACLE_HOME/dbs/orapw$ORACLE_SID password=xxx