Oracle Flashback: পুরো Restore ছাড়াই মানুষের ভুল থেকে রিকভারি
কেউ একজন WHERE clause ছাড়াই একটি UPDATE চালিয়ে দিল। একজন ডেভেলপার ভুল টেবিলটি drop করে ফেলল। একটি batch job গত বছরের বদলে গত মাসের ডেটা delete করে ফেলল। এই প্রতিটি মুহূর্তে প্রশ্নটি একই: কত দ্রুত আমরা ডেটা ফিরিয়ে আনতে পারি? ব্যাকআপ থেকে একটি পুরো restore ঘণ্টার পর ঘণ্টা নিতে পারে এবং ব্যাকআপের পর হওয়া সবকিছু হারিয়ে ফেলে। Oracle Flashback প্রায়ই একই ভুল মিনিটের মধ্যে ঠিক করে ফেলে, কোনো restore ছাড়াই - যদি ডেটাবেজটি এর জন্য প্রস্তুত থাকে। এই গাইডে পুরো Flashback পরিবার, কখন কোনটি ব্যবহার করবেন, এবং দুর্ঘটনা ঘটার আগে যে পূর্বশর্তগুলো আপনার জায়গামতো রাখতে হবে তা নিয়ে আলোচনা করা হয়েছে।
মূল কথাগুলো
- Oracle Flashback হলো ফিচারের একটি পরিবার যা undo data ও flashback logs ব্যবহার করে ডেটাকে আগের একটি অবস্থায় ফিরিয়ে নেয় - ব্যাকআপ থেকে restore করার চেয়ে অনেক দ্রুত।
- Flashback Query (AS OF) একটি টেবিল অতীতের কোনো সময়ে যেমন ছিল তেমন পড়ে দেখায়; Flashback Table টেবিলের সারিগুলোকে ওই বিন্দুতে ফিরিয়ে নেয়।
- Flashback Drop ভুলে drop করা একটি টেবিল recycle bin থেকে ফিরিয়ে আনে - bin খালি (purge) করার আগ পর্যন্ত অবজেক্টটি আসলে delete হয় না, শুধু নাম বদলে রাখা হয়।
- Flashback Database পুরো ডেটাবেজকে অতীতের একটি SCN বা সময়ে ফিরিয়ে নেয় - একটি ব্যর্থ release-এর জন্য শক্তিশালী, তবে ওই বিন্দুর পরের সব পরিবর্তন বাতিল করে দেয়।
- এটি জাদু নয়: Flashback Query ও Table নির্ভর করে undo এখনও ধরে রাখা আছে কিনা তার উপর, এবং Flashback Database আগে থেকেই একটি Fast Recovery Area দিয়ে চালু রাখতে হয়।
- প্রয়োজন হওয়ার আগেই undo retention, একটি Fast Recovery Area, এবং flashback চালু করে রাখুন - ভুলের আগে কনফিগার করা থাকলেই কেবল Flashback আপনাকে সাহায্য করবে।
১. মানুষের ভুলের ক্ষেত্রে কেন Flashback একটি Restore-কে হারিয়ে দেয়
ব্যাকআপ থাকে দুর্যোগের জন্য - একটি হারানো ডিস্ক, একটি নষ্ট datafile, একটি ধ্বংস হওয়া সার্ভার। কিন্তু সবচেয়ে সাধারণ ডেটা হারানো কোনো দুর্যোগ নয়; এটি একজন মানুষের একটি সুস্থ ডেটাবেজে ভুল করা। তার জন্য একটি পুরো restore ভুল টুল: এটি ধীর, সাধারণত ব্যাকআপের পর হওয়া প্রতিটি transaction হারিয়ে ফেলে, এবং প্রায়ই পুরো ডেটাবেজ বন্ধ করে দিতে হয়।
Flashback ঠিক এই পরিস্থিতির জন্যই তৈরি। এটি Oracle ইতিমধ্যে রেখে দিচ্ছে এমন ডেটা - undo information এবং, পুরো-ডেটাবেজ rewind-এর জন্য, flashback logs - ব্যবহার করে ডেটাকে ভুলের ঠিক আগের অবস্থায় ফিরিয়ে নেয়। এটি সূক্ষ্ম, দ্রুত, এবং অনেক ক্ষেত্রে অন্য ব্যবহারকারীদের একদমই বিঘ্নিত করে না।
২. এক নজরে Flashback পরিবার
"Flashback" একটি ফিচার নয়। এটি বেশ কয়েকটি, প্রতিটি ভিন্ন পরিসরের সমস্যা সমাধান করে:
- Flashback Query - একটি টেবিল অতীতের কোনো সময়ে যেমন ছিল তেমন দেখুন (শুধু পড়ার জন্য)।
- Flashback Versions Query - দুটি সময়ের মধ্যে একটি সারির প্রতিটি সংস্করণ দেখুন।
- Flashback Transaction Query - একটি transaction ঠিক কী পরিবর্তন করেছে তা দেখুন, এবং সেগুলো undo করার SQL।
- Flashback Table - একটি টেবিলের বিষয়বস্তু জায়গামতোই অতীতের একটি সময়ে ফিরিয়ে নিন।
- Flashback Drop - drop করে ফেলা একটি টেবিল recycle bin থেকে ফিরিয়ে আনুন।
- Flashback Database - পুরো ডেটাবেজকে অতীতের একটি বিন্দুতে ফিরিয়ে নিন।
প্রথম চারটি undo-এর উপর নির্ভর করে। Flashback Drop recycle bin-এর উপর নির্ভর করে। Flashback Database flashback logs-এর উপর নির্ভর করে। প্রতিটি কোন কৌশল ব্যবহার করে তা জানলেই বুঝবেন আগে থেকে আপনাকে কী কনফিগার করে রাখতে হবে।
৩. Flashback Query ও Versions - অতীত দেখুন, তারপর ঠিক করুন
কেউ সারি নষ্ট করে ফেললে আপনার প্রথম কাজ হলো ডেটা আগে কেমন ছিল তা দেখা। Flashback Query AS OF clause দিয়ে এটি করে - যথেষ্ট undo ধরে রাখা থাকা ছাড়া বিশেষ কোনো সেটআপ ছাড়াই।
-- See the SALARIES table as it looked 30 minutes ago
SELECT * FROM employees
AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '30' MINUTE)
WHERE department_id = 50;
-- Recover just the affected rows back into the current table
INSERT INTO employees
SELECT * FROM employees
AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '30' MINUTE) e
WHERE e.department_id = 50
AND e.employee_id NOT IN (SELECT employee_id FROM employees);
Flashback Versions Query আরও এগিয়ে গিয়ে সময়ের সাথে একটি সারির ইতিহাস দেখায়, যা যখন আপনাকে প্রমাণ করতে হয় কী পরিবর্তন হয়েছে এবং কখন তখন অমূল্য:
SELECT employee_id, salary,
VERSIONS_STARTTIME, VERSIONS_ENDTIME, VERSIONS_OPERATION
FROM employees
VERSIONS BETWEEN TIMESTAMP
(SYSTIMESTAMP - INTERVAL '1' HOUR) AND SYSTIMESTAMP
WHERE employee_id = 101;
৪. Flashback Table - পুরো টেবিল জায়গামতোই ফিরিয়ে নিন
ক্ষতি যখন একটি টেবিল জুড়ে ছড়িয়ে থাকে এবং আপনি শুধু এটিকে আগের অবস্থায় ফিরিয়ে আনতে চান, Flashback Table restore ছাড়াই সারিগুলো জায়গামতোই ফিরিয়ে নেয়।
-- Row movement must be enabled on the table first
ALTER TABLE employees ENABLE ROW MOVEMENT;
-- Rewind the table to a timestamp before the bad change
FLASHBACK TABLE employees
TO TIMESTAMP (SYSTIMESTAMP - INTERVAL '45' MINUTE);
এটি transactional এবং আপনি বেশি পেছনে চলে গেলে এটি undo করা যায়। সমস্যাটি হলো এটি নির্ভর করে ওই সময়ের জন্য undo এখনও উপলব্ধ থাকার উপর - এই কারণেই undo retention গুরুত্বপূর্ণ (দেখুন সেকশন ৬)।
৫. Flashback Drop - Recycle Bin আপনাকে বাঁচায়
একটি টেবিল drop করা হলে Oracle তাৎক্ষণিকভাবে এটি ধ্বংস করে না। আপনি PURGE দিয়ে drop না করলে অবজেক্টটির নাম বদলে recycle bin-এ রেখে দেওয়া হয়, এবং আপনি এটিকে সরাসরি ফিরিয়ে আনতে পারেন।
-- What is in the recycle bin?
SELECT object_name, original_name, droptime FROM recyclebin;
-- Bring the table back under its original name
FLASHBACK TABLE employees TO BEFORE DROP;
-- If a new object now uses that name, restore under a different one
FLASHBACK TABLE employees TO BEFORE DROP RENAME TO employees_restored;
দুটি বিষয় মনে রাখবেন। একটি DROP TABLE ... PURGE recycle bin পুরোপুরি এড়িয়ে যায় - ফিরিয়ে আনার মতো কিছুই থাকে না। আর recycle bin হলো tablespace-এর জায়গা; জায়গার চাপ পড়লে Oracle স্বয়ংক্রিয়ভাবে এটি খালি করে ফেলবে, তাই একটি drop করা টেবিল চিরকাল অপেক্ষা করবে ধরে না নিয়ে দ্রুত রিকভার করুন।
৬. Flashback Database - পুরো ডেটাবেজ ফিরিয়ে নিন
সবচেয়ে ভারী হাতুড়িটি হলো Flashback Database, যা পুরো ডেটাবেজকে অতীতের একটি SCN বা সময়ে ফিরিয়ে নেয়। একটি release deployment ভুল হয়ে গেলে এবং পরিবর্তনের ঠিক আগে ডেটাবেজটি যেমন ছিল ঠিক তেমন আপনার দরকার হলে - বহু-ঘণ্টার restore-এর বদলে মিনিটের মধ্যে - এই ফিচারটিই আপনি চান।
-- Prerequisites: Fast Recovery Area + flashback enabled (see below)
-- Then, to rewind:
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
FLASHBACK DATABASE TO TIMESTAMP
(SYSTIMESTAMP - INTERVAL '20' MINUTE);
-- Open read-only first to verify you rewound to the right point
ALTER DATABASE OPEN READ ONLY;
-- If correct, open for real (resetlogs)
SHUTDOWN IMMEDIATE; STARTUP MOUNT;
ALTER DATABASE OPEN RESETLOGS;
এর বিনিময়টি চূড়ান্ত: Flashback Database আপনি যে বিন্দুতে ফিরে যান তার পরের প্রতিটি পরিবর্তন বাতিল করে দেয়। একটি নিয়ন্ত্রিত সিস্টেমে একটি খারাপ batch upgrade ফিরিয়ে আনার জন্য এটি নিখুঁত, আর সবাই যখন কাজ চালিয়ে যাচ্ছে তখন একজন ব্যবহারকারীর ভুল ঠিক করার জন্য ভুল। একটি সাধারণ পেশাদার প্যাটার্ন হলো ঝুঁকিপূর্ণ পরিবর্তনের ঠিক আগে একটি guaranteed restore point নেওয়া, তারপর প্রয়োজনে সেটিতে flash back করা। এটি একটি নিরাপদ upgrade runbook-এর একটি মূল অংশ।
৭. যে পূর্বশর্তগুলো আপনাকে আগে থেকে সেট করে রাখতে হবে
দুর্ঘটনার আগে প্রস্তুত থাকলেই কেবল Flashback সাহায্য করে। এগুলো এখনই জায়গামতো রাখুন:
- Undo retention: Flashback Query, Versions ও Table কেবল ততটুকু পেছনে পৌঁছাতে পারে যতটুকু undo ধরে রাখা আছে। একটি বাস্তবসম্মত রিকভারি উইন্ডো কভার করতে
UNDO_RETENTIONসেট করুন এবং তা মানার মতো করে undo tablespace-এর আকার দিন। - Recycle bin চালু: এটি ডিফল্টভাবে চালু থাকে; শুধু নিশ্চিত করুন কেউ যেন অভ্যাসবশত
DROP ... PURGEস্ক্রিপ্ট না করে। - Fast Recovery Area + Flashback Database: এগুলো আগে থেকেই চালু রাখতে হবে - ঘটনার পরে এগুলো চালু করে চালু করার আগের কোনো সময়ে ফিরে যাওয়া যায় না।
-- Enable Flashback Database (needs a Fast Recovery Area configured)
ALTER SYSTEM SET db_recovery_file_dest_size = 100G;
ALTER SYSTEM SET db_recovery_file_dest = '/u02/fra';
ALTER DATABASE FLASHBACK ON;
-- Confirm and check how far back you can currently go
SELECT flashback_on FROM v$database;
SELECT oldest_flashback_scn, oldest_flashback_time
FROM v$flashback_database_log;
৮. সীমাবদ্ধতা ও সৎ সতর্কতা
Flashback শক্তিশালী কিন্তু সীমাহীন নয়। ওই সময়ের undo ইতিমধ্যে মুছে যাওয়া থাকলে Flashback Query ও Table ORA-01555 বা ORA-08180 দিয়ে ব্যর্থ হয় - তাই আগামী সপ্তাহে ধরা পড়া একটি ভুল undo উইন্ডোর বাইরে চলে যেতে পারে। Flashback Database Fast Recovery Area-এর জায়গা খরচ করে এবং একটি ছোট চলমান write ওভারহেড যোগ করে। আর truncate ও কাঠামোগত পরিবর্তনের মতো DDL সাধারণ DML থেকে ভিন্নভাবে আচরণ করে। Flashback একটি চমৎকার প্রথম সাড়াদানকারী, তবে সত্যিকারের দুর্যোগের জন্য একটি পরীক্ষিত RMAN backup strategy আপনার নিরাপত্তা জাল হিসেবে থেকে যায়, যেমনটি রাত ৩টায় ডেটাবেজ ফেল করলে কী করবেন লেখায় আলোচনা করা হয়েছে।
৯. একটি বাস্তব রক্ষা: মাস-শেষে একটি ভুল UPDATE
ব্যস্ত মাস-শেষ ক্লোজিংয়ের সময়, একজন অপারেটর WHERE clause ছাড়াই একটি price-correction UPDATE চালিয়ে দিলেন এবং একটি লাইভ billing টেবিলে হাজার হাজার সারি বদলে ফেললেন। ব্যাকআপ থেকে restore করলে সবচেয়ে খারাপ সপ্তাহটিতে সিস্টেমটি ঘণ্টার পর ঘণ্টা বন্ধ থাকত।
আমরা যা করেছি: নিশ্চিত করলাম undo retention স্বচ্ছন্দে শেষ এক ঘণ্টা কভার করছে, Flashback Versions Query ব্যবহার করে ফিন্যান্সকে ঠিক কোন সারিগুলো এবং কীসে বদলেছে তা দেখালাম, তারপর Flashback Query ব্যবহার করে সঠিক মানগুলো পুনঃস্থাপন করলাম - সবই বাকি অ্যাপ্লিকেশন চালু থাকা অবস্থায়। ডেটা ঠিক করতে মোট সময়: পনেরো মিনিটেরও কম, অডিটের জন্য একটি স্পষ্ট আগে-ও-পরের রেকর্ডসহ। ওই ফলাফল কেবল সম্ভব হয়েছিল কারণ undo retention আগে থেকেই ইচ্ছাকৃতভাবে আকার দেওয়া হয়েছিল - প্রতিটি Flashback গল্পের মূল সুর।
সাধারণ জিজ্ঞাসা (FAQ)
Oracle Flashback কী এবং একটি restore থেকে এটি কীভাবে আলাদা?
Flashback হলো ফিচারের একটি পরিবার যা ব্যাকআপ থেকে ফাইল restore করার বদলে undo data ও flashback logs ব্যবহার করে ডেটাকে আগের একটি অবস্থায় ফিরিয়ে নেয়। মানুষের ভুলের জন্য - একটি ভুল UPDATE, DELETE বা DROP - এটি অনেক দ্রুত এবং প্রায়ই কোনো ডাউনটাইম লাগে না, যেখানে restore ধীর এবং ব্যাকআপের পর হওয়া পরিবর্তনগুলো হারিয়ে ফেলে।
আমি কি ভুলে DROP করে ফেলা একটি টেবিল ফিরিয়ে আনতে পারব?
সাধারণত হ্যাঁ। যদি PURGE দিয়ে drop করা না হয়ে থাকে, Oracle অবজেক্টটিকে recycle bin-এ রেখে দেয়, এবং FLASHBACK TABLE ... TO BEFORE DROP এটি ফিরিয়ে আনে। দ্রুত রিকভার করুন, কারণ tablespace-এ জায়গার চাপ পড়লে recycle bin স্বয়ংক্রিয়ভাবে খালি করে ফেলা হয়।
Flashback Query কত পেছন পর্যন্ত যেতে পারে?
যতক্ষণ undo এখনও ধরে রাখা আছে ততটুকুই। Flashback Query, Versions Query ও Flashback Table সবই undo পড়ে, তাই UNDO_RETENTION এবং undo tablespace ছোট হলে পৌঁছানোর মতো সময়সীমাও ছোট হয়। undo মুছে যাওয়া থাকলে আপনি ORA-01555 পাবেন। আপনি যে রিকভারি উইন্ডো চান তার জন্য undo ইচ্ছাকৃতভাবে আকার দিন।
Flashback Database কী করে, আর এর সমস্যাটি কী?
Flashback Database পুরো ডেটাবেজকে অতীতের একটি SCN বা সময়ে মিনিটের মধ্যে ফিরিয়ে নেয় - একটি ব্যর্থ release ফিরিয়ে আনার জন্য আদর্শ। সমস্যাটি হলো এটি ওই বিন্দুর পরে হওয়া প্রতিটি পরিবর্তন বাতিল করে দেয়, তাই এটি নিয়ন্ত্রিত, পুরো-সিস্টেম rollback-এর জন্য উপযুক্ত, একজন ব্যবহারকারীর ভুল সংশোধনের জন্য নয় যখন অন্যরা কাজ চালিয়ে যাচ্ছে। এটি আগে থেকেই একটি Fast Recovery Area দিয়ে চালু রাখতে হয়।
Flashback কাজ করার আগে আমাকে কি কিছু কনফিগার করতে হবে?
হ্যাঁ। Flashback Query ও Table-এর জন্য যথেষ্ট undo retention দরকার; Flashback Drop-এর জন্য recycle bin চালু রাখা উচিত; এবং Flashback Database-এর জন্য আগে থেকেই ALTER DATABASE FLASHBACK ON সেট করা একটি Fast Recovery Area দরকার। Flashback Database চালু করার আগের কোনো সময়ে আপনি ফিরে যেতে পারবেন না।
🔄 ডেটা হারিয়েছেন বা ঝুঁকিপূর্ণ পরিবর্তনের পরিকল্পনা করছেন?
আমি Flashback ও undo সঠিকভাবে সেট করি, deployment-এর আগে guaranteed restore point তৈরি করি, এবং মানুষের ভুল থেকে দ্রুত রিকভার করি। বাংলাদেশ ও বিশ্বজুড়ে ক্লায়েন্ট।
তথ্যসূত্র ও আরও পড়ুন
- 📄 Oracle Database Development Guide - Flashback Query and Versions
- 📄 Oracle Backup and Recovery User's Guide - Flashback Database
এই লেখার পদ্ধতি ও কেস স্টাডিগুলো ম্যানুফ্যাকচারিং, ব্যাংকিং ও ফার্মাসিউটিক্যাল পরিবেশে ১৮+ বছরের Oracle প্রোডাকশন ডেটাবেজ অ্যাডমিনিস্ট্রেশনের অভিজ্ঞতার উপর ভিত্তি করে তৈরি।
