MySQL: الدليل الشامل للنسخ الاحتياطي والاستعادة في MySQL
آخر تحديث: 2026-08-26
تعطل القرص الصلب في خادم شركة أليس فجأة، مما تسبب في تعطل قاعدة البيانات تمامًا. ونظراً لعدم وجود نسخ احتياطية، فقدت إلى الأبد بيانات العملاء وسجلات الطلبات والمعلومات المالية التي تغطي ثلاث سنوات. شكلت هذه الكارثة جرس إنذار لها، مما دفعها إلى إنشاء نظام نسخ احتياطي شامل: نسخ احتياطية يومية كاملة باستخدام mysqldump، ونسخ احتياطية تراكمية مستمرة لملفات binlog، وعمليات نقل أسبوعية للبيانات خارج الموقع، وتدريبات استعادة شهرية. ومنذ ذلك الحين، حتى لو واجهت عطلًا آخر في الأجهزة، يمكنها استعادة جميع البيانات بالكامل في غضون 30 دقيقة.
في هذا الدرس، ستتعلم ما يلي:
- 5 أوضاع للنسخ الاحتياطي المنطقي باستخدام mysqldump (كامل/قاعدة بيانات واحدة/جدول واحد/الهيكل فقط/البيانات فقط)
- كيفية إجراء عملية الاستعادة باستخدام أمر MySQL وجملة SOURCE
- التصدير باستخدام الأمر SELECT INTO OUTFILE والاستيراد باستخدام الأمر LOAD DATA INFILE
- العملية الكاملة للسجل الثنائي (binlog) والاستعادة إلى نقطة زمنية محددة (PITR)
- XtraBackup: مبادئ النسخ الاحتياطي المادي وتصميم استراتيجية النسخ الاحتياطي
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) النسخ الاحتياطي الكامل
يُصدَّر النسخ الاحتياطي الكامل جميع البيانات من كل قاعدة بيانات؛ وهو الطريقة الأساسية والأكثر أمانًا لإجراء النسخ الاحتياطي.
mysqldump -u root -p --all-databases --single-transaction > full_backup.sql
تستخدم المعلمة --single-transaction لقطات الاتساق لعمليات القراءة على جداول InnoDB ولا تقوم بقفل الجدول. أما جداول MyISAM فتظل مقفلة.
(2) النسخ الاحتياطي لقاعدة بيانات واحدة وجدول واحد
# 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) الفصل بين البنية والبيانات
# 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
# 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 إلى قاعدة بيانات محددة:
mysql -u root -p mydb < mydb_backup.sql
استعادة ملف نسخة احتياطية مضغوط:
gunzip < mydb_backup.sql.gz | mysql -u root -p mydb
(2) الاستعادة باستخدام الأمر SOURCE
قم بالاستعادة باستخدام الأمر SOURCE من خلال عميل MySQL:
USE mydb;
SOURCE /var/backups/mysql/mydb_backup.sql;
▶ مثال: عملية الاسترداد
# 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;"
▶ مثال: استعادة نسخة احتياطية مضغوطة
# 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 على جانب الخادم:
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 موجود على الخادم إلى جدول:
LOAD DATA INFILE '/tmp/active_users.csv'
INTO TABLE users_copy
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS;
▶ مثال: العملية الكاملة لتصدير واستيراد ملفات CSV
-- 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
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).
-- 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) حتى النقطة الزمنية المستهدفة.
# 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
▶ مثال: الاستعادة إلى نقطة زمنية محددة بعد الحذف العرضي لجدول
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
# 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. ويتمثل مبدأها الأساسي في:
- خيط العمل في الخلفية: يقوم بقراءة صفحات بيانات InnoDB بشكل مستمر مع مراقبة التغييرات في سجل إعادة التنفيذ
- كما يتم تسجيل سجلات الإعادة الجديدة التي يتم إنشاؤها أثناء عملية النسخ الاحتياطي بشكل مستمر.
- بعد اكتمال النسخ الاحتياطي، استخدم سجل الإعادة (redo log) لإعادة تحميل صفحات البيانات إلى حالة متسقة.
- لا يتم قفل الجداول طوال العملية؛ ولا تتأثر عمليات القراءة والكتابة الخاصة بالأعمال.
(2) العمليات الأساسية
# 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
# 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) الجمع الكامل والتدريجي
- نسخ احتياطي يومي كامل + نسخ احتياطي تراكمي لـ binlog في الوقت الفعلي: مناسب لقواعد البيانات الصغيرة والمتوسطة الحجم؛ سهل الاستعادة
- نسخ احتياطي كامل أسبوعي + نسخ احتياطي تراكمي يومي (XtraBackup): مناسب لقواعد البيانات الكبيرة؛ يوفر مساحة
(2) النسخ الاحتياطي خارج الموقع
يجب نقل ملفات النسخ الاحتياطي إلى موقع تخزين خارجي لتجنب الكوارث التي قد تحدث على مستوى مركز البيانات:
# 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) التدريبات الدورية على التعافي من الكوارث
النسخة الاحتياطية التي لم يتم التحقق منها لا تُعتبر نسخة احتياطية على الإطلاق. قم بإجراء تدريب كامل على الاستعادة مرة واحدة على الأقل شهريًّا للتحقق مما يلي:
- يمكن استخراج ملفات النسخ الاحتياطي واستعادتها بشكل طبيعي
- اجتياز فحص سلامة البيانات بعد الاستعادة
- يقع وقت الاستعادة ضمن نطاق مقبول لـ RTO
| حجم البيانات | تواتر النسخ الاحتياطي الكامل | طريقة النسخ التراكمي | استراتيجية التخزين خارج الموقع | تدريبات الاستعادة |
|---|---|---|---|---|
| ≤ 10 جيجابايت | نسخ احتياطي كامل يومي | سجل binlog | نقل يومي | مرة واحدة شهريًّا |
| 10–100 جيجابايت | نسخ احتياطي يومي كامل | سجل binlog | نقل يومي | مرة واحدة شهريًّا |
| 100 جيجابايت – 1 تيرابايت | نسخ احتياطي كامل أسبوعي | نسخ احتياطي تراكمي يومي عبر XtraBackup | نقل أسبوعي | ربع سنوي |
| > 1 تيرابايت | نسخ احتياطي كامل أسبوعي | نسخ احتياطي تراكمي يومي عبر XtraBackup | مزامنة في الوقت الفعلي | كل ثلاثة أشهر |
| طريقة الاسترداد | السيناريوهات القابلة للتطبيق | سرعة الاسترداد | درجة التعقيد | دقة البيانات |
|---|---|---|---|---|
| استعادة كاملة لـ mysqldump | الحذف العرضي لقاعدة البيانات/الترحيل الكامل لقاعدة البيانات | بطيء | منخفض | قاعدة بيانات كاملة |
| استعادة البيانات إلى نقطة زمنية محددة في Binlog | التراجع عن التغييرات بسبب خطأ من المستخدم | متوسط | عالي | أقل من ثانية |
| استعادة XtraBackup | عطل في الأجهزة/حالة طوارئ | سريع | متوسط | قاعدة البيانات الكاملة |
| LOAD DATA INFILE | تجديد بيانات جدول واحد | سريع | منخفض | جدول واحد |
9. النسخ الاحتياطية التلقائية والأمثلة الشاملة
(1) النقاط الرئيسية للنسخ الاحتياطي التلقائي
- استخدم crontab لتشغيل نصوص برمجية النسخ الاحتياطي وفقًا لجدول زمني محدد
- يتم تسمية ملفات النسخ الاحتياطي حسب التاريخ، مما يسهل العثور عليها
- الضغط التلقائي يوفر مساحة
- حذف النسخ الاحتياطية التي انتهت صلاحيتها بانتظام (الاحتفاظ بها لمدة N أيام)
- إرسال إشعار بمجرد اكتمال عملية النسخ الاحتياطي
▶ مثال: برنامج نصي للنسخ الاحتياطي التلقائي
#!/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
▶ مثال: نص برمجي كامل للنسخ الاحتياطي والاستعادة
#!/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 صباحًا كل يوم:
0 2 * * * /usr/local/bin/full_backup_restore.sh
❓ أسئلة شائعة
--single-transaction؛ حيث تتم قراءتها باستخدام لقطات التناسق MVCC. أما جداول MyISAM فستخضع لأقفال القراءة؛ لذا يُنصح بإجراء النسخ الاحتياطي لها خلال ساعات الذروة أو التحول إلى استخدام XtraBackup.mysqlcheck --check للتحقق من الجداول التي تمت استعادتها. قم بإجراء هذا التحقق مرة واحدة على الأقل شهريًّا.mysqlbinlog لإعادة تشغيل سجل العمليات (binlog) حتى النقطة التي تسبق مباشرةً الأمر DROP TABLE، وأخيرًا قم بتصدير البيانات من الجدول المحذوف من قاعدة البيانات المؤقتة وأعد إدخالها في قاعدة البيانات الإنتاجية.secure_file_priv ماذا أفعل إذا كان مسار OUTFILE مقيدًا؟secure_file_priv على دليل محدد (مثل /var/lib/mysql-files/)، أو استخدم mysql -e "SELECT ..." لإعادة التوجيه إلى ملف على جانب العميل لتجاوز القيد المفروض على جانب الخادم.--throttle للحد من معدل عمليات الإدخال/الإخراج. نوصي بإجراء عمليات النسخ الاحتياطي خلال ساعات الذروة أو تكوين معلمة الحد من المعدل.📖 ملخص
- mysqldump هي أداة النسخ الاحتياطي المنطقي الأكثر استخدامًا، وتدعم خمسة أوضاع: النسخ الكامل، وقاعدة البيانات الواحدة، والجدول الواحد، والهيكل، والبيانات.
- تضمن المعلمة --single-transaction عدم قيام نسخ InnoDB الاحتياطية بقفل الجداول؛ وهي ضرورية لبيئات الإنتاج.
- طريقتان لاستعادة النسخ الاحتياطية المنطقية: mysql < file.sql وSOURCE
- SELECT INTO OUTFILE / LOAD DATA INFILE مناسب لاستيراد وتصدير البيانات بتنسيق CSV
- يتيح binlog الاستعادة إلى نقطة زمنية محددة (PITR)، مما يتيح لك التراجع عن العمليات التي تمت عن غير قصد بدقة تقل عن ثانية واحدة.
- XtraBackup يقوم بإجراء نسخ احتياطية مادية سريعة دون قفل الجداول، مما يجعله مناسبًا لقواعد البيانات الكبيرة
- ينبغي اختيار استراتيجيات النسخ الاحتياطي بناءً على حجم البيانات: نسخ احتياطية كاملة يومية للقاعدة البيانات الصغيرة، ونسخ احتياطية كاملة أسبوعية بالإضافة إلى نسخ احتياطية تراكمية يومية للقاعدة البيانات الكبيرة.
- تعد النسخ الاحتياطية خارج الموقع والتدريبات الدورية على الاستعادة عاملاً أساسياً لضمان فعالية النسخ الاحتياطية
📝 تمارين
-
سؤال أساسي (مستوى الصعوبة: ⭐): استخدم
mysqldumpلعمل نسخة احتياطية لقاعدة البيانات، ثم قم باستعادتها إلى قاعدة بيانات جديدة. قارن عدد الجداول والصفوف في قاعدة البيانات الأصلية بعددها في قاعدة البيانات المستعادة. -
تمرين أساسي (مستوى الصعوبة: ⭐): قم بتصدير البيانات من جدول إلى ملف CSV باستخدام
SELECT INTO OUTFILE، ثم قم باستيرادها إلى جدول آخر باستخدامLOAD DATA INFILE، وتأكد من تطابق البيانات. -
تمرين متقدم (مستوى الصعوبة: ⭐⭐): قم بمحاكاة سيناريو يتم فيه حذف جدول عن طريق الخطأ: أولاً، قم بإجراء نسخ احتياطي كامل؛ ثم نفذ بعض عمليات INSERT؛ بعد ذلك، قم بتنفيذ أمر DROP TABLE؛ وأخيرًا، استخدم استعادة بنلوج (binlog) إلى نقطة زمنية محددة للعودة إلى الحالة التي سبقت أمر DROP.
-
تمرين متقدم (مستوى الصعوبة: ⭐⭐): اكتب برنامج نصي بلغة شيل (shell script) لإجراء نسخ احتياطي يومي كامل تلقائيًا، وضغطه باستخدام gzip، والاحتفاظ بالنسخة الاحتياطية لمدة 7 أيام، وإرسال إشعار عبر البريد الإلكتروني بنتائج النسخ الاحتياطي.
-
سؤال التحدي (مستوى الصعوبة: ⭐⭐⭐): صمم استراتيجية نسخ احتياطي شاملة تغطي أربعة أبعاد: النسخ الكامل، والنسخ التراكمي، والنسخ خارج الموقع، والاختبار. بالنسبة لقاعدة بيانات إنتاجية سعتها 200 جيجابايت، حدد الأدوات التي سيتم استخدامها، وتواتر التنفيذ، وخطوات الاستعادة، وطرق التحقق.