Saytni boshqa hostingga ko'chirish yoki zaxira nusxadan tiklash paytida eng ko'p uchraydigan to'siq katta MySQL bazani import qilishdir. Bir necha megabaytli baza phpMyAdmin orqali bir zumda yuklanadi, ammo hajm yuzlab megabayt yoki bir necha gigabaytga yetganda jarayon yarim yo'lda uzilib qoladi. Brauzer oynasi oq sahifa ko'rsatadi, phpMyAdmin vaqt tugagani haqida xabar beradi yoki MySQL ulanishni o'zi uzib qo'yadi. Bu maqolada shunday xatolarning sababini va katta bazani xatosiz import qilishning amaliy usullarini ko'rib chiqamiz.
Nega katta dump phpMyAdmin orqali yuklanmaydi
phpMyAdmin oddiy PHP ilovasi, shuning uchun u PHP sozlamalari bilan cheklangan. Faylni yuklash uchun upload_max_filesize va post_max_size qiymatlari dump hajmidan katta bo'lishi kerak, aks holda fayl serverga umuman yetib bormaydi. Fayl yetib borgan taqdirda ham skript max_execution_time bilan belgilangan vaqtdan ortiq ishlay olmaydi, ko'p gigabaytli bazani esa bir necha daqiqada import qilib bo'lmaydi. Bundan tashqari, veb-server va proksi ham o'z kutish limitlariga ega, shu sabab brauzer 504 Gateway Timeout xatosini ko'rsatishi mumkin, orqada esa import yarim holatda to'xtab qoladi.
Yarim import qilingan baza xavfli holat hisoblanadi. Ba'zi jadvallar to'liq, ba'zilari bo'sh yoki chala bo'ladi, sayt esa ochiq xato bermasdan noto'g'ri ishlashi mumkin. Shuning uchun import uzilgan bo'lsa, qolgan qismini "yuklab qo'yishga" urinmasdan, bazani tozalab, jarayonni boshidan qayta boshlash to'g'riroq bo'ladi.
max_allowed_packet xatosi nimani bildiradi
Ikkinchi keng tarqalgan muammo MySQL serverning o'zida yuzaga keladi. max_allowed_packet parametri server bir marta qabul qila oladigan eng katta paket yoki so'rov hajmini belgilaydi. mysqldump odatda ko'p qatorni bitta uzun INSERT buyrug'iga birlashtiradi, rasm yoki katta matn saqlangan BLOB va LONGTEXT ustunlari bo'lsa, bitta qator ham bir necha megabaytga yetadi. Agar shunday so'rov limitdan katta bo'lsa, quyidagi xatolardan biri chiqadi:
ERROR 1153 (08S01): Got a packet bigger than 'max_allowed_packet' bytes
ERROR 2006 (HY000): MySQL server has gone away
Ikkinchi xabar boshqa sabablarga ham bog'liq bo'lishi mumkin, masalan, ulanish uzoq vaqt bo'sh turib uzilganda. Lekin import paytida, ayniqsa katta jadvalga kelganda chiqsa, birinchi navbatda paket limitini tekshirish kerak. Mijoz tomonida limitni buyruq satrida oshirsa bo'ladi, server tomonidagi global qiymatni esa shared hostingda foydalanuvchi o'zi o'zgartira olmaydi, buning uchun hosting texnik yordamiga murojaat qilinadi.
Eng ishonchli usul: SSH va mysql buyrug'i
Agar hostingingizda SSH kirish yoqilgan bo'lsa, katta bazani buyruq satri orqali import qilish eng barqaror yo'ldir. Bu holatda PHP limitlari va brauzer kutish vaqti umuman ishtirok etmaydi, jarayon serverning o'zida ishlaydi. Avval dump faylini FTP yoki SFTP orqali hosting papkasiga yuklaysiz, so'ng quyidagi buyruqni ishlatasiz:
mysql -u baza_user -p --default-character-set=utf8mb4 \
--max_allowed_packet=512M baza_nomi < dump.sql
Dump siqilgan holatda bo'lsa, uni oldin ochib o'tirish shart emas, oqim orqali to'g'ridan-to'g'ri uzatish mumkin. Bu disk joyini tejaydi, chunki matnli SQL dump siqilganda odatda bir necha barobar kichrayadi:
gunzip < dump.sql.gz | mysql -u baza_user -p baza_nomi
Uzoq davom etadigan importni SSH sessiya uzilib qolsa ham to'xtamaydigan qilib ishga tushirish foydali. Buning uchun nohup yoki serverda mavjud bo'lsa screen ishlatiladi. Parol so'ralmasligi uchun uni faqat sizga o'qish huquqi berilgan sozlama fayliga yozish mumkin:
# ~/.my.cnf (huquq: chmod 600 ~/.my.cnf)
[client]
user=baza_user
password=PAROL
nohup sh -c 'gunzip < dump.sql.gz | mysql baza_nomi' > import.log 2>&1 &
Import tugagach import.log faylini ko'rib chiqing: bo'sh bo'lsa, xato yuz bermagan. Ishingiz tugagach .my.cnf faylidagi parolni o'chirib qo'yish xavfsizlik nuqtai nazaridan to'g'ri qaror, chunki bu fayl serverda ochiq matn ko'rinishida saqlanadi.
Dumpni to'g'ri tayyorlash
Importning muvaffaqiyati ko'p jihatdan dump qanday olinganiga bog'liq. Eski serverdan eksport qilganda mysqldump buyrug'iga bir nechta parametr qo'shish keyingi bosqichni ancha osonlashtiradi. --single-transaction InnoDB jadvallarini saytni to'xtatmasdan izchil holatda saqlaydi, --quick esa katta jadvallarni xotiraga to'liq yuklamasdan qatorma-qator o'qiydi:
mysqldump -u baza_user -p --single-transaction --quick \
--default-character-set=utf8mb4 baza_nomi | gzip > dump.sql.gz
Agar baza juda katta bo'lsa, uni jadvallar bo'yicha alohida fayllarga bo'lish mumkin. Shunda biror jadvalda xato chiqsa, butun jarayonni emas, faqat shu jadvalni qayta yuklaysiz. Faylni split bilan satrlar soni bo'yicha bo'lish tavsiya etilmaydi, chunki bitta INSERT buyrug'i o'rtasidan kesilib, buzilgan SQL hosil bo'lishi mumkin. Kodlashga ham e'tibor bering: eski bazada utf8, yangisida utf8mb4 bo'lsa, import tugagach kirill harflari va emoji belgilarini tekshirib chiqing.
SSH bo'lmasa nima qilish kerak
Ba'zi tariflarda buyruq satri mavjud bo'lmaydi. Bunday holatda uchta yo'l bor. Birinchisi, dumpni jadvallar bo'yicha bir nechta kichik faylga bo'lib, phpMyAdmin orqali navbatma-navbat import qilish: har bir fayl yuklash limitidan kichik bo'lishi kerak. Ikkinchisi, katta dumpni qismlab o'qib, har so'rovda ma'lum miqdordagi buyruqni bajaradigan bosqichma-bosqich import skriptlaridan foydalanish, ular PHP vaqt limitiga tushib qolmaydi. Uchinchisi va eng sodda yo'li, faylni hostingga yuklab, import ishini texnik yordamga topshirish.
Masalan, Toshkentdagi elektronika do'konining misol.uz sayti boshqa provayderdan ko'chirilayotganini tasavvur qiling. Mahsulotlar, buyurtmalar tarixi va loglar bilan baza 2,5 GB ni tashkil qiladi, phpMyAdmin orqali yuklashga har urinish o'n daqiqadan so'ng uzilib qoladi. Dumpni gzip bilan siqib, SSH orqali yuqoridagi buyruq bilan import qilish butun ishni taxminan yarim soatda yakunlaydi va hech qanday kutish xatosi chiqmaydi. sayt.uz hostingida ham shunday holatda faylni yuklab, kabinet orqali tiket ochib yordam so'rash mumkin.
Importdan keyin nimani tekshirish kerak
Import xatosiz tugagani hali hamma narsa joyida ekanini anglatmaydi. Jadvallar sonini eski va yangi bazada solishtiring, eng muhim jadvallardagi qatorlar sonini SELECT COUNT(*) bilan tekshiring. Saytning konfiguratsiya faylida yangi baza nomi, foydalanuvchi va parol to'g'ri yozilganini ko'rib chiqing, so'ng sahifalarni, qidiruvni va buyurtma berish jarayonini sinab ko'ring. Agar matnlarda so'roq belgilari yoki tushunarsiz belgilar paydo bo'lsa, bu kodlash muammosidan darak beradi va importni to'g'ri --default-character-set bilan qaytadan bajarish kerak bo'ladi.