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

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

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

وقت القراءة: 13 دقيقة إدارة الخادم
mysqlpostgresqlنسخ احتياطيdumpاستعادةcronقاعدة بياناتmysqldump

جدول المحتويات

النسخ الاحتياطي لقواعد البيانات: دليل 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.