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

mysqldump يومياً مو كافي. Incremental backup، point-in-time recovery، واختبار دوري. نشرح الاستراتيجية الكاملة.
لماذا النسخ الاحتياطي ضرورة وليس خيار؟
فقدان البيانات يحدث أكثر مما تتوقع. خطأ بشري في استعلام DELETE بدون WHERE، فساد في القرص، هجمة فدية، أو حتى تحديث فاشل. بدون نسخ احتياطي موثوق ومختبر، أي من هذه السيناريوهات تعني كارثة قد تنهي عملك.
الإحصائيات واضحة: 60% من الشركات الصغيرة التي تفقد بياناتها تغلق خلال 6 أشهر. النسخ الاحتياطي ليس تكلفة إضافية، هو تأمين على استمرارية عملك.
أنواع النسخ الاحتياطي
1. النسخ الكامل (Full Backup)
نسخة كاملة من كل البيانات في كل مرة.
المميزات: استعادة سريعة ومباشرة. ملف واحد يحتوي كل شيء. العيوب: يستهلك مساحة كبيرة ووقت طويل. غير عملي يوميا لقواعد البيانات الكبيرة.
2. النسخ التفاضلي (Differential Backup)
ينسخ فقط التغييرات منذ آخر نسخة كاملة.
المميزات: أسرع من النسخ الكامل. استعادة تحتاج ملفين فقط (كامل + تفاضلي). العيوب: الحجم يزداد كل يوم حتى النسخة الكاملة التالية.
3. النسخ التزايدي (Incremental Backup)
ينسخ فقط التغييرات منذ آخر نسخة من أي نوع.
المميزات: أصغر حجما وأسرع تنفيذا. العيوب: الاستعادة تحتاج كل الملفات التزايدية بالترتيب. فقدان ملف واحد يفسد السلسلة.
مقارنة الأنواع
| المعيار | كامل | تفاضلي | تزايدي |
|---|---|---|---|
| حجم النسخة | كبير | متوسط ومتزايد | صغير |
| وقت النسخ | طويل | متوسط | قصير |
| وقت الاستعادة | قصير | متوسط | طويل |
| التعقيد | بسيط | متوسط | معقد |
| الملفات المطلوبة للاستعادة | 1 | 2 | عديدة |
استراتيجية 3-2-1
القاعدة الذهبية للنسخ الاحتياطي:
- 3 نسخ من بياناتك على الأقل
- 2 وسيط تخزين مختلفين (قرص محلي + تخزين سحابي)
- 1 نسخة خارج الموقع (في مكان جغرافي مختلف)
هذه الاستراتيجية تحميك من كل السيناريوهات: فشل القرص (نسخة ثانية)، كارثة في الموقع (نسخة خارجية)، وفساد البيانات (نسخ متعددة بأوقات مختلفة).
النسخ الاحتياطي لـ MySQL
mysqldump (النسخ المنطقي)
الأداة الأبسط والأكثر استخداما:
# نسخ قاعدة بيانات واحدة
mysqldump -u root -p mydb > /backup/mydb_$(date +%Y%m%d_%H%M%S).sql
# نسخ كل القواعد
mysqldump -u root -p --all-databases > /backup/all_$(date +%Y%m%d_%H%M%S).sql
# نسخ مع ضغط
mysqldump -u root -p mydb | gzip > /backup/mydb_$(date +%Y%m%d).sql.gz
# نسخ مع بيانات فقط بدون هيكل
mysqldump -u root -p --no-create-info mydb > /backup/data_only.sql
Percona XtraBackup (النسخ المادي)
للقواعد الكبيرة التي لا تتحمل التوقف:
# نسخ كامل بدون قفل الجداول
xtrabackup --backup --target-dir=/backup/full/
# نسخ تزايدي
xtrabackup --backup --target-dir=/backup/inc1/ \
--incremental-basedir=/backup/full/
# تحضير النسخة للاستعادة
xtrabackup --prepare --target-dir=/backup/full/
Binary Log Replication
لاستعادة البيانات لنقطة زمنية محددة (Point-in-Time Recovery):
# تفعيل Binary Logging
# في my.cnf:
server-id = 1
log_bin = /var/log/mysql/mysql-bin
binlog_expire_logs_seconds = 604800
binlog_format = ROW
# استعادة لنقطة زمنية
mysqlbinlog --stop-datetime="2026-03-25 14:30:00" \
/var/log/mysql/mysql-bin.000001 | mysql -u root -p
النسخ الاحتياطي لـ PostgreSQL
pg_dump (النسخ المنطقي)
# نسخ قاعدة بيانات
pg_dump -U postgres mydb > /backup/mydb_$(date +%Y%m%d).sql
# نسخ بتنسيق مخصص (يدعم الاستعادة الانتقائية)
pg_dump -U postgres -Fc mydb > /backup/mydb_$(date +%Y%m%d).dump
# نسخ كل القواعد
pg_dumpall -U postgres > /backup/all_$(date +%Y%m%d).sql
# استعادة من تنسيق مخصص
pg_restore -U postgres -d mydb /backup/mydb_20260325.dump
pg_basebackup (النسخ المادي)
# نسخ مادي كامل
pg_basebackup -U postgres -D /backup/base \
-Ft -z -P --wal-method=stream
# إعداد WAL Archiving للاستعادة الزمنية
# في postgresql.conf:
archive_mode = on
archive_command = 'cp %p /backup/wal/%f'
wal_level = replica
جدولة النسخ الاحتياطي
الاستراتيجية الموصى بها
| التكرار | النوع | الاحتفاظ | الوسيط |
|---|---|---|---|
| كل ساعة | WAL/Binary Log | 48 ساعة | محلي |
| يومي (2:00 AM) | تزايدي | 7 أيام | محلي + خارجي |
| أسبوعي (الجمعة) | كامل | 4 أسابيع | محلي + خارجي |
| شهري (1 من كل شهر) | كامل | 12 شهر | خارجي فقط |
أتمتة مع Cron
# /etc/cron.d/database-backup
# نسخ يومي الساعة 2 صباحا
0 2 * * * root /opt/scripts/daily-backup.sh >> /var/log/backup.log 2>&1
# نسخ أسبوعي كل جمعة الساعة 1 صباحا
0 1 * * 5 root /opt/scripts/weekly-backup.sh >> /var/log/backup.log 2>&1
# تنظيف النسخ القديمة يوميا
30 3 * * * root find /backup/daily -mtime +7 -delete
اختبار الاستعادة
النسخ الاحتياطي بدون اختبار استعادة لا قيمة له. جدول اختبارات منتظمة:
- أسبوعيا: تأكد من اكتمال ملفات النسخ وسلامتها
- شهريا: استعد نسخة كاملة على سيرفر اختبار وتحقق من البيانات
- ربع سنوي: اختبار استعادة كامل مع قياس الوقت (يجب أن يكون ضمن RTO المحدد)
# التحقق من سلامة النسخة
# MySQL
mysqlcheck -u root -p --all-databases
# PostgreSQL
pg_restore --list /backup/mydb.dump | head -20
التخزين الخارجي
خيارات التخزين
| الخيار | التكلفة | السرعة | الأمان |
|---|---|---|---|
| S3 / Object Storage | منخفضة | متوسطة | عالي مع تشفير |
| سيرفر ثاني في موقع مختلف | متوسطة | عالية | عالي |
| NFS / SAN | عالية | عالية جدا | عالي |
تشفير النسخ
النسخ الاحتياطية تحتوي بيانات حساسة. التشفير إلزامي:
# تشفير مع GPG
mysqldump -u root -p mydb | gzip | \
gpg --encrypt --recipient backup@example.com > /backup/mydb.sql.gz.gpg
# تشفير مع OpenSSL
pg_dump -U postgres mydb | gzip | \
openssl enc -aes-256-cbc -salt -out /backup/mydb.sql.gz.enc
الخلاصة
النسخ الاحتياطي الفعال يجمع بين أنواع متعددة واستراتيجية 3-2-1 واختبار دوري. لا تنتظر الكارثة لتكتشف إن نسخك لا تعمل. على سيرفرات كلاود (cloud.net.sa) نوفر خدمة نسخ احتياطي يومي كإضافة مع احتفاظ 7 أو 30 يوم، لكن النسخ الاحتياطي على مستوى قاعدة البيانات يبقى مسؤوليتك كمدير للتطبيق. ابدأ اليوم.
ابدأ الآن
تبي تجرب بنفسك؟ اختر باقة الاستضافة المناسبة أو صمم سيرفرك الخاص بالمواصفات اللي تبيها.
