|
Üsna normaalne on, et andmebaasist on mitu eksemplari:
Kui nüüd andmebaasis on muudatusi, siis tuleb need paigaldada ka kõikidesse teistesse eksemplaridesse. Mismoodi te olete selle lahendanud? Logite ALTER TABLE käsklusi? Kasutate mingit andmebaasiskeemide võrdlemise tööriistu? Jagage kogemusi! Küsimus on inspireeritud Saiku Kaizen blogist. |
|
railsi migratsioonid on hea näide versioonimisest. IMHO elegantselt lahendatud. Täpsemalt siin: http://api.rubyonrails.org/classes/ActiveRecord/Migration.html |
|
Siiani olen mitmetes projektides saanud hakkama lihtsalt SQL konvert-skriptide kirjutamisega. Käsitsi ALTER TABEL-ite kirjutamine pole senini olulist peavalu valmistanud - küllap oleks kasuks ka mingi vahend nende lihtsamaks genereerimiseks aga mõningate keerukamate muudatuste puhul ei jää nagunii muud üle kui ise käsitsi skript kirjutada. Seni päris lahendamata probleem on olnud, kuidas neid konvert-skripte hallata. Või kuidas neid üldse nimetada.
Seejärel tuleb kirjutada miski skript, mis oskab vajalikud muudatused baasile rakendada. Oluline trikk siinkohal on tuvastamine, millise versiooniga andmebaasist tegemist on. Ju vast oleks hea kui selle versiooninumbri või kuupäeva saaks kuskilt failist või andmebaasist endast välja lugeda. Kus seda kõige parem hoida oleks, jään vastuse võlgu. Mul on hetkel üles pandud selline süsteem, et igaöiselt tehakse live baasist tagavarakoopia ning taastatakse testbaasi. Seejärel rakendatakse sellele testbaasile kõik konvert skriptid. Vigade logi tuleb meili peale. Seda kõike teeb üks bash skript. Nii saan mitu asja korraga - tagavarakoopia saab testitud + saan testida oma koodi live andmebaasiga. Selle tulemusena on release'i tegemine oluliselt pingevabamaks muutunud. Samuti kasutan seda testbaasi keerulisemate kasutajatoe probleemide lahendamisel - saan soperdada kliendi andmetega, ilma et see teda mõjutaks.
(Nov 04 '09 at 09:03)
Tambet Matiisen ♦♦
|
|
Railsi migreerimise osas on ehk ülevaatlikum see leht: http://guides.rubyonrails.org/migrations.html Railsi migreerimise põhiline võlu seisneb selles, baasimuudatuse haldusühikuks on migratsioonifailid, millede rakendamise üle konkreetse baasiinstantsi vastu rails ise arvet peab. Sisuliselt "fire and forget" tüüpi lahendus, käsitsi haldamist praktiliselt ei ole. |
|
Kasuta julgelt mõnda andmebaasi diffimise tarkvara. See võrdleb kahte andmebaasi ning kuvab nendevahelised erinevused (filtreerimisvalikud on laiad, mida võrrelda ja mida ignoreerida). Võrdluse pealt SQL skript (transaktsioon), mis transformeerib võrdlusest valitud erinevuste najal ühe baasi teisega üheseks. Arvesta muidugi sellega, et kui LIVE baasis on muudetavas tabelis juba näiteks 3.000.000 kirjet ning su skript muudab iga rida, siis admin võib heaga selle ööseks serverisse käima jätta. Valik tööriistu konkreetselt selleks otstarbeks on lai, kuid (avaliku sektori suurimas IT asutuses) kasutame hetkel põhiliselt sellist töörista nagu Red Gate SQL Compare (http://www.red-gate.com/products/SQL_Compare/index.htm). Ühtegi viga ei ole kunagi täheldanud. Vali mõni välja endale (trial peroodid peaks vist neil kõigil olema), katseta ning usu mind, sul ei tule pähegi enam kunagi et see võis kunagi probleem olla (mul tavaliselt läheb ca 10-15 minutit deploy paki koostamisel LIVEsse mineku eel andmebaasi skriptide koostamisele). |
|
Ise olen loginud SQL skeemi muutmise käsklused konvert skriptides. Mul on nad nimetatud kuupäevaliselt - konvert_AAAAKKPP.sql. Kuna mul on enamasti üks keskne andmebaas ja ainult arendus, test ja avalik baas, siis ma tavaliselt tean, mis kuupäeva versioon on avalikus baasis (üritan versioonikontrollis tagida kui muudatusi avalikustan) ja millised konvert skriptid tuleks rakendada. Vanad konvert skriptid tõstan eest ära arhiivi kataloogi. Tegelikult ei kirjuta ma konvert skripte käsitsi, vaid genereerin Sybase PowerDesignerist. Selle eelis andmebaasiskeemide võrdlemise ees on see, et PowerDesigneri mudelis on rohkem infot, nt suudab ta tuvastada kas tabeli väli nimetati ümber või kustutati vana ja lisati uus. Töötab hästi, aga on tasuline (~8000 krooni SQL Anywhere koosseisus). Olen kaalunud ka andmebaasiskeemide võrdlemist katsetada, sest kui see enam-vähem töötaks, saaks muudatused teha otse andmebaasis ja oleks arendus kiirem. Olen plaaninud katsetada DB Comparerit, aga pole aega leidnud. |
|
Pisut põhjalikum analüüs koos erinevate lahendusvariantidega: http://code.djangoproject.com/wiki/SchemaEvolution Sisaldab ka palju viiteid edasisele lugemismaterjalile, vt sektsioone "Prior art" ja "Something Completely Different". |
|
Soovitan uurida Liquibase võimalusi http://www.liquibase.org/ Siiamaani ei ole pidanud selles pettuma. |
|
Üks variant on kirjutada konvertimine vastavasse programmi sisse ning hoida kuskil andmebaasis hetke tabelite versiooni. Ning siis saad seda vastavalt soovile jooksutada. Kui mingi veebirakendus, siis võib see konverter olla mingi osa veebirakendusest, mis uuendab tabelid. (näiteks iga kord kui uuendad midagi või muudad) Kui midagi muud, siis võib seda konverterit jooksutada programmi käivitamisel. Ma saan aru, et näiteks Ruby on Railsis ja Drupalis see nii ongi lahendatud. St konvert skriptid pead kirjutama käsitsi, aga sul on raamistik, mis neid skripte õigel hetkel rakendab.
(Nov 04 '09 at 09:15)
Tambet Matiisen ♦♦
|
|
Mina tegin nii et andmebaasil on versiooninumber (mida hoitakse ühes konkreetses SystemParameter tabeli ühes väljas, ning koodis verifitseeritakse et andmebaasi versioon on sama), ning andmebaasiskriptid organiseeruvad kataloogidesse umbes sellise struktuuri järgi:
Skripte pidi küll käsitsi majandama aga kuna enamasti läks vaja ainult asju stiilis data/varsion-/from-, mis tekkisid kergelt ja peaaegu automaatselt siis polnud see väga raske. Sellega saab sama hästi versioneerida mitte ainult schemat (ALTER TABLE) vaid ka teatud "baas andmed" (a-la mõned andmebaasis hoitavad Enum-id), muidu. Aga ega ma pole kindel et see kõige optimaalsem viis oleks. |
|
Database Comparer (Boris Loboda) on hea. IBExperti sisse ehitatud vahend on ka hea. Mõned tüütud bugid sees aga ajab asja ära. IBExpertil on lisaks ka andmete võrdluse vahend. Tihtipeale läheb baase uuendades mõlemaid vaja. Üldiselt on mul kaks baasi: tööbaas ja viimase reliisi baas Kui läheb uuendamiseks siis võrdlen reliisi baasi kliendi omaga. Tabelite modifikatsioonid tuleb ikka iga kord üle vaadata et miskit kaotsi ei läheks. Lisaks olen kunagi teinud ka delphi versioonihaldus komponendi. Versioonid võivad olla string, number ja kuupäev. Komponent tuvastab baasi hetkeversiooni ja otsib sellele uuendus skripti (skript salvestatakse ressursidesse) ning käivitab selle. Kui komponendil on veel uuemaid skripte siis käivitatakse järgmine kuni jõutakse baasi viimase teadaoleva versioonini. Ühtlasi kontrollib ega baasil pole uuem versioon kui binaarile teada. Kui on siis genereerib vastava vea (a'la keegi tuli vana kliendiga baasi külge). Paraku sõltub devrace fibplus pakist mis on tasuline. |
