ব্যাকআপ এবং রিকভারি (বিপদের বন্ধু)
ধরুন, ভুলবশত একজন ডেভেলপার DELETE FROM users কমান্ড চালিয়ে দিল (WHERE ক্লজ ছাড়াই)।
বা র্যানসামওয়্যার অ্যাটাক করে সব এনক্রিপ্ট করে ফেলল। এখন উপায়?
একমাত্র উপায় হলো Backup। ব্যাকআপ ছাড়া প্রোডাকশন ডেটাবেস চালানো আর হেলমেট ছাড়া হাইওয়েতে বাইক চালানো একই কথা।
১৪.১ ব্যাকআপের ধরণ (Types of Backup)
ব্যাকআপ মূলত দুই প্রকার। পরিস্থিতি বুঝে সিদ্ধান্ত নিতে হয় কোনটি ব্যবহার করবেন।
📄 ১. Logical Backup (SQL Format)
এটি ডেটাবেসের স্ট্রাকচার এবং ডেটাকে CREATE এবং INSERT কমান্ড আকারে সেভ করে।
Tools: mysqldump, mysqlpump, phpMyAdmin export
- ✅ সুবিধা: পোর্টেবল (উইন্ডোজের ব্যাকআপ লিনাক্সে রিস্টোর করা যায়), Human Readable
- ❌ অসুবিধা: বড় ডেটাবেস (১০০ জিবি+) রিস্টোর করা খুব ধীরগতির
💾 ২. Physical Backup (Raw Files)
এটি সরাসরি ডিস্কের ডেটা ফাইল (/var/lib/mysql) কপি করে।
Tools: Percona XtraBackup, MySQL Enterprise Backup
- ✅ সুবিধা: সুপার ফাস্ট ব্যাকআপ এবং রিস্টোর
- ❌ অসুবিধা: একই ভার্সন এবং ওএস হতে হয়
১৪.২ mysqldump (সবচেয়ে জনপ্রিয় টুল)
ছোট থেকে মাঝারি ডেটাবেসের জন্য এটিই স্ট্যান্ডার্ড।
📦 Full Backup:
mysqldump -u root -p mydb > mydb_backup.sql
📋 Single Table Backup:
mysqldump -u root -p mydb users > users_backup.sql
🔥 Senior Tip (Locking এড়াতে):
ডিফল্ট mysqldump টেবিল লক করতে পারে। প্রোডাকশনে লাইভ সাইট যাতে স্লো না হয়, তার জন্য নিচের ফ্ল্যাগগুলো ব্যবহার করুন:
mysqldump -u root -p --single-transaction --quick --routines --triggers mydb > backup.sql
--single-transaction: InnoDB টেবিল লক না করে স্ন্যাপশট নেয় (Consistent Read)--quick: র্যামে লোড না করে সরাসরি ডিস্কে লেখে
১৪.৩ mysqlpump (mysqldump এর বড় ভাই)
এটি mysqldump এর আধুনিক ভার্সন যা প্যারালাল প্রসেসিং সাপোর্ট করে।
# ৪টি থ্রেড ব্যবহার করে ব্যাকআপ
mysqlpump --default-parallelism=4 mydb > backup.sql
✅ মাল্টি-কোর সিপিইউ ব্যবহার করে দ্রুত ব্যাকআপ নেয়।
১৪.৪ Physical Backup: Percona XtraBackup (Enterprise Solution)
বড় এন্টারপ্রাইজ সিস্টেমে (১০০ জিবি - ১ টিবি ডেটা) লজিক্যাল ব্যাকআপ কাজ করে না। সেখানে Percona XtraBackup ব্যবহার করা হয়। এটি Hot Backup নেয়, অর্থাৎ ডেটাবেস শাটডাউন করার দরকার নেই এবং কোনো লক হয় না।
ব্যাকআপ নেওয়ার ধাপ:
# ১. ব্যাকআপ নেওয়া
xtrabackup --backup --target-dir=/data/backups/full
# ২. রিস্টোর করার জন্য প্রস্তুত করা (Prepare)
xtrabackup --prepare --target-dir=/data/backups/full
# ৩. রিস্টোর করা (Data Directory তে কপি করা)
xtrabackup --copy-back --target-dir=/data/backups/full
১৪.৫ Incremental Backup (স্মার্ট ব্যাকআপ)
প্রতিদিন ১০০ জিবি ব্যাকআপ নেওয়া সম্ভব নয়।
রবিবার
ফুল ব্যাকআপ
(১০০ জিবি)
সোমবার
শুধু চেঞ্জ
(৫০০ এমবি)
মঙ্গলবার
শুধু চেঞ্জ
(৩০০ এমবি)
এটি স্টোরেজ বাঁচায় এবং দ্রুত হয়। XtraBackup বা Binary Log দিয়ে এটি করা যায়।
১৪.৬ Point-in-Time Recovery (PITR) — টাইম মেশিন
এটি ডেটাবেস অ্যাডমিনদের জন্য জাদুর কাঠি।
দৃশ্যপট: সকাল ১০:০০ টায় ফুল ব্যাকআপ নেওয়া হয়েছে। সকাল ১০:৩০ এ একজন ডেভেলপার ভুল করে users টেবিল ডিলিট করে দিয়েছে। এখন সময় ১০:৩১। শুধু ব্যাকআপ রিস্টোর করলে ১০:০০ থেকে ১০:৩০ এর মাঝখানের ডেটা হারিয়ে যাবে।
✅ সমাধান (PITR):
আমাদের টার্গেট ১০:২৯:৫৯ সময়ে ফিরে যাওয়া। এর জন্য Binary Log এনাবল থাকতে হবে।
কনফিগারেশন (my.cnf):
log_bin = mysql-bin
binlog_format = ROW
রিকভারি প্রসেস:
- সর্বশেষ ফুল ব্যাকআপ রিস্টোর করুন
- ১০:০০ থেকে ১০:২৯:৫৯ পর্যন্ত বাইনারি লগ অ্যাপ্লাই করুন
mysqlbinlog
--start-datetime="2025-01-28 10:00:00" --stop-datetime="2025-01-28 10:29:59" /var/lib/mysql/mysql-bin.000123 | mysql -u root -p
এতে আপনি একদম সেকেন্ড ধরে ডেটা ফিরিয়ে আনতে পারবেন।
১৪.৭ Backup Rotation & Strategy (The 3-2-1 Rule)
একজন প্রফেশনাল আর্কিটেক্ট 3-2-1 Rule মেনে চলেন:
৩
টি কপি ডেটা থাকবে
(১টি প্রাইমারি, ২টি ব্যাকআপ)
২
টি ভিন্ন মিডিয়াতে
(লোকাল ডিস্ক + ক্লাউড)
১
টি কপি অফসাইট
(অন্য লোকেশনে)
🤖 অটোমেশন স্ক্রিপ্ট (Cron Job):
# প্রতিদিন রাত ২টায় ব্যাকআপ
0 2 * * * mysqldump -u root -p'pass' mydb | gzip > /backups/db_$(date +%F).sql.gz
১৪.৮ Backup Encryption (নিরাপত্তা)
ব্যাকআপ ফাইলে সব ইউজার ডেটা থাকে। এটি লিক হলে সর্বনাশ। তাই ব্যাকআপ এনক্রিপ্ট করা বাধ্যতামূলক।
OpenSSL দিয়ে এনক্রিপশন:
mysqldump mydb | gzip | openssl aes-256-cbc -a -salt -out backup.sql.enc -k 'SecretPass'
১৪.৯ Backup Testing (Schrödinger's Backup)
💡 আইটিতে একটি কথা আছে: "Untested backup is no backup."
আপনি বছরের পর বছর ব্যাকআপ নিলেন, কিন্তু যেদিন রিস্টোর করতে গেলেন দেখলেন ফাইল করাপ্টেড। তখন?
✅ বেস্ট প্র্যাকটিস: মাসে অন্তত একবার প্রোডাকশন ব্যাকআপ নিয়ে একটি স্টেজিং সার্ভারে রিস্টোর করে চেক করুন সব টেবিল এবং ডেটা ঠিক আছে কি না।
১৪.১০ Cloud Strategy (AWS/DigitalOcean)
আপনি যদি ক্লাউড ব্যবহার করেন, জীবন অনেক সহজ।
☁️ AWS RDS
অটোমেটিক স্ন্যাপশট নেয়। আপনি কনসোল থেকে ১ ক্লিকে নির্দিষ্ট টাইমে রিস্টোর করতে পারেন।
📦 S3 Upload
লোকাল সার্ভার থেকে ব্যাকআপ নিয়ে aws s3 cp কমান্ড দিয়ে আমাজন S3 তে পাঠিয়ে দিন। এটি নিরাপদ এবং সস্তা।
❓ Interview Q&A
Q: RPO এবং RTO কী?
RPO (Recovery Point Objective): ক্র্যাশ করলে সর্বোচ্চ কতটুকু ডেটা হারানো মেনে নেওয়া যায়? (যেমন: গত ৫ মিনিটের ডেটা)
RTO (Recovery Time Objective): সার্ভিস আবার আপ করতে কত সময় লাগবে? (যেমন: ১ ঘণ্টার মধ্যে সাইট আপ হতে হবে)
Q: mysqldump চলার সময় কি ওয়েবসাইট ডাউন থাকে?
যদি --single-transaction ফ্ল্যাগ ব্যবহার করা হয় (InnoDB এর জন্য), তবে ডাউন থাকে না। কিন্তু MyISAM হলে টেবিল লক হয়, তখন সাইট স্লো হতে পারে।
🎯 অধ্যায় ১৪ এর সারাংশ (Summary)
এই অধ্যায়ে আমরা শিখলাম:
- ✓Logical Backup: mysqldump, mysqlpump - পোর্টেবল কিন্তু ধীর
- ✓Physical Backup: Percona XtraBackup - ফাস্ট কিন্তু OS নির্ভর
- ✓Point-in-Time Recovery: Binary Log ব্যবহার করে সেকেন্ড নির্ভুল রিকভারি
- ✓3-2-1 Rule: ৩ কপি, ২ মিডিয়া, ১ অফসাইট
- ✓Best Practice: ব্যাকআপ এনক্রিপ্ট করা এবং নিয়মিত টেস্ট করা জরুরি
✨ মনে রাখবেন: "A backup without a restore is just a file." - শুধু ব্যাকআপ নিলেই হবে না, সেটা রিস্টোর করে দেখতে হবে কাজ করে কি না!