
اگر تابهحال در Oracle با موقعیتی روبهرو شدهای که لازم بوده وضعیت دادهها را قبل از یک تغییر یا حذف مشاهده کنی، قابلیت Flashback همان نجاتدهنده واقعی توست.
پکیج DBMS_FLASHBACK به شما اجازه میدهد در سطح آمادهسازی Session، نمایی از دادهها را به هر لحظه از گذشته بازگردانید — بدون اینکه نیاز به Backup یا Restore داشته باشید.
در پروژههایی چون تحلیل خطا، ممیزی مالی، گزارشهای تاریخی، و بررسی تغییرات قبل از عملیات Batch این پکیج ابزاری حیاتیست.
در این مقاله آموزش Oracle در بخش آموزش پکیج های اوراکلی در این پکیج DBMS_FLASHBACK صحبت خواهیم کرد.
پکیج DBMS_SQLDIAG مثل یک پزشک هوشمند برای SQL عمل میکند؛ مشکل را تشخیص میدهد، گزارش دقیق تولید میکند و حتی میتواند سناریوی کندی را به شکل تست کیس بازسازی کند. پیشنهاد می کنم این مقاله زیر رو حتما مطالعه کنی.
در این مقاله شما می خوانید
🧠 مفهوم Flashback در Oracle
اوراکل برای هر تراکنش یک شماره تغییر سیستم (SCN) و نسخههای قبلی رکوردها را در Undo Tablespace نگه میدارد.
زمانی که فلشبک فعال میشود، سیستم دادهها را از همان Undoها میخواند و تصویری تاریخی از جدول نمایش میدهد.
به این معنا، Oracle به تو اجازهی “سفر در زمان دادهای” را میدهد — بدون آنکه حتی یک بایت از داده فعلی را دستکاری کند.
🔧 معرفی پکیج DBMS_FLASHBACK
ین پکیج در واقع کنترلکننده فلشبک در سطح Session است.
یعنی در همان Session که فعالش میکنی، هر دستور SELECT دادهها را از زمان تعیینشده نمایش میدهد تا وقتی که آن را غیرفعال کنی.
📦 توابع و برنامههای اصلی (Procedures)
| نام | توضیح |
|---|---|
| DBMS_FLASHBACK.ENABLE_AT_TIME(time) | فعالسازی فلشبک برای یک زمان خاص از نوع TIMESTAMP |
| DBMS_FLASHBACK.ENABLE_AT_SYSTEM_CHANGE_NUMBER(scn) | فعالسازی فلشبک براساس شماره SCN سیستم تغییرات |
| DBMS_FLASHBACK.DISABLE | غیرفعالسازی فلشبک و بازگشت دید Session به حالت معمول |
⚙️ پیشنیاز استفاده از پکیج DBMS_FLASHBACK
قبل از اجرای دستورها، این موارد ضروریست:
- دسترسی مناسب (Privilege): باید مجوزهای
SELECT ANY TRANSACTIONیا دسترسی لازم برای مشاهده اطلاعات تاریخی را داشته باشی. - کفایت Undo Tablespace: اگر اندازه Undo کم باشد یا تاریخچه پاک شده باشد، فلشبک کامل عمل نمیکند.
- Session Read-Only: وقتی فلشبک فعال است، فقط عملیات خواندن مجاز است (نه Insert یا Update).
🧩 مثال آموزشی — بازگشت به زمان گذشته دادهها
فرض کن جدولی داریم به نام EMP:
CREATE TABLE emp (
empno NUMBER PRIMARY KEY,
ename VARCHAR2(50),
salary NUMBER,
deptno NUMBER
);
در ساعت ۱۰:۰۰ صبح دادهها وارد شدهاند:
INSERT INTO emp VALUES (1, 'Ali', 6000, 10);
INSERT INTO emp VALUES (2, 'Sara', 9000, 20);
COMMIT;
و در ساعت ۱۰:۳۰ تغییر زیر انجام شده است:
UPDATE emp SET salary = 8000 WHERE empno = 1;
COMMIT;
اکنون ساعت ۱۱:۰۰ است و میخواهیم دادههای جدول را در وضعیت ساعت ۱۰:۰۵ مشاهده کنیم.
✳️ فعالسازی فلشبک بر اساس زمان
EXEC DBMS_FLASHBACK.ENABLE_AT_TIME(
TO_TIMESTAMP('2025-11-17 10:05:00', 'YYYY-MM-DD HH24:MI:SS')
);
اکنون هر Query در این Session دادههای ساعت ۱۰:۰۵ را نشان میدهد:
SELECT * FROM emp;
📤 خروجی:
EMPNO | ENAME | SALARY | DEPTNO
------|--------|--------|--------
۱ | Ali | 6000 | 10
۲ | Sara | 9000 | 20
🕑 بازگشت به وضعیت معمول
EXEC DBMS_FLASHBACK.DISABLE;
حالا دوباره داده فعلی (حقوق ۸۰۰۰ برای علی) دیده میشود.
⚙️ فلشبک بر اساس SCN (System Change Number)
شماره SCN شاخص ترتیب تغییرات در سیستم است.
هر COMMIT در Oracle یک SCN جدید ایجاد میکند.
مثلاً میتوان از SCN استفاده کرد:
SELECT CURRENT_SCN FROM V$DATABASE;
-- nemoone SCN: 20384619
سپس:
EXEC DBMS_FLASHBACK.ENABLE_AT_SYSTEM_CHANGE_NUMBER(20384619);
SELECT * FROM emp;
EXEC DBMS_FLASHBACK.DISABLE;
💡 کاربردهای عملی پکیج در سازمانها
- 🔹 تحلیل خطاهای سیستمی و بازیابی لحظه قبل از خرابی
- 🔹 گزارشگیری تاریخی و مشاهده وضعیت دادهها در زمان گذشته
- 🔹 ممیزی تغییرات (Audit) پیش از اجرای پردازشهای حساس یا کامیتهای گروهی
- 🔹 تحلیل قبلوبعد از تغییرات حجیم در بانکهای مالی یا تراکنشی
🧠 تفاوت Flashback Query و DBMS_FLASHBACK
| ویژگی | Flashback Query | DBMS_FLASHBACK |
|---|---|---|
| سطح عملکرد | تنها در همان Query | در سطح Session تا زمان غیرفعالسازی |
| کنترل اجرا | در دستور Select | از طریق برنامهنویسی PL/SQL |
| کاربرد متداول | گزارش لحظهای یا مقایسه داده | تحلیلهای بلندمدت و تستهای دادهای |
🔸 نمونه Query فلشبک بدون پکیج:
SELECT * FROM emp AS OF TIMESTAMP (TO_TIMESTAMP('2025-11-17 10:05:00', 'YYYY-MM-DD HH24:MI:SS'));
سوالات متداول درباره پکیج DBMS_FLASHBACK در اوراکل
پکیج DBMS_FLASHBACK در Oracle Database ابزاری است برای مشاهده دادهها در زمان گذشته بدون نیاز به Backup یا Restore. این قابلیت با استفاده از اطلاعات Undo Tablespace نسخهی قبلی رکوردها را بازسازی میکند.
کاربرد اصلی آن در تحلیل خطاهای سیستمی، گزارشگیری تاریخی، و ممیزی تغییرات اطلاعات است.
در واقع DBMS_FLASHBACK به شما اجازهی “سفر در زمان دادهای” میدهد و میتوانید وضعیت جدول را مثلاً در ساعت یا SCN خاصی ببینید.
در Flashback Query (عبارت AS OF TIMESTAMP) فلشبک فقط در همان Query فعال است، ولی در DBMS_FLASHBACK کل Session تا زمان غیرفعالسازی تحت تأثیر قرار میگیرد.
بهعبارت دیگر، DBMS_FLASHBACK برای تحلیلهای پیدرپی یا تستهای زمانمند مناسب است، در حالی که Flashback Query برای گزارش سریع و یکباره بهکار میرود.
برای فعالسازی فلشبک در زمان خاص از نوع TIMESTAMP استفاده کن:
EXEC DBMS_FLASHBACK.ENABLE_AT_TIME(
TO_TIMESTAMP(‘2025-11-17 10:05:00’, ‘YYYY-MM-DD HH24:MI:SS’)
);
برای فعالسازی بر پایه شماره تغییر سیستم (SCN):
EXEC DBMS_FLASHBACK.ENABLE_AT_SYSTEM_CHANGE_NUMBER(20384500);
برای بازگشت به حالت معمول:
EXEC DBMS_FLASHBACK.DISABLE;
پس از اجرای DISABLE دوباره به حالت فعلی دادهها برمیگردد.
DBMS_FLASHBACK زمانی ایدهآل است که لازم باشد وضعیت دادهها قبل از یک تغییر بزرگ یا خطای برنامه مشخص شود.
بهویژه در بانکهای اطلاعاتی مالی و تراکنشی، قبل و بعد از اجرای Jobهای گروهی (Batch Jobs) یا پردازشهای خودکار، میتوان از فلشبک استفاده کرد تا دادههای قبلی بدون بازیابی کامل دیده شوند.
این رویکرد باعث صرفهجویی در زمان و منابع سیستم و افزایش دقت کنترل دادهها میشود.
جمعبندی
پکیج DBMS_FLASHBACK پلی هوشمند میان حال و گذشته دادههای Oracle است.
مهندسان بانک اطلاعاتی با درک این پکیج میتوانند هم در تحلیل خطاها و هم در ممیزی تغییرات عملکردی سریع، دقیق و بدون نیاز به بازیابی (Recovery) داشته باشند.
در واقع این ابزار همان “ماشین زمان” Oracle برای رسیدن به دقت تاریخی در دادهها است.
📥 اگر سوالی داری در مورد پکیج DBMS_FLASHBACK در اوراکل داری، در بخش کامنتها بپرس.
سؤالی درباره این مقاله داری؟
اگر نکتهای در این مقاله برات مبهم بود یا خواستی بیشتر بدونی، همین حالا برام بنویس تا دقیق و صمیمی پاسخت رو بدم — مثل یه گفتوگوی واقعی 💬
برو به صفحه پرسش و پاسخ
دیدگاهتان را بنویسید