ترقية قاعدة بيانات منتدى vBulletin تحمل ترميز latin1 إلى ترميز utf8

تقليص
هذا موضوع مثبت.
X
X
 
  • الوقت
  • عرض
إلغاء تحديد الكل
مشاركات جديدة
  • AboAbdulla

    ابوعبدالله

    • 23 - 12 - 2004
    • 5530
    • السعودية
    • الطيران
    • طيار
    • Saudi Airlin
    • Dakota
    • السلامة الجوية



    • (( قُلْ يَا عِبَادِيَ الَّذِينَ أَسْرَفُوا عَلَى أَنفُسِهِمْ لَا تَقْنَطُوا مِن رَّحْمَةِ اللَّهِ
      إِنَّ اللَّهَ يَغْفِرُ الذُّنُوبَ جَمِيعًا إِنَّهُ هُوَ الْغَفُورُ الرَّحِيمُ ))

      اللهم إني استودعتك قلبي فلا يبقى فيه إلا أنت
      واستودعتك لا إله الا الله فذكرنيها في كل وقت

    #1

    [درس] ترقية قاعدة بيانات منتدى vBulletin تحمل ترميز latin1 إلى ترميز utf8


    لتحويل قاعدة بيانات قديمة لا تحمل ترميز UTF-8 ⚠️ فإننا نحتاج إلى خطوات قليلة يجب تنفيذها بدقة وعناية

    اولاً: 🟡 في البداية نحتاج إلى محرر لغات برمجية خاص وهو مجاني ويمكن تحميلة من الموقع الرسمي الخاص به والشرح في الرابط التالي:

    📁 محرر النصوص EmEditor للتعامل مع قواعد البيانات sql الضخمة

    ثانياً: 🟡 نحن هنا نتحدث عن قاعدة بيانات ضخمه، ❌ حجمها أكثر من واحد جيجا، لذلك نحتاج الى أخذ نسخة أحتياطية من قاعدة البيانات التي تريد تحويلها وتغيير ترميزها ويمكن مراجعة الرابط التالي:

    📁 أوامر Shll لتحسين عمل قواعد البيانات

    ثالثاً: 🟡 استخدم الأمر التالي لتصدير 📁 الهيكل + البيانات لقاعدة البينات المطلوبة والتي من المؤكد انها تحمل الترميز latin1:
    • أسم قاعدة البيانات على السيرفر: flying
    • الملف المطلوب استخراجه: flying_20-05-2025_latin1.sql
    • الصيغة المطلوبة هي: latin1 - والسبب هي ان هذه الصيغة تحمل ترميز البيانات الموجودة بالاضافة إلى أن بيانات اللغة العربية كانت تدخل فيها بصيغة cp1256


    mysqldump -u root --skip-set-charset --default-character-set=latin1 flying > flying_20-05-2025_latin1.sql


    رابعاً: 🟢 بعد الحصول على نسخة من قاعدة البيانات بهذه الصيغة بالملف التالي: flying_20-05-2025_latin1.sql

    💡 نقوم بفتح الملف في محرر: EmEditor

    نتأكد بأن الأحرف العربية مقروءة ومفهومة جيداً فهذا يعني أن الترميز داخل الملف هو فعلياً Windows-1256 وأحياناً (cp1256) - ولكنه محفوظ كـ latin1 ظاهرياً — وهذا أمر شائع مع قواعد البيانات العربية القديمة.



    خامساً: 🔴 في حال لم تكن الأحرف العربية واضحة فهنا نتبع الخطوات التالية: 🧭 الخطوات التفصيلية


    افتح الملف داخل EmEditor:

    اسحب الملف flying_20-05-2025_latin1.sql إلى EmEditor.

    إذا ظهرت لك نافذة "Select Encoding"، اختر:

    Western European (Windows) أو Latin1 (أو جرب مباشرة Windows-1256)

    إذا لم تظهر الأحرف العربية سليمة كما في الصورة، أكمل للخطوة التالية.

    اضبط الترميز الحالي يدويًا:

    أكمل الشرح بالصور


    سادسا: 🟡 وهو الأهم في تحويل ترميز قاعدة البيانات ✅ لتحويل الملف من latin1 إلى UTF-8 بواسطة محرر EmEditor:


    🧭 من خلال الخطوات التفصيلية نفذ الاستبدالات كما يلي:

    🔍 تابع الصور مع التعديلات
    COLLATE=latin1_swedish_ci COLLATE=utf8_general_ci
    CHARSET=latin1 CHARSET=utf8
    CHARACTER SET latin1 COLLATE latin1_bin CHARACTER SET utf8 COLLATE utf8_general_ci






    📊 مجموع الاستبدالات يساوي عدد الجداول في قاعدة البيانات، بحيث لوكانت قاعدة البيانات مكونة من 160 جدول فإن كل استبدال يساوي 160 مرة إلا أستبدال خصائص الصفوف ربما اقل بكثير


    سابعاً: 🟡 استيراد قاعدة البيانات الى قاعدة جديدة في موقعك أو في السيرفر المحلي

    ⛔ في البداية أنشئ قاعدة بيانات جديدة على سيرفرك الخاص أو في موقعك مثلا أعطها الأسم: flyin_utf8
    ولديك الملف الذي تم تصديره بعد التعديلات بواسطة محرر EmEditor اسمه: new_data_20-05-2025_utf8.sql
    بالطريقة التالية:

    🔺 ملاحظة: هنا لم أستخدم كلمة مرور حيث اني أعمل من خلال السيرفر المحلي
    mysql -u root flyin_utf8 < new_data_20-05-2025_utf8.sql

    صورة من داخل phpMyadmin توضح أن اللغة تم تحويلها وتغير الترميز إلى UTF-8

  • AboAbdulla

    ابوعبدالله

    • 23 - 12 - 2004
    • 5530
    • السعودية
    • الطيران
    • طيار
    • Saudi Airlin
    • Dakota
    • السلامة الجوية



    • (( قُلْ يَا عِبَادِيَ الَّذِينَ أَسْرَفُوا عَلَى أَنفُسِهِمْ لَا تَقْنَطُوا مِن رَّحْمَةِ اللَّهِ
      إِنَّ اللَّهَ يَغْفِرُ الذُّنُوبَ جَمِيعًا إِنَّهُ هُوَ الْغَفُورُ الرَّحِيمُ ))

      اللهم إني استودعتك قلبي فلا يبقى فيه إلا أنت
      واستودعتك لا إله الا الله فذكرنيها في كل وقت

    #2

    الفرق بين MyISAM و InnoDB في قواعد البيانات
    لا يوجد "ضرر مباشر" من اختلاف محرك الجداول (MyISAM) عن محرك القاعدة ككل (InnoDB)، لكن هناك بعض السلبيات التقنية التي قد تواجهها نتيجة هذا الاختلاف، وسأشرحها ثم أوضح مدى صعوبة التحويل.
    ✅ أولاً: الفرق بين MyISAM و InnoDB بإيجاز
    دعم المعاملات (Transactions) ❌ لا يدعم ✅ يدعم
    القيد الخارجي (Foreign Key) ❌ لا يدعم ✅ يدعم
    الأداء في القراءة فقط ✅ أسرع ⭕ أبطأ قليلاً
    الحماية من الأعطال ❌ لا يوجد ✅ يوجد (Crash Recovery)
    القفل قفل على مستوى الجدول قفل على مستوى الصف
    دعم UTF-8 الكامل (مثل الرموز التعبيرية) ضعيف مع utf8 ممتاز مع utf8mb4

    ❗ هل هناك ضرر فعلي؟


    نعم، على المدى الطويل:
    • MyISAM لا يدعم الـ Transactions، وهذا قد يسبب مشاكل في التطبيقات التي تتطلب ضمان تنفيذ العمليات بالكامل أو لا شيء.
    • عدم دعم العلاقات الخارجية (foreign keys) في MyISAM يجعل سلامة البيانات (Data Integrity) ضعيفة.
    • MyISAM عرضة للتلف إذا حدث إيقاف غير طبيعي للسيرفر (مثلاً بسبب انقطاع الكهرباء).
    • الجداول MyISAM غالباً لا تستفيد من خصائص قواعد البيانات الحديثة (مثل الأداء المحسن في InnoDB، والدعم الأفضل للتخزين المؤقت).

    🔄 هل من الصعب تحويل الجداول إلى InnoDB؟


    لا، التحويل سهل جداً، ويمكنك تنفيذه بأمر واحد لكل جدول:
    ALTER TABLE your_table_name ENGINE=InnoDB;


    مثال:
    ALTER TABLE users ENGINE=InnoDB;
    ALTER TABLE posts ENGINE=InnoDB;


    إذا كان لديك الكثير من الجداول، يمكننا عمل سكريبت PHP أو SQL يقوم بذلك تلقائيًا.
    ⚠️ ملاحظات قبل التحويل
    1. خذ نسخة احتياطية من قاعدة البيانات قبل أي تغيير.
    2. تأكد أن الجداول لا تعتمد على خصائص معينة في MyISAM مثل FULLTEXT (كانت قديمة، الآن InnoDB يدعمها).
    3. إذا كانت الجداول تحتوي على ملفات ضخمة، التحويل قد يأخذ وقتاً.
    4. تأكد أن محرك InnoDB مفعل في السيرفر (وهو كذلك بشكل افتراضي في معظم الاستضافات الحديثة).

    ✅ توصية
    • نعم، يُفضل تحويل جميع الجداول إلى InnoDB.
    • ويفضل أيضًا استخدام utf8mb4_general_ci أو utf8mb4_unicode_ci بدلًا من utf8_general_ci للحصول على دعم أفضل للعربية والرموز.

    تعليق

    • AboAbdulla

      ابوعبدالله

      • 23 - 12 - 2004
      • 5530
      • السعودية
      • الطيران
      • طيار
      • Saudi Airlin
      • Dakota
      • السلامة الجوية



      • (( قُلْ يَا عِبَادِيَ الَّذِينَ أَسْرَفُوا عَلَى أَنفُسِهِمْ لَا تَقْنَطُوا مِن رَّحْمَةِ اللَّهِ
        إِنَّ اللَّهَ يَغْفِرُ الذُّنُوبَ جَمِيعًا إِنَّهُ هُوَ الْغَفُورُ الرَّحِيمُ ))

        اللهم إني استودعتك قلبي فلا يبقى فيه إلا أنت
        واستودعتك لا إله الا الله فذكرنيها في كل وقت

      #3

      نفذ الكود التالي في phpMyadmin
      🔍 وسوف يظهر قائمة بالجداول التي تحمل التخزين: MyISAM
      أنسخ الناتج ، ومن ثم الصقه في: SQL مرة أخرى ونفذه
      🟡 ذلك سوف يغير نمط تخزين البيانات في الجداول
      ⚠️ مدة التنفيذ تعتمد على حجم البيانات في الجداول وربما يصل بعض الجداول إلى ساعة.
      كود HTML:
      SELECT CONCAT('ALTER TABLE `', table_name, '` ENGINE=InnoDB;') AS stmt
      FROM information_schema.tables
      WHERE table_schema = 'اسم_قاعدة_البيانات' AND engine = 'MyISAM';
      ✅ يمكن لك كتابة سكربت PHP أو Python تلك الاستعلامات.

      تعليق

      • AboAbdulla

        ابوعبدالله

        • 23 - 12 - 2004
        • 5530
        • السعودية
        • الطيران
        • طيار
        • Saudi Airlin
        • Dakota
        • السلامة الجوية



        • (( قُلْ يَا عِبَادِيَ الَّذِينَ أَسْرَفُوا عَلَى أَنفُسِهِمْ لَا تَقْنَطُوا مِن رَّحْمَةِ اللَّهِ
          إِنَّ اللَّهَ يَغْفِرُ الذُّنُوبَ جَمِيعًا إِنَّهُ هُوَ الْغَفُورُ الرَّحِيمُ ))

          اللهم إني استودعتك قلبي فلا يبقى فيه إلا أنت
          واستودعتك لا إله الا الله فذكرنيها في كل وقت

        #4

        حجم جدول post في منتديات vB عادة يكون كبير جدا جدا وعند تنفيذ الاستعلام أو أمر تحويل التخزين من MyISAM إلى InnoDB عادة يستغرق وقت طويل جدا ربما ساعات:
        كود HTML:
        ALTER TABLE `post` ENGINE=InnoDB;
        فإن MySQL يقوم فعليًا بـ:
        1. إنشاء نسخة جديدة من الجدول باستخدام المحرك الجديد (InnoDB في حالتك).
        2. نسخ جميع البيانات (1.2 جيجا) من الجدول القديم إلى الجديد.
        3. إعادة بناء الفهارس (indexes).
        4. استبدال الجدول القديم بالجديد بعد انتهاء النقل.
        5. تحديث التعريفات.

        ⏱️ لماذا التأخير؟
        جدول بحجم 1.2 جيجا قد يستغرق وقتًا طويلاً للأسباب التالية:
        • نوع القرص (SSD أسرع بكثير من HDD).
        • سرعة المعالج والذاكرة (RAM).
        • وجود فهارس معقدة (indexes, foreign keys).
        • وجود عمليات قراءة أو كتابة أخرى على الجدول أثناء التنفيذ.
        • قيود في إعدادات MySQL مثل:
          • innodb_buffer_pool_size
          • innodb_log_file_size
        • تفعيل الـ binary logging أو replication قد يزيد الوقت.

        🧪 كيف تتحقق إن كان لا زال يعمل؟

        ✅ 1. من خلال سطر الأوامر:
        كود HTML:
        mysql -u root -p -e "SHOW PROCESSLIST\G"
        ابحث عن العملية التي تعمل على post وستجد حالة مثل:
        كود HTML:
        State: Copying to tmp table / Creating tmp table
        أو:
        State: altering table ✅ 2. من خلال htop أو top:
        راقب استهلاك CPU و MySQL.
        ⚠️ ملاحظات وتحذيرات:
        • لا تقطع العملية بالقتل أو الإغلاق المفاجئ، سيؤدي ذلك إلى فقدان البيانات أو تلف الجدول.
        • يمكن أن يتضاعف حجم التخزين مؤقتًا لأن MySQL ينشئ نسخة مؤقتة من الجدول.
        • تأكد أن هناك مساحة كافية في القرص (على الأقل 2x من حجم الجدول).

        ✅ التوصيات مستقبلاً:
        1. اعمل نسخة احتياطية قبل تنفيذ ALTER.
        2. استخدم أدوات مثل pt-online-schema-change من Percona لتغيير الجدول بدون توقف:
          كود HTML:
          pt-online-schema-change --alter "ENGINE=InnoDB" D=yourdb,t=post --execute

        تعليق

        مواضيع ذات صلة

        تقليص

        يعمل...