Πώς επαναφέρουμε έναν πίνακα σε συγκεκριμένο χρονικό σημείο σε Oracle Database με RMAN

Πώς επαναφέρουμε έναν πίνακα σε συγκεκριμένο χρονικό σημείο σε Oracle Database με RMAN
Πώς επαναφέρουμε έναν πίνακα σε συγκεκριμένο χρονικό σημείο σε Oracle Database με RMAN

Σε αυτό το άρθρο θα δούμε πως σε Oracle Database μπορούμε να επαναφέρουμε έναν πίνακα σε συγκεκριμένη χρονική στιγμή. Τα δεδομένα για να πραγματοποιηθεί η διαδικασία προέρχονται από RMAN backups και κατά την διαδικασία γίνονται προσωρινά restore αυτόματα σε έναν κλώνο της βάσης δεδομένων (auxiliary database).

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

Θα πρέπει η βάση δεδομένων να βρίσκεται σε 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;
Πώς επαναφέρουμε έναν πίνακα σε συγκεκριμένο χρονικό σημείο σε Oracle Database με RMAN
01

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

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

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;

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;
Πώς επαναφέρουμε έναν πίνακα σε συγκεκριμένο χρονικό σημείο σε Oracle Database με RMAN
02

Πώς επαναφέρουμε τον πίνακα σε μία συγκεκριμένη χρονική στιγμή

Ας πούμε πως κάποιος έχει τρέξει ένα query και έχει κάνει update όλες τις εγραφές του πίνακα με μία λάθος τιμή:

update stratos.users set username='Oups!!';
commit;

Πώς επαναφέρουμε τον πίνακα με ένα άλλο όνομα

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

rman target /

Και κάνουμε recover τον πίνακα σε συγκεκριμένη χρονική στιγμή:

  • Ως auxiliary destination ορίζουμε τον χώρο που θα δημιουργηθεί προσωρινά ένας κλώνος της βάσης δεδομένων έως ότου ολοκληρωθεί η διαδικασία.
  • Με την εντολή remap table ορίζουμε να φέρει τον πίνακα με ένα άλλο όνομα.

RECOVER TABLE stratos.users
  UNTIL TIME "TO_DATE('08-02-2022 14:23', 'DD-MM-YYYY HH24:MI')"
  AUXILIARY DESTINATION '/oracle/app/oracle/oradata/AUX/'
  REMAP TABLE stratos.users:stratos.users2;
Πώς επαναφέρουμε έναν πίνακα σε συγκεκριμένο χρονικό σημείο σε Oracle Database με RMAN
03

Με το που ολοκληρωθεί η διαδικασία θα δούμε ότι έχει επανέλθει ο πίνακας με το καινούργιο όνομα:

select * from stratos.users2;
Πώς επαναφέρουμε έναν πίνακα σε συγκεκριμένο χρονικό σημείο σε Oracle Database με RMAN
04

Πώς επαναφέρουμε τον πίνακα με το ίδιο όνομα

Μπορούμε να αντικαταστήσουμε απευθείας τον πίνακα αφού πρώτα σβήσουμε τον παλιό:

sqlplus / as sysdba
drop table stratos.users;
rman target /

Και κάνουμε recover τον πίνακα σε συγκεκριμένη χρονική στιγμή:

  • Ως auxiliary destination ορίζουμε τον χώρο που θα δημιουργηθεί προσωρινά ένας κλώνος της βάσης δεδομένων έως ότου ολοκληρωθεί η διαδικασία.
RECOVER TABLE stratos.users
  UNTIL TIME "TO_DATE('08-02-2022 16:00', 'DD-MM-YYYY HH24:MI')"
  AUXILIARY DESTINATION '/oracle/app/oracle/oradata/AUX/';
Πώς επαναφέρουμε έναν πίνακα σε συγκεκριμένο χρονικό σημείο σε Oracle Database με RMAN
05
select * from stratos.users;
Πώς επαναφέρουμε έναν πίνακα σε συγκεκριμένο χρονικό σημείο σε Oracle Database με RMAN
06

Πώς εξάγουμε τον πίνακα συγκεκριμένης χρονικής στιγμής σε Export Dump File

Μπορούμε να κάνουμε recover τον πίνακα σε συγκεκριμένη χρονική στιγμή, όχι στην βάση δεδομένων αλλά σε ένα export dump file:

  • Ως auxiliary destination ορίζουμε τον χώρο που θα δημιουργηθεί προσωρινά ένας κλώνος της βάσης δεδομένων έως ότου ολοκληρωθεί η διαδικασία.
  • Ως datapump destination ορίζουμε την τοποθεσία που θα γίνει export το dump file.
  • Ως dump file ορίζουμε το όνομα του export dump file.
  • Με το notableimport ορίζουμε μόνο να εψαχθεί ο πίνακας σε export dump file και να μην εισαχθεί.
RECOVER TABLE stratos.users
  UNTIL TIME "TO_DATE('08-02-2022 15:40', 'DD-MM-YYYY HH24:MI')"
  AUXILIARY DESTINATION '/oracle/app/oracle/oradata/AUX/'
  DATAPUMP DESTINATION '/home/oracle/Documents'
  DUMP FILE 'users.dmp'
  NOTABLEIMPORT;
Πώς επαναφέρουμε έναν πίνακα σε συγκεκριμένο χρονικό σημείο σε Oracle Database με RMAN
07

Πώς επαναφέρουμε ολόκληρο το tablespace σε συγκεκριμένη χρονική στιγμή

Μπορούμε να κάνουμε recover ολόκληρο το tablespace σε συγκεκριμένη χρονική στιγμή:

  • Ως auxiliary destination ορίζουμε τον χώρο που θα δημιουργηθεί προσωρινά ένας κλώνος της βάσης δεδομένων έως ότου ολοκληρωθεί η διαδικασία.
RECOVER TABLESPACE corrupt_ts
  UNTIL TIME "TO_DATE('08-02-2022 14:23', 'DD-MM-YYYY HH24:MI')"
  AUXILIARY DESTINATION '/oracle/app/oracle/oradata/AUX/';
Πώς επαναφέρουμε έναν πίνακα σε συγκεκριμένο χρονικό σημείο σε Oracle Database με RMAN
08

Πηγές:

Μοιράσου το

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