نقل قاعدة البيانات نسخةٌ واستيراد. والذي يفسده هو ما لا تحتويه النسخة، واكتشافُ ذلك بعد أن يكون الموقع قد وُجّه إلى الخادم الجديد.
النسخ
mysqldump --single-transaction --quick --routines --triggers --events \
--default-character-set=utf8mb4 shop | gzip > shop.sql.gz
التحويل
scp shop.sql.gz newserver:/tmp/
# or stream it directly, with no file in between
mysqldump --single-transaction shop | gzip | ssh newserver 'gunzip | mysql shop'
أنشئ الهدف على وجهه قبل الاستيراد
mysql -e "CREATE DATABASE shop CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci"
zcat /tmp/shop.sql.gz | mysql shop
أنشئ قاعدة البيانات بترميز المحارف الصحيح أوّلًا. فالاستيراد إلى قاعدة بترميز latin1 يعطيك بنيةً تبدو سليمة ويُشوّه العربية والرموز التعبيرية في صمت — انظر ترميز المحارف والترتيب.
الثلاثة التي لا تحملها النسخة
- المستخدمون والصلاحيّات. مسكنها مخطّط mysql. أعد إنشاءها — انظر المستخدمون والصلاحيّات.
- إعدادات الخادم. حوض الذاكرة وmax_connections والمهل. انقل السطور التي تعنيك منها.
- الأحداث المجدولة، إلّا أن تكون قد مرّرت --events، وعلى مجدول الأحداث أن يكون مفعّلًا في الخادم الجديد أيضًا.
CREATE USER 'shop'@'localhost' IDENTIFIED BY '...';
GRANT SELECT, INSERT, UPDATE, DELETE ON shop.* TO 'shop'@'localhost';
SET GLOBAL event_scheduler = ON;
تحقّق قبل التحويل
# same table count, same row counts on the tables that matter
mysql -e "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema='shop'"
mysql shop -e "SELECT COUNT(*) FROM orders; SELECT COUNT(*) FROM customers"
قارن عدد الصفوف بالخادم القديم قبل أن توجّه التطبيق إلى الجديد. فالاستيراد الذي يفشل في منتصفه ينتهي بلا شكوى في بعض المسارات، ونصفُ قاعدةٍ يبدو تمامًا كقاعدةٍ عاملة حتى يبحث أحدهم عن الشهر الماضي.