Git (sürüm kontrolü) altına nasıl bir veritabanı koyabilirim?


274

Bir web uygulaması yapıyorum ve bazı büyük değişiklikler için bir şube yapmak gerekiyor, şey, bu değişiklikler veritabanı şemasında değişiklikler gerektirir, bu yüzden de tüm veritabanını git altına koymak istiyorum.

Bunu nasıl yaparım? git deposu altında saklayabileceğim belirli bir klasör var mı? Hangisini nasıl bilebilirim? Doğru klasörü yerleştirdiğimden nasıl emin olabilirim?

Emin olmak gerekir, çünkü bu değişiklikler geriye dönük uyumlu değildir; Berbat etmeyi göze alamam.

Benim durumumda veritabanı PostgreSQL

Düzenle:

Birisi yedek almayı ve yedek dosyasını veritabanı yerine sürüm denetimine almayı önerdi. Dürüst olmak gerekirse, yutmak gerçekten zor.

Daha iyi bir yol olmalı.

Güncelleme:

Tamam, bu yüzden daha iyi bir yol yok, ama hala ikna olmadım, bu yüzden soruyu biraz değiştireceğim:

Tüm veritabanını sürüm kontrolü altına koymak istiyorum, gerçek veritabanı dökümü yerine sürüm kontrolü altına koymak için hangi veritabanı motoru kullanabilirim?

Sqlite git dostu olur mu?

Bu sadece geliştirme ortamı olduğundan, istediğim veritabanını seçebilirim.

Edit2:

Gerçekten istediğim, geliştirme geçmişimi takip etmek değil, "yeni radikal değişiklikler" dalımdan "mevcut kararlı dal" a geçiş yapabilmek ve örneğin bazı hataları / sorunları, vb. kararlı dal. Öyle ki, dalları değiştirdiğimde, veritabanı otomatik olarak şu anda bulunduğum dalla uyumlu hale gelir. Gerçek verilerle pek ilgilenmiyorum.


5
Dürüst olmak gerekirse, şema değişikliklerini tanıtıyorsam ve aynı anda birden çok geliştirme dalıyla uğraşmak zorunda kalırsam veritabanının kopyalarını çıkarırım ... dev veritabanları umarım bunu yapacak kadar küçük olmalıdır. Zeki olmaya çalıştığım ve sadece şüpheli kaynak dalını değiştirdiğim için DB değişiklikleri yapmaya çalışan herhangi bir sistemi düşünürdüm. Ayrıca, çalışma alanımı klonlayıp bir yerde bir şubesi ve diğerinde yeni bir dalı varsa, çalışmaya devam edecek şeylerden emin olmak istiyorum.
araqnid


Veritabanınızı sürüm kontrolü altında bir yapı olarak başlatmak için komut dosyasını (ve bileşenlerini) düşünüyorsanız, 'yedekler' böyle kötü bir şey gibi görünmeyebilir. Radikal bir dalda db şemanızı değiştirirseniz, veri tabanıyla veritabanını başlatan komut dosyasını güncellemeniz gerekir.
Fuhrmanator

1
Bunu tam olarak yapan bir yazılım için cevabımı kontrol et: stackoverflow.com/a/28123546/1662984
Kevin

Yanıtlar:


140

Bir veritabanı dökümü alın ve bunun yerine sürüm kontrolü. Bu şekilde düz bir metin dosyasıdır.

Şahsen hem veri dökümü hem de şema dökümü tutmanızı öneririm. Bu şekilde fark kullanmak şemada revizyondan revizyona nelerin değiştiğini görmek oldukça kolay hale gelir.

Büyük değişiklikler yapıyorsanız, yeni şema değişikliklerini yaptığınız ikincil bir veritabanına sahip olmanız ve eski bir şeye dokunmamanız gerekir.


132
Ne? Daha iyi bir yol olmalı.
hasen

18
PostGreSQL veritabanı dosyaları ikili dosyalardır, onları git deponuza koymaktan çekinmeyin, sadece herhangi bir fark yapamazsınız ve herhangi bir değişiklik büyük olasılıkla tüm veritabanını değiştirir ve böylece tam olarak göndermeniz gerekir veritabanını tel üzerinden git repo'nuza aktarın ve saklayın. Bu verimsiz, yavaş ve çalışmayı son derece zorlaştırıyor. Ayrıca, VACUUM olmadan diskte depolanan ve bir kopya yapmak için PostgreSQL'i kapatma veritabanı dosyalarının tüm verilerde her zaman olduğu gibi "kararlı" olduğundan emin değilim, böylece muhtemelen bozuk verilerle ayrılır.
X-Istence

