Πώς επαναφέρουμε έναν πίνακα σε συγκεκριμένο χρονικό σημείο σε Oracle Database με RMAN
- Πώς συλλέγουμε to actual execution plan από τα queries με χρήση Extended Event και πως διαβάζουμε τα δεδομένα του - 2 Δεκέμβριος 2024
- Πώς βρίσκουμε τι δικαιώματα έχει ένας χρήστης σε βάση δεδομένων της Oracle - 1 Νοέμβριος 2024
- Πώς ενεργοποιούμε το Unified Auditing σε Oracle Database - 7 Οκτώβριος 2024
Σε αυτό το άρθρο θα δούμε πως σε 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;
Το παράδειγμα
Για το παράδειγμα έχουμε φτιάξει ένα 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;
Πώς επαναφέρουμε τον πίνακα σε μία συγκεκριμένη χρονική στιγμή
Ας πούμε πως κάποιος έχει τρέξει ένα 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;
Με το που ολοκληρωθεί η διαδικασία θα δούμε ότι έχει επανέλθει ο πίνακας με το καινούργιο όνομα:
select * from stratos.users2;
Πώς επαναφέρουμε τον πίνακα με το ίδιο όνομα
Μπορούμε να αντικαταστήσουμε απευθείας τον πίνακα αφού πρώτα σβήσουμε τον παλιό:
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/';
select * from stratos.users;
Πώς εξάγουμε τον πίνακα συγκεκριμένης χρονικής στιγμής σε 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;
Πώς επαναφέρουμε ολόκληρο το 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/';