MySQL: الدليل الشامل للنسخ الاحتياطي والاستعادة في MySQL

آخر تحديث: 2026-08-26

تعطل القرص الصلب في خادم شركة أليس فجأة، مما تسبب في تعطل قاعدة البيانات تمامًا. ونظراً لعدم وجود نسخ احتياطية، فقدت إلى الأبد بيانات العملاء وسجلات الطلبات والمعلومات المالية التي تغطي ثلاث سنوات. شكلت هذه الكارثة جرس إنذار لها، مما دفعها إلى إنشاء نظام نسخ احتياطي شامل: نسخ احتياطية يومية كاملة باستخدام mysqldump، ونسخ احتياطية تراكمية مستمرة لملفات binlog، وعمليات نقل أسبوعية للبيانات خارج الموقع، وتدريبات استعادة شهرية. ومنذ ذلك الحين، حتى لو واجهت عطلًا آخر في الأجهزة، يمكنها استعادة جميع البيانات بالكامل في غضون 30 دقيقة.

في هذا الدرس، ستتعلم ما يلي:

100%
flowchart TD
    A[Daily Full Backup<br/>mysqldump --single-transaction] --> B[binlog Ongoing Record<br/>Real-Time Incremental]
    B --> C[Weekly Remote Data Transfer<br/>rsync/scp To Remote]
    C --> D[Monthly Recovery Drills<br/>Verify Backup Availability]
    D -->|Drill Passed| A
    D -->|Identifying Problems| E[Adjust the Backup Strategy]
    E --> A

1. القصة: ثمن عدم وجود نسخة احتياطية

تقوم شركة «TechFlow»، التي تعمل فيها أليس، بتشغيل قاعدة بيانات MySQL لمنصة التجارة الإلكترونية الخاصة بها، والتي تخزن بيانات طلبات العملاء ومعلومات الحسابات على مدى ثلاث سنوات. ولم يقم فريق العمليات قط بوضع إجراءات رسمية للنسخ الاحتياطي، بل اعتمد بشكل حصري على مصفوفة RAID باعتبارها «شبكة أمان». وفي إحدى ليالي يوم الجمعة، تسبب عطل في نظام تكييف الهواء بمركز البيانات في ارتفاع درجة حرارة الخوادم بشكل مفرط، مما أدى إلى تعطل محركي أقراص صلبة في آن واحد وانهيار مصفوفة RAID. فُقدت جميع البيانات — معلومات العملاء وسجلات المعاملات وبيانات المخزون. أمضت الشركة ثلاثة أشهر في محاولة استعادة البيانات، لكنها تمكنت من استرداد أقل من 10% منها. تجاوزت الخسارة المالية المباشرة 500,000 دولار أمريكي، كما فقدت الشركة قدرًا كبيرًا من ثقة العملاء.

بعد هذا الدرس المؤلم، أخذت أليس زمام المبادرة في إنشاء نظام نسخ احتياطي شامل: نسخ احتياطية كاملة تلقائية كل يوم عند منتصف الليل، ونسخ احتياطية تراكمية في الوقت الفعلي عبر سجلات binlog، ومزامنة أسبوعية خارج الموقع، وتدريبات استعادة شهرية. وبعد ستة أشهر، تعطل الخادم مرة أخرى، لكنها هذه المرة أكملت عملية الاستعادة الكاملة في غضون 30 دقيقة، دون أي انقطاع يذكر في سير العمل.



2. النسخ الاحتياطية المنطقية والنسخ الاحتياطية المادية

(1) نظرة عامة على النسخ الاحتياطية المنطقية

يقوم النسخ الاحتياطي المنطقي بتصدير البيانات من قاعدة البيانات إلى ملف نصي بلغة SQL يحتوي على عبارات مثل CREATE TABLE وINSERT. لاستعادة البيانات، ما عليك سوى إعادة تنفيذ عبارات SQL هذه. ومن الأدوات الشائعة في هذا المجال mysqldump.

المزايا: سهولة القراءة، والتوافق بين الإصدارات المختلفة، والقدرة على إجراء نسخ احتياطي انتقائي لقواعد البيانات والجداول الفردية.

العيوب: سرعة بطيئة؛ يتطلب كل من النسخ الاحتياطي والاستعادة تدخل عملية MySQL؛ يستغرق وقتًا طويلاً في حالة قواعد البيانات الكبيرة.