6
Hmm anlıyorum! Peki, daha git dostu olan db sistemleri var mı?
hasen

16
Bu tip solüsyonun oldukça standarttır ve şema olduğunu aslında kaynak kodu.
Dana the Sane

12
2017, bu soruda herhangi bir güncelleme var mı? kutudan aslında DB sürüm kontrolü yok mu? Gerçekten mi ?
Stavm

48

Yeniden Düzenleme Veritabanlarına göz atın ( http://databaserefactoring.com/ kod değişiklikleriyle birlikte korumak için bir dizi iyi teknik için ) sayfasına göz atın.

Yanlış sorular sorduğunuzu söylemek yeterli. Veritabanınızı git yerine koymak yerine, şema değişikliklerini kolaylıkla taşıyabilmeniz / geri alabilmeniz için değişikliklerinizi doğrulanabilir küçük adımlara ayırmanız gerekir.

Tam kurtarılabilirlik istiyorsanız, postgres WAL günlüklerinizi arşivlemeyi ve işlemleri bilinen iyi durumlara iletmek / oynatmak için PITR'yi (zaman kurtarma) kullanın.


2
Veritabanındafactoring sitesinde ilgili bilgi bulamadım ... DB kodu (Fowler normal kod için yaptığı gibi) için çeşitli yeniden düzenleme tekniklerini listeliyor gibi görünüyor
Nickolay

26

Gerçekten basit bir çözüm düşünmeye başladım, neden daha önce düşünmediğimi bilmiyorum !!

  • Veritabanını çoğaltın (hem şema hem de veri).
  • Yeni büyük değişikliklerin dalında, yeni yinelenen veritabanını kullanmak için proje yapılandırmasını değiştirmeniz yeterlidir.

Bu şekilde veritabanı şeması değişiklikleri hakkında endişelenmeden şubeler arasında geçiş yapabilirim.

DÜZENLE:

Çoğaltmak gerekirse, farklı bir adla başka bir veritabanı oluşturmak (yani my_db_2); bir çöplük ya da onun gibi bir şey yapmamak.


3
Bu en basit ve en verimli çözüm gibi görünüyor, ancak bunu otomatikleştirmenin bir yolu olsaydı iyi olurdu ... Henüz orada bir şey olmadığına şaşırdım ...
JustMaier

Git hook şablonuna göre bir şube oluşturmak için bir şube adı,
dalore

Bu benim yaptığım, ben de yanlışlıkla bir "yanlış" şube dosyasını canlı sunucuya yüklerseniz hiçbir şey kırılır DB değişkenler için include dosyasına bir IP kontrol hattı ekleyin.
liamvictor

hemen hemen her dal kendi DB olsun, ha? 🤔
olli

19

LiquiBase gibi bir şey kullanın, bu da Liquibase dosyalarınızın revizyon kontrolünü korumanızı sağlar. değişiklikleri yalnızca üretim için etiketleyebilirsiniz ve DB'nizin üretim veya geliştirme (veya istediğiniz şema) için güncel kalmasını sağlayabilirsiniz.


3
Liguibase'nin en iyi uygulamaları, şema oluşturma komut dosyalarını sırayla çalıştırılacak bir dizi ardışık komut dosyası olarak tutmanızı önerir. Bu iyi bir iyi uygulama olsa da, merkezi bir depo olmadan nasıl çalışacağını görmüyorum, yani GIT.
Frank Schwieterman

1
Eğer id = ve author = etiketleri konusunda dikkatli olursanız, git gayet iyi çalışır. Teoride, her kullanıcının kendi yazar girişi (GOOD) olur ve id = ile makul bir şey yaparsanız, YYYYMMDD_REV deyin, o zaman gitmek için oldukça iyisiniz. Git ile bile, herkesin belirli bir proje için bir 'merkezi repo' var. İnsanların% 99'unda 'merkezi' bir şey yok. Yine, Liquibase dosyaları, belirli bir DB'ye (veya kümesine) karşı çalıştırılacak bir komut yığını olan metin XML-ish dosyalarını planlamaktadır. Tüm projelerin% 99'u DVCS'lerde bile pratikte bunu takiben 0 sorunla karşılaşır.
Mart'ta zie

+1 Bu cevap için. Birkaç projede kullandığımız bu. Kimliklerin yalnızca bir xml dosyasında benzersiz olması gerekir. Uygulanmakta olan kullanım durumundan kimlikleri adlandırırsanız, bunlar benzersizdir. Önceden uygulanmış değişiklik kümelerini değiştirmemeye dikkat etmelisiniz, aksi takdirde sağlama toplamı hataları alırsınız.
bernardn

7

Benzer bir ihtiyaç ile karşı karşıya ve burada veritabanı sürüm kontrol sistemleri üzerine araştırma benim attı:

  1. Sqitch - perl tabanlı açık kaynak; PostgreSQL dahil tüm büyük veritabanları için kullanılabilir https://github.com/sqitchers/sqitch
  2. Mahout - sadece PostgreSQL için; açık kaynak veritabanı şeması sürüm kontrolü. https://github.com/cbbrowne/mahout
  3. Liquibase - başka bir açık kaynaklı db sürüm kontrolü sw. Datical ücretsiz sürümü.http://www.liquibase.org/index.html
  4. Datical - Liquibase'in ticari versiyonu - https://www.datical.com/
  5. BoxFuse tarafından Flyway - ticari sw. https://flywaydb.org/
  6. Başka bir açık kaynak projesi https://gitlab.com/depesz/Versioning Author burada bir rehber sunuyor: https://www.depesz.com/2010/08/22/versioning/
  7. Red Gate Değişim Otomasyonu - sadece SQL Server için. https://www.red-gate.com/products/sql-development/sql-change-automation/

Geçmişte ChronicDBde denilen bir şey vardı : ChronicDB provides dynamic database upgrades with zero database downtime and inconsistencies. crunchbase.com/organization/chronicdb#section-overview Kristis Makris adlı bir adam belki SCMBug için bilinen kuruculardan biriydi: mkgnu.net/scmbug
Thorsten Schöning

6

Doktrin altında Göçler adında harika bir proje var ve bu amaç için inşa edildi.

Hala alfa durumda ve php için inşa edilmiş.

http://docs.doctrine-project.org/projects/doctrine-migrations/en/latest/index.html


ops! bağlantınız kopuk ... belki bunu kastediyorsunuz: github.com/doctrine/migrations
Francesco Casula

burada Symfony2'deki doktrin göçlerini entegre eden paket için dokümanlar: symfony.com/doc/master/bundles/DoctrineMigrationsBundle/…
Francesco Casula

1
Bahşiş için teşekkürler, Doktrin adamlarının dokümanların yerini değiştirme eğilimi vardır, bu da hem burada hem de Google'da birçok bozuk bağlantıya neden olur. Bağlantı düzeltildi.
Hakan Deryal

4

Ben DB tabanlı Dizin yapısına yaklaşan bir şey, 'dosyaları' saklar ve ben yönetmek için git gerekir benzer bir sorun var gibi, bu soruya rastladım. Çoğaltma kullanılarak bir bulutta dağıtılır, bu nedenle erişim noktası MySQL aracılığıyla olacaktır.

Yukarıdaki cevapların özü, benzer bir şekilde sorulan soruna alternatif bir çözüm öneriyor gibi görünüyor, hangi tür bir noktayı kaçırıyor, Git'i bir Veritabanındaki bir şeyi yönetmek için kullanma, bu yüzden bu soruyu cevaplamaya çalışacağım.

Git, özünde bir bağlamı yeniden oluşturmak için yeniden birleştirilebilen bir deltalar veritabanı (farklılıklar) depolayan bir sistemdir. Git'in normal kullanımı, bağlamın bir dosya sistemi olduğunu ve bu deltaların bu dosya sisteminde diff olduğunu varsayar, ancak gerçekten git, deltaların hiyerarşik bir veritabanıdır (hiyerarşik, çünkü çoğu durumda her delta en az 1 ile bir taahhüttür) ebeveynler, bir ağaçta düzenlenmiştir).

Bir delta oluşturabildiğiniz sürece, teorik olarak git saklayabilir. Sorun normalde git, delta ürettiği bağlamın bir dosya sistemi olmasını bekler ve benzer şekilde, git hiyerarşisinde bir noktaya baktığınızda bir dosya sistemi oluşturmayı bekler.

Değişikliği yönetmek istiyorsanız, bir veritabanında 2 ayrı probleminiz var ve bunları ayrı ayrı ele alırdım (eğer siz olsaydım). Birincisi şema, ikincisi verilerdir (sorunuzda verileriniz endişe duyduğunuz bir şey değildir). Geçmişte yaşadığım bir sorun, Dev'in şemada artımlı değişiklikler alabileceği bir Dev ve Prod veritabanıydı ve bu değişikliklerin CVS'de belgelenmesi ve yaşamak için propoge edilmesi gerekiyordu. tablolar. Bunu, yalnızca statik verileri içeren Cruise adlı 3. bir veritabanına sahip olarak yaptık. Herhangi bir noktada Dev ve Cruise şeması karşılaştırılabilir ve biz bu 2 dosyanın diff almak ve uygulamak için ALTER deyimleri içeren bir SQL dosyası üretmek için bir komut dosyası vardı. Benzer şekilde yeni veriler, INSERT komutlarını içeren bir SQL dosyasına damıtılmış olabilir. Alanlar ve tablolar yalnızca eklendiği ve asla silinmediği sürece, işlem deltayı uygulamak için SQL deyimlerinin oluşturulmasını otomatikleştirebilir.

Git'in delta ürettiği diffmekanizma ve 1 veya daha fazla deltayı bir dosyayla birleştirdiği mekanizma denir merge. Farklı bir bağlamdan ayırmak ve birleştirmek için bir yöntem geliştirebilirseniz, git çalışmalıdır, ancak tartışıldığı gibi bunu sizin için yapan bir aracı tercih edebilirsiniz. Çözmeye yönelik ilk düşüncem bu git https://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration#External-Merge-and-Diff-Tools'un git farkının nasıl değiştirileceğini ve birleştirme aracı. Soruna daha iyi bir çözüm bulduğum için bu yanıtı güncelleyeceğim, ancak benim durumumda sadece veri değişikliklerini yönetmek zorunda kalmayı bekliyorum, bugüne kadar DB tabanlı bir dosya deposu değişebileceği için çözümüm tam olarak ihtiyacınız olan şey olmayabilir.


3

RedGate SQL Source Control'e bir göz atın.

http://www.red-gate.com/products/sql-development/sql-source-control/

Bu araç, veritabanınızı Git ile Kaynak Denetimi altına yerleştirmenize olanak tanıyan bir SQL Server Management Studio ek bileşenidir.

Kullanıcı başına 495 $ 'dan biraz pahalı, ancak 28 günlük ücretsiz deneme var.

NOT RedGate ile hiçbir şekilde bağlantılı değilim.


3

Benzer bir şey yapmak istiyorum, veritabanı değişikliklerimi sürüm kontrol sistemime eklemek istiyorum.

Vladimir Khorikov "Veritabanı versiyonlama en iyi uygulamalar" dan bu yazıdaki fikirleri takip edeceğim . Özetle yapacağım

  • hem şemasını hem de referans verilerini bir kaynak kontrol sisteminde depolar.
  • her değişiklik için ayrı bir SQL betiği oluşturacağız.

Yardımcı olması durumunda!


3
  • Irmin
  • Flur.ee
  • Crux DB

Bir süredir Postgres (veya genel olarak SQL veritabanları) için aynı özelliği arıyordum, ancak yeterli (basit ve sezgisel) uygun hiçbir araç bulamadım. Bu muhtemelen verilerin nasıl saklandığının ikili doğasından kaynaklanmaktadır. Klonio ideal görünüyor ama ölü görünüyor. Noms DB ilginç ( ve canlı ) görünüyor . Ayrıca Irmin'e (Git özellikleriyle OCaml tabanlı) bir göz atın .

Bu, Postgres ile çalışacağı sorusuna cevap vermese de , Flur.ee veritabanına bakın. Verileri zaman içinde rastgele bir noktadan sorgulamanızı sağlayan bir "zaman yolculuğu" özelliğine sahiptir. Sanırım bir "dallanma" modeli ile çalışabilmelidir.

Bu veritabanı son zamanlarda blockchain amaçları için geliştirildi. Blok zincirlerinin doğası nedeniyle, verilerin artışlarla kaydedilmesi gerekir, bu da git'in tam olarak nasıl çalıştığıdır. Onlar edilir Q2 2019 yılında bir açık kaynak salımını hedefleyen .

Her Fluree veritabanı bir blockchain olduğundan, gerçekleştirilen her işlemin tüm geçmişini saklar. Bu, bir blockchain'in bilginin değişmez ve güvenli olmasını nasıl sağladığının bir parçasıdır .

Güncelleme : Ayrıca , "sürümler" olarak görebileceğiniz eklerin zaman boyutu boyunca sorgulayabilen Crux veritabanına da göz atın . Crux, son derece takdir edilen Datomic'in açık kaynaklı bir uygulaması gibi görünüyor.

Crux, işlem zamanını ve geçerli zaman geçmişlerini depolayan bir bitemporal veritabanıdır. Geçici bir veritabanı, veritabanı oluşturma anından mevcut durumuna kadar veritabanı durumlarının işlem dizisi aracılığıyla "zaman yolculuğu" sorgulamasına olanak sağlarken, Crux ayrıca gereksiz tasarım karmaşıklığı olmadan ayrı bir geçerli zaman ekseni için "zaman yolculuğu" sorgusu sağlar veya performans etkisi. Bu, bir Crux kullanıcısının, bilginin geldiği sıradan bağımsız olarak veritabanını geçmiş ve gelecekteki bilgilerle doldurabileceği ve belirli bir etki alanının sürekli gelişen geçici bir modelini oluşturmak için geçmiş kayıtlarda düzeltmeler yapabileceği anlamına gelir.


2

Atomisite olmadan yapamazsınız ve pg_dump veya anlık görüntü dosya sistemi kullanmadan atomisite elde edemezsiniz.

Postgres örneğim, zaman zaman anlık olarak çektiğim zfs'de. Yaklaşık anlık ve tutarlıdır.


2

İstediğiniz şey, ruhsal olarak, belki de bir veritabanının sürümlerini bir veritabanında depolayan Post Facto gibi bir şeydir . Bu sunuyu kontrol edin .

Görünüşe göre proje hiçbir zaman gerçekten hiçbir yere gitmedi, bu yüzden hemen size yardımcı olmayacak, ancak ilginç bir kavram. Bunu düzgün yapmak çok zor olacağından korkuyorum, çünkü sürüm 1 bile insanların çalışmalarına güvenebilmeleri için tüm ayrıntıları doğru bir şekilde almak zorunda kalacaklardı.


2

İstediğiniz şeyi yapan sqlite için bir araç yayınladım. Sqlite projeleri aracını 'sqldiff', UUID'leri birincil anahtar olarak kullanan özel bir fark sürücüsü kullanır ve sqlite satır kimliğini bırakır. Hala alfadadır, bu nedenle geri bildirim takdir edilmektedir.

Postgres ve mysql daha zordur, çünkü ikili veriler birden fazla dosyada tutulur ve anlık görüntü alabiliyorsanız geçerli olmayabilir.

https://github.com/cannadayr/git-sqlite


Git'in ikili verileri olduğu gibi saklamasına izin vermişsiniz gibi görünüyor. Bunun yerine, çöplükleri depolamak için temiz / bulaşma filtreleri kullanılabilir. Bunu yapan bazı senaryolar var.
max630

1
İki veritabanı durumu farklı olduğunda, dökümün metinsel bir farkını yapmak dışında iyi bir yaklaşım. Sqldiff'i özel bir diff sürücüsü olarak kullanarak, veritabanınızı bir sonraki duruma geçirmek için gerçek komutları alırsınız.
cannadayr

1

Bence X-Istence doğru yolda, ancak bu stratejide yapabileceğiniz birkaç gelişme var. İlk kullanım:

$pg_dump --schema ... 

tabloları, dizileri vb. dökümü ve bu dosyayı sürüm denetimi altına almak için. Bunu, dallarınız arasındaki uyumluluk değişikliklerini ayırmak için kullanacaksınız.

Ardından, form varsayılanları ve kullanıcı tarafından değiştirilemeyen diğer veriler gibi, uygulamanızın çalışması için gereken yapılandırmayı içeren (muhtemelen kullanıcı verilerini atlamalı vb.) Tablolar kümesi için bir veri dökümü gerçekleştirin . Bunu kullanarak seçici olarak yapabilirsiniz:

$pg_dump --table=.. <or> --exclude-table=..

Tam bir veri dökümü yaparken veritabanınız 100Mb + 'ya ulaştığında repo gerçekten tıknaz olabilir. Daha iyi bir fikir, uygulamanızı test etmek için ihtiyaç duyduğunuz daha az veri kümesini yedeklemektir. Varsayılan verileriniz çok büyükse, yine de sorunlara neden olabilir.

Repo'ya kesinlikle tam yedeklemeniz gerekiyorsa, kaynak ağacınızın dışındaki bir dalda yapmayı düşünün. Bununla birlikte, eşleşen svn rev'e bazı atıfta bulunan harici bir yedekleme sistemi muhtemelen en iyisidir.

Ayrıca, revizyon amacıyla (en azından şema için) ikili biçimdeki metin biçimindeki dökümleri kullanmanızı öneririz çünkü bunların fark edilmesi daha kolaydır. Check-in işleminden önce yerden tasarruf etmek için bunları her zaman sıkıştırabilirsiniz.

Son olarak, henüz yapmadıysanız postgres yedekleme belgelerine bir göz atın . Dökümden ziyade 'veritabanını' yedekleme hakkında yorum yapma şekliniz, dosya sistemi tabanlı yedeklemeler düşünüp düşünmediğinizi merak ediyor ( uyarılar için bölüm 23.2'ye bakın ).


Çöplük sadece bir yedek değil mi?
hasen

Evet, ancak alternatif bir veritabanına geri yükleyebilir ve burada değişikliklerinizi yapabilirsiniz.
Dana the Sane

1

Bu soru hemen hemen cevaplandı, ancak X-Istence ve Dana Sane'in cevabını küçük bir öneriyle tamamlamak istiyorum.

Her ne kadar bir düzeyde ayrıntı düzeyinde revizyon kontrolüne ihtiyacınız varsa, her gün, hem tabloların hem de şemanın metin dökümünü , artımlı yedeklemeler yapan rdiff-backup gibi bir araçla birleştirebilirsiniz . Avantajı, günlük yedeklerin anlık görüntülerini depolamak yerine, önceki günden farkları depolamanızdır.

Bununla revizyon kontrolü avantajına sahip olursunuz ve çok fazla alan harcamazsınız.

Her durumda, git'i çok sık değişen büyük düz dosyalar üzerinde doğrudan kullanmak iyi bir çözüm değildir. Veritabanınız çok büyürse git dosyaları yönetmede bazı sorunlar yaşamaya başlar.


1

İşte projelerimde yapmaya çalıştığım şey:

  • ayrı veri ve şema ve varsayılan veri.

Veritabanı yapılandırması, sürüm denetimi (.gitignore) altında olmayan yapılandırma dosyasında saklanır

Veritabanı varsayılanları (yeni Projeler oluşturmak için) sürüm kontrolü altında basit bir SQL dosyasıdır.

Veritabanı şeması için sürüm denetimi altında bir veritabanı şeması dökümü oluşturun.

En yaygın yol, SQL Deyimleri (ALTER Tablosu .. veya GÜNCELLEME) içeren güncelleme komut dosyalarına sahip olmaktır. Ayrıca veritabanınızda şemanızın geçerli sürümünü kaydettiğiniz bir yer olması gerekir)

Diğer büyük açık kaynak veritabanı projelerine (piwik veya en sevdiğiniz cms sistemi) bir göz atın, hepsi güncellemeler kullanır (1.sql, 2.sql, 3.sh, 4.php.5.sql)

Ancak bu çok zaman gerektiren bir iş, güncelleme metinlerini oluşturmanız ve test etmeniz ve sürümü karşılaştıran ve gerekli tüm güncelleme komut dosyalarını çalıştıran ortak bir güncelleme metni çalıştırmanız gerekir.

Yani teorik olarak (ve aradığım şey) her değişiklikten sonra veritabanı şemasını (manuel olarak, conjob, git kancaları (belki de taahhütten önce)) dökebilirsiniz (ve sadece bazı özel durumlarda updatecripts oluşturun)

Bundan sonra ortak güncellemenizde (özel durumlar için normal güncelleme metinlerini çalıştırın) ve şemaları (döküm ve geçerli veritabanı) karşılaştırın ve sonra otomatik olarak gerekli ALTER İfadelerini oluşturun. Bunu zaten yapabilen bazı araçlar var, ancak henüz iyi bir araç bulamadı.


1

NeXtep'in veritabanını kontrol eden versiyonu için tavsiye ederim , iyi bir dizi belge ve nasıl kurulacağını ve karşılaşılan hataları açıklayan forumları var. PostgreSQL 9.1 ve 9.3 için test ettim, 9.1 için çalışmayı başardım ama 9.3 için işe yaramıyor.


@Nickolay Evet, artık üretilmiyor gibi görünüyor. Alternatif olarak neden Skitch'i denemiyorsunuz
Jerry M Sunny

Teşekkürler, kontrol edecek!
Nickolay

1

Benim kişisel projelerimde, tüm veritabanımı dropbox saklamak ve sonra oradan kullanmak için MAMP, WAMP iş akışı işaret olduğunu .. Bu şekilde veritabanı her zaman bazı geliştirme yapmak için gereken her zaman güncel. Ama bu sadece dev için! Canlı siteler bu sunucu için kendi sunucusunu kullanıyor! :)


