การเก็บถาวรข้อมูลย้อนหลังให้ความสามารถในการติดตามและเก็บถาวรการเปลี่ยนแปลงข้อมูลธุรกรรมไปยังวัตถุฐานข้อมูลที่ระบุโดยอัตโนมัติ
คำอธิบาย
คลังข้อมูลย้อนหลังประกอบด้วยพื้นที่ตารางหลายตารางและจัดเก็บข้อมูลในอดีตจากธุรกรรมทั้งหมดเทียบกับตารางที่ติดตาม ข้อมูลถูกจัดเก็บไว้ในตารางประวัติภายใน ซึ่งให้การจัดเก็บข้อมูลการเลิกทำในระยะยาว ทำให้การดำเนินการย้อนหลังแบบเลิกทำสามารถดำเนินการได้เป็นระยะเวลานาน เพื่อรักษาการป้องกันที่เข้มงวดในตารางประวัติภายในและรักษาข้อมูลประวัติไว้เป็นเวลาสั้นๆ และระยะเวลานาน Flash Data Archive เป็นตัวเลือกที่ช่วยเรียกคืนโดยไม่ต้องกู้คืนข้อมูลสำรองในอดีต
สิทธิ์ที่จำเป็นในการดำเนินการ
- สคีมาที่มีสิทธิ์ของระบบ FLASHBACK ARCHIVE ADMINISTER สามารถดำเนินการยกเลิกการเชื่อมโยงและเชื่อมโยงขั้นตอน PL/SQL ใหม่ได้
- เมื่อยกเลิกการเชื่อมโยงตารางแล้ว ผู้ใช้ทั่วไปสามารถดำเนินการคำสั่ง DDL และ DML ได้หากพวกเขามีสิทธิ์ที่จำเป็นในตาราง
- สิทธิ์ของระบบ FLASHBACK ARCHIVE ADMINISTER จำเป็นต้องสร้างคลังข้อมูลย้อนหลัง
- ต้องมีสิทธิ์ของระบบ CREATE TABLESPACE เพื่อสร้างคลังข้อมูลย้อนหลัง
- ตรวจสอบให้แน่ใจว่าคุณมีโควต้าเพียงพอบนพื้นที่ตารางซึ่งมีข้อมูลประวัติอยู่
ข้อมูลบริบทถูกเก็บไว้กับข้อมูลธุรกรรม คุณต้องใช้ขั้นตอน DBMS_FLASHBACK_ARCHIVE.SET_CONTEXT_LEVEL โดยส่งค่าพารามิเตอร์ใดค่าหนึ่งต่อไปนี้
- ทั่วไป:เฉพาะแอตทริบิวต์การตรวจสอบพื้นฐานจากบริบท USERENV เท่านั้นที่จะถูกเก็บไว้
- ทั้งหมด:บริบททั้งหมดที่มีให้สำหรับผู้ใช้ผ่านฟังก์ชัน SYS_CONTEXT จะถูกเก็บไว้
- ไม่มี:ไม่มีการจัดเก็บข้อมูลบริบท
ในกรณีนี้ ให้ใช้ ALL เพื่อจับ USERENV และค่าบริบทที่กำหนดเอง
CONN sys@surya AS SYSDBA
EXEC DBMS_FLASHBACK_ARCHIVE.set_context_level('ALL');
การทดสอบและการใช้งาน
ในตัวอย่างต่อไปนี้ ฉันกำลังเปิดใช้ FDA ที่ระดับพื้นที่โต๊ะ และตั้งค่าการเก็บข้อมูลไว้สำหรับช่วงเวลาเฉพาะสำหรับพื้นที่โต๊ะหลายรายการ ยังดึงข้อมูลจากคลังข้อมูลย้อนหลังซึ่งถูกลบระหว่างระยะเวลาการเก็บรักษา จุดประสงค์คือเพื่อให้ได้ข้อมูลในอดีตอย่างง่ายดายด้วย FAD โดยไม่ต้องเปิดใช้งานคุณสมบัตินี้ เราต้องกู้คืนฐานข้อมูลทั้งหมดเพื่อรับข้อมูลในอดีต สิ่งที่เพิ่มความซับซ้อนคือกรณีของระบบฐานข้อมูลขนาดใหญ่
ตัวอย่าง:
• คำสั่งสำหรับสร้าง tablespace
SQL> CREATE TABLESPACE FBA DATAFILE size 500m autoextend on next 100m ;
สร้างพื้นที่ตารางแล้ว
• เรียกใช้คำสั่งต่อไปนี้เพื่อสร้างข้อมูลย้อนหลังย้อนหลัง (FDA)
SQL> CREATE FLASHBACK ARCHIVE DEFAULT FLA1 TABLESPACE FBA QUOTA 500M RETENTION 1 YEAR;
สร้างไฟล์ Flashback แล้ว
• ทำตามขั้นตอนต่อไปนี้เพื่อสร้าง Non-Default FDA
SQL> CREATE FLASHBACK ARCHIVE FLA2 TABLESPACE users QUOTA 400M RETENTION 6 MONTH;
สร้างไฟล์ Flashback แล้ว
• รับรายชื่อองค์การอาหารและยาที่สร้างขึ้น
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
จาก dba_flashback_archive
เรียงตามชื่อเจ้าของ, flashback_archive_name;
OWNER_NAME FLASHBACK_ARCHIVE_NAME FLASHBACK_ARCHIVE# RETENTION_IN_DAYS CREATE_TIME สถานะ LAST_PURGE_TIME
SYS FLA1 1 365 16-DEC-2021 19:28:53 16-DEC-2021 19:28:53 DEFAULTSYS FLA2 2 180 16-DEC-2021 19:29:14 16-DEC-2021 19:29:14
• ตั้งค่า Default FDA และรับรายละเอียด
SQL> ALTER FLASHBACK ARCHIVE FLA1 SET DEFAULT ;
คลังข้อมูลย้อนหลังมีการเปลี่ยนแปลง
SELECT flashback_archive_name,
flashback_archive#,
tablespace_name,
quota_in_mb
จาก dba_flashback_archive_ts
เรียงลำดับตาม flashback_archive_name;
FLASHBACK_ARCHIVE_NAME FLASHBACK_ARCHIVE# TABLESPACE_NAME QUOTA_IN_MB
FLA1 1 FBA 500
FLA2 2 ผู้ใช้ 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 สถานะ
พนักงาน HR FLA1 SYS_FBA_HIST_92593 เปิดใช้งานแล้ว
ทำการทดสอบต่อไปนี้และดูว่ามันทำงานอย่างไร
SQL> ALTER SESSION SET NLS_DATE_FORMAT='YYYY/MM/DD HH24:MI:SS';
มีการเปลี่ยนแปลงเซสชัน
SQL>SQL> เลือก SYSDATE จาก DUA;
SYSDATE
2021/12/16 19:39:31
SQL> เลือก DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER จาก DUAL;
GET_SYSTEM_CHANGE_NUMBER
1964623
ให้เราลองลบบันทึกและปรับปรุงตารางพนักงาน
SQL> DELETE FROM HR.EMPLOYEES WHERE EMPLOYEE_ID=192;
ลบแล้ว 1 แถว
SQL> คอมมิต;
ภาระผูกพันเสร็จสมบูรณ์
SQL>SQL>SQL>SQL> UPDATE HR.EMPLOYEES SET SALARY=12000 WHERE EMPLOYEE_ID=168;
มุ่งมั่น;
UPDATE HR.EMPLOYEES SET SALARY=12500 WHERE EMPLOYEE_ID=168;
มุ่งมั่น;
UPDATE HR.EMPLOYEES SET SALARY=12550 WHERE EMPLOYEE_ID=168;
COMMIT อัปเดตแล้ว 1 แถว
SQL> SQL>ดำเนินการเสร็จสิ้น
SQL> SQL>อัปเดต 1 แถวแล้ว
SQL> SQL>ดำเนินการเสร็จสิ้น
SQL> SQL>อัปเดต 1 แถวแล้ว
SQL> SQL>
ภาระผูกพันเสร็จสมบูรณ์
- ทำตามขั้นตอนการเปรียบเทียบข้อมูลโดยใช้ 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
ที่นี่คุณสามารถดูแถวที่ถูกลบจาก FDA คุณยังรับข้อมูลได้ด้วย VERSION_STARTSCN pseudcoumns
• ข้อมูลที่มี SCN ที่กำหนด
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
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 น. 1964650 Lisa Ozer 12550
คุณสามารถดูแถวที่มีเวอร์ชันต่างกันสำหรับข้อมูลเดียวกันในคอลัมน์เงินเดือน เนื่องจากเราได้อัปเดตใบแจ้งยอดในคอลัมน์เงินเดือนที่มีค่าส่วนต่าง 500 ค่า
ข้อจำกัดและวิธีแก้ปัญหาสำหรับคำสั่ง DDL (จับภาพวิวัฒนาการของการบันทึก)
ยกเลิกการเชื่อมโยง / ผู้ร่วมงาน
สำหรับ DDL ที่ซับซ้อนมากขึ้น เช่น การอัปเกรด ตารางแยก ฯลฯ สามารถใช้โพรซีเดอร์ Disassociate และ Associate PL/SQL เพื่อปิดใช้งาน Flashback Data Archive ชั่วคราวในตารางที่ระบุได้ ขั้นตอนการเชื่อมโยงบังคับใช้ความสมบูรณ์ของสกีมาหลังการเชื่อมโยง:ตารางพื้นฐานและสกีมาตารางประวัติต้องเหมือนกัน ขั้นตอน Disassociate and Associate ต้องการสิทธิ์ FLASHBACK ARCHIVE ADMINISTER
o เพิ่ม ลบ เปลี่ยนชื่อ หรือแก้ไข columnoDelete หรือตัดทอนพาร์ทิชัน
o เปลี่ยนชื่อหรือตัดทอนตาราง (ตารางที่มี FBA Delete ล้มเหลวโดยมีข้อผิดพลาด ORA- 55610)
o การเปลี่ยนแปลงบางอย่าง (เช่น:วิธี MOVE / SPLIT / CHANGE PARTITIONS) ต้องใช้แพ็คเกจ DBMS_FLASHBACK_ARCHIVE เพื่อดำเนินการ
ในตัวอย่างต่อไปนี้ คุณสามารถดูวิธีที่เราสามารถดำเนินกิจกรรม DDL บนตาราง FDA สำหรับข้อมูลในอดีต การสร้างตารางสาธิต EMPLOYEES_FBA เพิ่มข้อจำกัด
SQL> CREATE TABLE HR.EMPLOYEES_FBA AS SELECT * FROM HR.EMPLOYEES;
สร้างตารางแล้ว
SQL> ALTER TABLE HR.EMPLOYEES_FBA ADD CONSTRAINT employee_pk PRIMARY KEY (employee_id);
ตารางเปลี่ยนแปลง
เปิดใช้ FDA ในตารางสาธิตและอัปเดตบันทึกบางส่วน
SQL> ALTER TABLE HR.EMPLOYEES_FBA FLASHBACK ARCHIVE;
ตารางเปลี่ยนแปลง
SQL> UPDATE HR.EMPLOYEES_FBA SET SALARY=10000 WHERE EMPLOYEE_ID=203;
อัปเดต 1 แถวแล้ว
COMMIT;
ภาระผูกพันเสร็จสมบูรณ์
เมื่อปิดใช้งานและเปิดใช้งานข้อจำกัดของตาราง พร้อมท์ ORA-55610 ป้องกันตารางข้อมูลแทร็กในอดีต
SQL> ALTER TABLE HR.EMPLOYEES_FBA DISABLE CONSTRAINT EMPLOYEE_PK;
ตารางเปลี่ยนแปลง
SQL> SQL> ALTER TABLE HR.EMPLOYEES_FBA ENABLE CONSTRAINT EMPLOYEE_PK;
ALTER TABLE HR.EMPLOYEES_FBA ENABLE CONSTRAINT EMPLOYEE_PK
*ข้อผิดพลาดที่บรรทัด 1:ORA-55610:คำสั่ง DDL ไม่ถูกต้องในตารางที่ติดตามประวัติ
ตอนนี้จะดำเนินการต่ออย่างไรเมื่อเราได้รับข้อจำกัดเหล่านี้
*หมายเหตุ:การเพิ่มข้อจำกัดใดๆ บนโต๊ะ (Primary Key, Unique Key, Foreign Key หรือ Check Constraint) จะทำให้คุณไม่สามารถอ่านข้อมูลในอดีตโดยอัตโนมัติ โดยไม่ต้องเข้าถึงตารางเก็บถาวร SYS_FBA_ ที่ขีดเส้นใต้**คุณจำเป็นต้อง ระมัดระวังในการจัดการข้อจำกัดและการติดตามตารางในอดีต*
SQL> SELECT * FROM DBA_FLASHBACK_ARCHIVE_TABLES WHERE TABLE_NAME='EMPLOYEES_FBA';
TABLE_NAME OWNER_NAME FLASHBACK_ARCHIVE_NAME ARCHIVE_TABLE_NAME สถานะ
EMPLOYEES_FBA HR FLA1 SYS_FBA_HIST_93946 เปิดใช้งานแล้ว
ด้วยความช่วยเหลือของ DBMS_FLASHBACK_ARCHIVE.DISASSOCIATE_FBA เราสามารถทำได้
SQL> EXEC DBMS_FLASHBACK_ARCHIVE.DISASSOCIATE_FBA('HR','EMPLOYEES_FBA');
ขั้นตอน PL/SQL เสร็จสมบูรณ์
ตอนนี้ให้ลองเปิดใช้งานข้อจำกัดอีกครั้ง
SQL> ALTER TABLE HR.EMPLOYEES_FBA ENABLE CONSTRAINT EMPLOYEE_PK;
ตารางเปลี่ยนแปลง
เปิดใช้ข้อจำกัดอีกครั้งด้วยความช่วยเหลือของ DBMS_FLASHBACK_ARCHIVE.REASSOCIATE_FBA
SQL> EXEC DBMS_FLASHBACK_ARCHIVE.REASSOCIATE_FBA('HR','EMPLOYEES_FBA');
ขั้นตอน PL/SQL เสร็จสมบูรณ์
ล้างข้อมูลในอดีตในช่วงเวลาที่กำหนด SQL> ALTER FLASHBACK ARCHIVE FLA1 PURGE BEFORE TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' DAY);
คลังข้อมูลย้อนหลังมีการเปลี่ยนแปลง
ปิดการใช้งาน FDA
SQL> ALTER TABLE HR.EMPLOYEES NO FLASHBACK ARCHIVE;
SQL> ALTER TABLE HR.EMPLOYEES_FBA NO FLASHBACK ARCHIVE;
เลิกใช้ FDA
SQL>DROP FLASHBACK ARCHIVE FLA1;
บทสรุป
ฟีเจอร์ Flashback Data Archive ให้อินเทอร์เฟซแบบรวมศูนย์เพื่อจัดการและเก็บรักษาประวัติข้อมูล และการจัดการตามนโยบายแบบอัตโนมัติซึ่งมอบโซลูชันที่น่าทึ่งสำหรับการบริหารฐานข้อมูล โดยที่การติดตามข้อมูลในอดีตนี้เพื่อให้สอดคล้องกับระเบียบข้อบังคับใหม่หรือปรับให้เข้ากับความต้องการทางธุรกิจที่เปลี่ยนแปลงไป
ให้ผู้เชี่ยวชาญของเราแนะนำคุณในการเดินทางฐานข้อมูลของคุณ
ใช้แท็บคำติชมเพื่อแสดงความคิดเห็นหรือถามคำถาม คุณสามารถเริ่มการสนทนากับเราได้เช่นกัน