Cum te descurci cu baze de date în dezvoltare, testare și producție?

Am'am avut un timp de greu încercarea de a găsi bune exemple de cum să gestioneze baza de date scheme și date între dezvoltare, testare și producție servere.

Aici's noastră de configurare. Fiecare producător are o mașină virtuală care rulează aplicația noastră și baza de date MySQL. Este lor personale nisip pentru a face ce vor. În prezent, dezvoltatorii vor face o schimbare la schema SQL și de a face un depozit de date într-un fișier text care se angajează în SVN.

Am're care doresc să desfășoare o continuă dezvoltare de integrare server, care va fi întotdeauna rulează cele mai recente comise de cod. Dacă facem asta acum, va reîncărca baza de date de la SVN pentru fiecare build.

Avem un test (virtual) server care rulează "lansarea candidaților." Implementarea la server de test, este în prezent un proces manual, și, de obicei, implică-mă de încărcare cele mai recente SQL din SVN și tweaking. De asemenea, datele de pe serverul de testare este incompatibil. Ajungi cu orice date de testare ultima dezvoltator pentru a comite avut pe nisip server.

În cazul în care totul se descompune este desfășurarea de producție. Din moment ce ne putem't suprascrie datele vii cu date de test, acest lucru implică manual re-crearea toate modificările schemei. Dacă ar exista un număr mare de modificări schema sau de conversie script-uri pentru a manipula datele, acest lucru se poate obține foarte păros.

Dacă problema a fost doar schema, L'd fi o problemă mai ușoară, dar nu este "baza" datele din baza de date care este actualizat în timpul dezvoltării, precum și, cum ar fi meta-date în securitate și permisiunile de mese.

Aceasta este cea mai mare barieră văd în mișcare spre integrare continuă și un-pas-construiește. Cum te o rezolve?


O întrebare: cum ai urmări versiuni de baze de date astfel încât să știți ce script-uri pentru a rula pentru a face upgrade o anumită instanță de bază de date? Este o versiune de masă ca Lance menționează mai jos procedura standard?


Multumesc pentru trimiterea la Tarantino. Am'm nu .Mediu NET, dar am gasit DataBaseChangeMangement pagina wiki pentru a fi de foarte mare ajutor. Mai ales acest Prezentare Powerpoint (.ppt)

Am'm de gând să scrie un script Python care verifică numele de *.sql script-uri într-un anumit director împotriva unui tabel în baza de date și se execută de cei care nu't acolo, în scopul bazează pe un întreg, care formează prima parte a fisierului. Dacă este destul de simplă soluție, așa cum bănuiesc că va fi, atunci am'll posta aici.


