Vra

Wat is die beste metodes vir die dop en/of outomatisering DB skedule veranderings?Ons span maak gebruik van Ondermyning vir weergawe beheer en ons het in staat was om te outomatiseer sommige van ons take op hierdie manier (stoot bou tot'n stellasies bediener, die implementering getoets kode om'n produksie-bediener) maar ons is nog steeds besig databasis updates hand.Ek wil graag om uit te vind of die skep van'n oplossing wat ons toelaat om doeltreffend te werk oor bedieners met verskillende omgewings, terwyl die voortsetting van om te gebruik Ondermyning as'n backend waardeur kode en DB updates gestoot om verskeie bedieners.

Baie gewilde sagteware pakkette sluit motor-update skrifte wat spoor DB weergawe en die toepassing van die nodige veranderinge.Is hierdie die beste manier om dit te doen, selfs op'n groter skaal (oor verskeie projekte en soms verskeie omgewings en tale)?As dit so is, is daar enige bestaande kode daar buite wat vereenvoudig die proses, of is dit die beste om net te rol ons eie oplossing?Het iemand geïmplementeer iets soortgelyk voor en geïntegreerde dit in Ondermyning post-pleeg hake, of is dit'n slegte idee?

Terwyl'n oplossing wat ondersteun verskeie platforms sou beter wees, ons het beslis nodig het om te ondersteun die Linux/Apache/MySQL/PHP stapel soos die meerderheid van ons werk is om op die platform.

Was dit nuttig?

Oplossing

In die Rails wêreld, daar is die konsep van migrasie, skrifte in watter veranderinge aan die databasis is gemaak in Ruby eerder as 'n databasis-spesifieke geur van SQL. Jou Ruby migrasie kode beland omskep in die DDL spesifiek vir jou huidige databasis; dit maak skakel databasis platforms baie maklik.

Vir elke verandering wat jy maak om die databasis, jy skryf 'n nuwe migrasie. Migrasies het gewoonlik twee metodes: 'n "up" metode waarop die veranderinge toegepas word en 'n "down" metode waarop die veranderinge is ongedaan gemaak. 'N Enkele opdrag bring die databasis op datum is, en kan ook gebruik word om die databasis op 'n spesifieke weergawe van die skema te bring. In Rails, is migrasies in hul eie gids gehou in die projek gids en kry nagegaan in weergawe beheer, net soos enige ander projek kode.

Dit Oracle gids tot Rails migrasies dek migrasies baie goed.

Ontwikkelaars met behulp van ander tale het gekyk na migrasies en het hul eie taal-spesifieke weergawes geïmplementeer. Ek weet van Ruckusing , 'n PHP migrasies stelsel wat is gemodelleer na migrasies Rails '; dit kan wees wat jy soek vir.

Ander wenke

