Desventures de Mysql: logs binaris

A la feina toco diverses tecnologies, i una d’elles és Mysql. No en sóc expert, però clar, fent coses es va aprenent (a mesura que un té petits o grans problemes). M’han passat dues coses que considero força interessants i descric aquí: una sobre els logs binaris i l’altre sobre uns selects amb Innodb i Python. Avui només explico la primera cosa que ja és suficientment llarg.

Logs binaris


Què són els logs binaris? Els logs binaris són uns logs on Mysql hi desa totes les consultes que es fan al servidor i que modifiquen la base de dades (creates, updates, inserts, etc.). Aquests fitxers són binaris per millorar el rendiment, i es poden visualitzar amb mysqlbinlog (també són la base de fer servidors mestre-esclaus). Així, si per algun motiu la base de dades “desapareix” (disc dur defectuós, errada de l’administrador, etc.) es pot restaurar l’última còpia de seguretat i utilitzar els logs binaris com a font per anar fins al punt que es vulgui del dia actual. També es poden fer servir per auditar les consultes, replicar a altres servidors tal com ja he dit, etc.

El primer problema va ser ara fa un any aproximadament i va ser per desconeixement: a un servidor jo no era conscient que estaven activats (tot i que estan actius a Debian per defecte) i un dia no funcionava bé el Mysql. S’engegava però quedava bloquejat. Jo no hi era (vull dir físicament), però no sé perquè quan ho vaig mirar el primer que vaig fer va ser un “df” i veure que una partició estava plena, així que ràpidament va quedar solucionat el problema (després de veure que hi havia els logs binaris omplint tot l’espai). Buscant una mica vaig veure com eliminar els logs aquests per valors de més de N dies (cron i una comanda).

Segon problema: fa uns mesos, es va tornar a omplir. Crec que va ser en cap de setmana. Bé, no passa res, el dilluns elimino els logs i enlloc de guardar-los N dies els guardo N/2 dies 🙂 . Curiosament dies després va passar igual (s’omplia i no s’eliminava). Vaig estar buscant problemes relacionats amb logs binaris i un dels primers llocs deia: ull! si algú elimina els logs binaris a mà potser no s’eliminaran més automàtics perquè cal fer un “purge master logs”. Ho vaig fer i vaig seguir mirant. Semblava que tot anava bé fins que un altre dia va tornar a fallar (dilluns? potser, no ho recordo). Faig el “purge master logs” i a més a més vaig posar altres maneres d’eliminar els logs. Però va tornar a passar… un altre dilluns! (és a dir, passava en cap de setmana).

La resolució


Un dilluns (bé, vaig fer una ullada el diumenge) vaig pensar que calia anar a l’arrel del problema ja que s’estava repetint massa sovint. Això no podia ser, ja feia 3 o 4 setmanes que estava igual! (i hi ha coses importants a la base de dades, perquè quedi inaccessible). Primer vaig comprovar una cosa: el dilluns, tots els fitxers binlogs eren prou nous (de 2 dies). Els dies de cada dia no s’omplia pas, semblava cosa dels caps de setmana. Doncs bé, mirant amb el mysqlbinlog el contingut dels fitxers va estar clar el motiu! Feia unes setmanes que havia afegit un script fent uns càlculs a la base de dades. Els dies de cada dia, per cada taula tardava segons a fer els càlculs, però els caps de setmana l’script tarda “res” perquè no hi ha activitat a les taules. Bufa! cada segon feia desenes o centenars d’insercions al log binari! (l’script fa updates a altres taules de resum).

Hi ha diverses solucions: que l’script no actualitzi la taula resum si no cal (per tant no genera log binari innecessari), configurar el mysql perquè una taula o base de dades no tinguin log binari, fer que sempre tardi N segons l’script a escriure valors (ja que no cal que siguin a temps real), etc. Feta una de les solucions, acabat el problema!

Leave a Reply

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>