انتقل إلى المحتوى الرئيسي
العودة إلى الفئة

النسخ الاحتياطي لقواعد البيانات: دليل MySQL وPostgreSQL

النسخ الاحتياطي واستعادة قواعد بيانات MySQL وPostgreSQL باستخدام mysqldump وpg_dump. النسخ الاحتياطي التلقائي مع cron وإجراءات الاستعادة وأفضل الممارسات.

وقت القراءة: 13 دقيقة إدارة الخادم
mysqlpostgresqlنسخ احتياطيdumpاستعادةcronقاعدة بياناتmysqldump
الكاتب
REXE Teknoloji Network & Security Team
المحرر
REXE Teknoloji Technical Editorial
أول نشر
آخر تحديث

النسخ الاحتياطي لقواعد البيانات: دليل MySQL وPostgreSQL

يُعدّ النسخ الاحتياطي لقواعد البيانات من أهم مهام إدارة الخوادم. النسخ الاحتياطية المنتظمة ضرورية للتعافي من أعطال الأجهزة أو الأخطاء البشرية أو الهجمات الإلكترونية. يغطي هذا الدليل إجراءات النسخ الاحتياطي والاستعادة لكل من MySQL وPostgreSQL.

لماذا النسخ الاحتياطي لقواعد البيانات؟

  • عطل الأجهزة أو تلف القرص
  • البيانات المحذوفة عن طريق الخطأ
  • مشاكل بعد تحديثات البرامج
  • الهجمات الإلكترونية أو برامج الفدية
  • نسخ البيانات إلى بيئة التطوير/الاختبار

بدون نسخ احتياطية، فقدان البيانات لا رجعة فيه. اتبع قاعدة 3-2-1: 3 نسخ، نوعان مختلفان من الوسائط، موقع واحد خارجي.

النسخ الاحتياطي لـ MySQL / MariaDB

النسخ الاحتياطي الأساسي مع mysqldump

hljs bash
# نسخ احتياطي لقاعدة بيانات واحدة
mysqldump -u root -p اسم_قاعدة_البيانات > backup.sql

# مع كلمة المرور (للسكريبتات)
mysqldump -u root -pكلمة_المرور اسم_قاعدة_البيانات > backup.sql

# نسخ احتياطي لجميع قواعد البيانات
mysqldump -u root -p --all-databases > all_databases.sql

# نسخ احتياطي لجداول محددة
mysqldump -u root -p اسم_قاعدة_البيانات جدول1 جدول2 > tables.sql

# نسخ احتياطي مضغوط
mysqldump -u root -p اسم_قاعدة_البيانات | gzip > backup_$(date +%Y%m%d).sql.gz

خيارات mysqldump المتقدمة

hljs bash
# نسخ احتياطي متسق لقواعد البيانات الكبيرة
mysqldump -u root -p \
  --single-transaction \
  --routines \
  --triggers \
  --events \
  اسم_قاعدة_البيانات > full_backup.sql

# الهيكل فقط (بدون بيانات)
mysqldump -u root -p --no-data اسم_قاعدة_البيانات > schema.sql

# البيانات فقط (بدون هيكل)
mysqldump -u root -p --no-create-info اسم_قاعدة_البيانات > data.sql

# نسخ احتياطي من خادم بعيد
mysqldump -h remote_server -u user -p اسم_قاعدة_البيانات > remote_backup.sql

استعادة MySQL

hljs bash
# الاستعادة من ملف SQL
mysql -u root -p اسم_قاعدة_البيانات < backup.sql

# الاستعادة من نسخة احتياطية مضغوطة
gunzip -c backup.sql.gz | mysql -u root -p اسم_قاعدة_البيانات

# إنشاء قاعدة بيانات جديدة والاستعادة
mysql -u root -p -e "CREATE DATABASE new_database;"
mysql -u root -p new_database < backup.sql

# استعادة جميع قواعد البيانات
mysql -u root -p < all_databases.sql

تخزين بيانات الاعتماد بأمان