1

Git sürüm oluşturma kontrolü altında her bir veritabanı değişikliğini saklamak, her bir komutla tüm veritabanınızı itmek ve her çekme işlemiyle tüm veritabanınızı geri yüklemek gibidir . Veritabanınız çok önemli değişikliklere eğilimliyse ve bunları kaybetmeyi göze alamıyorsanız, sadece ön_başlangıç ve post_merge kancalarınızı güncelleyebilirsiniz . Aynı şeyi projelerimden biriyle yaptım ve talimatları burada bulabilirsiniz .


1

Ben böyle yaparım:

DB türü hakkında özgür seçiminiz olduğundan, örneğin firebird gibi dosya tabanlı bir DB kullanın.

Gerçek dalınıza uyan şemaya sahip bir şablon DB oluşturun ve bunu deponuzda saklayın.

Uygulamanızı programlı olarak yürütürken şablon DB'nizin bir kopyasını oluşturun, başka bir yerde saklayın ve bu kopyayla çalışın.

Bu şekilde DB şemanızı veri olmadan sürüm denetimine alabilirsiniz. Şemanızı değiştirirseniz şablon DB'sini değiştirmeniz yeterlidir


1

Standart bir LAMP yapılandırmasında sosyal bir web sitesi çalıştırıyorduk. Canlı sunucu, Test sunucusu ve Geliştirme sunucumuzun yanı sıra yerel geliştirici makinelerimiz vardı. Hepsi GIT kullanılarak yönetildi.

