Asosiy kontentga o‘tish
Innovialabs

Ma’lumotlar bazasini MySQL dan PostgreSQL ga qanday ko‘chirish mumkin

Amaliyot4 daq

Qisqacha

MySQL dan PostgreSQL ga migratsiya faqat ma’lumot ko‘chirish emas: avval turlar va ilova so‘rovlari tekshiriladi, keyin ma’lumotlar pgloader orqali test stendga ko‘chiriladi, solishtiriladi va faqat repetitsiyadan so‘ng ilova orqaga qaytish rejasi bilan qisqa oynada almashtiriladi.

Qisqa javob

Ishonchli migratsiya besh bosqichdan iborat:

  1. Audit: sxema, turlar, ilova so‘rovlari, saqlanadigan protseduralar.
  2. Nusxada repetitsiya: pgloader orqali ko‘chirish, xatolarni tuzatish.
  3. Ilovani moslashtirish: drayver, ORM, «xom» SQL so‘rovlar.
  4. Ma’lumotlarni solishtirish: qatorlar soni, summalar, tanlangan yozuvlar.
  5. Tayyor orqaga qaytish rejasi bilan xizmat ko‘rsatish oynasida almashtirish.

Ma’lumotlarni ko‘chirishning o‘zi odatda eng oson qism. Ko‘p vaqt MySQL kechirgan, PostgreSQL esa kechirmaydigan so‘rovlarga ketadi.

Turlar farqi

MySQLPostgreSQLIzoh
INT AUTO_INCREMENTinteger GENERATED BY DEFAULT AS IDENTITY yoki serialYuklagandan keyin hisoblagichlarni suring
TINYINT(1)booleanAgar faqat 0 va 1 bo‘lsa
INT UNSIGNEDbigint yoki integer + CHECKPostgreSQL da ishorasiz turlar yo‘q
DATETIMEtimestampVaqt zonasisiz
TIMESTAMPtimestamptzVaqt zonasi bilan
DOUBLEdouble precisionPul uchun — numeric
ENUM(...)text + CHECK yoki CREATE TYPE ... AS ENUMCHECK ga yangi qiymat qo‘shish osonroq
JSONjsonbGIN orqali indekslanadi
BLOB, LONGBLOBbytea
'0000-00-00'NULLPostgreSQL da bunday sanalar yo‘q

Sintaksis va xatti-harakat farqlari

  • Teskari qo‘shtirnoqlar (backtick) → qo‘shtirnoq "name", yaxshisi esa qo‘shtirnoqsiz kichik harfli nomlar.
  • Registr: PostgreSQL qo‘shtirnoqsiz nomlarni kichik harfga o‘tkazadi. Qo‘shtirnoqda yaratilgan "Users" jadvali hamma joyda qo‘shtirnoq talab qiladi.
  • LIMIT 10, 20 → LIMIT 20 OFFSET 10.
  • IFNULL() → COALESCE(), GROUP_CONCAT() → string_agg().
  • INSERT ... ON DUPLICATE KEY UPDATE → INSERT ... ON CONFLICT (...) DO UPDATE.
  • Satrlarni solishtirish: MySQL da collation tufayli ko‘pincha registrga sezgir emas, PostgreSQL da esa sezgir. ILIKE, ifoda bo‘yicha indeksli lower() yoki citext turidan foydalaning.
  • GROUP BY: PostgreSQL agregatsiyalanmagan barcha ustunlar GROUP BY da bo‘lishini yoki kalitga funksional bog‘liq bo‘lishini talab qiladi.
  • Turlar qat’iyligi: MySQL turlarni jimgina o‘zgartiradi, PostgreSQL esa sonli ustunni matn sifatida uzatilgan parametr bilan solishtirsangiz xato beradi.

Ilovaning to‘liq testlar to‘plamini PostgreSQL da ishga tushiring — bunday so‘rovlarni topishning eng tez yo‘li.

pgloader orqali ko‘chirish