(2) نظرة عامة على النسخ الاحتياطية المادية

تقوم النسخة الاحتياطية المادية بنسخ ملفات البيانات الأساسية للقاعدة البيانات (.ibd، .frm، إلخ) مباشرةً؛ ولإعادة الاستعادة، ما عليك سوى نسخ الملفات مرة أخرى إلى دليل البيانات. ومن الأدوات الشائعة في هذا المجال XtraBackup.

المزايا: سريع، لا يتطلب قفل الجداول (InnoDB)، مناسب لقواعد البيانات الكبيرة.

العيوب: غير قابلة للقراءة البشرية، وتوافق محدود بين الأنظمة الأساسية المختلفة، وتتطلب توقفًا مؤقتًا عن العمل أو استخدام أدوات متخصصة للحفاظ على الاتساق.

عنصر المقارنة النسخ الاحتياطي المنطقي (mysqldump) النسخ الاحتياطي المادي (XtraBackup)
محتوى النسخ الاحتياطي عبارات SQL نسخ ملفات البيانات
سرعة النسخ الاحتياطي بطيئة (التصدير صفًا بصف) سريعة (نسخ الملفات)
سرعة الاستعادة بطيئة (تنفذ أوامر SQL صفًا تلو الآخر) سريعة (تنسخ الملفات مرة أخرى)
تأثير قفل الجداول InnoDB بدون قفل عدم وجود أقفال على الجداول
سهولة القراءة عالية (نص SQL عادي) منخفضة (ملف ثنائي)
عبء التخزين منخفض (نسبة ضغط نصية عالية) مرتفع (نسخ الملف بالكامل)
عبر الإصدارات متوافق يتطلب تطابق الإصدار
حالات الاستخدام قواعد البيانات الصغيرة إلى المتوسطة الحجم ≤ 50 جيجابايت قواعد البيانات الكبيرة > 50 جيجابايت


3. شرح مفصل للنسخ الاحتياطية المنطقية باستخدام mysqldump

(1) النسخ الاحتياطي الكامل

يُصدَّر النسخ الاحتياطي الكامل جميع البيانات من كل قاعدة بيانات؛ وهو الطريقة الأساسية والأكثر أمانًا لإجراء النسخ الاحتياطي.

BASH
mysqldump -u root -p --all-databases --single-transaction > full_backup.sql

تستخدم المعلمة --single-transaction لقطات الاتساق لعمليات القراءة على جداول InnoDB ولا تقوم بقفل الجدول. أما جداول MyISAM فتظل مقفلة.

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

BASH
# Backing Up a Single Database
mysqldump -u root -p --single-transaction mydb > mydb_backup.sql

# Back up the specified table
mysqldump -u root -p --single-transaction mydb users orders > tables_backup.sql

(3) الفصل بين البنية والبيانات

BASH
# Back up only the table structure
mysqldump -u root -p --no-data mydb > mydb_schema.sql

# Back up only the data
mysqldump -u root -p --no-create-info mydb > mydb_data.sql

▶ مثال: خمسة أوضاع للنسخ الاحتياطي باستخدام mysqldump

BASH
# Pattern1:Full Backup(All Libraries)
mysqldump -u root -p --all-databases \
  --single-transaction --routines --triggers \
  > full_backup_$(date +%Y%m%d).sql

# Pattern2:Single-Database Backup
mysqldump -u root -p --single-transaction mydb > mydb.sql

# Pattern3:Single-Table Backup
mysqldump -u root -p --single-transaction mydb users > users.sql

# Pattern4:Structure Only
mysqldump -u root -p --no-data mydb > schema.sql

# Pattern5:Data Only
mysqldump -u root -p --no-create-info mydb > data.sql
المعلمة الوظيفة حالة الاستخدام
--all-databases نسخ احتياطي لجميع قواعد البيانات نسخ احتياطي كامل
--single-transaction لقطة اتساق InnoDB النسخ الاحتياطي عبر الإنترنت دون قفل الجداول
--no-data تصدير هياكل الجداول فقط الوثائق، نصوص إنشاء قواعد البيانات
--no-create-info تصدير البيانات فقط نقل البيانات
--routines يتضمن الإجراءات المخزنة والوظائف نسخة احتياطية منطقية كاملة
--triggers يتضمن مشغلات نسخ احتياطي كامل للمنطق
--where="condition" تصدير الصفوف المحددة وفقًا لمعايير معينة الترحيل الجزئي للبيانات
--quick القراءة سطراً سطراً دون تخزين مؤقت منع حدوث خطأ OOM أثناء النسخ الاحتياطي للجداول الكبيرة


