MySQL 5.x – Konačno unapređen klijent

Listajući svoje omiljene WebDev feed-ove, za oko mi je zapao jedan post na sjajnom MySQL Perfomance Blogu:

…if you press CTRL-C MySQL Command Line Client will not exit but will terminate query being executed.

Drugim rečima, u dosadašnjim verzijama MySQL klijenta, kada bi ste ukucali neki query i pritiskom na CTRL-C pokušali da prekinete njegovo izvršavanje, CTRL-C bi zapravo ubio MySQL klijent, ali query nastavlja da se izvršava u pozadini! Rešenje u takvim slučajevima je traženje id-a tog query-a na listi procesa upitom “show full processlist”, a zatim njegovo “ubijanje” upitom “kill 12345” gde je 12345 u ovom slučaju id procesa koji želimo da ubijemo. Dakle, recimo nešto ovako:

mysql> select * from odm_result_keywords where keyword like '%foo%joe%';
^CAborted
bash-2.05b$ mysql -A --enable-local-infile -udinke -ppass mydb
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1512 to server version: 4.1.18-log

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> show full processlist;
+------+-------+----------------------------+-------------------+---------+------+--------------+--------------------------------------------------------------------+
| Id   | User  | Host                       | db                | Command | Time | State        | Info                                                               |
+------+-------+----------------------------+-------------------+---------+------+--------------+--------------------------------------------------------------------+
| 1486 | dinke | localhost                  | mydb | Query   |    3 | Sending data | select * from odm_result_keywords where keyword like '%foo%joe.cl' |
+------+-------+----------------------------+-------------------+---------+------+--------------+--------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> kill 1486;
mysql>

Zahvaljujući izmenama u MySQL klijentu, sada je dovoljno da stisnete CTRL-C, i query će biti odmah prekinut:

mysql> select domain from odm_result_keywords_de where whois_status is null and domain like '%.%.%';
Query aborted by Ctrl+C
ERROR 1317 (70100): Query execution was interrupted
mysql>

Više informacija o ovoj, kao i drugim izmenama u pomenutoj verziji (5.0.25) možete naći ovde.

MySQL – Backup velikih MyISAM tabela

Ako ste ikada morali da backup-ujete ili prebacujete podatke iz jedne ili više MySQL tabela, znate da se za to koristi mysqldump utility, pomoću kojeg jednostavno podatke iz MySQL-a “dumpujete” u neki mojetabele.sql fajl, koji zatim možete sačuvati kao backup, prebaciti i importovati na neki drugi MySQL server, itd. Ovu proceduru koristio sam milion puta do sada, i ona se generalno svodi na izvršavanje sledećih komandi u linuxu:

export:

mysqldump -udinke -pmojpass -hhostname.prvog.servera ime_baze tabela1 tabela 2 tabelan > dump_fajl.sql

import:

mysql -udinke -pmojpass -hhostname.drugog.servera ime_baze < dump_fajl.sql

Tu i tamo pojavi se problem kada prebacujete dump sa novije verzije MySQL-a na stariju, i tada je poželjno specifirati i odgovarajući compability flag prilikom izvršavanja mysqldump komande (--compatible=name gde name može biti mysql323, mysql40, postgresql, oracle itd.).

Elem, pre nekoliko dana zbog prebacivanja MySQL servera sa jedne lokacije na drugu, morao sam da odradim dump solidno velikih MySQL tabela (10-tak tabela gde je svaka imala preko 2 miliona slogova). Nakon užasavajuće duge procedure dumpa, gzipovanja i scpovanja na drugi server, konačno sam startovao import. Međutim, nakon 3 sata (tri sata) umesto standardne "no news is a good news" poruke, kada sam bacio pogled na status dočekala me je sledeća poruka ...:

[dinke@um-917 ~/public_html]$ mysql -udinke -p325ewfwt23rasf
keyword_discovery < es_miner_data.sql
ERROR 1582 (23000) at line 163833: Duplicate entry '1167548' for key
'PRIMARY'

WTF? Prebacivao sam podatke sa starije verzije na noviju, što znali da import mora proći glatko! Ovo bi trebalo da znači da je MySQL negde nešto pobrljavio sa indexima, i umesto da čekam još 2 sata da se odradi check & repair, odlučujem se da napravim ponovo dump fajl, ovaj put sa ignore opcijom, kako bi svi inserti u dump fajlu bili "insert ignore" tako da u slučaju ovakve greške ne bi došlo do pucanja. Ne preterano pametno, ali podaci nisu extremno osetljivi i mogu da dozvolim luksuz da izgubim desetak slogova, ali ne i desetak sati za import!

Naravno, novi dump, zip, scp ... to je traajalooo ... toliko dugo da sam posle par sati nakon startovanja importa krenuo da mozgam sa administratorom (kuki) oko alternativnih rešenja. A rešenje je bilo jednostavno ali efikasno. Prekopirali smo sve MySQL data fajlove sa jednog servera na drugi (*.MYI, *.MYD i *.frm fajlove), a zatim odradili myisamchk kako bi sredili pomenute tabele, jer nismo smeli da spuštamo server prilikom backup-a što generalno može da prouzrokuje dosta problema (tipa oštećene tabele) ako se na ovaj način backupuju fajlovi.

