Import velike količine podataka u mysql bazu
Ukoliko ste imali priliku raditi import velike količine podataka, izvorna .sql datoteka preko 5GB ili preko 20 milijuna zapisa, vrlo vjerojatno ste se susreli sa pitanjem na koji način to najbrže i najlakše odraditi. Pogotovo kada se radi o live produkcijskom serveru kod kojeg nije zgodno isključiti pristup na više sati.
Ovih dana upravo sam radio na jednom takvom primjeru. Sql datoteka sa oko 25 milijuna zapisa koje treba ubaciti u mysql bazu.
Kreirao sam myslq bazu i unutar mysql prompta upisao naredbu:
. /home/user/backup_dump.sql
Krenulo je odlično, ubrzo je importano preko 10 milijuna zapisa. Međutim, import podataka lagano se počeo usporavati.
Na početku je bilo oko 15 tisuća upisa u sekundi, nakon milijun-dva upisa usporilo se na 2-3 sekunde po upisu, zatim na 12-15 sekundi, da bi se nakon 15 milijuna zapisa usporilo na preko 60 sekundi i smanjilo na svega 6 tisuća upisa. Ovo je poprilično velik problem pošto je ostalo još oko 10 milijuna zapisa za upisati, a svaki paket upisa je sve sporiji i sporiji. Ukoliko se ovako nastavi trebati će preko 100 sati (>4 dana) da se dovrši upis kompletno svih podataka.
Ovakav način importa je prekinut. Pokušao sam zatim import preko komandne linije “mysql baza < /home/user/backup_dump.sql” no završilo je sa istim rezultatom. Što se više bliži kraj, više vremena treba mysql-u da pročita upiti iz datoteke.
Nakon toga pokušao sam sljedeće. Backup_dump.sql datoteku podijelio sam na nekoliko dijelova od po otprilike 200MB. Za ovo sam koristio naredbu “split”:
cd /home/user
mkdir splits
split -l 200 backup_dump.sql splits/sql_
Ovo je rezultiralo sa petnaestak datoteka i potrajalo je par minuta (8 min). Opcija -l označava da se nakon svakih 200 linija napravi prekid i kreira nova datoteka za upis sljedećih 200 linija. Kreirane manje datoteke nazvane su sql_aa, sql_ab, sql_ac, itd. sve do zadnje. Nakon toga, koristio sam naredbu “cat” da pošaljem sve podatke prema mysql-u:
cd splits
cat sql_* | mysql baza
Jedini problem kod ovoga je da se ne može pratiti status svakog izvršenog upita, već se jednostavno podaci importaju dok se ne pojavi neka greška, nakon čega se prekida daljnji import. Ako sve prođe ok vratit će se natrag komandna linija. Za pregled tijeka importa može se u novom prozoru u mysql naredbenoj liniji izvršiti naredba “show processlist;”, ili u komandnoj liniji naredba “mysqladmin proc”, tako da vidimo dokle je stigao import.
Nakon nekoliko sati kompletno svi podaci importani su u mysql bazu. Najvažnije je da za ovakav import treba znatno manje vremena nego za import jedne cijele velike datoteke.
Nadam se da će vam ovaj članak pomoći u slučaju da se nađete u sličnoj situaciji.