ফ্ল্যাশব্যাক ডেটা আর্কাইভ নির্দিষ্ট ডাটাবেস অবজেক্টের বিরুদ্ধে সকল ট্রানজ্যাকশনাল ডেটা পরিবর্তন স্বয়ংক্রিয়ভাবে ট্র্যাক এবং আর্কাইভ করার ক্ষমতা প্রদান করে।
বিবরণ
একটি ফ্ল্যাশব্যাক ডেটা আর্কাইভ একাধিক টেবলস্পেস নিয়ে গঠিত এবং ট্র্যাক করা টেবিলগুলোর সকল ট্রানজ্যাকশন থেকে হিস্টরিক্যাল ডেটা স্টোর করে। ডেটা ইন্টারন্যাল হিস্টরি টেবিলগুলিতে স্টোর হয়। এটি আন্ডো ডেটার দীর্ঘমেয়াদী স্টোরেজ প্রদান করে, যা এক্সটেনডেড পিরিয়ডের জন্য আন্ডো-ভিত্তিক ফ্ল্যাশব্যাক অপারেশন পারফর্ম করতে দেয়। ইন্টারন্যাল হিস্টরিক্যাল টেবিলে কঠোর প্রোটেকশন বজায় রাখতে এবং ছোট ও বড় পিরিয়ডের জন্য হিস্টরিক্যাল ডেটা মেইনটেইন করতে, ফ্ল্যাশ ডেটা আর্কাইভ একটি অপশন যা ঐতিহাসিক ব্যাকআপ রিস্টোর ছাড়া রিক্যাল করতে সাহায্য করে।
এক্সিকিউট করার জন্য প্রয়োজনীয় প্রিভিলেজ
- FLASHBACK ARCHIVE ADMINISTER সিস্টেম প্রিভিলেজ 가진 স্কিমা PL/SQL প্রসিজার ডিসঅসোসিয়েশন এবং রি-অসোসিয়েশন এক্সিকিউট করতে পারে।
- একবার টেবিল ডিসঅসোসিয়েট হলে, সাধারন ইউজাররা টেবিলগুলোর ওপর DDL এবং DML স্টেটমেন্ট পারফর্ম করতে পারে যদি তাদের টেবিলগুলোর ওপর প্রয়োজনীয় প্রিভিলেজ থাকে।
- ফ্ল্যাশব্যাক ডেটা আর্কাইভ তৈরি করার জন্য FLASHBACK ARCHIVE ADMINISTER সিস্টেম প্রিভিলেজ প্রয়োজন।
- হিস্টরিক্যাল ইনফরমেশন থাকবে সে টেবলস্পেসে পর্যাপ্ত কোটা আছে কিনা নিশ্চিত করতে হবে CREATE TABLESPACE সিস্টেম প্রিভিলেজ থাকতে হবে।
কনটেক্সট ইনফরমেশন ট্রানজ্যাকশন ডেটার সাথে স্টোর থাকে, আপনাকে DBMS_FLASHBACK_ARCHIVE.SET_CONTEXT_LEVEL প্রসিজার ব্যবহার করতে হবে, নিচের প্যারামিটার ভ্যালুগুলোর একটা পাস করে।
- TYPICAL: USERENV কনটেক্সট থেকে শুধু বেসিক অডিটিং অ্যাট্রিবিউট স্টোর হয়।
- ALL: SYS_CONTEXT ফাংশন দিয়ে ইউজারকে যেসব কনটেক্সট উপলব্ধ সেগুলো সব স্টোর হয়।
- NONE: কোনো কনটেক্সট ইনফরমেশন স্টোর হয় না।
এই কেসে ALL ব্যবহার করুন, USERENV এবং কাস্টম কনটেক্সট ভ্যালু ক্যাপচার করার জন্য।
CONN sys@surya AS SYSDBA
EXEC DBMS_FLASHBACK_ARCHIVE.set_context_level('ALL');
টেস্টিং এবং ইমপ্লিমেন্টেশন
নিচের উদাহরণে, আমি FDA টেবলস্পেস লেভেলে ইন্যাবল করছি, এবং একাধিক টেবলস্পেসের জন্য নির্দিষ্ট পিরিয়ডের জন্য রিটেনশন সেট করছি। রিটেনশন পিরিয়ডের মাঝপথে ডিলিট করা ডেটা ফ্ল্যাশব্যাক ডেটা আর্কাইভ থেকে রিট্রিভ করছি। উদ্দেশ্য হলো FAD-এ সহজে হিস্টরিক্যাল ডেটা পাওয়া। এই ফিচার ইন্যাবল না করলে, আমাদের পুরো ডাটাবেস রিস্টোর করতে হতো হিস্টরিক্যাল ডেটা পাওয়ার জন্য। বড় ডাটাবেস সিস্টেমের কেসে যা কমপ্লেক্সিটি যোগ করে।
উদাহরণ:
• টেবলস্পেস তৈরির কমান্ড
SQL> CREATE TABLESPACE FBA DATAFILE size 500m autoextend on next 100m ;
Tablespace created.
• ডিফল্ট ফ্ল্যাশব্যাক ডেটা আর্কাইভ (FDA) তৈরির কমান্ড
SQL> CREATE FLASHBACK ARCHIVE DEFAULT FLA1 TABLESPACE FBA QUOTA 500M RETENTION 1 YEAR;
Flashback archive created.
• নন-ডিফল্ট FDA তৈরির ধাপ
SQL> CREATE FLASHBACK ARCHIVE FLA2 TABLESPACE users QUOTA 400M RETENTION 6 MONTH;
Flashback archive created.
• তৈরি করা 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;
আউটপুট উদাহরণ:
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
• ডিফল্ট FDA সেট করুন এবং ডিটেইল পান
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;
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
নিচের টেস্ট পারফর্ম করুন এবং দেখুন কীভাবে কাজ করে
SQL> ALTER SESSION SET NLS_DATE_FORMAT='YYYY/MM/DD HH24:MI:SS';
Session altered.
SQL> SQL> SELECT SYSDATE FROM DUA;
SYSDATE
2021/12/16 19:39:31
SQL> SELECT DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER FROM DUAL;
GET_SYSTEM_CHANGE_NUMBER
1964623
employees টেবিলে রেকর্ড ডিলিট এবং আপডেট করার চেষ্টা করুন।
SQL> DELETE FROM HR.EMPLOYEES WHERE EMPLOYEE_ID=192;
1 row deleted.
SQL> commit;
Commit complete.
SQL> SQL> SQL> SQL> 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; 1 row updated.
SQL> SQL> Commit complete.
SQL> SQL> 1 row updated.
SQL> SQL> Commit complete.
SQL> SQL> 1 row updated.
SQL> SQL>
Commit complete.
- 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 슈ডোকলাম দিয়েও ডেটা পেতে পারেন।
দেওয়া 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 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
আপনি একই ডেটার জন্য স্যালারি কলামে ভিন্ন ভার্সন দেখতে পাচ্ছেন কারণ আমরা ৫০০ মান পার্থক্য দিয়ে স্যালারি কলামে আপডেট স্টেটমেন্ট চালিয়েছিলাম।
DDL স্টেটমেন্টের রেস্ট্রিকশন এবং ওয়ার্কঅরাউন্ড (রেকর্ডিং এর ইভোলিউশন ক্যাপচার)
ডিসঅসোসিয়েট / অ্যাসোসিয়েট
অধিক জটিল DDL - আপগ্রেড, স্প্লিট টেবিল ইত্যাদি - এর জন্য, Disassociate এবং Associate PL/SQL প্রসিজারগুলো নির্দিষ্ট টেবিলগুলোর ওপর ফ্ল্যাশব্যাক ডেটা আর্কাইভ مؤقتভাবে ডিজেবল করতে ব্যবহার করা যেতে পারে। Associate প্রসিজার অ্যাসোসিয়েশনের পর স্কিমা ইন্টিগ্রিটি এনফোর্স করে: বেস টেবিল এবং হিস্ট্রি টেবিলের স্কিমা একই হতে হবে। Disassociate এবং Associate প্রসিজার FLASHBACK ARCHIVE ADMINISTER প্রিভিলেজ চায়।
- কলাম যোগ, ডিলিট, রিনেম বা এডিট
- পার্টিশন ডিলিট বা ট্রানকেট
- টেবিল রিনেম বা ট্রানকেট (FBA থাকা টেবিল ডিলিট করলে ORA-55610 এরর দেয়)
- কিছু পরিবর্তন (যেমন: MOVE / SPLIT / CHANGE PARTITIONS) মেথড DBMS_FLASHBACK_ARCHIVE প্যাকেজ দিয়ে করতে হয়।
নিচের উদাহরণে আপনি দেখতে পাবেন কীভাবে FDA টেবিলগুলোর ওপর ঐতিহাসিক ডেটার জন্য DDL এক্টিভিটি পারফর্ম করা যায়। ডেমো টেবিল EMPLOYEES_FBA তৈরি করা এবং কনস্ট্রেইন্ট যোগ করা।
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.
ডেমো টেবিলে FDA ইন্যাবল করা এবং কিছু রেকর্ড আপডেট করা।
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.
টেবিল কনস্ট্রেইন্ট ডিজেবল এবং ইন্যাবল করলে ORA-55610 প্রম্পট হিস্টরিক্যাল ট্র্যাক ডেটা টেবিলকে রোধ করে।
SQL> ALTER TABLE HR.EMPLOYEES_FBA DISABLE CONSTRAINT EMPLOYEE_PK;
Table altered.
SQL> 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
এই রেস্ট্রিকশন পাওয়া যাক কীভাবে এগিয়ে যাবেন
*দ্রষ্টব্য: একটি টেবিলে যেকোনো কনস্ট্রেইন্ট যোগ করা (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 STATUS
EMPLOYEES_FBA HR FLA1 SYS_FBA_HIST_93946 ENABLED
DBMS_FLASHBACK_ARCHIVE.DISASSOCIATE_FBA সাহায্যে আমরা এটি অর্জন করতে পারি।
SQL> EXEC DBMS_FLASHBACK_ARCHIVE.DISASSOCIATE_FBA('HR','EMPLOYEES_FBA');
PL/SQL procedure successfully completed.
এখন আবার কনস্ট্রেইন্ট ইন্যাবল করার চেষ্টা করুন
SQL> ALTER TABLE HR.EMPLOYEES_FBA ENABLE CONSTRAINT EMPLOYEE_PK;
Table altered.
DBMS_FLASHBACK_ARCHIVE.REASSOCIATE_FBA সাহায্যে আবার রেস্ট্রিকশন ইন্যাবল করুন
SQL> EXEC DBMS_FLASHBACK_ARCHIVE.REASSOCIATE_FBA('HR','EMPLOYEES_FBA');
PL/SQL procedure successfully completed.
নির্দিষ্ট সময়ের জন্য ঐতিহাসিক ডেটা পার্জ করা। SQL> ALTER FLASHBACK ARCHIVE FLA1 PURGE BEFORE TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' DAY);
Flashback archive altered.
FDA ডিজেবল
SQL> ALTER TABLE HR.EMPLOYEES NO FLASHBACK ARCHIVE;
SQL> ALTER TABLE HR.EMPLOYEES_FBA NO FLASHBACK ARCHIVE;
FDA ড্রপ
SQL> DROP FLASHBACK ARCHIVE FLA1;
উপসংহার
ফ্ল্যাশব্যাক ডেটা আর্কাইভ ফিচার একটি সেন্ট্রালাইজড এবং ইন্টিগ্রেটেড ইন্টারফেস প্রদান করে ডেটা হিস্টরি ম্যানেজ এবং রিটেইন করতে, এবং অটোমেটেড, পলিসি-ভিত্তিক ম্যানেজমেন্ট যা ডাটাবেস অ্যাডমিনিস্ট্রেশনে דרামাটিক সমাধান প্রদান করে যেখানে এই ঐতিহাসিক ডেটা ট্র্যাক করা নতুন রেগুলেশনের সাথে কম্প্লায়েন্স বা পরিবর্তনশীল বাইজনেস 니ডের সাথে অ্যাডাপ্ট করার জন্য।
আমাদের এক্সপার্টরা আপনার ডাটাবেস যাত্রায় গাইড করবেন।
মন্তব্য বা প্রশ্নের জন্য Feedback ট্যাব ব্যবহার করুন। আপনি আমাদের সাথে কথা বলতে পারেন।