फ्लैशबैक डेटा आर्काइव निर्दिष्ट डेटाबेस ऑब्जेक्ट के लेनदेन संबंधी डेटा परिवर्तनों को स्वचालित रूप से ट्रैक और आर्काइव करने की क्षमता प्रदान करता है।
विवरण
एक फ्लैशबैक डेटा आर्काइव में कई टेबलस्पेस होते हैं और यह ट्रैक की गई टेबल के विरुद्ध सभी लेनदेन से ऐतिहासिक डेटा संग्रहीत करता है। डेटा आंतरिक इतिहास टेबल पर संग्रहीत होता है। यह पूर्ववत डेटा का दीर्घकालिक भंडारण प्रदान करता है, जिससे पूर्ववत-आधारित फ्लैशबैक ऑपरेशन को विस्तारित अवधि में किया जा सकता है। आंतरिक ऐतिहासिक टेबल पर सख्त सुरक्षा बनाए रखने और ऐतिहासिक डेटा को छोटी और लंबी अवधि के लिए बनाए रखने के लिए, फ्लैश डेटा आर्काइव एक विकल्प है जो ऐतिहासिक बैकअप को पुनर्स्थापित किए बिना याद करने में मदद करता है।
निष्पादन के लिए आवश्यक विशेषाधिकार
- 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.
• बने FDAs की सूची प्राप्त करें
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> SELECT SYSDATE FROM DUAL;
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> 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> Commit complete.
SQL> 1 row updated.
SQL> Commit complete.
SQL> 1 row updated.
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
आप वेतन कॉलम में समान डेटा के लिए अलग-अलग संस्करण देख सकते हैं क्योंकि हमने वेतन कॉलम पर 500 मूल्य के अंतर के साथ अपडेट स्टेटमेंट निष्पादित किया है।
DDL स्टेटमेंट के लिए प्रतिबंध और समाधान (रिकॉर्डिंग के विकास को कैप्चर करें)
डिसएसोसिएट / एसोसिएट
अधिक जटिल DDL - अपग्रेड, स्प्लिट टेबल, आदि के लिए - निर्दिष्ट टेबल पर फ्लैशबैक डेटा आर्काइव को अस्थायी रूप से अक्षम करने के लिए डिसएसोसिएट और एसोसिएट PL/SQL प्रक्रियाओं का उपयोग किया जा सकता है। एसोसिएट प्रक्रिया एसोसिएशन के बाद स्कीमा अखंडता को लागू करती है: बेस टेबल और इतिहास टेबल स्कीमा समान होने चाहिए। डिसएसोसिएट और एसोसिएट प्रक्रियाओं के लिए 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> 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
अब कैसे आगे बढ़ें जब हमें ये प्रतिबंध मिल रहे हैं
नोट: एक टेबल पर किसी भी बाधा का जोड़ (प्राइमरी की, यूनिक की, फॉरेन की या चेक कंस्ट्रेंट) आपको सीधे अंतर्निहित 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;
निष्कर्ष
फ्लैशबैक डेटा आर्काइव सुविधा डेटा इतिहास को प्रबंधित और बनाए रखने के लिए एक केंद्रीकृत और एकीकृत इंटरफ़ेस प्रदान करती है, और स्वचालित, नीति-आधारित प्रबंधन जो डेटाबेस प्रशासन के लिए एक नाटकीय समाधान प्रदान करता है जहां इस ऐतिहासिक डेटा को ट्रैक करना नए नियमों का पालन करने या बदलती व्यावसायिक आवश्यकताओं के अनुकूल होने के लिए आवश्यक है।
हमारे विशेषज्ञ आपके डेटाबेस यात्रा में आपका मार्गदर्शन करें।
किसी भी टिप्पणी या प्रश्न के लिए फीडबैक टैब का उपयोग करें। आप हमारे साथ बातचीत भी शुरू कर सकते हैं।