Πώς επαναφέρουμε datafiles ενώ βρίσκεται σε λειτουργία η Oracle Database
- Πώς ενεργοποιούμε το Unified Auditing σε Oracle Database - 7 Οκτώβριος 2024
- Τι είναι η PostgreSQL και πως κάνουμε μία πλήρης εγκατάσταση - 2 Σεπτέμβριος 2024
- Πώς ρυθμίζουμε το replication του GoldenGate ώστε να διαβάζει από το Standby του Oracle Data Guard - 2 Αύγουστος 2024
Σε αυτό το άρθρο θα δούμε πως σε 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;
Εναλλακτικά μπορούμε ταυτόχρονα με την βάση δεδομένων, να πέρνουμε 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';
Φτιάχνουμε έναν πίνακα κάτω από έναν χρήστη που θα ανήκει σε αυτό το 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, κάνουμε restart την βάση δεδομένων:
shutdown immediate; startup;
Εναλλακτικά κάνουμε checkpoint την βάση δεδομένων:
alter system checkpoint;
Τώρα αφού έχουμε κάνει όλα τα παραπάνω, πάμε στην τοποθεσία που βρίσκεται ένα από τα datafiles του tablespace που περιέχει τον πίνακα και το σβήνουμε:
Αν πάμε να διαβάσουμε πάλι τον πίνακα θα παρούμε το παρακάτω μήνυμα:
select * from stratos.users;
Πώς διορθώνουμε το πρόβλημα
Για αρχή γυρνάμε το tablespace σε offline:
sqlplus / as sysdba
alter tablespace corrupt_ts offline immediate; exit;
Συνδεόμαστε στον RMAN:
rman target /
Και κάνουμε restore τον αριθμό του datafile που εμφάνισε πρόβλημα:
restore datafile 5;
Στη συνέχεια κάνουμε recover το datafile ώστε να γίνουν apply τα logs και να φτάσουμε το datafile στην πιο πρόσφατη χρονική στιγμή πριν το σβήσουμε:
recovery datafile 5; exit;
Όταν ολοκληρωθεί η διαδικασία, γυρνάμε το tablespace σε online:
sqlplus / as sysdba
alter tablespace corrupt_ts online;
Πλέον αν κάνουμε select τον πίνακα θα ξαναδούμε τις εγγραφές του πίνακα χωρίς πρόβλημα:
select * from stratos.users;
Πώς επαναφέρουμε όλα τα 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;
Στη συνέχεια κάνουμε recover τα datafiles του tablespace ώστε να γίνουν apply τα logs και να φτάσουμε το datafile στην πιο πρόσφατη χρονική στιγμή πριν το σβήσουμε:
recover tablespace corrupt_ts; exit;
Ξαναγυρνάμε το tablespace σε online ώστε να ολοκληρωθεί η διαδικασία και να είναι προσβάσιμο το tablespace:
sqlplus / as sysdba
alter tablespace corrupt_ts online;