Ma’lumotlar bazasini MySQL dan PostgreSQL ga qanday ko‘chirish mumkin
Amaliyot4 daqInnovialabs tahririyati
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:
- Audit: sxema, turlar, ilova so‘rovlari, saqlanadigan protseduralar.
- Nusxada repetitsiya: pgloader orqali ko‘chirish, xatolarni tuzatish.
- Ilovani moslashtirish: drayver, ORM, «xom» SQL so‘rovlar.
- Ma’lumotlarni solishtirish: qatorlar soni, summalar, tanlangan yozuvlar.
- 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
| MySQL | PostgreSQL | Izoh |
|---|---|---|
INT AUTO_INCREMENT | integer GENERATED BY DEFAULT AS IDENTITY yoki serial | Yuklagandan keyin hisoblagichlarni suring |
TINYINT(1) | boolean | Agar faqat 0 va 1 bo‘lsa |
INT UNSIGNED | bigint yoki integer + CHECK | PostgreSQL da ishorasiz turlar yo‘q |
DATETIME | timestamp | Vaqt zonasisiz |
TIMESTAMP | timestamptz | Vaqt zonasi bilan |
DOUBLE | double precision | Pul uchun — numeric |
ENUM(...) | text + CHECK yoki CREATE TYPE ... AS ENUM | CHECK ga yangi qiymat qo‘shish osonroq |
JSON | jsonb | GIN orqali indekslanadi |
BLOB, LONGBLOB | bytea | |
'0000-00-00' | NULL | PostgreSQL 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 indekslilower()yokicitextturidan foydalaning. - GROUP BY: PostgreSQL agregatsiyalanmagan barcha ustunlar
GROUP BYda 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 SCHEMAkerak. - pgloader da turlarni o‘zgartirishning standart qoidalari bor; ularni
CASTblokida 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 dagiinformation_schemastatistikasi InnoDB uchun taxminiy. - Nazorat agregatlari: pul maydonlari summasi, kalitlar va sanalarning
MIN/MAXqiymatlari. - 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:
- Migratsiyani oldindan repetitsiya qiling va ko‘chirish vaqtini o‘lchang.
- Xizmat ko‘rsatish oynasida ilovani faqat o‘qish rejimiga o‘tkazing yoki yozishni to‘xtating.
- Yakuniy ko‘chirish va solishtirishni bajaring.
- Ulanish satrini almashtiring va ilovani qayta ishga tushiring.
- 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.