Her makinede PHP dosyaları, ayrıca MySQL hizmeti ve kullanıcıların yükleyeceği Görseller içeren bir klasör vardı. Canlı sunucu 100K (!) Tekrarlayan kullanıcılara sahip oldu, dökümü yaklaşık 2GB (!), Görüntü klasörü yaklaşık 50GB (!) İdi. Gittiğimde, sunucumuz CPU, Ram ve en önemlisi eşzamanlı net bağlantı limitlerine ulaşıyordu (Hatta sunucunun 'lol' değerini maksimize etmek için kendi ağ kartı sürücümüzün sürümünü derledik). GIT'ye 2GB veri ve 50GB resim koyamadık ( ne de web sitenizle varsaymanız gerekmiyor ).

Tüm bunları GIT altında kolayca yönetmek için, bu klasör yollarını .gitignore'a ekleyerek ikili klasörleri (Görüntüleri içeren klasörler) yok sayarız. Ayrıca Apache belge kök yolunun dışında SQL adlı bir klasör vardı. Bu SQL klasöründe, SQL dosyalarımızı geliştiricilerden artımlı numaralara koyarız (001.florianm.sql, 001.johns.sql, 002.florianm.sql, vb.). Bu SQL dosyaları GIT tarafından da yönetildi. İlk sql dosyası gerçekten de büyük bir DB şeması kümesi içerir. GIT'e kullanıcı verileri eklemiyoruz (örn. Kullanıcı tablosunun veya yorum tablosunun kayıtları), ancak config veya topoloji veya siteye özgü diğer veriler gibi veriler sql dosyalarında (ve dolayısıyla GIT tarafından) tutulur. Çoğunlukla SQL şeması ve verileri ile ilgili olarak GIT tarafından neyin korunmadığını ve neyin korunmadığını belirleyen geliştiriciler (kodu en iyi bilen).