hljs bash
# إنشاء ~/.my.cnf
nano ~/.my.cnf
hljs ini
[client]
user=root
password=كلمة_المرور
host=localhost
hljs bash
# تقييد أذونات الملف
chmod 600 ~/.my.cnf

# الآن يمكن الاستخدام بدون إدخال كلمة المرور
mysqldump اسم_قاعدة_البيانات > backup.sql

النسخ الاحتياطي لـ PostgreSQL

النسخ الاحتياطي الأساسي مع pg_dump

hljs bash
# نسخ احتياطي لقاعدة بيانات واحدة
pg_dump -U postgres اسم_قاعدة_البيانات > backup.sql

# تنسيق مخصص مضغوط (موصى به)
pg_dump -U postgres -Fc اسم_قاعدة_البيانات > backup.dump

# تنسيق الدليل (للاستعادة المتوازية)
pg_dump -U postgres -Fd اسم_قاعدة_البيانات -f backup_dir/

# نسخ احتياطي لجميع قواعد البيانات (بما فيها الأدوار)
pg_dumpall -U postgres > all_pg.sql

# نسخ احتياطي مضغوط
pg_dump -U postgres اسم_قاعدة_البيانات | gzip > backup_$(date +%Y%m%d).sql.gz

استعادة PostgreSQL

hljs bash
# الاستعادة من تنسيق SQL
psql -U postgres اسم_قاعدة_البيانات < backup.sql

# استعادة التنسيق المخصص (.dump)
pg_restore -U postgres -d اسم_قاعدة_البيانات backup.dump

# الاستعادة المتوازية (أسرع)
pg_restore -U postgres -d اسم_قاعدة_البيانات -j 4 backup.dump

# إنشاء قاعدة بيانات جديدة والاستعادة
psql -U postgres -c "CREATE DATABASE new_database;"
pg_restore -U postgres -d new_database backup.dump

الوصول بدون كلمة مرور (.pgpass)

hljs bash
nano ~/.pgpass
# التنسيق: host:port:database:user:password
localhost:5432:*:postgres:كلمة_المرور
hljs bash
chmod 600 ~/.pgpass

النسخ الاحتياطي التلقائي مع Cron

سكريبت النسخ الاحتياطي التلقائي لـ MySQL

hljs bash
#!/bin/bash

# الإعداد
DB_USER="root"
DB_PASS="كلمة_المرور"
DB_NAME="اسم_قاعدة_البيانات"
BACKUP_DIR="/var/backups/mysql"
DATE=$(date +%Y%m%d_%H%M%S)
RETENTION_DAYS=7

# إنشاء مجلد النسخ الاحتياطي
mkdir -p $BACKUP_DIR

# أخذ النسخة الاحتياطية
mysqldump -u $DB_USER -p$DB_PASS \
  --single-transaction \
  --routines \
  --triggers \
  $DB_NAME | gzip > $BACKUP_DIR/${DB_NAME}_${DATE}.sql.gz

# حذف النسخ الاحتياطية القديمة
find $BACKUP_DIR -name "*.sql.gz" -mtime +$RETENTION_DAYS -delete

echo "اكتمل النسخ الاحتياطي: ${DB_NAME}_${DATE}.sql.gz"
hljs bash
# جعل السكريبت قابلاً للتنفيذ
chmod +x /root/scripts/mysql-backup.sh

# إضافة إلى crontab (كل ليلة الساعة 02:00)
crontab -e
0 2 * * * /root/scripts/mysql-backup.sh >> /var/log/mysql-backup.log 2>&1

إرسال النسخ الاحتياطية إلى خادم بعيد

hljs bash
# النسخ إلى خادم بعيد باستخدام rsync
rsync -avz /var/backups/mysql/ user@remote-server:/backup/mysql/

# إرسال ملف واحد باستخدام scp
scp /var/backups/mysql/backup.sql.gz user@remote-server:/backup/

# الإرسال إلى التخزين السحابي باستخدام rclone (S3، Google Drive، إلخ)
rclone copy /var/backups/mysql/ remote:bucket-name/mysql/