Sve u svemu, ova operacija prošla je jako brzo (najduže je trajalo kopiranje fajlova sa jednog hosta na drugi), i za manje od pola sata cela procedura bila je završena.

Zaključak do koga smo došli je da je kod velikih tabela zbog dužine trajanja operacije dumpovanje praktično neprihvatljivo kao backup rešenje, i da se samim tim kao jedino rešenje nameće kopiranje MySQL data fajlova. Kod MyISAM tabela to nije nikakav problem, jer su one "platform safe", tj. binarni fajl kreiran na jednoj platformi (recimo *.MYI fajl na linuxu) radiće bez ikakvih problema na drugoj platformi (recimo isti *.MYI fajl na Windowsu).

Muke po Kirbiju

Nešto sam utanjio sa postovima u poslednje vreme. Nisam siguran šta je tačan razlog … nedostatak vremena, inspiracije, kriza srednjih godina … :)) Obećavam da ću se uskoro ponovo aktivirati, tako da, nema potrebe da brišete ovaj feed 🙂

Elem, večeras mi je moj prijatelj Kuki prepričao strašnu (ROFL) priču o njegovom iskustvu prilikom posete prodavca Kirbija. Zamolio sam Kukija da mi potanko prekuca sve interesantnije detalje priče, kako bi istu objavio na Blogu. Ideja je bila da otvorim Kukiju “Guest Blogger” account, ali kako će on uskoro među nas Blogere (mislim, moraće, švercovao se preko mene na BlogOpenu :)), rešio sam da jednostavno odradim copy-paste iz maila koji mi je Kuki poslao 🙂

Priča sledi 🙂

Muke po Kirbiju (By Kuki)
————————–
Dakle, došao mi je lik, tačno 5 min ranije, ali to je ok, bolje da porani nego da okasni 🙂 pošto smo mi dobili besplatno usisavanje jednog komada nameštaja i jednog tepiha :)))
I krene on sa standardnom pričom (inače sve smo to već slušali, pa smo mu rekli da smo već imali prezentaciju kirbija i da ne mora da se trudi). I krene on sa pričom kako jedino kirbi ima one četkice na sredini, a ja mu kažem, nije, ima i Cepter (inace, pomenuti Cepter i posedujemo, tako da znam o čemu pričam). Na njegovu žalost, lik krene da ulazi u raspravu sa mnom, gde me pita da li je to možda Reinbou (namerno pisem fonetski zbog fore kasnije), ali ja sam ostao pri tome da je Cepter. On kaže pa jeste li baš sigurni da je cepter? Na šta mu ja na kraju odgovarm, u pravu ste, nije Cepter, nego je Zepter :))))

Usput naravno pominje kako to što to košta 2 soma eura i nije tako mnogo :))) a ako oćete i ostale dodatke, dogura se na preko 3 somića. Dijalog je počeo ovako …

ja: pa za 10-15 eura mozete da iznajmite nekog da vam sa istim tim kirbijem dođe i usisa ceo stan. I još taj neko drugi radi, dakle zero smaranja, i ako usisavam jednom mesečno, to je 15 godina, minimum, plus, ne smaram se, i ne zauzima mi prostor
kirbi: ali, ali, ovo imate za ceo život :)))

OK, sad dolazimo do finala večeri: krene lik sa usisavanjem kreveta na kom mi inače spavamo, i pokaže nam koliko je prašine izvukao, uz standardno smaranje sa grinjama

kirbi: i da li bi ste vi stali u ovo (pokazujući na tu prašinu što ju je izvukao)
ja: pa zavisi od patika, ali bih 🙂
kirbi: ok, a da li bi ste seli?
ja: zavisi od motivacije/potrebe :))
kirbi: da li bi ste seli za 200-300 din 🙂
ja: da :))))
kirbi: seli bi ste za 200 din?
žena: a-ha, rekli ste 300!
kirbi: reko sam 200-300, dakle 200 :)))
ja: ma bih i za 200

I prvo malo rukom prodžaram po toj prašini i onda sednem u to i kažem
ja: dajte mojih 200 dindži :)))

kirbi: ….
(liku su ispale oči)
ja: pa to je skoro 5l koka kole, dakle, što da ne

Lik krene oma da se pakuje (inače, nije završio usisavanje)
ja: šta je sa mojih 200 dindži
kirbi: pa to mora šef
(i krene kao da izlazi)
ja: a šta je sa usisavanjem
kirbi: vi očigledno ne cenite čistoću, pa onda ništa od usisavanja
ja: sići ću dole sa vama da uzmem moje pare
kirbi: nene, to mora šef, a on je otisao kući, evo vam telefon, zovite sutra
ja: ok, uzmem telefon, a zapisao sam i broj koji je on zvao da se javi na početku prezentacije

epilog: nije usisao, zbrisao je posle pola sata :))) Ala ću sutra da smaram šefa za moje teško zarađene pare 🙂