Skip to content
VDS · قواعد البيانات

النسخ الاحتياطية لقاعدة البيانات

كيفية جدولة نسخ 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 دون قفل الجداول — وبدونه سيتعطل موقعك أثناء التصدير. صيغة -Fc في PostgreSQL مضغوطة وتتيح لك استعادة الجداول فرديًا.

لا تضع كلمات المرور على سطر الأوامر: أنشئ ~/.pgpass أو ~/.my.cnf بصلاحيات 600.

التفريغ المجدول

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». أرسل التفريغات إلى موقع خارجي:

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

أو إلى أي تخزين متوافق مع S3 عبر rclone. ضع في الحسبان عرض النطاق الذي يصل إلى 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

احتفظ بنسختين على الأقل في موقعين مختلفين وراقب حجم التفريغ: الانخفاض الحاد في الحجم يعني أن قاعدة البيانات لم تُفرَّغ كاملة.