adatbázis-szerkezet “verziókövetése”

Egy ideig gondot okozott, hogy vajon mivel tudnám a címben lévő problémát orvosolni. Adott az éppen aktuális fejlesztés amihez verziókövetőt használok, viszont az adatbázissal eddig nem sok mindent tudtam csinálni. Önálló részegység aminek a szerkezetváltozása elég nehezen követhető. Volt, eddig. Most úgy tűnik sikerült végre megoldást találnom a problémára.
A megoldást a binlog fogja szállítani. A mysql binlog követi és loggolja az insert update alter és hasonló, változással járó parancsokat. A másik hasznos tulajdonsága amit most használni is fogunk, hogy képes a rendelkezésre álló adathalmazból szűrni adatbázisra és időpontra (tól ig intervallumban is akár). Nézzük hogyan is valósul meg az elképzelés.
Egy fájlba fogunk dolgozni, legyen mondjuk dev/mysql_changes.sql. Ha commitolni akarunk akkor a fájl történetéből ki tudjuk deríteni azt, hogy mikor commitoltunk utoljára, tehát van egy dátumunk. Ezt így kapjuk meg:

user="connor"
revdate="$(svn log dev/mysql_changes.log | grep "| $user |" | awk '{ print $5 " " $6 }' | head -n1)"

M.j.: Ezen a ponton van az első pontatlansága a jelen megvalósításnak, hiszen ha egy futó projectbe érkezik egy új fejlesztő nála ez üres lesz. Így kézzel kellene megadni egy dátumot. Ez a dátum mondjuk lehet a fájl létrehozásának időpontja (hiszen ha saját checkoutja van a fejlesztőnek, akkor a co utáni változásokra vagyunk kíváncsiak). Így ha az elgondolás helytálló akkor ez is megteszi: stat -c “%Z” dev/mysql_changes.log

Majd a kapott dátummal listázunk a binlogokból és szükség esetén commitolunk:

database="folkradio"
mysqlbinlog /var/log/mysql/mysql-bin.0* -d $database --start-datetime="$revdate" | grep -e "^insert" -e "^update" -e "^#" -vi > dev/mysql_changes.log
svn commit -m "adatbázis szerkezet változott" dev/mysql_changes.log

Eddig a fejlesztő oldaláról. A szerver oldalon és az éles rendszeren szintúgy végig lehet szambázni a változásokon. Akkor az “svn log” parancs segítségével értelem szerűen revíziók vagy ágak közötti változásokat kell listáznunk. Ekkor egy ciklusra és az svn cat parancsra van szükség. Mivel viszont a fejlesztés közben adódhatnak hibák és fölösleges kódok a kimenetet éles rendszer frissítése előtt mindenképpen érdemes egy fájlba összehozni és végigfutni. Ha minden rendben akkor lehet rá áment mondani.

Mik az elgondolás hibái?

  • Elgondolás szinten létezik. Gyakorlatba még csak most fogom átültetni.
  • Nem tesztelt.
  • Nem tűri az olyan szerkezeteket ahol az adatbázis táblája, vagy annak sora a program számára fontos elemet tárol, amit szintúgy mozgatni, verziózni kell. Ekkor nyilvánvalóan filter (pl awk) kell a binlog kimenetére amiben táblára is tudunk szűrni.
  • Éles szerver és a fejlesztői szerver scriptjei nincsenek kidolgozva így lehetnek nem látható akadályok

Összességében viszont már így is több mint ami eddig volt. A tapasztalatot a használat fogja meghozni, így ha beválik akkor mindenképpen referálok az elkészült scriptekkel egyetemben.

Leave a Reply

Your email address will not be published. Required fields are marked *