Ons gebruik iets soortgelyk aan bcwoord te hou ons databasis schemata gesinchroniseer oor 5 verskillende installasies (produksie, stellasies en'n paar ontwikkeling installasies), en gerugsteun in weergawe beheer, en dit werk baie goed.Ek sal uit te brei'n bietjie:


Te sinchroniseer die databasis struktuur, ons het'n enkele script, update.php, en'n aantal van die lêers genommer 1.sql, 2.sql, 3.sql, ens.Die skrif gebruik'n ekstra tafel te slaan die huidige weergawe nommer van die databasis.Die N. sql lêers is gemaak deur die hand, om te gaan van die weergawe (N-1) om N weergawe van die databasis.

Hulle kan gebruik word om by te voeg tafels, voeg kolomme, migreer data van'n ou aan'n nuwe kolom-formaat dan val die kolom, voeg "meester" data rye soos gebruiker tipes, ens.Basies, dit kan enigiets doen, en met behoorlike data migrasie skrifte jy sal nooit verloor data.

Die update script werk soos hierdie:

  • Toegang tot die databasis.
  • Maak'n rugsteun van die huidige databasis (want dinge sal verkeerd gaan) [mysqldump].
  • Skep boekhouding tafel (genoem _meta) indien dit nie bestaan nie.
  • Lees huidige WEERGAWE van _meta tafel.Aanvaar 0 as nie gevind nie.
  • Vir almal .sql lêers genommer hoër as WEERGAWE, voer hulle in orde
  • As een van die lêers wat'n fout:rol terug na die rugsteun
  • Andersins, sal werk om die weergawe in die boekhouding tafel na die hoogste .sql lêer uitgevoer word.

Alles gaan in bron beheer, en elke installasie het'n script te werk na die nuutste weergawe met'n enkele script uitvoering (roeping update.php met die behoorlike databasis wagwoord, ens.).Ons SVN update opvoering en produksie omgewings via'n script wat jou oproepe outomaties die databasis update script, so'n kode update kom met die nodige databasis updates.

Ons kan ook gebruik maak van die dieselfde script te herskep die hele databasis van nuuts af;ons het net laat val en herskep die databasis, dan loop die script wat sal heeltemal weer vul die databasis.Ons kan ook gebruik om die skrif te vul'n leë databasis vir outomatiese toets.


Dit het slegs'n paar uur na die opstel van hierdie stelsel, dit is konseptueel eenvoudige en almal kry die weergawe nommer skema, en dit is van onskatbare waarde in die vermoë om vorentoe te beweeg en ontwikkel die databasis ontwerp, sonder om te kommunikeer of met die hand voer die veranderinge op alle databasisse.

Pasop wanneer plak navrae van phpMyAdmin al! Diegene wat gegenereer navrae sluit gewoonlik die naam databasis, wat jy beslis nie wil hê nie, aangesien dit sal breek jou skrifte!Iets soos die SKEP van TAFEL mydb.newtable(...) sal misluk as die databasis op die stelsel is nie genoem mydb.Ons het'n pre-kommentaar SVN haak wat sal weier .sql lêers met die mydb string, wat is'n seker teken dat iemand kopie/plak van die phpMyAdmin sonder behoorlike kontrole.

My span skrifte uit alle databasis veranderinge, en pleeg diegene skrifte SVN, saam met elke vrystelling van die aansoek. Dit maak voorsiening vir inkrementele veranderinge van die databasis, sonder enige data verloor.

Om te gaan van die een release na die volgende, jy hoef net die stel van verandering skrifte loop, en jou databasis is up-to-date, en jy het nog steeds al jou data. Dit kan nie die maklikste metode wees, maar dit is beslis doeltreffende.

Die kwessie hier is werklik maak dit maklik vir ontwikkelaars om script hul eie plaaslike veranderinge in die bron beheer te deel met die span. Ek het hierdie probleem in die gesig gestaar het vir baie jare, en is geïnspireer deur die funksie van Visual Studio vir databasis professionals. As jy 'n oop-bron hulpmiddel met dieselfde eienskappe hê, probeer hierdie: http://dbsourcetools.codeplex.com/ Hê pret, - Nathan

.

Dump jou skedule in 'n lêer en voeg dit by die bron beheer. Dan sal 'n eenvoudige diff jou wys wat verander.

Scott Ambler produseer 'n groot reeks artikels (en mede-outeur van 'n boek ) op databasis refactoring, met die idee dat jy in wese TDD beginsels en praktyke moet aansoek doen om die handhawing van jou skedule. Jy stel 'n reeks van struktuur en saad data eenheid toetse vir die databasis. Dan, voordat jy enigiets verander, jy verander / skryf toetse om daardie verandering te weerspieël.

Ons het hierdie doen vir 'n rukkie nou en dit blyk te werk. Ons het kode vir basiese naam en data type kolom tjeks in 'n eenheid toets suite te genereer. Ons kan dié toetse tik enige tyd om te bevestig dat die databasis in die SVN Checkout ooreenstem met die live db die aansoek is eintlik loop.

As dit blyk dat ontwikkelaars ook soms aanpas hul sandbox databasis en nalaat om die skedule lêer in SVN te werk. Die kode hang dan op 'n db verandering wat nog nie nagegaan in. Daardie soort van fout kan enorm moeilik wees om vas te pen, maar die toets suite sal dit kom haal dadelik. Dit is veral lekker as jy dit gebou in 'n groter Deurlopende integrasie plan.