Am'am luat un script de lucru pentru asta. Acesta se ocupă de inițializarea DB, dacă nu't există și funcționare upgrade script-uri după cum este necesar. Există, de asemenea, switch-uri pentru a șterge o bază de date existentă și importul de test cu date dintr-un fișier. L's de aproximativ 200 de linii, deci am castigat't post (desi s-ar putea pune pe pastebin, dacă nu's de interes).

Comentarii la întrebare (2)
Soluția

Există o serie de opțiuni bune. Am ar't de a folosi "a restaura un backup" strategie.

  1. Scenariul toate modificările schemă, și au CI serverul rula aceste scripturi pe baza de date. Au o versiune de masă pentru a urmări de date curentă versiune, și executa script-uri, dacă acestea sunt pentru o versiune mai nouă.

  2. Utilizați o soluție de migrare. Aceste soluții variază în funcție de limbă, dar pentru .Eu folosesc NET Migrator.NET. Acest lucru vă permite să versiunea bazei de date și pentru a muta în sus și în jos între versiuni. Schema este specificat în C# cod.

Comentarii (0)

Dezvoltatorii trebuie să scrie modifica script-uri (schema și modificare date) pentru fiecare bug/feature-au de lucru, nu doar pur și simplu arunce întreaga bază de date în sursă control. Aceste script-uri se va face upgrade de producția curentă de date la noua versiune în dezvoltare.

Construi proces poate restaura o copie de baze de date de producție într-un mediu adecvat și a alerga toate script-urile de la sursa de control pe ea, care va actualiza baza de date de la versiunea curentă. Vom face acest lucru pe o bază de zi cu zi pentru a vă asigura că toate script-uri rula corect.

Comentarii (0)

Au o privire la modul în Ruby on Rails face acest lucru.

În primul rând, există așa-numita migrație fișiere, care practic transforma schema de baze de date și de date de la versiunea N la versiunea N+1 (sau în caz de downgrade de la versiunea N+1 la N). Baza de date a tabelului care spune versiunea curentă.

Test de baze de date sunt întotdeauna șters înainte unitate-teste și populată cu date fixe de fișiere.

Comentarii (0)

Cartea Refactoring Baze de date: Evolutivi Proiectare de baze de Date s-ar putea da câteva idei cu privire la modul de a gestiona baza de date. O versiune scurtă este ușor de citit, de asemenea, la http://martinfowler.com/articles/evodb.html

Într-una PHP+MySQL proiect am'am avut baza de date numărul de revizie stocate în baza de date, și atunci când programul se conectează la baza de date, se va verifica mai întâi de revizuire. Dacă programul necesită un alt revizuire, se va deschide o pagină pentru actualizarea bazei de date. Fiecare upgrade este specificat in codul PHP, care va schimba schema bazei de date și a migra toate datele existente.

Comentarii (0)
  • Numele dumneavoastră de baze de date după cum urmează - dev_<<db>> , tst_<<db>> , stg_<<db>> , prd_<<db>> (Evident, niciodată nu ar trebui să hardcode db denumiri
  • Astfel, vă va fi capabil de a implementa chiar și diferite tipuri de db's pe același server fizic ( nu recomand asta , dar trebuie să ... dacă resursele sunt strâns )
  • Asigura v-ar fi capabil de a muta date între cei automat
  • Separa db crearea script-uri de la populație = ar trebui să fie întotdeauna posibil pentru a recrea db de la zero și popula ( de la vechea versiune db sau sursă de date externă
  • nu utilizați hardcode conexiune siruri de caractere în cod ( chiar și în fișierele de configurare ) - utilizarea în fișierele de configurare conexiune șir de template-uri , care te face popula dinamic , fiecare reconfigurare a application_layer care are nevoie de recompilare este RĂU
  • nu folosesc baza de date de versionare și db obiecte de versionare - dacă vă puteți permite să utilizați gata produse , dacă nu dezvolta ceva pe cont propriu
  • urmăriți în fiecare DDL modificați și salvați-l într-un tabel istorie ( exemplu )
  • Backup de zi cu ZI ! Testa cât de repede v-ar fi capabil de a restabili ceva de pierdut dintr-un backup (utilizarea automathic restabili script-uri
  • chiar DEV date și PROD au exact același crearea script-ul va avea probleme cu datele, astfel încât permite dezvoltatorilor pentru a crea o copie exactă a prod și să se joace cu ea ( stiu ca nu voi primi minusuri pentru asta , dar o schimbare în mentalitatea și procesul de afaceri va costa mult mai puțin atunci când treaba se împute - deci forța programatori să indice în mod legal orice ar face , dar asigura asta
Comentarii (2)

Acest lucru este ceva care nu'm în mod constant nemulțumit cu - soluția noastră pentru această problemă. De mai mulți ani ne-am menținut o schimbare separat script pentru fiecare lansare. Acest script ar conține delte din ultima producție. Cu fiecare lansare a aplicației, numărul versiunii și-ar crește, oferindu-ceva de genul următor:

  • dbChanges_1.sql
  • dbChanges_2.sql
  • ...
  • dbChanges_n.sql

Acest lucru a funcționat destul de bine până când am început menținerea a două linii de dezvoltare: Portbagaj/Principală pentru dezvoltarea de noi, și o întreținere ramură de bug fixat, îmbunătățiri pe termen scurt, etc. În mod inevitabil, a apărut necesitatea de a face modificări la schema din ramură. În acest moment, am avut deja dbChanges_n+1.sql în Portbagaj, așa că am sfârșit prin a merge cu o schema cum ar fi următoarele:

  • dbChanges_n.1.sql
  • dbChanges_n.2.sql
  • ...
  • dbChanges_n.3.sql

Din nou, acest lucru a funcționat destul de bine, până la noi într-o zi ne-am uitat în sus și am văzut 42 delta scripturi în magistrala și 10 din ramură. ARGH!

În aceste zile vom menține pur și simplu unul delta script și să SVN versiune - adică vom suprascrie script cu fiecare lansare. Și am timid departe de a face modificări schema în ramuri.

Deci, am'm nu este mulțumit cu acest lucru. Îmi place foarte mult conceptul de migrații de la Șine. Am'am devenit destul de fascinat cu LiquiBase. Acesta susține conceptul de elementare de baze de date refactoriz ari. L's valoare de o privire și am'll fi în căutarea la ea în detaliu în curând. Are cineva experienta cu ea? Am'd fi foarte curios să aud despre rezultatele tale.

Comentarii (0)

Ai putea, de asemenea, uita-te la folosind un instrument, cum ar fi SQL Compara pentru a script diferența între diferite versiuni ale unei baze de date, permițându-vă să migreze rapid între versiuni

Comentarii (0)

Am'm'm in acord cu alte postere. Dezvoltatorii trebuie să scenariul lor se schimbă.

În multe cazuri, un simplu ALTER TABLE câștigat't de lucru, aveți nevoie pentru a modifica datele existente, prea - dezvoltatorii trebuie să lucru despre ce migrații sunt necesare și asigurați-vă că acestea're scenariu corect (desigur, aveți nevoie pentru a testa acest lucru cu atenție, la un moment dat în ciclul de lansare).

Mai mult decât atât, dacă aveți orice sens,'ll obține dezvoltatori de script schimb de tura pentru modificările aduse acestora, precum și astfel încât să poată fi revenit dacă va fi nevoie. Acest lucru ar trebui să fie testate la fel de bine, pentru a se asigura că rollback nu doar execută fără erori, dar lasă DB in aceeasi stare in care a fost în prealabil (acest lucru nu este întotdeauna posibil sau de dorit, dar este o bună regulă de cele mai multe ori).

Cum te conectezi la un server CI, I don't știu. Poate CI serverul trebuie să aibă un cunoscut construi instantaneu, ceea ce revine la fiecare noapte și apoi se aplică toate modificările de atunci. Ca's, probabil, cel mai bun, altfel o rupt migration script-ul se va rupe, nu doar în acea noapte's a construi, dar toate cele ulterioare.

Comentarii (0)

Avem o setare similară cu OP.

Dezvoltatorii dezvolta în VM's cu privat DB's.

[Dezvoltatorii vor fi în curând comiterea în privat ramuri]

Testarea se execută pe mașini diferite ( de fapt, în VM's găzduit pe un server) [În curând va fi condusă de Hudson CI server]

Testul de încărcare de referință arunce în db. Aplica dezvoltatorii schema patch-uri apoi se aplică dezvoltatorii de date patch-uri

Apoi rulați unitate și sistem de teste.

Producția este implementat pentru clienții ca instalatori.

Ce vom face:

Vom lua o schemă basculante de nisip DB. Apoi o date sql dump. Am diff care să anterioare de bază. acea pereche de delte este de a face upgrade n-1 la n.

vom configura haldele și delte.

Deci, pentru a instala versiunea N CURAT vom rula groapa de gunoi într-un gol db. Pentru a patch-uri, se aplică patch-uri care intervin.

( Juha menționat Feroviar's ideea de a avea o masă de înregistrare curent DB versiune este una bună și ar trebui să facă instalarea actualizărilor, mai puțin încărcată. )

Delte și haldele trebuie să fie revizuite înainte de testare beta. Pot't vad nici o cale în jurul valorii de acest lucru ca am'am vazut dezvoltatorii introduce conturi de test în DB pentru ei înșiși.

Comentarii (0)

Check out dbdeploy, există și Java .net instrumentele deja disponibile, ai putea urmări standardele lor de fișier SQL machete și schema versiune masă și scrie versiunea python.

Comentarii (0)

Dacă sunteți în .NET mediu atunci soluția este Tarantino. Acesta se ocupă de toate astea (inclusiv script-uri sql pentru a instala) într-un NANT construi.

Comentarii (1)

Suntem folosind linia de comandă mysql-diff: produce o diferență între două scheme de baze de date (de la DB direct sau script) ca să MODIFICE scenariul. mysql-dif este executat la cererea începe, și dacă schema schimbat, se raportează la dezvoltator. Deci, dezvoltatorii nu trebuie să scrie Modifică manual, schema actualizări întâmpla semi-automat.

Comentarii (0)

Am'am scris un instrument care (prin agățare în Deschide DBDiff) compară scheme de baze de date, și va sugera migration script-uri pentru tine. Dacă ai face o schimbare care șterge sau modifică date, se va arunca o eroare, dar oferă o sugestie pentru script-ul (de exemplu, atunci când o coloană în lipsă, în noua schemă, se va verifica daca coloana a fost redenumit și de a crea xx - script-ul generat.sql.sugestie conțin o redenumiți declarație).

http://code.google.com/p/migrationscriptgenerator/ SQL Server doar eu'm tem :( L's, de asemenea, destul de alfa, dar este EXTREM de scăzută la frecare (mai ales daca se combina cu Tarantino sau http://code.google.com/p/simplescriptrunner/)

Modul în care am folosi este de a avea un script-uri SQL proiect în dumneavoastră .sln. Aveți, de asemenea, un db_next baza de date la nivel local care face ca modificările să (folosind Management Studio sau NHibernate Schema de Export sau LinqToSql CreateDatabase sau ceva de genul). Apoi executați migrationscriptgenerator cu _dev și _next DBs, care creează. actualizare SQL script-uri pentru migrarea peste.

Comentarii (0)

Pentru baza de date oracle vom folosi oracle-ddl2svn unelte.

Acest instrument automat următorul proces

  1. pentru fiecare db schema obține schema ddls
  2. a pus-o sub versiunea contol

modificări între cazuri rezolvate manual

Comentarii (0)