النسخة ملفّ نصّيّ من جمل SQL. وقابليّتها للاستعادة تتوقّف على طريقة كتابتها، والقيم الافتراضية ليست الصحيحة لموقع حيّ. وأغلب إخفاقات الاستيراد تُحسم لحظة أخذ النسخة، قبل أسابيع.
الأمر
mysqldump \
--single-transaction \
--quick \
--routines --triggers --events \
--default-character-set=utf8mb4 \
--set-gtid-purged=OFF \
dbname | gzip > db-$(date +\%F).sql.gz
ما يمنعه كلٌّ منها
- --single-transaction — لقطة متّسقة بلا إقفال للجداول. وبدونها يتجمّد الموقع المزدحم طوال مدّة النسخ.
- --quick — يتدفّق صفًّا صفًّا بدل حشر جدول كبير في الذاكرة.
- --routines --triggers --events — غير مضمّنة افتراضيًّا. واستعادةٌ بدونها تبدو تامّة وتفقد بصمت كل إجراء مخزَّن وكل حدث مجدوَل.
- --default-character-set=utf8mb4 — تنجو العربية والرموز التعبيرية من رحلة الذهاب والإياب.
الراية --single-transaction متّسقة مع InnoDB وحده. وجدول MyISAM في القاعدة نفسها يُنسَخ بلا ذلك الضمان، فحوّلها أو اقبل نسخةً غير متّسقة لتلك الجداول.
تحقّق من الملفّ لا من رمز الخروج
gzip -t db-2026-09-05.sql.gz # the archive is intact
zcat db-2026-09-05.sql.gz | tail -5 # ends with "Dump completed"
zcat db-2026-09-05.sql.gz | grep -c "CREATE TABLE"
نسخةٌ قطعها امتلاء القرص تبقى gzip صالحًا في أغلب طولها. وسطر الإتمام في آخرها هو الدليل أن mysqldump بلغ النهاية — وفحصه يكلّف أمرًا واحدًا.
واستعدها في مكان آخر، بجدول
mysql -e "CREATE DATABASE restore_test CHARACTER SET utf8mb4"
zcat db-2026-09-05.sql.gz | mysql restore_test
mysql restore_test -e "SELECT COUNT(*) FROM orders"
قارن عدد الصفوف ذاك بالإنتاج. فنسخةٌ تُستورَد بلا خطأ وتصل بنصف الصفوف هي العطل الذي لا يمسكه أحد، لأن الاستيراد لم يقل شيئًا إطلاقًا.
