ڈیٹا بیس بیک اپس
MySQL اور PostgreSQL ڈمپس کا شیڈول کیسے بنائیں، انہیں مشین سے باہر کیسے منتقل کریں، اور تصدیق کریں کہ بیک اپ واقعی ری اسٹور ہوتا ہے۔
اپ ڈیٹ 23 اگست، 2026
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 شامل کریں |
مختلف مقامات پر کم از کم دو کاپیاں رکھیں اور ڈمپ کے سائز کی نگرانی کریں: سائز میں تیزی سے کمی کا مطلب ہے کہ پورا ڈیٹا بیس ڈمپ نہیں ہوا۔