التحقق من النسخ الاحتياطية

hljs bash
# التحقق من حجم ملف النسخة الاحتياطية
ls -lh /var/backups/mysql/

# التحقق بالاستعادة إلى قاعدة بيانات اختبار
mysql -u root -p -e "CREATE DATABASE test_restore;"
mysql -u root -p test_restore < backup.sql
mysql -u root -p -e "SHOW TABLES;" test_restore
mysql -u root -p -e "DROP DATABASE test_restore;"

اختبر نسخك الاحتياطية بانتظام. النسخة الاحتياطية التي لا يمكنك استعادتها عديمة الفائدة. قم بإجراء استعادة اختبارية مرة واحدة على الأقل شهرياً.

أفضل الممارسات

  1. نسخ احتياطي منتظم: يومي أو كل ساعة لقواعد البيانات الحيوية
  2. الضغط: استخدم gzip لتوفير مساحة القرص
  3. التخزين البعيد: احفظ النسخ الاحتياطية على خادم مختلف أو في السحابة
  4. سياسة الاحتفاظ: احتفظ بـ 7 نسخ يومية و4 أسبوعية و12 شهرية
  5. التشفير: شفّر النسخ الاحتياطية التي تحتوي على بيانات حساسة
  6. المراقبة: تنبيهات بريد إلكتروني عند فشل النسخ الاحتياطي
  7. الاختبار: تحقق من النسخ الاحتياطية بانتظام عن طريق استعادتها

الخلاصة

النسخ الاحتياطي المنتظم لقواعد البيانات هو أهم دفاع ضد فقدان البيانات. من خلال إعداد سكريبتات النسخ الاحتياطي التلقائي لـ MySQL وPostgreSQL وتخزين النسخ الاحتياطية خارجياً، يمكنك الحفاظ على أمان بياناتك على خوادم REXE.

الأسئلة الشائعة

ما الفرق بين mysqldump وpg_dump؟

mysqldump هو أداة النسخ الاحتياطي لـ MySQL وMariaDB. pg_dump خاص بـ PostgreSQL. كلاهما ينتج مخرجات SQL، لكن pg_dump يدعم أيضاً تنسيق ثنائي مخصص (-Fc) وتنسيق الدليل (-Fd). التنسيق الثنائي يتيح استعادة أسرع ومعالجة متوازية.

كيف أنسخ احتياطياً قواعد البيانات الكبيرة؟

لـ MySQL، استخدم --single-transaction للنسخ الاحتياطي المتسق لجداول InnoDB. لـ PostgreSQL، استخدم -Fc (تنسيق مخصص) وpg_restore -j للاستعادة المتوازية. لقواعد البيانات الكبيرة جداً، فكر في Percona XtraBackup (MySQL) أو pg_basebackup (PostgreSQL).

كم مرة يجب أن أنسخ احتياطياً؟

يعتمد على الأهمية: كل ساعة للتجارة الإلكترونية أو البيانات المالية؛ يومياً للمدونات أو مواقع المحتوى. حدد بناءً على RPO (هدف نقطة الاسترداد). التوصية العامة: نسخ احتياطي كامل يومي + نسخ احتياطي تدريجي كل ساعة.

أين يجب تخزين النسخ الاحتياطية؟

اتبع قاعدة 3-2-1: 3 نسخ، نوعان مختلفان من الوسائط، موقع واحد خارجي. القرص المحلي + خادم بعيد + تخزين سحابي (S3، Backblaze B2) هو المزيج المثالي.

هل تُقفل قاعدة البيانات أثناء النسخ الاحتياطي؟

مع علامة --single-transaction في MySQL، لا تُقفل جداول InnoDB. قد تحتاج جداول MyISAM إلى قفل قصير. يستخدم pg_dump في PostgreSQL MVCC ولا يقفل الجداول. تجنب النسخ الاحتياطي في أوقات الذروة.

مقالات ذات صلة

حركة الشبكةالداخل Gbpsالخارج Gbps