Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> ฐานข้อมูล

Flashback Data Archive: ติดตามและเรียกคืนธุรกรรมแบบปลอดภัยระยะยาว

ภาพรวม Flashback Data Archive (FDA)

Flashback Data Archive ให้ความสามารถในการติดตามและ Archive การเปลี่ยนแปลงข้อมูล Transactional ของ Database Objects ที่ระบุได้อย่างอัตโนมัติ

คำอธิบาย

FDA ประกอบด้วย Multiple Tablespaces เก็บ Historical Data จาก Transactions ทั้งหมด對 Tracked Tables ข้อมูลเก็บใน Internal History Tables ให้ Long-term Storage ของ Undo Data ทำให้ Flashback Operations ทำงานได้ย้อนหลังนานขึ้น รักษาความปลอดภัยข้อมูลทางประวัติศาสตร์ ทั้งระยะสั้นและระยะยาว ไม่ต้อง Restore Backup

สิทธิ์ที่จำเป็น (Required Privileges)

  • Schema ที่มี FLASHBACK ARCHIVE ADMINISTER System Privilege สามารถ Disassociate/Reassociate PL/SQL Procedures ได้
  • หลัง Disassociate ผู้ใช้ทั่วไปทำ DDL/DML ได้หากมีสิทธิ์บน Tables
  • ต้องมี FLASHBACK ARCHIVE ADMINISTER เพื่อสร้าง FDA
  • ต้องมี CREATE TABLESPACE System Privilege
  • ต้องมี Quota เพียงพอบน Tablespace ที่จะเก็บ Historical Data

Context Information เก็บร่วมกับ Transaction Data ใช้ DBMS_FLASHBACK_ARCHIVE.SET_CONTEXT_LEVEL:

  • TYPICAL: Basic Auditing Attributes จาก USERENV
  • ALL: ทุก Context ที่เข้าถึงได้ผ่าน SYS_CONTEXT (แนะนำ)
  • NONE: ไม่เก็บ Context
CONN sys@surya AS SYSDBA
EXEC DBMS_FLASHBACK_ARCHIVE.set_context_level('ALL');

การทดสอบและการนำไปใช้

ตัวอย่าง: เปิดใช้งาน FDA ระดับ Tablespace ตั้ง Retention Period หลาย Tablespaces ดึงข้อมูลที่ถูกลบในช่วง Retention Period โดยไม่ต้อง Restore Database ทั้งหมด

ตัวอย่างขั้นตอน

  1. สร้าง Tablespace:
    CREATE TABLESPACE FBA DATAFILE SIZE 500M AUTOEXTEND ON NEXT 100M;
  2. สร้าง Default FDA:
    CREATE FLASHBACK ARCHIVE DEFAULT FLA1 TABLESPACE FBA QUOTA 500M RETENTION 1 YEAR;
  3. สร้าง Non-Default FDA:
    CREATE FLASHBACK ARCHIVE FLA2 TABLESPACE users QUOTA 400M RETENTION 6 MONTH;
  4. ดูรายการ FDA:
    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;
  5. ตั้ง Default FDA และดูรายละเอียด:
    ALTER FLASHBACK ARCHIVE FLA1 SET DEFAULT;
    SELECT flashback_archive_name, flashback_archive#, tablespace_name, quota_in_mb
    FROM dba_flashback_archive_ts ORDER BY flashback_archive_name;
  6. ตรวจสอบ Table ที่เปิดใช้งาน FDA:
    SELECT * FROM DBA_FLASHBACK_ARCHIVE_TABLES WHERE TABLE_NAME='EMPLOYEES' AND OWNER_NAME='HR';

ทดสอบการทำงาน

ALTER SESSION SET NLS_DATE_FORMAT='YYYY/MM/DD HH24:MI:SS';
SELECT SYSDATE FROM DUAL;  -- 2021/12/16 19:39:31
SELECT DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER FROM DUAL;  -- 1964623

ลบและ Update ข้อมูลใน Employees Table

DELETE FROM HR.EMPLOYEES WHERE EMPLOYEE_ID=192; COMMIT;
UPDATE HR.EMPLOYEES SET SALARY=12000 WHERE EMPLOYEE_ID=168; COMMIT;
UPDATE HR.EMPLOYEES SET SALARY=12500 WHERE EMPLOYEE_ID=168; COMMIT;
UPDATE HR.EMPLOYEES SET SALARY=12550 WHERE EMPLOYEE_ID=168; COMMIT;

เปรียบเทียบข้อมูลด้วย FDA (AS OF TIMESTAMP)

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 192 Sarah Bell)

ดูข้อมูลแบบ Versioning (VERSIONS BETWEEN TIMESTAMP)

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;

-- ผลลัพธ์: แสดง Salary ต่างๆ ตาม Version (11500, 12000, 12500, 12550)

ข้อจำกัดและวิธีแก้ไขสำหรับ DDL (Disassociate/Associate)

สำหรับ DLP ซับซ้อน (Upgrades, Split Table ฯลฯ) ใช้ DBMS_FLASHBACK_ARCHIVE.DISASSOCIATE_FBA และ REASSOCIATE_FBA ปิด/เปิด FDA ชั่วคราว ต้องมีสิทธิ์ FLASHBACK ARCHIVE ADMINISTER

การดำเนินการที่ถูกจำกัด:

  • Add, Delete, Rename, Edit Column
  • Delete/Truncate Partition
  • Rename/Truncate Table (Error ORA-55610)
  • MOVE/SPLIT/CHANGE PARTITIONS - ต้องใช้ DBMS_FLASHBACK_ARCHIVE Package

ตัวอย่างจัดการ Constraint บน FDA Table

  1. สร้าง Table Demo และเพิ่ม Constraint
  2. เปิดใช้งาน FDA บน Table Demo
  3. Update ข้อมูลบาง Record
  4. พยายาม Disable/Enable Constraint → Error ORA-55610
  5. ใช้ DBMS_FLASHBACK_ARCHIVE.DISASSOCIATE_FBA('HR','EMPLOYEES_FBA')
  6. Enable Constraint ได้สำเร็จ
  7. Re-enable FDA: DBMS_FLASHBACK_ARCHIVE.REASSOCIATE_FBA('HR','EMPLOYEES_FBA')

Purge Historical Data

ALTER FLASHBACK ARCHIVE FLA1 PURGE BEFORE TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' DAY);

Disable/Drop FDA

ALTER TABLE HR.EMPLOYEES NO FLASHBACK ARCHIVE;
ALTER TABLE HR.EMPLOYEES_FBA NO FLASHBACK ARCHIVE;
DROP FLASHBACK ARCHIVE FLA1;

สรุป

Flashback Data Archive ให้ Interface จัดการและเก็บรักษาประวัติข้อมูลแบบ Centralized และ Integrated พร้อม Policy-based Automation แก้ปัญหาการติดตามข้อมูลประวัติศาสตร์เพื่อปฏิบัติตามกฎระเบียบหรือความต้องการทางธุรกิจที่เปลี่ยนแปลง