pgloader MySQL sxemasini o‘qiydi, PostgreSQL da jadvallar, indekslar va tashqi kalitlarni yaratadi, ma’lumotlarni ko‘chiradi va ketma-ketliklarni yangilaydi. Bitta buyruq bilan tez start:

pgloader mysql://user:pass@mysql-host/shop postgresql://user:pass@pg-host/shop

Takroriy ishga tushirishlar uchun sozlamalar fayli qulayroq:

LOAD DATABASE
  FROM mysql://app:secret@mysql-host/shop
  INTO postgresql://app:secret@pg-host/shop

WITH include drop, create tables, create indexes,
     reset sequences, foreign keys

ALTER SCHEMA 'shop' RENAME TO 'public';
pgloader migrate.load

Bilish muhim:

  • Standart holatda pgloader jadvallarni MySQL bazasi nomidagi sxemaga joylaydi — shuning uchun ALTER SCHEMA kerak.
  • pgloader da turlarni o‘zgartirishning standart qoidalari bor; ularni CAST blokida qayta belgilash mumkin.
  • Yakuniy hisobotni o‘qing: xatoli qatorlarni u o‘tkazib yuboradi va alohida ko‘rsatadi.
  • Triggerlar, protseduralar va view lar avtomatik ko‘chmaydi — ular qo‘lda qayta yoziladi.

Ma’lumotlarni solishtirish

«Xatosiz yakunlandi» degan yozuvga ishonmang. Tekshiring:

  • Har bir jadvalning aniq qatorlar soni — ikkala bazada COUNT(*) orqali. MySQL dagi information_schema statistikasi InnoDB uchun taxminiy.
  • Nazorat agregatlari: pul maydonlari summasi, kalitlar va sanalarning MIN/MAX qiymatlari.
  • Tanlangan yozuvlar: ikkala bazadagi bir xil 100 ta tasodifiy id, qatorma-qator solishtirish.
  • Kodirovka: kirill harflari, o‘zbekcha tutuq belgilari, foydalanuvchi ma’lumotlaridagi emoji.
  • Ketma-ketliklar: keyingi id mavjud eng katta qiymatdan katta bo‘lishi kerak.

Yuklagandan keyin rejalashtiruvchi statistika olishi uchun ANALYZE ni bajaring.

Minimal to‘xtash bilan almashtirish

Ko‘pchilik loyihalar uchun eng amaliy variant:

  1. Migratsiyani oldindan repetitsiya qiling va ko‘chirish vaqtini o‘lchang.
  2. Xizmat ko‘rsatish oynasida ilovani faqat o‘qish rejimiga o‘tkazing yoki yozishni to‘xtating.
  3. Yakuniy ko‘chirish va solishtirishni bajaring.
  4. Ulanish satrini almashtiring va ilovani qayta ishga tushiring.
  5. Xatolar va sekin so‘rovlarni kuzating; orqaga qaytish uchun MySQL ga tegmang.

Qisqa to‘xtash ham mumkin bo‘lmasa, o‘zgarishlarni replikatsiya qilish (CDC) dan foydalaning — masalan, Debezium yoki bulutli migratsiya xizmatlari. Bu murakkabroq va alohida tekshiruv talab qiladi, shuning uchun faqat haqiqatan ham muhim tizimlar uchun o‘zini oqlaydi.

Ko‘p beriladigan savollar

Ma’lumotlar hajmiga, koddagi «xom» SQL so‘rovlar soniga, saqlanadigan protseduralarga va testlar qamroviga bog‘liq. Ma’lumot ko‘chirish vaqti repetitsiyada o‘lchanadi; ilovani moslashtirish odatda ko‘proq vaqt oladi.

Bunda yordam beramiz

O‘zingiz shug‘ullanmasdan natija olishni istasangiz — biz har kuni shu bilan shug‘ullanamiz.

Loyihani muhokama qilish

Yana o‘qing

G‘oya yoki vazifangiz bormi? Bizga aytib bering

Ish kuni davomida javob beramiz va yechim taklif qilamiz. Konsultatsiya bepul.