Πώς επαναφέρουμε datafiles ενώ βρίσκεται σε λειτουργία η Oracle Database

Πώς επαναφέρουμε datafiles ενώ βρίσκεται σε λειτουργία η Oracle Database
Πώς επαναφέρουμε datafiles ενώ βρίσκεται σε λειτουργία η Oracle Database

Σε αυτό το άρθρο θα δούμε πως σε Oracle Database μπορούμε να επαναφέρουμε ένα datafile που έχει σβηστεί ή έχει γίνει corrupt ενώ η βάση δεδομένων παραμένει “ανοιχτή” και συνεχίζει την λειτουργία της. Τα δεδομένα για να πραγματοποιηθεί η διαδικασία προέρχονται από τα RMAN backups.

Τα προαπαιτούμενα

Θα πρέπει η βάση δεδομένων να βρίσκεται σε Archive Log Mode, αν δεν βρίσκεται συνδεόμαστε από τερματικό με τον χρήστη oracle(με τον οποίο έχει γίνει η εγκατάσταση της Oracle Database):

sqlplus / as sysdba

Για να γίνει η αλλαγή θα χρειαστεί να γίνει επανεκκίνηση η βάση δεδομένων τρέχοντας τα παρακάτω:

shutdown immediate;

alter database archivelog mode;

startup;

Επίσης θα πρέπει να πέρνουμε application aware RMAN database backups και να κρατάμε τα Archive Logs.

Συνδεόμαστε στο RMAN:

rman target /

Για να πάρουμε το backup της βάσης δεδομένων τρέχουμε το παρακάτω:

backup database;
Πώς επαναφέρουμε datafiles ενώ βρίσκεται σε λειτουργία η Oracle Database
01

Εναλλακτικά μπορούμε ταυτόχρονα με την βάση δεδομένων, να πέρνουμε backup και τα archive logs το οποίο όμως δεν απαιτείται για το παράδειγμα:

backup database plus archivelog;

Το παράδειγμα

Για το παράδειγμα έχουμε φτιάξει ένα tablespace που αποτελείται από δύο datafiles:

CREATE TABLESPACE corrupt_ts 
   DATAFILE '/oracle/app/oracle/oradata/ORACLEDB/datafile/corrupt_ts_data1.dbf'size 10m autoextend on next 64m maxsize 32767m,
   '/oracle/app/oracle/oradata/ORACLEDB/datafile/corrupt_ts_data2.dbf'size 10m autoextend on next 64m maxsize 32767m;

Μπορούμε να δούμε από ποια datafiles αποτελείται το tablespace και τι file_id έχει με το παρακάτω query:

SELECT 
   tablespace_name, 
   file_id,
   file_name, 
   bytes / 1024/ 1024  MB,
   online_status
FROM
   dba_data_files
WHERE TABLESPACE_NAME='CORRUPT_TS';
Πώς επαναφέρουμε datafiles ενώ βρίσκεται σε λειτουργία η Oracle Database
02

Φτιάχνουμε έναν πίνακα κάτω από έναν χρήστη που θα ανήκει σε αυτό το tablespace, αφόυ πρώτα όμως δώσουμε στον χρήστη δικαιώμα να γράφει στο tablespace:

ALTER USER stratos quota unlimited on CORRUPT_TS;

CREATE TABLE stratos.users(
   id INT GENERATED ALWAYS AS IDENTITY, 
   username VARCHAR2(50)
) TABLESPACE corrupt_ts;


insert into stratos.users (username) values ('Stratos');
insert into stratos.users (username) values ('Giorgos');
insert into stratos.users (username) values ('Nikos');
insert into stratos.users (username) values ('Vasilis');
commit;

Ελέγχουμε να δούμε ότι ο πίνακας περιέχει τις εγγραφές:

select * from stratos.users;
Πώς επαναφέρουμε datafiles ενώ βρίσκεται σε λειτουργία η Oracle Database
03

Για να είμαστε σίγουροι για το παράδειγμα ότι η πληροφορία του πίνακα έχει γραφτεί στα datafiles, κάνουμε restart την βάση δεδομένων:

shutdown immediate;
startup;

Εναλλακτικά κάνουμε checkpoint την βάση δεδομένων:

alter system checkpoint;

Τώρα αφού έχουμε κάνει όλα τα παραπάνω, πάμε στην τοποθεσία που βρίσκεται ένα από τα datafiles του tablespace που περιέχει τον πίνακα και το σβήνουμε:

Πώς επαναφέρουμε datafiles ενώ βρίσκεται σε λειτουργία η Oracle Database
04

Αν πάμε να διαβάσουμε πάλι τον πίνακα θα παρούμε το παρακάτω μήνυμα:

select * from stratos.users;
Πώς επαναφέρουμε datafiles ενώ βρίσκεται σε λειτουργία η Oracle Database
05

Πώς διορθώνουμε το πρόβλημα

Για αρχή γυρνάμε το tablespace σε offline:

sqlplus / as sysdba
alter tablespace corrupt_ts offline immediate;
exit;

Συνδεόμαστε στον RMAN:

rman target /

Και κάνουμε restore τον αριθμό του datafile που εμφάνισε πρόβλημα:

restore datafile 5;
Πώς επαναφέρουμε datafiles ενώ βρίσκεται σε λειτουργία η Oracle Database
06

Στη συνέχεια κάνουμε recover το datafile ώστε να γίνουν apply τα logs και να φτάσουμε το datafile στην πιο πρόσφατη χρονική στιγμή πριν το σβήσουμε:

recovery datafile 5;

exit;
Πώς επαναφέρουμε datafiles ενώ βρίσκεται σε λειτουργία η Oracle Database
07

Όταν ολοκληρωθεί η διαδικασία, γυρνάμε το tablespace σε online:

sqlplus / as sysdba
alter tablespace corrupt_ts online;

Πλέον αν κάνουμε select τον πίνακα θα ξαναδούμε τις εγγραφές του πίνακα χωρίς πρόβλημα:

select * from stratos.users;
Πώς επαναφέρουμε datafiles ενώ βρίσκεται σε λειτουργία η Oracle Database
08

Πώς επαναφέρουμε όλα τα datafiles που αποτελούν το tablespace

Γυρνάμε όπως πριν το tablespace σε offline και συνδεόμαστε στο RMAN:

sqlplus / as sysdba
alter tablespace corrupt_ts offline immediate;
exit;
rman target /

Με το που συνδεθούμε στον RMAN κάνουμε restore όλα τα datafiles που αποτελούν το tablespace με την παρακάτω εντολή:

restore tablespace corrupt_ts;
Πώς επαναφέρουμε datafiles ενώ βρίσκεται σε λειτουργία η Oracle Database
09

Στη συνέχεια κάνουμε recover τα datafiles του tablespace ώστε να γίνουν apply τα logs και να φτάσουμε το datafile στην πιο πρόσφατη χρονική στιγμή πριν το σβήσουμε:

recover tablespace corrupt_ts;
exit;
Πώς επαναφέρουμε datafiles ενώ βρίσκεται σε λειτουργία η Oracle Database
10

Ξαναγυρνάμε το tablespace σε online ώστε να ολοκληρωθεί η διαδικασία και να είναι προσβάσιμο το tablespace:

sqlplus / as sysdba
alter tablespace corrupt_ts online;

Πηγές:

Μοιράσου το

Αφήστε μία απάντηση