النسخة ملفّ نصّيّ من جمل 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"
قارن عدد الصفوف ذاك بالإنتاج. فنسخةٌ تُستورَد بلا خطأ وتصل بنصف الصفوف هي العطل الذي لا يمسكه أحد، لأن الاستيراد لم يقل شيئًا إطلاقًا.