K. Scott Allen het 'n ordentlike artikel of twee op skedule weergawes, wat die inkrementele update skrifte / migrasies konsep waarna verwys word in ander antwoorde hier gebruik; sien http://odetocode.com/Blogs/scott/archive/ 2008/01/31 / 11710.aspx .

Dit is kinda lae tegnologie, en daar kan daar 'n beter oplossing wees, maar jy kan net slaan jou skedule in 'n SQL script wat kan gebruik word om die databasis te skep. Ek dink jy kan 'n bevel uit te voer om hierdie skrif te genereer, maar nie ongelukkig weet die opdrag.

Toe, pleeg die script in die bron beheer saam met die kode wat werk op dit. Wanneer jy nodig het om die skema te verander saam met die kode, kan die script nagegaan word in saam met die kode wat die veranderde skedule vereis. Dan sal ewenaars op die script ewenaars dui op skedule veranderings.

Met hierdie script, jy kan dit te integreer met DBUnit of 'n soort van bou script, so dit lyk dit kon inpas by jou reeds outomatiese prosesse.

As jy 'C #, 'n blik op Subsonic, 'n baie nuttige ORM instrument, maar ook genereer sql script om jou skema en \ of data herskep. Hierdie skrifte kan dan in die bron beheer word nie.

http://subsonicproject.com/

Ek het die volgende databasis projek struktuur in Visual Studio gebruik vir 'n paar projekte en dit is redelik goed gewerk:

Database

  

Verandering Skrifte

     
    

0.PreDeploy.sql

         

1.SchemaChanges.sql

         

2.DataChanges.sql

         

3.Permissions.sql

  
     

Skep skrifte

     
    

Sprocs

         

Funksies

         

Views

  

Ons bou stelsel updates dan die databasis van die een weergawe na die volgende deur die uitvoering van die skrifte in die volgende volgorde:

  

1.PreDeploy.sql

     

2.SchemaChanges.sql

     

Die inhoud van Skep skrifte gids

     

2.DataChanges.sql

     

3.Permissions.sql

Elke ontwikkelaar tjeks in hul veranderinge vir 'n bepaalde fout / funksie deur die aanbring van hul kode op die einde van elke lêer. Sodra 'n groot weergawe is volledig en vertakte in bron beheer, is die inhoud van die .sql lêers in die gids Change Scripts verwyder.

Ons gebruik'n baie eenvoudige, maar tog effektiewe oplossing.

Vir nuwe installeer, ons het'n metadata.sql lêer in die bewaarplek wat die besit van al die DB skedule, dan in die bou proses wat ons gebruik hierdie lêer te genereer die databasis.

Vir updates, voeg ons die updates in die sagteware gekodeer.Ons hou dit gekodeer omdat ons nie hou van die oplos van probleme voor dit regtig IS'n probleem, en hierdie soort van ding nie bewys te word nie'n probleem so ver.

So in ons sagteware wat ons het iets soos hierdie:

RegisterUpgrade(1, 'ALTER TABLE XX ADD XY CHAR(1) NOT NULL;');