4. استعادة قاعدة البيانات

(1) استعادة أوامر MySQL

استعادة البيانات من ملف نسخة احتياطية لـ SQL إلى قاعدة بيانات محددة:

BASH
mysql -u root -p mydb < mydb_backup.sql

استعادة ملف نسخة احتياطية مضغوط:

BASH
gunzip < mydb_backup.sql.gz | mysql -u root -p mydb

(2) الاستعادة باستخدام الأمر SOURCE

قم بالاستعادة باستخدام الأمر SOURCE من خلال عميل MySQL:

SQL
USE mydb;
SOURCE /var/backups/mysql/mydb_backup.sql;

▶ مثال: عملية الاسترداد

BASH
# Steps1:Create the target database
mysql -u root -p -e "CREATE DATABASE mydb_restore;"

# Steps2:Restore Data
mysql -u root -p mydb_restore < mydb_backup.sql

# Steps3:Number of rows to verify
mysql -u root -p -e "SELECT COUNT(*) FROM mydb_restore.users;"

▶ مثال: استعادة نسخة احتياطية مضغوطة

BASH
# Restore gzip Compressed Backup
gunzip < /backup/mydb_20260703.sql.gz | mysql -u root -p mydb

# Restore and display progress
pv /backup/mydb_20260703.sql.gz | gunzip | mysql -u root -p mydb


5. تصدير البيانات واستيرادها

(1) SELECT INTO OUTFILE

تصدير نتائج الاستعلام إلى ملف CSV على جانب الخادم:

SQL
SELECT id, name, email
FROM users
WHERE status = 'active'
INTO OUTFILE '/tmp/active_users.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n';

ملاحظة: المسار الخاص بـ INTO OUTFILE هو المسار الموجود على خادم MySQL، وليس مسار العميل. يجب أن تتمتع عملية MySQL بأذونات الكتابة لهذا المسار، ويجب أن تسمح المتغير secure_file_priv بالوصول إلى هذا الدليل.

(2) LOAD DATA INFILE

استيراد البيانات من ملف CSV موجود على الخادم إلى جدول:

SQL
LOAD DATA INFILE '/tmp/active_users.csv'
INTO TABLE users_copy
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS;

▶ مثال: العملية الكاملة لتصدير واستيراد ملفات CSV

SQL
-- Export order data as CSV
SELECT order_id, customer_id, total_amount, order_date
FROM orders
WHERE order_date >= '2026-01-01'
INTO OUTFILE '/tmp/orders_2026.csv'
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n';

-- Import into another table
LOAD DATA INFILE '/tmp/orders_2026.csv'
INTO TABLE orders_archive
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n';
▶ جرّب الكود

▶ مثال: استيراد ملفات العملاء باستخدام LOCAL

SQL
LOAD DATA LOCAL INFILE '/home/alice/data/products.csv'
INTO TABLE products
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS;
▶ جرّب الكود

6. السجلات الثنائية والاستعادة إلى نقطة زمنية محددة

(1) أساسيات سجلات البين

يسجل السجل الثنائي جميع عبارات SQL التي تُعدّل البيانات، ويُستخدم بشكل أساسي في النسخ المتماثل بين الخادم الرئيسي والخادم التابع، والاستعادة إلى نقطة زمنية محددة (PITR).

SQL
-- View binlog Enabled or Disabled
SHOW VARIABLES LIKE 'log_bin%';

-- View Current binlog List of Files
SHOW BINARY LOGS;

-- View the data currently being written binlog
SHOW MASTER STATUS;

-- View binlog Details of the Incident
SHOW BINLOG EVENTS IN 'binlog.000003';

ثلاثة تنسيقات لسجلات البين:

