Giới thiệu Flashback Data Archive
Flashback Data Archive cung cấp khả năng tự động theo dõi và lưu trữ các thay đổi dữ liệu giao dịch đối với các đối tượng database được chỉ định.
Mô tả
Một Flashback Data Archive bao gồm nhiều tablespaces và lưu trữ dữ liệu lịch sử từ tất cả các giao dịch đối với các bảng được theo dõi. Dữ liệu được lưu trữ trên các bảng lịch sử nội bộ (internal history tables). Nó cung cấp lưu trữ dài hạn cho dữ liệu undo, cho phép các hoạt động flashback dựa trên undo được thực hiện trong một khoảng thời gian mở rộng. Để duy trì sự bảo vệ nghiêm ngặt trên bảng lịch sử nội bộ và duy trì dữ liệu lịch sử cho khoảng thời gian ngắn và dài, Flashback Data Archive là một tùy chọn giúp truy hồi mà không cần khôi phục bản sao lưu lịch sử.
Đặc quyền cần thiết để thực thi
- Schema có đặc quyền hệ thống FLASHBACK ARCHIVE ADMINISTER có thể thực thi các thủ tục PL/SQL disassociate (ngắt liên kết) và reassociate (liên kết lại).
- Khi một bảng bị ngắt liên kết (disassociated), người dùng bình thường có thể thực hiện các câu lệnh DDL và DML nếu họ có đặc quyền cần thiết trên các bảng.
- Đặc quyền hệ thống FLASHBACK ARCHIVE ADMINISTER là bắt buộc để tạo flashback data archive.
- Phải có đặc quyền hệ thống CREATE TABLESPACE để tạo flashback data archive.
- Đảm bảo bạn có quota đủ trên tablespace nơi thông tin lịch sử sẽ nằm.
Thông tin ngữ cảnh (context information) được lưu trữ cùng với dữ liệu giao dịch, bạn cần sử dụng thủ tục DBMS_FLASHBACK_ARCHIVE.SET_CONTEXT_LEVEL, truyền một trong các giá trị tham số sau:
- TYPICAL: Chỉ lưu trữ các thuộc tính kiểm toán cơ bản từ ngữ cảnh USERENV.
- ALL: Tất cả ngữ cảnh có sẵn cho người dùng qua hàm SYS_CONTEXT được lưu trữ.
- NONE: Không lưu trữ thông tin ngữ cảnh.
Trong trường hợp này sử dụng ALL, để nắm bắt giá trị USERENV và custom context.
CONN sys@surya AS SYSDBA
EXEC DBMS_FLASHBACK_ARCHIVE.set_context_level('ALL');
Kiểm tra và Triển khai
Trong ví dụ sau, tôi đang bật FDA ở cấp tablespace, và thiết lập retention (thời gian giữ) cho khoảng thời gian cụ thể cho nhiều tablespaces. Cũng truy xuất dữ liệu từ flashback data archive đã bị xóa trong khoảng thời gian retention. Mục đích là lấy dữ liệu lịch sử dễ dàng với FAD. Nếu không bật tính năng này, chúng ta phải khôi phục toàn bộ database để lấy dữ liệu lịch sử. Điều gì thêm phức tạp trong trường hợp hệ thống database lớn.
Ví dụ:
• Lệnh tạo tablespace
SQL> CREATE TABLESPACE FBA DATAFILE size 500m autoextend on next 100m;
Tablespace created.
• Chạy lệnh sau để tạo default flashback data archive (FDA)
SQL> CREATE FLASHBACK ARCHIVE DEFAULT FLA1 TABLESPACE FBA QUOTA 500M RETENTION 1 YEAR;
Flashback archive created.
• Hoàn thành bước sau để tạo Non-Default FDA
SQL> CREATE FLASHBACK ARCHIVE FLA2 TABLESPACE users QUOTA 400M RETENTION 6 MONTH;
Flashback archive created.
• Lấy danh sách FDA đã tạo
SELECT owner_name, flashback_archive_name,
flashback_archive#, retention_in_days, TO_CHAR(create_time, 'DD-MON-YYYY HH24:MI:SS') AS create_time,
TO_CHAR(last_purge_time, 'DD-MON-YYYY HH24:MI:SS') AS last_purge_time, status
FROM dba_flashback_archive
ORDER BY owner_name, flashback_archive_name;
Kết quả:
| OWNER_NAME | FLASHBACK_ARCHIVE_NAME | FLASHBACK_ARCHIVE# | RETENTION_IN_DAYS | CREATE_TIME | LAST_PURGE_TIME | STATUS |
|---|---|---|---|---|---|---|
| SYS | FLA1 | 1 | 365 | 16-DEC-2021 19:28:53 | 16-DEC-2021 19:28:53 | DEFAULT |
| SYS | FLA2 | 2 | 180 | 16-DEC-2021 19:29:14 | 16-DEC-2021 19:29:14 |
• Thiết lập Default FDA và lấy chi tiết
SQL> ALTER FLASHBACK ARCHIVE FLA1 SET DEFAULT;
Flashback archive altered.
SELECT flashback_archive_name, flashback_archive#, tablespace_name, quota_in_mb
FROM dba_flashback_archive_ts ORDER BY flashback_archive_name;
Kết quả:
| FLASHBACK_ARCHIVE_NAME | FLASHBACK_ARCHIVE# | TABLESPACE_NAME | QUOTA_IN_MB |
|---|---|---|---|
| FLA1 | 1 | FBA | 500 |
| FLA2 | 2 | USERS | 400 |
SQL> SELECT * FROM DBA_FLASHBACK_ARCHIVE_TABLEs WHERE TABLE_NAME='EMPLOYEES' AND OWNER_NAME='HR';
TABLE_NAME OWNER_NAME FLASHBACK_ARCHIVE_NAME ARCHIVE_TABLE_NAME STATUS
EMPLOYEES HR FLA1 SYS_FBA_HIST_92593 ENABLED
Thực hiện test sau để xem cách nó hoạt động
SQL> ALTER SESSION SET NLS_DATE_FORMAT='YYYY/MM/DD HH24:MI:SS';
Session altered.
SQL> SELECT SYSDATE FROM DUAL;
SYSDATE
2021/12/16 19:39:31
SQL> SELECT DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER FROM DUAL;
GET_SYSTEM_CHANGE_NUMBER
1964623
Thử xóa bản ghi và cập nhật trên bảng employees.
SQL> DELETE FROM HR.EMPLOYEES WHERE EMPLOYEE_ID=192;
1 row deleted.
SQL> commit;
Commit complete.
SQL> UPDATE HR.EMPLOYEES SET SALARY=12000 WHERE EMPLOYEE_ID=168; COMMIT;
SQL> UPDATE HR.EMPLOYEES SET SALARY=12500 WHERE EMPLOYEE_ID=168; COMMIT;
SQL> UPDATE HR.EMPLOYEES SET SALARY=12550 WHERE EMPLOYEE_ID=168; COMMIT;
1 row updated. (lặp lại 3 lần)
- Làm theo các bước so sánh dữ liệu bằng FDA
SQL> SELECT EMPLOYEE_ID, FIRST_NAME, LAST_NAME
FROM HR.EMPLOYEES
AS OF TIMESTAMP TO_TIMESTAMP('2021/12/16 19:39:31','YYYY/MM/DD HH24:MI:SS')
MINUS
SELECT EMPLOYEE_ID, FIRST_NAME, LAST_NAME
FROM HR.EMPLOYEES;
EMPLOYEE_ID FIRST_NAME LAST_NAME
192 Sarah Bell
Ở đây bạn có thể thấy hàng bị xóa từ FDA. Bạn cũng có thể lấy dữ liệu với pseudocolumns VERSION_STARTSCN.
• Dữ liệu với SCN cho trước
SQL> COL VERSIONS_STARTTIME FORMAT A40
SELECT VERSIONS_STARTTIME, VERSIONS_STARTSCN, FIRST_NAME, LAST_NAME, SALARY
FROM HR.EMPLOYEES VERSIONS BETWEEN TIMESTAMP
TO_TIMESTAMP('2021/12/16 19:39:31','YYYY/MM/DD HH24:MI:SS') AND SYSTIMESTAMP
WHERE EMPLOYEE_ID=168;
VERSIONS_STARTTIME VERSIONS_STARTSCN FIRST_NAME LAST_NAME SALARY
16-DEC-21 07.40.08.000000000 PM 1964648 Lisa Ozer 12500
16-DEC-21 07.40.08.000000000 PM 1964646 Lisa Ozer 12000
Lisa Ozer 11500
16-DEC-21 07.40.08.000000000 PM 1964650 Lisa Ozer 12550
Bạn có thể thấy hàng với các phiên bản khác nhau cho cùng dữ liệu trong cột salary khi chúng ta đã chạy câu lệnh update trên cột salary với chênh lệch 500 giá trị.
Hạn chế và Giải pháp thay thế cho câu lệnh DDL (nắm bắt sự tiến hóa của bản ghi)
Disassociate / Associate (Ngắt liên kết / Liên kết lại)
Đối với DDL phức tạp hơn – nâng cấp, chia bảng, v.v. – các thủ tục PL/SQL Disassociate và Associate có thể được dùng để tạm thời vô hiệu hóa Flashback Data Archive trên các bảng được chỉ định. Thủ tục Associate thực thi tính toàn vẹn schema sau liên kết: schema bảng cơ sở và schema bảng lịch sử phải giống nhau. Các thủ tục Disassociate và Associate yêu cầu đặc quyền FLASHBACK ARCHIVE ADMINISTER.
- Thêm, Xóa, Đổi tên hoặc Sửa đổi cột
- Xóa hoặc truncate một partition
- Đổi tên hoặc truncate một bảng (bảng có FBA Delete thất bại với lỗi ORA-55610)
- Một số thay đổi (ví dụ: MOVE / SPLIT / CHANGE PARTITIONS) yêu cầu gói DBMS_FLASHBACK_ARCHIVE để thực hiện.
Ví dụ: Thực hiện hoạt động DDL trên bảng FDA cho dữ liệu lịch sử. Tạo bảng demo EMPLOYEES_FBA thêm ràng buộc.
SQL> CREATE TABLE HR.EMPLOYEES_FBA AS SELECT * FROM HR.EMPLOYEES;
Table created.
SQL> ALTER TABLE HR.EMPLOYEES_FBA ADD CONSTRAINT employee_pk PRIMARY KEY (employee_id);
Table altered.
Bật FDA trên bảng demo và cập nhật một số bản ghi.
SQL> ALTER TABLE HR.EMPLOYEES_FBA FLASHBACK ARCHIVE;
Table altered.
SQL> UPDATE HR.EMPLOYEES_FBA SET SALARY=10000 WHERE EMPLOYEE_ID=203;
1 row updated.
COMMIT;
Commit complete.
Khi vô hiệu hóa và kích hoạt lại ràng buộc bảng, lỗi ORA-55610 ngăn chặn bảng theo dõi lịch sử.
SQL> ALTER TABLE HR.EMPLOYEES_FBA DISABLE CONSTRAINT EMPLOYEE_PK;
Table altered.
SQL> ALTER TABLE HR.EMPLOYEES_FBA ENABLE CONSTRAINT EMPLOYEE_PK;
ALTER TABLE HR.EMPLOYEES_FBA ENABLE CONSTRAINT EMPLOYEE_PK
* ERROR at line 1: ORA-55610: Invalid DDL statement on history-tracked table
Làm thế nào để tiến hành khi gặp hạn chế này?
Lưu ý: Việc thêm bất kỳ ràng buộc nào trên bảng (Primary Key, Unique Key, Foreign Key hoặc Check Constraint) sẽ khiến bạn không thể tự động đọc dữ liệu lịch sử, trừ khi truy cập trực tiếp các bảng archive SYS_FBA_ bên dưới. *Bạn cần rất cẩn trọng với quản lý ràng buộc và theo dõi lịch sử của bảng.*
SQL> SELECT * FROM DBA_FLASHBACK_ARCHIVE_TABLES WHERE TABLE_NAME='EMPLOYEES_FBA';
TABLE_NAME OWNER_NAME FLASHBACK_ARCHIVE_NAME ARCHIVE_TABLE_NAME STATUS
EMPLOYEES_FBA HR FLA1 SYS_FBA_HIST_93946 ENABLED
Với sự giúp đỡ của DBMS_FLASHBACK_ARCHIVE.DISASSOCIATE_FBA chúng ta có thể đạt được điều này.
SQL> EXEC DBMS_FLASHBACK_ARCHIVE.DISASSOCIATE_FBA('HR','EMPLOYEES_FBA');
PL/SQL procedure successfully completed.
Bây giờ thử kích hoạt lại ràng buộc.
SQL> ALTER TABLE HR.EMPLOYEES_FBA ENABLE CONSTRAINT EMPLOYEE_PK;
Table altered.
Bây giờ kích hoạt lại hạn chế với sự giúp đỡ của DBMS_FLASHBACK_ARCHIVE.REASSOCIATE_FBA
SQL> EXEC DBMS_FLASHBACK_ARCHIVE.REASSOCIATE_FBA('HR','EMPLOYEES_FBA');
PL/SQL procedure successfully completed.
Xóa (Purging) dữ liệu lịch sử cho một thời gian cụ thể.
SQL> ALTER FLASHBACK ARCHIVE FLA1 PURGE BEFORE TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' DAY);
Flashback archive altered.
Vô hiệu hóa FDA
SQL> ALTER TABLE HR.EMPLOYEES NO FLASHBACK ARCHIVE;
SQL> ALTER TABLE HR.EMPLOYEES_FBA NO FLASHBACK ARCHIVE;
Xóa FDA
SQL> DROP FLASHBACK ARCHIVE FLA1;
Kết luận
Tính năng Flashback Data Archive cung cấp giao diện tập trung và tích hợp để quản lý và giữ dữ liệu lịch sử, và quản lý tự động dựa trên chính sách cung cấp giải pháp kịch tính cho quản trị database nơi việc theo dõi dữ liệu lịch sử này để tuân thủ quy định mới hoặc thích ứng với nhu cầu kinh doanh thay đổi.
Hãy để các chuyên gia của chúng tôi hướng dẫn bạn trong hành trình database.
Sử dụng tab Feedback để đưa ra nhận xét hoặc đặt câu hỏi. Bạn cũng có thể bắt đầu cuộc trò chuyện với chúng tôi.