Kho lưu trữ dữ liệu hồi tưởng 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 cho các đối tượng cơ sở dữ liệu được chỉ định.
Mô tả
Một kho lưu trữ dữ liệu hồi tưởng bao gồm nhiều không gian bảng và lưu trữ dữ liệu lịch sử từ tất cả các giao dịch dựa trên 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ộ. Nó cung cấp khả năng lưu trữ lâu dài đối với dữ liệu hoàn tác, cho phép thực hiện các hoạt động hồi tưởng dựa trên hoàn tác trong một thời gian dài. và trong thời gian dài, Lưu trữ dữ liệu Flash là một tùy chọn giúp nhớ lại mà không cần khôi phục bản sao lưu lịch sử.
Các đặc quyền bắt buộc để thực thi
- Lược đồ với đặc quyền hệ thống FLASHBACK ARCHIVE ADMINISTER có thể thực thi việc tách và liên kết lại các thủ tục PL / SQL.
- Sau khi một bảng được tách ra, 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ác đặc quyền cần thiết trên bảng.
- FLASHBACK ARCHIVE ADMINISTER yêu cầu đặc quyền hệ thống tạo một kho lưu trữ dữ liệu hồi tưởng.
- Một người phải có đặc quyền hệ thống CREATE TABLESPACE để tạo kho lưu trữ dữ liệu hồi tưởng
- Đảm bảo bạn có đủ hạn ngạch trên vùng bảng chứa thông tin lịch sử.
Thông tin ngữ cảnh đượ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, chuyển một trong các giá trị tham số sau.
- TIÊU BIỂU:Chỉ các thuộc tính kiểm tra cơ bản từ ngữ cảnh USERENV mới được lưu trữ.
- TẤT CẢ:Tất cả các ngữ cảnh có sẵn cho người dùng thông qua chức năng SYS_CONTEXT đều được lưu trữ.
- KHÔNG CÓ:Không có thông tin ngữ cảnh nào được lưu trữ.
Trong trường hợp này, hãy sử dụng TẤT CẢ, để nắm bắt USERENV và các giá trị ngữ cảnh tùy chỉnh.
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 kích hoạt FDA ở cấp không gian bảng và đặt lưu giữ trong khoảng thời gian cụ thể cho nhiều không gian bảng. Đồng thời truy xuất dữ liệu từ kho lưu trữ dữ liệu hồi tưởng đã bị xóa giữa khoảng thời gian lưu giữ. Mục đích là để lấy dữ liệu lịch sử một cách dễ dàng với FAD. Nếu không bật tính năng này, chúng tôi phải khôi phục toàn bộ cơ sở dữ liệu để lấy dữ liệu lịch sử. Điều gì đó làm tăng thêm sự phức tạp là trường hợp của một hệ thống cơ sở dữ liệu lớn.
Ví dụ:
• Lệnh tạo vùng bảng
SQL> CREATE TABLESPACE FBA DATAFILE size 500m autoextend on next 100m ;
Đã tạo vùng bảng.
• Chạy lệnh sau để tạo kho lưu trữ dữ liệu hồi tưởng mặc định (FDA)
SQL> CREATE FLASHBACK ARCHIVE DEFAULT FLA1 TABLESPACE FBA QUOTA 500M RETENTION 1 YEAR;
Đã tạo lưu trữ hồi tưởng.
• Hoàn thành bước sau để tạo FDA không mặc định
SQL> CREATE FLASHBACK ARCHIVE FLA2 TABLESPACE users QUOTA 400M RETENTION 6 MONTH;
Đã tạo lưu trữ hồi tưởng.
• Lấy danh sách các FDA đã tạo
CHỌN 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
ĐẶT HÀNG THEO tên_chính_hàng, flashback_archive_name;
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 DEFAULTSYS FLA2 180 16-DEC-2021 19:29:14 16-DEC-2021 19:29:14
• Đặt FDA Mặc định và nhận thông tin chi tiết
SQL> ALTER FLASHBACK ARCHIVE FLA1 SET DEFAULT ;
Đã thay đổi kho lưu trữ hồi tưởng.
SELECT flashback_archive_name,
flashback_archive#,
tablespace_name,
quota_in_mb
TỪ dba_flashback_archive_ts
ĐẶT HÀNG THEO flashback_archive_name;
FLASHBACK_ARCHIVE_NAME FLASHBACK_ARCHIVE # TABLESPACE_NAME QUOTA_IN_MB
FLA1 1 FBA 500
FLA2 2 NGƯỜI DÙNG 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 TÌNH TRẠNG
NHÂN VIÊN HR FLA1 SYS_FBA_HIST_92593 ĐÃ ĐƯỢC BỔ SUNG
Thực hiện kiểm tra sau và để xem nó hoạt động như thế nào
SQL> ALTER SESSION SET NLS_DATE_FORMAT =‘YYYY / MM / DD HH24:MI:SS’;
Đã thay đổi phiên.
SQL> SQL> CHỌN TỔNG HỢP TỪ DUA;
SYSDATE
2021/12/16 19:39:31
SQL> CHỌN DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER FROM DUAL;
GET_SYSTEM_CHANGE_NUMBER
1964623
Hãy để chúng tôi cố gắng xóa bản ghi và cập nhật trên bảng nhân viên.
SQL> DELETE FROM HR.EMPLOYEES WHERE EMPLOYEE_ID=192;
Đã xóa 1 hàng.
SQL> cam kết;
Cam kết hoàn tất.
SQL> SQL> SQL> SQL> UPDATE HR.EMPLOYEES SET SALARY=12000 WHERE EMPLOYEE_ID=168;
CAM KẾT;
UPDATE HR.EMPLOYEES SET SALARY=12500 WHERE EMPLOYEE_ID=168;
CAM KẾT;
UPDATE HR.EMPLOYEES SET SALARY=12550 WHERE EMPLOYEE_ID=168;
COMMIT; Đã cập nhật 1 hàng.
SQL> SQL> Hoàn tất cam kết.
SQL> SQL> 1 hàng được cập nhật.
SQL> SQL> Hoàn tất cam kết.
SQL> SQL> 1 hàng được cập nhật.
SQL> SQL>
Cam kết hoàn tất.
- 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
Tại đây bạn có thể thấy hàng đã bị xóa khỏi FDA. Bạn cũng có thể lấy dữ liệu bằng VERSION_STARTSCN giả cặp.
• Dữ liệu với SCN đã cho
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 1250016-DEC-21 07.40.08.000000000 PM 1964646 Lisa Ozer 12000Lisa Ozer 1150016-DEC-21 07.40.08.000000000 PM 1964650 Lisa Ozer 12550
Bạn có thể thấy hàng có phiên bản khác cho cùng một dữ liệu trong cột lương như chúng tôi đã thực hiện cập nhật bảng sao kê trên cột lương với giá trị chênh lệch 500.
Hạn chế và Giải pháp cho câu lệnh DDL (nắm bắt diễn biến của một bản ghi)
Disassociate / Associate
Đối với các DDL phức tạp hơn - nâng cấp, chia bảng, v.v. - có thể sử dụng thủ tục Disassociate và Associate PL / SQL để tạm thời vô hiệu hóa Lưu trữ dữ liệu Flashback trên các bảng được chỉ định. Thủ tục liên kết thực thi tính toàn vẹn của lược đồ sau khi liên kết:lược đồ bảng cơ sở và bảng lịch sử phải giống nhau. Thủ tục Disassociate và Associate yêu cầu đặc quyền QUẢN TRỊ VIÊN LƯU TRỮ SẮP XẾP.
o Thêm, Xóa, Đổi tên hoặc Chỉnh sửa một cộtXóa hoặc cắt bớt một phân vùng
o Đổi tên hoặc cắt bớt bảng (bảng có FBA Delete không thành công với lỗi ORA- 55610)
o Một số thay đổi (ví dụ:MOVE / SPLIT / CHANGE PARTITIONS) các phương thức yêu cầu gói DBMS_FLASHBACK_ARCHIVE thực hiện.
Trong ví dụ sau, bạn có thể thấy cách chúng tôi có thể thực hiện hoạt động DDL trên các bảng của FDA để có dữ liệu lịch sử. Tạo bảng demo EMPLOYEES_FBA thêm các ràng buộc.
SQL> CREATE TABLE HR.EMPLOYEES_FBA AS SELECT * FROM HR.EMPLOYEES;
Đã tạo bảng.
SQL> ALTER TABLE HR.EMPLOYEES_FBA ADD CONSTRAINT employee_pk PRIMARY KEY (employee_id);
Bảng đã thay đổi.
Bật FDA trên các bảng demo và cập nhật một số bản ghi.
SQL> ALTER TABLE HR.EMPLOYEES_FBA FLASHBACK ARCHIVE;
Bảng đã thay đổi.
SQL> UPDATE HR.EMPLOYEES_FBA SET SALARY=10000 WHERE EMPLOYEE_ID=203;
Đã cập nhật 1 hàng.
COMMIT;
Cam kết hoàn tất.
Khi tắt và bật các ràng buộc bảng, Lời nhắc ORA-55610 ngăn bảng dữ liệu theo dõi lịch sử
SQL> ALTER TABLE HR.EMPLOYEES_FBA DISABLE CONSTRAINT EMPLOYEE_PK;
Bảng đã thay đổi.
SQL> SQL> ALTER TABLE HR.EMPLOYEES_FBA ENABLE CONSTRAINT EMPLOYEE_PK;
ALTER TABLE HR.EMPLOYEES_FBA ENABLE CONSTRAINT EMPLOYEE_PK
* LỖI ở dòng 1:ORA-55610:Câu lệnh DDL không hợp lệ trên bảng theo dõi lịch sử
Bây giờ làm cách nào để tiếp tục khi chúng tôi nhận được những hạn chế này
* Lưu ý:Việc bổ sung bất kỳ ràng buộc nào trên bảng (Khóa chính, Khóa duy nhất, Khóa ngoại hoặc Ràng buộc kiểm tra) sẽ khiến bạn không thể tự động đọc dữ liệu lịch sử mà không cần truy cập trực tiếp vào các bảng lưu trữ SYS_FBA_ được gạch dưới. ** Bạn cần rất cẩn thận với quản lý ràng buộc và theo dõi lịch sử của các bảng *
SQL> SELECT * FROM DBA_FLASHBACK_ARCHIVE_TABLES WHERE TABLE_NAME='EMPLOYEES_FBA';
TABLE_NAME OWNER_NAME FLASHBACK_ARCHIVE_NAME ARCHIVE_TABLE_NAME TÌNH TRẠNG
EMPLOYEES_FBA HR FLA1 SYS_FBA_HIST_93946 ĐÃ BẬT
Với sự trợ giúp của DBMS_FLASHBACK_ARCHIVE.DISASSOCIATE_FBA, chúng tôi có thể đạt được điều này.
SQL> EXEC DBMS_FLASHBACK_ARCHIVE.DISASSOCIATE_FBA('HR','EMPLOYEES_FBA');
Thủ tục PL / SQL đã hoàn tất thành công.
Bây giờ, hãy thử bật lại các ràng buộc
một lần nữa
SQL> ALTER TABLE HR.EMPLOYEES_FBA ENABLE CONSTRAINT EMPLOYEE_PK;
Bảng đã thay đổi.
Bây giờ bật lại giới hạn với sự trợ giúp của DBMS_FLASHBACK_ARCHIVE.REASSOCIATE_FBA
SQL> EXEC DBMS_FLASHBACK_ARCHIVE.REASSOCIATE_FBA('HR','EMPLOYEES_FBA');
Thủ tục PL / SQL đã hoàn tất thành công.
Xóa dữ liệu lịch sử trong một thời gian cụ thể. SQL> ALTER FLASHBACK ARCHIVE FLA1 PURGE BEFORE TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' DAY);
Đã thay đổi kho lưu trữ hồi tưởng.
Tắt FDA
SQL> ALTER TABLE HR.EMPLOYEES NO FLASHBACK ARCHIVE;
SQL> ALTER TABLE HR.EMPLOYEES_FBA NO FLASHBACK ARCHIVE;
Bỏ FDA
SQL> DROP FLASHBACK ARCHIVE FLA1;
Kết luận
Tính năng Lưu trữ dữ liệu Flashback cung cấp một giao diện tập trung và tích hợp để quản lý và lưu giữ lịch sử dữ liệu cũng như quản lý dựa trên chính sách, tự động, cung cấp giải pháp ấn tượng để quản trị cơ sở dữ liệu trong đó việc theo dõi dữ liệu lịch sử này để tuân thủ các 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 cơ sở dữ liệu của bạn.
Sử dụng tab Phản hồi để đưa ra bất kỳ nhận xét hoặc đặt câu hỏi nào. Bạn cũng có thể bắt đầu cuộc trò chuyện với chúng tôi.