التنسيق محتوى السجل الإيجابيات والسلبيات
STATEMENT يسجل عبارات SQL حجم السجل صغير، ولكن قد توجد تناقضات في العبارات
ROW تغييرات على مستوى الصف سجل كبير، لكن اتساق البيانات جيد
مختلط الوضع المختلط استخدام الوضع STATEMENT بشكل افتراضي؛ والتحول إلى الوضع ROW في حالة عدم اليقين

(2) عملية الاستعادة إلى نقطة زمنية محددة

النهج الأساسي للاستعادة إلى نقطة زمنية محددة: أولاً، استعادة أحدث نسخة احتياطية كاملة، ثم إعادة تشغيل سجل العمليات (binlog) حتى النقطة الزمنية المستهدفة.

BASH
# Steps1:Restore a Full Backup
mysql -u root -p mydb < full_backup_20260703.sql

# Steps2:Find the point in time before the error occurred
mysqlbinlog --base64-output=DECODE-ROWS -v binlog.000003 | grep -A5 "DROP TABLE"

# Steps3:Replay binlog By the target date
mysqlbinlog --start-datetime="2026-07-03 02:00:00" \
  --stop-datetime="2026-07-03 14:30:00" \
  binlog.000003 binlog.000004 | mysql -u root -p

▶ مثال: الاستعادة إلى نقطة زمنية محددة بعد الحذف العرضي لجدول

TEXT 📖 للعرض فقط
Scene: At 14:25, accidentally executed DROP TABLE orders, need to revert to 14:24:59 state

Timeline:
  02:00  Full backup completed
  ...
  14:24  Last normal operation
  14:25  DROP TABLE orders (operational error)
  14:30  Problem identified, start recovery

Recovery steps:
  1. Restore 02:00 full backup
  2. Use mysqlbinlog to replay binlog from 02:00 to 14:24:59
  3. Verify orders table data integrity
BASH
# Execute the command
mysql -u root -p mydb < /backup/full_20260703.sql

mysqlbinlog --start-datetime="2026-07-03 02:00:00" \
  --stop-datetime="2026-07-03 14:24:59" \
  /var/lib/mysql/binlog.000003 \
  /var/lib/mysql/binlog.000004 \
  | mysql -u root -p mydb


7. النسخ الاحتياطي المادي باستخدام XtraBackup

(1) كيف يعمل برنامج XtraBackup

XtraBackup هي أداة نسخ احتياطي مادي مفتوحة المصدر طورتها شركة Percona. ويتمثل مبدأها الأساسي في:

  1. خيط العمل في الخلفية: يقوم بقراءة صفحات بيانات InnoDB بشكل مستمر مع مراقبة التغييرات في سجل إعادة التنفيذ
  2. كما يتم تسجيل سجلات الإعادة الجديدة التي يتم إنشاؤها أثناء عملية النسخ الاحتياطي بشكل مستمر.
  3. بعد اكتمال النسخ الاحتياطي، استخدم سجل الإعادة (redo log) لإعادة تحميل صفحات البيانات إلى حالة متسقة.
  4. لا يتم قفل الجداول طوال العملية؛ ولا تتأثر عمليات القراءة والكتابة الخاصة بالأعمال.

(2) العمليات الأساسية

BASH
# Full Backup
xtrabackup --backup --target-dir=/backup/full -u root -p

# Preparing to Back Up(Applications redo log,Ensure data consistency)
xtrabackup --prepare --target-dir=/backup/full

# Restore Backup
xtrabackup --copy-back --target-dir=/backup/full

# Incremental Backup(Based on the full dataset)
xtrabackup --backup --target-dir=/backup/inc1 \
  --incremental-basedir=/backup/full -u root -p

# Preparing an Incremental Backup
xtrabackup --prepare --apply-log-only --target-dir=/backup/full
xtrabackup --prepare --target-dir=/backup/full \
  --incremental-dir=/backup/inc1

▶ مثال: النسخ الاحتياطي الكامل والاستعادة باستخدام XtraBackup

BASH
# Full Backup
xtrabackup --backup \
  --target-dir=/data/backup/full_20260703 \
  --user=root --password=Secret123

# Preparation Phase
xtrabackup --prepare \
  --target-dir=/data/backup/full_20260703

# Stop before restoring MySQL
systemctl stop mysqld