Bir sürüm yayınlandığında, yönetici dev sunucusunda oturum açar, canlı dalı tüm geliştiricilerle ve geliştirici makinesindeki gerekli dalları bir güncelleştirme dalına birleştirir ve test sunucusuna iletir. Test sunucusunda, Canlı sunucunun güncelleme işleminin hala geçerli olup olmadığını kontrol eder ve hızlı bir şekilde Apache'deki tüm trafiği bir yer tutucu siteye yönlendirir, bir DB dökümü oluşturur, çalışma dizinini 'canlı' dan 'güncellemeye yönlendirir ', tüm yeni sql dosyalarını mysql içine yürütür ve trafiği doğru siteye yeniden yönlendirir. Tüm paydaşlar test sunucusunu inceledikten sonra kabul ettiğinde, Yönetici aynı şeyi Test sunucusundan Canlı sunucuya da yaptı. Daha sonra, üretim sunucusundaki canlı dalı, tüm sunuculardaki ana şubeyle birleştirir ve tüm canlı şubeleri yeniden temel alır.

Test sunucusunda sorunlar varsa, örn. birleştirmelerin çok fazla çakışması vardı, daha sonra kod geri döndürüldü (çalışma dalını 'canlı' olarak işaret ediyor) ve sql dosyaları hiçbir zaman yürütülmedi. Sql dosyalarının yürütüldüğü anda, o zaman geri döndürülemez bir eylem olarak kabul edildi. SQL dosyaları düzgün çalışmıyorsa, DB Döküm kullanılarak geri yüklendi (ve geliştiriciler kötü test edilmiş SQL dosyaları sağlamak için söylendi).

