Skip to content
VDS · ডেটাবেস

ডেটাবেস ব্যাকআপ

MySQL এবং PostgreSQL ডাম্প কীভাবে শিডিউল করবেন, মেশিনের বাইরে সরাবেন এবং ব্যাকআপ সত্যিই রিস্টোর হয় কিনা যাচাই করবেন।

আপডেট: ২৩ আগস্ট, ২০২৬

VPS-এর সাথে স্বয়ংক্রিয় মেশিন ব্যাকআপ বা স্টেট স্ন্যাপশট আসে না: আপনি নিজে যা কপি করেননি, তা একটিমাত্র ইনস্ট্যান্সে থাকে। ডেটাবেস ডাম্পই প্রথম জিনিস যা আপনার সেট আপ করা উচিত, কারণ ডেটা পুনরুদ্ধার করার আর কোনো জায়গা নেই, অথচ সাইটটি শূন্য থেকে আবার ডিপ্লয় করা যায়।

ম্যানুয়াল ডাম্প

PostgreSQL:

pg_dump -Fc -U shop -h 127.0.0.1 shop > /srv/backups/shop-$(date +%F).dump
pg_dumpall -U postgres --roles-only > /srv/backups/roles.sql

MySQL এবং MariaDB:

mysqldump --single-transaction --quick --routines --events \
  -u root shop | gzip > /srv/backups/shop-$(date +%F).sql.gz

--single-transaction টেবিল লক না করেই একটি সামঞ্জস্যপূর্ণ InnoDB ডাম্প নেয় — এটি ছাড়া এক্সপোর্টের সময় আপনার সাইট আটকে যাবে। PostgreSQL-এর -Fc ফরম্যাট কমপ্রেসড এবং এটি দিয়ে আলাদা আলাদা টেবিল পুনরুদ্ধার করা যায়।

কমান্ড লাইনে পাসওয়ার্ড দেবেন না: 600 পারমিশনসহ ~/.pgpass বা ~/.my.cnf তৈরি করুন।

শিডিউল করা

mkdir -p /srv/backups && chmod 700 /srv/backups
crontab -e
20 3 * * * /usr/local/bin/db-backup.sh >> /var/log/db-backup.log 2>&1

/usr/local/bin/db-backup.sh স্ক্রিপ্ট:

#!/bin/bash
set -euo pipefail
DEST=/srv/backups
STAMP=$(date +%F-%H%M)
pg_dump -Fc -U shop -h 127.0.0.1 shop > "$DEST/shop-$STAMP.dump.tmp"
mv "$DEST/shop-$STAMP.dump.tmp" "$DEST/shop-$STAMP.dump"
find "$DEST" -name '*.dump' -mtime +14 -delete

একটি টেম্পোরারি ফাইলে লিখে তারপর নাম পরিবর্তন করা গুরুত্বপূর্ণ: ডাম্প যদি বাধাগ্রস্ত হয়, তাহলে কাটা পড়া ফাইলকে আপনি সম্পূর্ণ ব্যাকআপ ভাববেন না। set -euo pipefail প্রথম ত্রুটিতেই স্ক্রিপ্ট থামায়, চুপচাপ চালিয়ে যায় না।

ব্যাকআপ মেশিনের বাইরে সরান

একই ডিস্কে থাকা কপি মাইগ্রেশনের ভুল, র‍্যানসমওয়্যার, বা “Access” ট্যাবে OS পুনরায় ইনস্টল করার থেকে আপনাকে বাঁচাবে না। ডাম্প অফসাইটে পাঠান:

rsync -az --delete /srv/backups/ backup@other-host:/store/vds/

অথবা rclone-এর মাধ্যমে যেকোনো S3-সামঞ্জস্যপূর্ণ স্টোরেজে। মনে রাখবেন ব্যান্ডউইথ সর্বোচ্চ 500 Mbit/s এবং প্রতি টিয়ারে ডিস্ক রাইটের সীমা: প্রতি কোর 60 MB/s।

পুনরুদ্ধার যাচাই

যে ব্যাকআপ আপনি কখনো পুনরুদ্ধার করেননি, তা ব্যাকআপ নয়।

createdb -U postgres shop_check
pg_restore -U postgres -d shop_check /srv/backups/shop-2026-08-23.dump
psql -U postgres -d shop_check -c "SELECT count(*) FROM users;"
dropdb -U postgres shop_check

MySQL-এর জন্য: gunzip -c dump.sql.gz | mysql -u root shop_check।

মাসে একবার এটি করুন এবং যাচাইয়ের তারিখ লিখে রাখুন।

সাধারণ ভুল

লক্ষণকারণ
ডাম্প মাত্র কয়েক কিলোবাইটস্ক্রিপ্ট অথেনটিকেশনে ব্যর্থ হয়েছে, আর ত্রুটিটি /dev/null-এ গেছে
ডিস্ক স্পেস শেষ হয়ে গেছেmtime অনুযায়ী পুরোনো ব্যাকআপ মুছে ফেলা হয়নি
পারমিশনে পুনরুদ্ধার ব্যর্থ হয়রোল ডাম্প করা হয়নি — আপনার --roles-only দরকার
Cron চুপ, কোনো ব্যাকআপ নেইCron-এ আপনার PATH নেই — অ্যাবসোলিউট পাথ ব্যবহার করুন
রাতে সাইট ধীর হয়ে যায়ডাম্প ডিস্কের জন্য প্রতিযোগিতা করে — সময় সরান, --quick যোগ করুন

আলাদা লোকেশনে অন্তত দুটি কপি রাখুন এবং ডাম্পের সাইজ মনিটর করুন: সাইজ হঠাৎ কমে গেলে বুঝবেন পুরো ডেটাবেস ডাম্প হয়নি।