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

การเรียกคืนทั้งหมด (คลังข้อมูลย้อนหลัง)

การเก็บถาวรข้อมูลย้อนหลังให้ความสามารถในการติดตามและเก็บถาวรการเปลี่ยนแปลงข้อมูลธุรกรรมไปยังวัตถุฐานข้อมูลที่ระบุโดยอัตโนมัติ

คำอธิบาย

คลังข้อมูลย้อนหลังประกอบด้วยพื้นที่ตารางหลายตารางและจัดเก็บข้อมูลในอดีตจากธุรกรรมทั้งหมดเทียบกับตารางที่ติดตาม ข้อมูลถูกจัดเก็บไว้ในตารางประวัติภายใน ซึ่งให้การจัดเก็บข้อมูลการเลิกทำในระยะยาว ทำให้การดำเนินการย้อนหลังแบบเลิกทำสามารถดำเนินการได้เป็นระยะเวลานาน เพื่อรักษาการป้องกันที่เข้มงวดในตารางประวัติภายในและรักษาข้อมูลประวัติไว้เป็นเวลาสั้นๆ และระยะเวลานาน 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 ให้อินเทอร์เฟซแบบรวมศูนย์เพื่อจัดการและเก็บรักษาประวัติข้อมูล และการจัดการตามนโยบายแบบอัตโนมัติซึ่งมอบโซลูชันที่น่าทึ่งสำหรับการบริหารฐานข้อมูล โดยที่การติดตามข้อมูลในอดีตนี้เพื่อให้สอดคล้องกับระเบียบข้อบังคับใหม่หรือปรับให้เข้ากับความต้องการทางธุรกิจที่เปลี่ยนแปลงไป

ให้ผู้เชี่ยวชาญของเราแนะนำคุณในการเดินทางฐานข้อมูลของคุณ

ใช้แท็บคำติชมเพื่อแสดงความคิดเห็นหรือถามคำถาม คุณสามารถเริ่มการสนทนากับเราได้เช่นกัน