Bugün, geliştiricilerin hem yükseltme sql dosyalarının eşit şekilde düşürülebileceğini test etmesi gereken eşdeğer dosya adlarına sahip bir sql-up ve sql-down klasörünü koruyoruz. Bu sonuçta bir bash betiği ile yürütülebilir, ancak insan gözlerinin yükseltme işlemini izlemeye devam etmesi iyi bir fikirdir.

Harika değil, yönetilebilir. Umarım bu gerçek hayattaki, pratik, nispeten yüksek kullanılabilirliğe sahip bir site hakkında fikir verir. Biraz modası geçmiş olsun, ama yine de takip etti.


0

İBatis Migrations ( manuel , kısa öğretici video ) gibi bir aracı , veritabanının kendisi yerine bir projenin yaşam döngüsü boyunca bir veritabanında yaptığınız değişiklikleri sürüm kontrol etmenizi sağlar .

Bu, farklı ortamlara seçici olarak bireysel değişiklikler uygulamanıza, hangi ortamlarda hangi değişikliklerin olduğu bir değişiklik günlüğü tutmanıza, A'dan N'ye değişiklikleri uygulamak için komut dosyaları oluşturmanıza, geri dönüş değişikliklerine vb.


0

Tüm veritabanını sürüm kontrolü altına koymak istiyorum, gerçek veritabanı dökümü yerine sürüm kontrolü altına koymak için hangi veritabanı motoru kullanabilirim?

Bu veritabanı motoruna bağlı değildir. Microsoft SQL Server tarafından birçok sürüm kontrol programı vardır. Sorunun git ile çözülebileceğini sanmıyorum, bir pgsql özel şema sürüm kontrol sistemi kullanmanız gerekiyor. Böyle bir şeyin var olup olmadığını bilmiyorum ...


2
Veritabanlarını sürümlemek için özel olarak üretilen klonio'ya gerçekten göz atmalısınız (şu anda Mongo ve MySQL'i destekliyor). Hala beta sürümünde, ancak oldukça umut verici görünüyor.
farthVader

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.