حسنًا، لم أستطع ترك هذا الأمر.
بينما أفترض أنه من الممكن أن يكون الخطأ الذي تلقيته قد تم التعامل معه بواسطة البرنامج النصي للاستيراد، إلا أنه يبدو لي حقًا أنه مشكلة في بنية قاعدة البيانات لـ phpBB3، وحقيقة أن تنسيق قاعدة البيانات الخاصة بي هو UTF8. تلقيت هذا الخطأ أثناء تشغيل البرنامج النصي للاستيراد:
ERROR 1071 (42000) at line 1233035: Specified key was too long; max key length is 1000 bytes
عندما نظرت إلى السطر 1233035 من ملف phpbb_mysql.sql الخاص بي - أستخدم نسخة محلية من تفريغ البيانات - رأيت هذا:
ALTER TABLE `phpbb_config`
ADD PRIMARY KEY (`config_name`),
ADD KEY `is_dynamic` (`is_dynamic`);
بالنظر إلى عمود config_name في الجدول phpbb_config، وجدت أنه تم تعيينه على VARCHAR(255).
بفضل هذا المنشور على Stackoverflow، اكتشفت أنه يمكنني استخدام “فهرس بادئة” لتقصير طول المفتاح. لقد اختبرته، وهو يعمل.
بالنسبة لقاعدة بيانات phpBB 3.3.8 الخاصة بي، تأثرت أربعة جداول بالفعل:
- phpbb_config
- phpbb_config_text
- phpbb_migrations
- phpbb_oauth_accounts
إذا أراد أي شخص آخر تجربته، فإليك الخطوات الخاصة بجدول phpbb_config، وسأقوم بتضمين الاستعلامات للجداول الأخرى في النهاية.
حساب أقصر قيمة لفهرس البادئة باستخدام هذا الاستعلام:
SELECT
ROUND(SUM(LENGTH(`config_name`)<10)*100/COUNT(`config_name`),2) AS pct_length_10,
ROUND(SUM(LENGTH(`config_name`)<20)*100/COUNT(`config_name`),2) AS pct_length_20,
ROUND(SUM(LENGTH(`config_name`)<50)*100/COUNT(`config_name`),2) AS pct_length_50,
ROUND(SUM(LENGTH(`config_name`)<100)*100/COUNT(`config_name`),2) AS pct_length_100
FROM `phpbb_config`;
في حالتي، أظهر أن 100٪ من الصفوف استخدمت أقل من 50 حرفًا، لذلك قمت بتحرير ملف تفريغ البيانات الخاص بي:
nano /var/discourse/shared/standalone/import/data/phpbb_mysql.sql
واستخدمت البحث Ctrl+W للسلسلة التالية:
ALTER TABLE `phpbb_config`
ثم قمت بتغيير هذا:
ALTER TABLE `phpbb_config`
ADD PRIMARY KEY (`config_name`),
ADD KEY `is_dynamic` (`is_dynamic`);
إلى هذا:
ALTER TABLE `phpbb_config`
ADD PRIMARY KEY (`config_name`(50)),
ADD KEY `is_dynamic` (`is_dynamic`);
الـ (50) الموجود هناك هو طول فهرس البادئة.
في حالتي، اضطررت إلى تكرار العملية مع الجداول الثلاثة الأخرى باستخدام هذه الاستعلامات للحصول على طول مفتاح البادئة الأمثل:
SELECT
ROUND(SUM(LENGTH(`config_name`)<10)*100/COUNT(`config_name`),2) AS pct_length_10,
ROUND(SUM(LENGTH(`config_name`)<20)*100/COUNT(`config_name`),2) AS pct_length_20,
ROUND(SUM(LENGTH(`config_name`)<50)*100/COUNT(`config_name`),2) AS pct_length_50,
ROUND(SUM(LENGTH(`config_name`)<100)*100/COUNT(`config_name`),2) AS pct_length_100
FROM `phpbb_config_text`;
SELECT
ROUND(SUM(LENGTH(`migration_name`)<10)*100/COUNT(`migration_name`),2) AS pct_length_10,
ROUND(SUM(LENGTH(`migration_name`)<20)*100/COUNT(`migration_name`),2) AS pct_length_20,
ROUND(SUM(LENGTH(`migration_name`)<50)*100/COUNT(`migration_name`),2) AS pct_length_50,
ROUND(SUM(LENGTH(`migration_name`)<100)*100/COUNT(`migration_name`),2) AS pct_length_100
FROM `phpbb_migrations`;
SELECT
ROUND(SUM(LENGTH(`provider`)<10)*100/COUNT(`provider`),2) AS pct_length_10,
ROUND(SUM(LENGTH(`provider`)<20)*100/COUNT(`provider`),2) AS pct_length_20,
ROUND(SUM(LENGTH(`provider`)<50)*100/COUNT(`provider`),2) AS pct_length_50,
ROUND(SUM(LENGTH(`provider`)<100)*100/COUNT(`provider`),2) AS pct_length_100
FROM `phpbb_oauth_accounts`;
هذه هي سلاسل البحث للجداول الأخرى لتوفير بعض الوقت:
ALTER TABLE `phpbb_config_text`
ALTER TABLE `phpbb_migrations`
ALTER TABLE `phpbb_oauth_accounts`
لن أقول إنني وصلت إلى بر الأمان، لكن ما سبق حل خطأ قاعدة البيانات الأولي الخاص بي، والاستيراد قيد التشغيل:
#import_phpbb3.sh
The phpBB3 import is starting...
Loading existing groups...
Loading existing users...
Loading existing categories...
Loading existing posts...
Loading existing topics...
importing from phpBB 3.3.8
creating users
722 / 5014 ( 14.4%) [58 items/min]
تحديث:
انتهى البرنامج النصي للاستيراد في 9 ساعات و 28 دقيقة. الحمد لله على Screen. هذا البرنامج النصي رائع!
المعالجة اللاحقة قيد التقدم الآن.
هل يوجد سجل لمخرجات البرنامج النصي للاستيراد في مكان ما، أم كان يجب علي توجيهه إلى ملف؟