Hierdie kode sal kyk as die databasis is in weergawe 1 (wat gestoor word in'n tabel outomaties geskep), as dit is verouderd, dan is die opdrag is uitgevoer.

Te werk om die metadata.sql in die bewaarplek, loop ons hierdie opgraderings plaaslik en dan pak die volledige databasis metadata.

Die enigste ding wat gebeur elke so dikwels, is om te vergeet van die pleeg van die metadata.sql, maar dit is nie'n groot probleem as gevolg van sy maklik om te toets op die bou proses en ook die enigste ding wat kan gebeur is om'n nuwe te installeer met'n verouderde databasis en opgegradeer om dit op die eerste gebruik.

Ook ons ondersteun nie downgrades, maar dit is deur ontwerp, as iets breek op'n werk, het ons weer die vorige weergawe en los die werk voordat jy probeer weer.

Ek skep dopgehou vernoem na die bou weergawes en sit op te gradeer en te skaal skrifte in daar. Byvoorbeeld, kan jy die volgende gidse het: 1.0.0, 1.0.1 en 1.0.2. Elkeen bevat die script wat jou toelaat om op te gradeer of af te gradeer jou databasis tussen weergawes.

As 'n kliënt of klant noem jy met 'n probleem met weergawe 1.0.1 en jy gebruik 1.0.2, bring die databasis terug na sy weergawe sal nie 'n probleem te wees nie.

In jou databasis, skep 'n tabel met die naam "skema" waar jy sit in die huidige weergawe van die databasis. Dan skryf 'n program wat kan opgradeer of afgradeer jou databasis vir jou maklik.

Net soos Joey gesê, as jy in 'n Rails wêreld, gebruik Migrations. :)

Vir my huidige PHP projek gebruik ons die idee van die relings migrasies en ons het'n migrasies gids wat ons hou lêers met die titel "migration_XX.sql" waar XX is die getal van die migrasie.Tans is hierdie lêers geskep word met die hand as updates is gemaak, maar hul skepping kan maklik verander.

Dan het ons het'n script genoem "Migration_watcher" wat, soos ons in die pre-alpha, tans loop op elke bladsy laai en tjeks of daar is'n nuwe migration_XX.sql lêer waar XX is groter as die huidige migrasie weergawe.As dit so is, dit loop al migration_XX.sql lêers tot die grootste aantal teen die databasis en voila!skedule veranderings is outomatiese.

As jy nodig het die vermoë om terug te keer die stelsel sou vereis dat'n baie van die opstel, maar dit is eenvoudig en werk baie goed vir ons redelik klein span so ver.

Ek sou raai die gebruik van Ant (kruis-platform) vir die "script" kant (aangesien dit feitlik enige db kan praat daar buite via JDBC) en Subversion vir die bron repository. Mier sal jy Aanvaar na "back-up" jou db plaaslike lêers, voordat veranderinge. 1. Friends bestaande db skedule in te dien via Ant 2. weergawe beheer te Subversion repository via Ant 3. stuur nuwe SQL-stellings te DB via Ant

Pad vir MySQL het 'n funksie genoem skedule vergelyk wat jou toelaat om 2 databasisse te sinchroniseer. Dit is die beste instrument wat ek tot dusver gebruik.

IMHO migrasies het 'n groot probleem:

Die opgradering van die een weergawe na 'n ander werk goed, maar doen 'n vars installasie van 'n gegewe weergawe kan vir ewig te neem as jy honderde tafels en 'n lang geskiedenis van veranderinge (soos ons dit doen). Het

Die uitvoer van die hele geskiedenis van deltas sedert die basislyn tot die huidige weergawe (vir honderde kliënte databasisse) kan 'n baie lang tyd in beslag neem.

Ek hou van die manier hoe Yii hanteer databasis migrasie. A migrasie is basies 'n PHP script implementering CDbMigration . CDbMigration definieer 'n up metode wat die migrasie logika bevat. Dit is ook moontlik om 'n down metode om ommekeer van die migrasie te ondersteun implementeer. Alternatiewelik kan safeUp of safeDown gebruik word om seker te maak dat die migrasie gedoen word in die konteks van 'n transaksie.

Yii se opdrag-lyn hulpmiddel yiic bevat ondersteuning te skep en uit te voer migrasies. Migrasies toegepas kan word of omgekeer, óf een vir een of in 'n bondel. Die skep van 'n migrasie resultate in kode vir 'n PHP klas implementering CDbMigration, uniek vernoem gebaseer op 'n tyd stempel en 'n migrasie naam wat deur die gebruiker. Alle migrasies wat voorheen aansoek gedoen het om die databasis gestoor word in 'n migrasie tafel.

Vir meer inligting die databasis migrasie artikel van die handleiding.

Daar is 'n opdrag-lyn mysql-diff instrument wat databasis skemas, waar vergelyk skema kan 'n lewendige databasis of SQL script op skyf wees. Dit is goed vir die meeste skedule migrasie take.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top