Để thực hành về Flashback trong Oracle Database, chúng ta có thể thực hiện các bước sau để trải nghiệm từng tính năng của Flashback, bao gồm Flashback Query, Flashback Table, Flashback Drop, Flashback Transaction, và Flashback Database.
Thực hành Flashback trong Oracle database
Cấu hình cần thiết:
Đảm bảo chúng ta đã bật ARCHIVELOG mode và Flashback Logging ON:
Kiểm tra chế độ ARCHIVELOG
ARCHIVE LOG LIST;
Nếu chưa ở chế độ ARCHIVELOG, thực hiện các bước sau để kích hoạt:
Shutdown cơ sở dữ liệu
SHUTDOWN IMMEDIATE;
Khởi động cơ sở dữ liệu ở chế độ mount
STARTUP MOUNT;
Thay đổi chế độ thành ARCHIVELOG
ALTER DATABASE ARCHIVELOG;
Tương tự vậy thực hiện cho Flashback: database phải ở chế độ mount
ALTER DATABASE FLASHBACK ON;
Mở cơ sở dữ liệu:
ALTER DATABASE OPEN;
Kiểm tra chế độ Archivelog và Flashback:
select flashback_on from v$database; ARCHIVE LOG LIST;
Tạo user mới:
CREATE USER duong_user IDENTIFIED BY oracle; Alter user duong_user quota 50m on users; GRANT CONNECT, RESOURCE TO duong_user;
Gán quyền Flashback cho user:
GRANT FLASHBACK ANY TABLE TO duong_user;
Login vào CSDL bằng user duong_user:
CONNECT duong_user/oracle;
1. Flashback Query
Flashback Query cho phép chúng ta truy vấn dữ liệu của một bảng tại một thời điểm trong quá khứ.
Tạo bảng mẫu:
CREATE TABLE employees (id NUMBER, name VARCHAR2(50), salary NUMBER); INSERT INTO employees VALUES (1, 'John Doe', 5000); INSERT INTO employees VALUES (2, 'Jane Smith', 6000); COMMIT;
Chỉnh sửa dữ liệu và kiểm tra flashback:
Kiểm tra thông tin trước khi update
SELECT * FROM employees;
Chốt mốc thời gian timestamp:
SELECT TO_CHAR(SYSTIMESTAMP, 'DD-MON-YYYY HH24:MI:SS.FF TZR') FROM dual;
10-SEP-2024 16:41:42.628392 +07:00
Cập nhật bảng:
UPDATE employees SET salary = 7000 WHERE id = 1; COMMIT;
Truy vấn bảng ở trạng thái trước khi cập nhật:
SELECT * FROM employees AS OF TIMESTAMP TO_TIMESTAMP_TZ('10-SEP-2024 16:41:42.628392 +07:00', 'DD-MON-YYYY HH24:MI:SS.FF TZR');
2. Flashback Table
Flashback Table cho phép khôi phục bảng về trạng thái trước đó.
Cập nhật bảng và thực hiện flashback:
Cập nhật dữ liệu:
UPDATE employees SET salary = 8000 WHERE id = 2; COMMIT;
Khôi phục bảng về thời điểm trước cập nhật:
Chúng ta phải sử dụng user khác user SYS để thực hiện Flashback. Người dùng SYS là tài khoản hệ thống có quyền quản trị cao nhất và Oracle không cho phép thực hiện Flashback trên các đối tượng thuộc sở hữu của SYS vì lý do bảo mật và tính nhất quán của hệ thống.
Thực hiện bật Row movement trước khi Flashback:
ALTER TABLE employees ENABLE ROW MOVEMENT;
Thực hiện Flashback:
FLASHBACK TABLE employees TO TIMESTAMP TO_TIMESTAMP_TZ('10-SEP-2024 16:41:42.628392 +07:00', 'DD-MON-YYYY HH24:MI:SS.FF TZR');
Dữ liệu bảng đã trở về trạng thái ban đầu khi mới update.
3. Flashback Drop
Nếu chúng ta vô tình xóa một bảng, chúng ta có thể khôi phục nó từ thùng rác (Recycle Bin).
Xóa và khôi phục bảng:
DROP TABLE employees; SELECT * FROM employees;
ERROR at line 1:
ORA-00942: table or view does not exist
Kiểm tra bảng trong thùng rác:
SELECT object_name, original_name FROM recyclebin;
Sau khi drop table thì dữ liệu bảng chưa bị xoá ngay lập tức mà còn lưu lại trong thùng rác
Khôi phục bảng:
FLASHBACK TABLE employees TO BEFORE DROP;
4. Flashback Transaction Query
Flashback Transaction cho phép chúng ta xem lại và tra cứu các giao dịch đã xảy ra trên cơ sở dữ liệu. (thực hiện bằng user SYS)
SELECT * FROM flashback_transaction_query WHERE table_name = 'EMPLOYEES';
5. Flashback Database
Flashback Database giúp khôi phục toàn bộ cơ sở dữ liệu về một thời điểm trong quá khứ. Tuy nhiên, để thực hành tính năng này, cần phải có cấu hình Flashback Log và quyền DBA.
Chúng ta thực hiện insert thêm data vào bảng sau đó thực hiện flashback rồi kiểm tra kết quả:
INSERT INTO employees VALUES (3, 'duong', 3333333); INSERT INTO employees VALUES (4, 'nana', 4444444); COMMIT;
select * from employees;
SHUTDOWN IMMEDIATE; STARTUP MOUNT; FLASHBACK DATABASE TO TIMESTAMP TO_TIMESTAMP_TZ('10-SEP-2024 16:41:42.628392 +07:00', 'DD-MON-YYYY HH24:MI:SS.FF TZR'); ALTER DATABASE OPEN RESETLOGS;
Login vào user duong_user sau đó kiểm tra thông tin thì dữ liệu đã trở về lúc thời gian chỉ định bên trên:
conn duong_user/oracle; select * from employees;
Chúc các bạn thành công!