# Clear the Data Directory and Restore
rm -rf /var/lib/mysql/*
xtrabackup --copy-back \
  --target-dir=/data/backup/full_20260703

# Repair permissions and start
chown -R mysql:mysql /var/lib/mysql
systemctl start mysqld


8. تصميم استراتيجية النسخ الاحتياطي

(1) الجمع الكامل والتدريجي

(2) النسخ الاحتياطي خارج الموقع

يجب نقل ملفات النسخ الاحتياطي إلى موقع تخزين خارجي لتجنب الكوارث التي قد تحدث على مستوى مركز البيانات:

BASH
# Usage rsync Transmit to a remote location
rsync -avz /backup/mysql/ backup-server:/data/mysql_backup/

# Usage scp Transmission
scp /backup/mysql/full_20260703.sql.gz backup-server:/data/backup/

(3) التدريبات الدورية على التعافي من الكوارث

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

حجم البيانات تواتر النسخ الاحتياطي الكامل طريقة النسخ التراكمي استراتيجية التخزين خارج الموقع تدريبات الاستعادة
≤ 10 جيجابايت نسخ احتياطي كامل يومي سجل binlog نقل يومي مرة واحدة شهريًّا
10–100 جيجابايت نسخ احتياطي يومي كامل سجل binlog نقل يومي مرة واحدة شهريًّا
100 جيجابايت – 1 تيرابايت نسخ احتياطي كامل أسبوعي نسخ احتياطي تراكمي يومي عبر XtraBackup نقل أسبوعي ربع سنوي
> 1 تيرابايت نسخ احتياطي كامل أسبوعي نسخ احتياطي تراكمي يومي عبر XtraBackup مزامنة في الوقت الفعلي كل ثلاثة أشهر
طريقة الاسترداد السيناريوهات القابلة للتطبيق سرعة الاسترداد درجة التعقيد دقة البيانات
استعادة كاملة لـ mysqldump الحذف العرضي لقاعدة البيانات/الترحيل الكامل لقاعدة البيانات بطيء منخفض قاعدة بيانات كاملة
استعادة البيانات إلى نقطة زمنية محددة في Binlog التراجع عن التغييرات بسبب خطأ من المستخدم متوسط عالي أقل من ثانية
استعادة XtraBackup عطل في الأجهزة/حالة طوارئ سريع متوسط قاعدة البيانات الكاملة
LOAD DATA INFILE تجديد بيانات جدول واحد سريع منخفض جدول واحد


9. النسخ الاحتياطية التلقائية والأمثلة الشاملة

(1) النقاط الرئيسية للنسخ الاحتياطي التلقائي

▶ مثال: برنامج نصي للنسخ الاحتياطي التلقائي

BASH
#!/bin/bash
# mysql_backup.sh - MySQL Automated Backup Script
BACKUP_DIR="/data/backup/mysql"
RETAIN_DAYS=7
DB_USER="root"
DB_PASS="Secret123"
DATE=$(date +%Y%m%d_%H%M%S)
LOG_FILE="/var/log/mysql_backup.log"

mkdir -p $BACKUP_DIR
echo "[$DATE] Start Backup..." >> $LOG_FILE

mysqldump -u$DB_USER -p$DB_PASS \
  --all-databases --single-transaction \
  --routines --triggers --set-gtid-purged=OFF \
  | gzip > $BACKUP_DIR/full_${DATE}.sql.gz

if [ $? -eq 0 ]; then
  SIZE=$(du -sh $BACKUP_DIR/full_${DATE}.sql.gz | cut -f1)
  echo "[$DATE] Backup Successful,Size: $SIZE" >> $LOG_FILE
else
  echo "[$DATE] Backup Failed!" >> $LOG_FILE
  exit 1
fi

find $BACKUP_DIR -name "full_*.sql.gz" -mtime +$RETAIN_DAYS -delete
echo "[$DATE] Cleanup ${RETAIN_DAYS} Backup from X days ago" >> $LOG_FILE

▶ مثال: نص برمجي كامل للنسخ الاحتياطي والاستعادة

BASH
#!/bin/bash
# full_backup_restore.sh - Complete Backup and Recovery Verification Script
BACKUP_DIR="/data/backup/mysql"
MYSQL_USER="root"
MYSQL_PASS="Secret123"
REMOTE_HOST="backup-server"
REMOTE_DIR="/data/mysql_backup"
DATE=$(date +%Y%m%d)
LOG="/var/log/backup_restore.log"

echo "=== $DATE Backup and Recovery Process ===" >> $LOG

# 1. Full Backup
mysqldump -u$MYSQL_USER -p$MYSQL_PASS \
  --all-databases --single-transaction \
  --routines --triggers \
  | gzip > $BACKUP_DIR/full_${DATE}.sql.gz
echo "[$DATE] Full backup completed" >> $LOG

# 2. Refresh and Record binlog Location
mysql -u$MYSQL_USER -p$MYSQL_PASS -e "FLUSH BINARY LOGS;"
BINLOG_FILE=$(mysql -u$MYSQL_USER -p$MYSQL_PASS \
  -N -e "SHOW MASTER STATUS;" | awk '{print $1}')
echo "[$DATE] Currently binlog: $BINLOG_FILE" >> $LOG

# 3. Backup binlog Documents
cp /var/lib/mysql/$BINLOG_FILE $BACKUP_DIR/
echo "[$DATE] binlog Backed up" >> $LOG

# 4. Long-distance transmission
rsync -avz $BACKUP_DIR/full_${DATE}.sql.gz \
  $REMOTE_HOST:$REMOTE_DIR/ >> $LOG 2>&1
echo "[$DATE] Remote transmission complete" >> $LOG

# 5. Restore Verification(In the temporary database)
mysql -u$MYSQL_USER -p$MYSQL_PASS \
  -e "CREATE DATABASE IF NOT EXISTS verify_db;"
gunzip < $BACKUP_DIR/full_${DATE}.sql.gz | \
  mysql -u$MYSQL_USER -p$MYSQL_PASS verify_db
ROW_COUNT=$(mysql -u$MYSQL_USER -p$MYSQL_PASS \
  -N -e "SELECT COUNT(*) FROM verify_db.users;")
echo "[$DATE] Verification users Number of lines: $ROW_COUNT" >> $LOG

# 6. Clean Up the Validation Database and Expired Backups
mysql -u$MYSQL_USER -p$MYSQL_PASS -e "DROP DATABASE verify_db;"
find $BACKUP_DIR -name "full_*.sql.gz" -mtime +7 -delete
echo "=== $DATE The backup and restore process is complete ===" >> $LOG

قم بإعداد مهمة في crontab لتُنفَّذ في الساعة 2:00 صباحًا كل يوم:

BASH
0 2 * * * /usr/local/bin/full_backup_restore.sh


❓ أسئلة شائعة

س هل يقوم mysqldump بقفل الجداول؟
ج لا يتم قفل جداول InnoDB عند استخدام المعلمة --single-transaction؛ حيث تتم قراءتها باستخدام لقطات التناسق MVCC. أما جداول MyISAM فستخضع لأقفال القراءة؛ لذا يُنصح بإجراء النسخ الاحتياطي لها خلال ساعات الذروة أو التحول إلى استخدام XtraBackup.
س ما الفرق بين سجل binlog وسجل redo log؟
ج سجل redo log هو سجل على مستوى محرك InnoDB، يُستخدم لاستعادة البيانات بعد التعطل ويتم كتابته بطريقة دائرية؛ أما سجل binlog فهو سجل على مستوى خادم MySQL، يُستخدم للتكرار بين الخادم الرئيسي والخادم التابع (master-slave) والاستعادة إلى نقطة زمنية محددة، ويتم كتابته بطريقة الإلحاق وهو مناسب للأرشفة. يختلف المحتوى المسجل والأغراض الخاصة بكل منهما اختلافًا تامًا.
س ما حجم ملفات النسخ الاحتياطي؟
ج تبلغ مساحة النسخ الاحتياطية المنطقية ما بين 30% و80% تقريبًا من حجم البيانات الأصلية (بتنسيق نصي)، وتبلغ حوالي 10% إلى 30% بعد ضغطها باستخدام gzip. أما النسخ الاحتياطية المادية، فتقترب من حجم البيانات الأصلية. نوصي بتخصيص مساحة تخزين تعادل ثلاثة أضعاف حجم البيانات.
س كيف يمكنني التأكد من أن النسخة الاحتياطية صالحة للاستخدام؟
ج قم بإجراء استعادة كاملة بشكل دوري في بيئة اختبار للتحقق من عدد الجداول وعدد الصفوف والبيانات التجارية الهامة. يمكنك أيضًا استخدام mysqlcheck --check للتحقق من الجداول التي تمت استعادتها. قم بإجراء هذا التحقق مرة واحدة على الأقل شهريًّا.
س كيف يمكنني استعادة جدول تم حذفه عن طريق الخطأ؟
ج قم باستعادة أحدث نسخة احتياطية كاملة إلى قاعدة بيانات مؤقتة، ثم استخدم mysqlbinlog لإعادة تشغيل سجل العمليات (binlog) حتى النقطة التي تسبق مباشرةً الأمر DROP TABLE، وأخيرًا قم بتصدير البيانات من الجدول المحذوف من قاعدة البيانات المؤقتة وأعد إدخالها في قاعدة البيانات الإنتاجية.
س secure_file_priv ماذا أفعل إذا كان مسار OUTFILE مقيدًا؟
ج اضبط secure_file_priv على دليل محدد (مثل /var/lib/mysql-files/)، أو استخدم mysql -e "SELECT ..." لإعادة التوجيه إلى ملف على جانب العميل لتجاوز القيد المفروض على جانب الخادم.
س هل يؤثر برنامج XtraBackup على الأداء أثناء عملية النسخ الاحتياطي؟
ج هناك بعض العبء الإضافي على عمليات الإدخال/الإخراج (I/O)، لكن برنامج XtraBackup يوفر المعلمة --throttle للحد من معدل عمليات الإدخال/الإخراج. نوصي بإجراء عمليات النسخ الاحتياطي خلال ساعات الذروة أو تكوين معلمة الحد من المعدل.

📖 ملخص


📝 تمارين

  1. سؤال أساسي (مستوى الصعوبة: ⭐): استخدم mysqldump لعمل نسخة احتياطية لقاعدة البيانات، ثم قم باستعادتها إلى قاعدة بيانات جديدة. قارن عدد الجداول والصفوف في قاعدة البيانات الأصلية بعددها في قاعدة البيانات المستعادة.

  2. تمرين أساسي (مستوى الصعوبة: ⭐): قم بتصدير البيانات من جدول إلى ملف CSV باستخدام SELECT INTO OUTFILE، ثم قم باستيرادها إلى جدول آخر باستخدام LOAD DATA INFILE، وتأكد من تطابق البيانات.

  3. تمرين متقدم (مستوى الصعوبة: ⭐⭐): قم بمحاكاة سيناريو يتم فيه حذف جدول عن طريق الخطأ: أولاً، قم بإجراء نسخ احتياطي كامل؛ ثم نفذ بعض عمليات INSERT؛ بعد ذلك، قم بتنفيذ أمر DROP TABLE؛ وأخيرًا، استخدم استعادة بنلوج (binlog) إلى نقطة زمنية محددة للعودة إلى الحالة التي سبقت أمر DROP.

  4. تمرين متقدم (مستوى الصعوبة: ⭐⭐): اكتب برنامج نصي بلغة شيل (shell script) لإجراء نسخ احتياطي يومي كامل تلقائيًا، وضغطه باستخدام gzip، والاحتفاظ بالنسخة الاحتياطية لمدة 7 أيام، وإرسال إشعار عبر البريد الإلكتروني بنتائج النسخ الاحتياطي.

  5. سؤال التحدي (مستوى الصعوبة: ⭐⭐⭐): صمم استراتيجية نسخ احتياطي شاملة تغطي أربعة أبعاد: النسخ الكامل، والنسخ التراكمي، والنسخ خارج الموقع، والاختبار. بالنسبة لقاعدة بيانات إنتاجية سعتها 200 جيجابايت، حدد الأدوات التي سيتم استخدامها، وتواتر التنفيذ، وخطوات الاستعادة، وطرق التحقق.

Web-Tutorial.com

فريق Web-Tutorial التقني

منصة دروس برمجية يديرها عدة مطورين. كل درس يتم كتابته ومراجعته بواسطة مطورين متخصصين في المجال. نعمل على ضمان دقة وموثوقية المحتوى — إذا لاحظت أي مشكلة، فيرجى إخبارنا.

100%