
اگر با Oracle کار کرده باشید، احتمالاً حداقل یکبار با این سناریو روبهرو شدهاید: یک DELETE یا UPDATE اشتباه، یک DROP TABLE ناخواسته، یا یک تغییر گسترده که دادهها را بههم میریزد.
در خیلی از دیتابیسها راهحل سنتی این است که از بکاپ restore بگیرید؛ کاری زمانبر، پرریسک و معمولاً همراه با downtime.
اینجاست که Flashback Technology در اوراکل مثل یک نجاتدهنده وارد میشود.
Flashback مجموعهای از قابلیتهاست که به شما کمک میکند دادهها یا حتی کل دیتابیس را به گذشته برگردانید یا حداقل وضعیت گذشته را ببینید—بدون اینکه همیشه مجبور شوید backup/restore انجام دهید.
در این مقاله آموزش اوراکل، از بخش آموزش مدیریت اوراکل، سعی کردهام کاملاً کاربردی و قدمبهقدم توضیح بدهم که Flashback در Oracle چگونه کار میکند، چه انواعی دارد، پیشنیازهایش چیست و در دنیای واقعی چطور از آن استفاده میکنیم.
اگر با Oracle Database کار میکنید، احتمال زیاد اسم Temporary Tablespace را شنیدهاید. این بخش یکی از اجزای مهم پایگاهداده است که مستقیماً روی عملکرد کوئریها، Sort، Join و پردازشهای موقت تأثیر میگذارد.
پیشنهاد می کنم این مقاله زیر رو حتما مطالعه کنی.
در این مقاله شما می خوانید
Oracle Flashback Technology یک خانواده از امکانات است که به شما اجازه میدهد:
- دادهها را در یک زمان/SCN گذشته مشاهده کنید (بدون تغییر دادن وضعیت فعلی)
- تغییرات را ردگیری و تحلیل کنید (چه تغییری، چه زمانی و توسط چه تراکنشی)
- یک جدول Drop شده را برگردانید
- یک جدول خرابشده را به نسخهٔ قبل Flashback کنید
- در سطح پیشرفتهتر، کل دیتابیس را به نقطهای قبل از خطا برگردانید (Flashback Database)
نکته مهم: Flashback معمولاً برای خطاهای منطقی (Logical Corruption) عالی است. اما جایگزین بکاپ نیست.
Flashback در Oracle با دو منبع اصلی کار میکند:
۱) UNDO (برای Flashback Query / Table / Versions / Transaction)
UNDO همان چیزی است که Oracle برای rollback تراکنشها استفاده میکند.
Flashback از همین اطلاعات کمک میگیرد تا نسخههای قبلی داده را بازسازی کند.
مواردی که معمولاً UNDO-محور هستند:
- Flashback Query
- Flashback Version Query
- Flashback Transaction Query
- Flashback Table
۲) Flashback Logs (برای Flashback Database)
برای اینکه بتوانید کل دیتابیس را به عقب برگردانید، Oracle در FRA (Fast Recovery Area) لاگهایی به نام Flashback Logs نگه میدارد. اینها با UNDO فرق دارند.
SCN (System Change Number) یک شمارهٔ منطقی ترتیبی در Oracle است که وضعیت دیتابیس را در طول زمان نشان میدهد.
Flashback میتواند بر اساس:
- Timestamp (قابل فهمتر برای انسان)
- یا SCN (دقیقتر و مناسبتر برای سناریوهای حساس)
کار کند.
انواع Flashback در Oracle
در Oracle معمولاً این قابلیتها را زیرمجموعه Flashback میدانیم:
- Flashback Query
- Flashback Version Query
- Flashback Transaction Query
- Flashback Table
- Flashback Drop
- Flashback Database
- Restore Point / Guaranteed Restore Point
کاربرد اصلی
وقتی میخواهید فقط مشاهده کنید که دادهها در گذشته چه شکلی بودهاند.
مثال عملی
فرض کنید جدول زیر را داریم:
CREATE TABLE employees (
emp_id NUMBER PRIMARY KEY,
emp_name VARCHAR2(100),
salary NUMBER
);
داده درج میشود:
INSERT INTO employees VALUES (1, 'Ali', 10000);
COMMIT;
بعد حقوق تغییر میکند:
UPDATE employees SET salary = 15000 WHERE emp_id = 1;
COMMIT;
حالا اگر بخواهید حقوق را در گذشته ببینید:
SELECT emp_id, emp_name, salary
FROM employees
AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '10' MINUTE)
WHERE emp_id = 1;
اگر Undo موجود باشد، مقدار قدیمی را میبینید.
نکتههای مهم Flashback Query
- دیتابیس تغییر نمیکند؛ فقط query به گذشته میزنید.
- محدودیت زمانی شما تابعی از UNDO است.
کاربرد اصلی
وقتی میخواهید تاریخچهٔ تغییرات یک ردیف را در یک بازه زمانی ببینید:
- چند بار تغییر کرده؟
- عملیات چه بوده؟ (
I,U,D) - تغییرات چه زمانی رخ داده؟
مثال عملی
SELECT versions_starttime,
versions_endtime,
versions_xid,
versions_operation,
emp_id,
salary
FROM employees
VERSIONS BETWEEN TIMESTAMP
(SYSTIMESTAMP - INTERVAL '1' HOUR)
AND SYSTIMESTAMP
WHERE emp_id = 1;
خروجی چه میگوید؟
VERSIONS_OPERATION: نوع تغییرVERSIONS_XID: شناسه تراکنش (برای ردیابی دقیقتر)
کاربرد اصلی
برای اینکه بفهمید:
- چه تراکنشی داده را خراب کرده؟
- چطور میشود تغییر را با SQL معکوس برگرداند؟
مثال
فرض کنید میخواهید تراکنشهای مرتبط را ببینید:
SELECT xid,
start_scn,
commit_scn,
operation,
logon_user,
undo_sql
FROM flashback_transaction_query
WHERE table_name = 'EMPLOYEES';
ستون طلایی اینجا UNDO_SQL است:
Oracle گاهی SQL معکوس را پیشنهاد میدهد تا بتوانید تغییر را منطقی برگردانید (با بررسی و احتیاط).
کاربرد اصلی
وقتی یک جدول با DELETE یا UPDATE اشتباه، «کلاً» خراب شده و میخواهید آن را به قبل برگردانید.
پیشنیاز مهم: فعال کردن Row Movement
ALTER TABLE employees ENABLE ROW MOVEMENT;
مثال عملی
اگر کسی زده باشد:
DELETE FROM employees;
COMMIT;
و شما میخواهید جدول را به ۵ دقیقه قبل برگردانید:
FLASHBACK TABLE employees
TO TIMESTAMP (SYSTIMESTAMP - INTERVAL '5' MINUTE);
نکته مهم
- Flashback Table روی کل جدول اثر میگذارد.
- باید Undo کافی وجود داشته باشد، وگرنه ممکن است خطا بدهد (مثل ORA-01555).
کاربرد اصلی
اگر جدول را اشتباهی Drop کردهاید و PURGE نزدهاید، معمولاً میتوانید آن را از Recycle Bin برگردانید.
مثال
DROP TABLE orders;
بازیابی:
FLASHBACK TABLE orders TO BEFORE DROP;
بررسی Recycle Bin
SELECT object_name, original_name, droptime
FROM recyclebin;
محدودیت مهم
اگر این کار انجام شده باشد، دیگر برگشت ندارد:
DROP TABLE orders PURGE;
کاربرد اصلی
وقتی مشکل فقط یک جدول نیست؛ مثلاً:
- release خراب deploy شده
- چندین جدول و داده درگیر شدهاند
- batch اشتباه روی دیتابیس اجرا شده
- نیاز دارید سریع کل دیتابیس را به قبل از حادثه برگردانید
پیشنیازها
- دیتابیس در ARCHIVELOG باشد
- FRA تنظیم شده باشد
- Flashback Database فعال باشد
فعالسازی این ویژگی (مثال)
ALTER SYSTEM SET db_recovery_file_dest_size = 20G;
ALTER SYSTEM SET db_recovery_file_dest = '/u01/app/oracle/fra';
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE FLASHBACK ON;
ALTER DATABASE OPEN;
بررسی وضعیت:
SELECT flashback_on FROM v$database;
انجام Flashback Database
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
FLASHBACK DATABASE TO TIMESTAMP (SYSTIMESTAMP - INTERVAL '30' MINUTE);
ALTER DATABASE OPEN RESETLOGS;
RESETLOGSمعمولاً لازم است، پس باید روی strategy بکاپ بعد از آن هم فکر کنید.
چرا مهم است؟
قبل از تغییرات بزرگ، یک نقطه امن میسازید تا اگر release خراب شد، سریع برگردید.
Restore Point معمولی
CREATE RESTORE POINT before_release;
Guaranteed Restore Point (پیشنهاد برای تغییرات حساس)
CREATE RESTORE POINT before_release GUARANTEE FLASHBACK DATABASE;
بازگشت:
STARTUP MOUNT;
FLASHBACK DATABASE TO RESTORE POINT before_release;
ALTER DATABASE OPEN RESETLOGS;
نکته: Guaranteed Restore Point میتواند فضای FRA را زیاد مصرف کند.
یک سناریوی واقعی: بازیابی رکورد حذف شده بدون برگشت کل جدول
فرض کنید فقط یک مشتری حذف شده و نمیخواهید کل جدول را flashback کنید.
- پیدا کردن رکورد در گذشته:
SELECT *
FROM customers
AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '15' MINUTE)
WHERE customer_id = 1001;
۲. برگرداندن همان رکورد:
INSERT INTO customers
SELECT *
FROM customers
AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '15' MINUTE)
WHERE customer_id = 1001;
COMMIT;
این روش در عمل یکی از تمیزترین راههاست، چون اثر جانبیاش کم است.
خطاهای رایج Flashback
ORA-01555 (Snapshot too old)
معمولاً یعنی Undo کافی نیست یا نسخههای قدیمی overwrite شدهاند.
راهکارهای رایج:
- افزایش سایز Undo Tablespace
- تنظیم منطقی
UNDO_RETENTION - جلوگیری از فشار بیش از حد روی Undo در ساعات حساس
تفاوت Flashback با Backup/Restore
- Flashback برای بازگشت سریع در خطاهای منطقی عالی است.
- Backup/Restore برای سناریوهای فاجعه (خرابی دیسک، از دست رفتن فایلها، corruption فیزیکی و …) ضروری است.
نتیجه: Flashback را بهعنوان مکمل استراتژی بکاپ ببینید، نه جایگزین.
سوالات متداول درباره Flashback در اوراکل
Flashback در Oracle مجموعهای از قابلیتها برای مشاهده یا بازیابی دادههای گذشته است.
این فناوری به شما کمک میکند دادههای حذفشده یا تغییرکرده را بدون restore کامل از backup بررسی یا برگردانید.
مهمترین کاربردهای آن شامل بازیابی رکورد حذفشده، برگرداندن جدول Drop شده، مشاهده تاریخچه تغییرات داده و بازگرداندن کل دیتابیس به زمان قبل از خطا است.
Flashback برای بازیابی سریع خطاهای منطقی مثل DELETE یا UPDATE اشتباه استفاده میشود، در حالی که Backup و Restore بیشتر برای خرابیهای جدیتر مثل از دست رفتن فایلهای دیتابیس یا خرابی دیسک کاربرد دارند.
بهصورت خلاصه:
- Flashback: سریعتر، مناسب خطاهای انسانی و منطقی
- Backup/Restore: مناسب خرابی فیزیکی و disaster recovery
بنابراین Flashback جایگزین بکاپ نیست، بلکه یک ابزار مکمل بسیار مهم در Oracle است.
اگر جدول با دستور DROP TABLE حذف شده باشد و با PURGE پاک نشده باشد، معمولاً میتوانید آن را با Flashback Drop بازیابی کنید:
FLASHBACK TABLE table_name TO BEFORE DROP;
مثال:
FLASHBACK TABLE employees TO BEFORE DROP;
اگر جدول در Recycle Bin باشد، این دستور آن را برمیگرداند.
اما اگر با PURGE حذف شده باشد، Flashback Drop دیگر کار نمیکند.
خطای ORA-01555: snapshot too old معمولاً زمانی رخ میدهد که اطلاعات لازم در UNDO دیگر در دسترس نباشد.
این مشکل اغلب به یکی از دلایل زیر ایجاد میشود:
- کوچک بودن Undo Tablespace
- کم بودن مقدار
UNDO_RETENTION - overwrite شدن دادههای Undo به دلیل فشار زیاد روی دیتابیس
برای کاهش این خطا معمولاً باید:
- Undo Tablespace را بزرگتر کنید
UNDO_RETENTIONرا منطقی تنظیم کنید- مصرف Undo را در workloadهای سنگین مدیریت کنید
جمعبندی
Flashback Technology در Oracle یک مجموعه ابزار قدرتمند برای مدیریت اشتباهات انسانی و خطاهای منطقی است. اگر Undo، FRA و سیاستهای نگهداری درست تنظیم شوند، Flashback میتواند زمان بازیابی را از ساعتها به دقیقهها کاهش دهد.
اگر بخواهم یک راهنمای سریع بدهم:
- فقط دیدن داده قدیمی؟ Flashback Query
- دیدن تاریخچه تغییرات؟ Flashback Versions
- پیدا کردن تراکنش و SQL معکوس؟ Flashback Transaction Query
- برگرداندن یک جدول خراب؟ Flashback Table
- بازیابی جدول Drop شده؟ Flashback Drop
- برگشت کل دیتابیس قبل از release خراب؟ Flashback Database + Restore Point
سؤالی درباره این مقاله داری؟
اگر نکتهای در این مقاله برات مبهم بود یا خواستی بیشتر بدونی، همین حالا برام بنویس تا دقیق و صمیمی پاسخت رو بدم — مثل یه گفتوگوی واقعی 💬
برو به صفحه پرسش و پاسخ
دیدگاهتان را بنویسید