Yeni sürümler aktarılırken veritabanı şeması değişikliklerini işleme


17

Ağır gelişme dönemlerinde, veritabanı şeması hem hızlı hem de sürekli olarak değişir ve haftalık beta sürümüne bastığımız zaman, şema o kadar değişti ki, tek mantıklı seçenek yapabileceğim tüm tabloları nuke yapmak ve yeni sürümleri geliştirici veritabanımdan kopyala. Açıkçası, bu, bir kez başlatıldıktan sonra işe yaramayacak, çünkü nuking üretim verileri felaket için bir reçete, bu yüzden bir sürümden / revizyondan diğerine veritabanı şeması değişikliklerini yönetmek için hangi stratejilerin olduğunu merak ediyordum?

Bulduğum veya deneyimlediğim bazıları:

  1. Bir veritabanından diğerine düz nuke-and-dump (şimdi ne yapıyorum)
  2. UPDATE.sql dosyasının komut dosyasıyla veya el ile çalıştırılan SQL deyimleriyle bakımı.
  3. Etkin veritabanında karşılık gelen "db-schema-version" değerine sahip bir update.php dosyasının bakımı

Üçüncü seçenek en mantıklı gibi görünüyor, ancak yine de kötü yapılandırılmış bir SQL sorgusunun komut dosyasının ortasında başarısız olması, veritabanını yarı güncellenmiş bir durumda bırakması ve bir yedeğin geri yüklenmesini gerektirmesi olasılığı var.

Sorun değil gibi görünüyor, ancak bir ekip olarak phpMyAdmin kullandığımız için gerçekleşti ve hatta update.php dosyasına yapıştırmak için yürütülen SQL deyimini kopyaladığımı hatırlamıyorum bile. Başka bir sayfaya gittikten sonra, SQL deyimini elle yeniden yazmam veya değişikliğimi tersine çevirmem ve tekrar yapmam gerekiyor.

Sanırım neyi bekliyorum, yerleşik geliştirme iş akışımızı etkilemeyen bir çözüm?


Ancak elbette, etkin veritabanına uygulamadan önce dosyanızı update.phpveya update.sqldosyanızı bir test ortamında test edersiniz , değil mi? Ve PHPMyAdmin senaryo gibi olası sorunlar için suçlanıyor, belki de farklı / daha iyi bir araca bakmanın zamanı geldi mi?
FrustratedWithFormsDesigner

Haha, evet, beni yakaladın. İlk etapta onları çözmek yerine kendi hatalarım üzerinde çalışmaya çalışıyorum.
Julian H. Lam

Bu işi aldıysanız lütfen örnek bir senaryo gösterir misiniz? Ben de bunu yapmaya çalışıyorum ama MS Sql arasında herhangi bir MySql arasında çeviri nasıl yapmıyorum: stackoverflow.com/questions/26948916/…
Richard

Aynı sorunla karşı karşıya kaldık, bir araç yazdık. Her yükseltme, sayısal tanımlayıcıya sahip bir dosyadır (düşük sayıdan daha yüksek sayıya kadar dosyaları çalıştırın), Gerçek DB'ye bırakmadan önce her dosyayı bir test DB'sine karşı kontrol eder, hangi dosyaların yayınlandığının kaydını tutar. Tabii ki, hepsi otomatiktir ve ana rel sistemine bağlanır.
Itay Moav -Malimovka

Yanıtlar:


11

Otomatikleştirmek. Otomatikleştirmek. Otomatikleştirmek.

Açık bir DB sürüm numarası ile doğru yoldasınız, ancak bir adım daha ileri gidip kodu tam olarak hangi şemaya karşı çalışacağını tam olarak fark edeceğim (örneğin, gerçek DDL komut dosyasını yürüterek ve güncelleyiciyi ayrıştırmasını sağlayarak) ); güncelleme zamanında, hangi sürümü güncellemek istediğinize bakılmaksızın, mevcut düzeni sadece veritabanı meta verileri ve INSERT / DROP / ALTER üzerinden bulmanız gerekir. (Ayrıca, veritabanının içinde açık bir sürüm numarası tutabilir ve şema geçmişinin tamamını yükleyici ile birlikte sunabilirsiniz, böylece şema bulmaya bile ihtiyacınız olmaz.)

Güncelleme SQL komut dosyasındaki olası sözdizimi hataları bir sorundur, ancak güncelleyicinin yalnızca doğru DDL ifadeleri üretebildiğini doğrulayarak bunu çözebilirsiniz. (Resmi kanıtlar, kurumsal yazılım geliştirmede neredeyse hiç işe yaramaz - çok az güvence için çok fazla çaba - ama veritabanı bütünlüğünün birkaç istisnadan biri olduğunu hissediyorum: temel SQL, resmi olarak yakalamak için özellikle zor bir dil değil ve üretim verilerinin korunması o kadar büyüktür ki, özellikle katılımsız kurulumlarda çalışması gerekiyorsa, hemen hemen her türlü bir kerelik ön çabaya gerek vardır.)


Büyük tavsiye Kilian, teşekkürler. Sonunda bunu otomatikleştirmeyi umuyordum, ancak bir noktada, UPDATE / ALTER ifadelerini oluşturmak için insan katılımının hala gerekli olduğu görülüyor.
Julian H. Lam

2

Veritabanı şeması sürüm oluşturma, gitmenin yoludur - her sürümün veritabanında yalnızca bir değişiklik veya en azından bir bütün olarak geri alınabilecek değişiklikler vardır. DBDeploy bunu otomatikleştirmek için harika bir araçtır.

Yararlı öğrendiğim bazı şeyler:

  1. Her zaman değişikliğinizi yerel olarak test edin ve kodunuzu onunla test edin, sadece ALTERgeçiş yeterli değildir
  2. Değişikliklerini ilk önce hangilerinin yapacağını senkronize etmeniz gerekiyor - ekibim için "bir numara alabilir" in çalışabileceği basit bir wiki sayfası.
  3. Kırık değişimi düzeltmeye çalışmayın, reddetmek için yeni bir karşı değişiklik ekleyin, çok acısız
  4. Kodunuz bu değişikliklere bağlıdır - hata izleme sisteminizdeki sorunları DB değişiklikleriyle ilişkilendirdiğinizden emin olun. Bu, konuşlandırma zamanında çok yararlıdır.
  5. DB değişikliklerini CI'nize ekleyin - değişikliklerinizi taahhütte bulunduğunuzda bir CI veritabanına uygulayın. Ayrıca, veritabanı kullanan herhangi bir testiniz varsa, bunları kesin olarak çalıştırın.

Yardım etmekten memnunum :)
jmruc

0

PhpMyAdmin kullandığınız için, MySQL de kullandığınızı varsayıyorum.

MySQL Workbench'teki EER Model diyagramlarına göz atın. Şemaların bakımı ve güncellenmesinde bana çok yardımcı oldular.

İlk olarak, modeli bir veritabanı kaynağı ile senkronize edebilirsiniz. Böylece şemadaki değişiklikler ALTER TABLE komutları olarak itilir. Bu, şema değişikliklerinizi şema üzerinde gerçekleştirmenize, her zaman güncel tutmanıza ve ayrıca gerektiğinde geliştirme veritabanınıza güncellemeler göndermenize olanak tanır.

İkinci olarak, bir EER diyagramını veritabanı kaynağından tersine mühendislik yapabilirsiniz. Bu, bir geliştirme veritabanında değişiklik alarak ve bir üretim veritabanını güncelleyerek farklılıkları hesaplayacağı için kullanışlı olabilir.

Üçüncü olarak, "update.sql" dosyanıza girmesi gereken SQL'in oluşturulmasına yardımcı olmak için kullanılabilir.

EKSİLERİ:

Veritabanı tetikleyicileri ve kısıtlamaları, senkronize edici güncelleyicide bir sorundur. Şeylerin doğru sırasını bilmiyor gibi görünüyor. Yabancı anahtar kısıtlamaları genellikle hata üretir, ancak bu, oluşturduğu SQL düzenlenerek çözülebilir.

Bu bir veri taşıma aracı değildir. Tamamen şemanın ötesinde herhangi bir değişiklik için yine de özel SQL gerekir.


0

Http://south.aeracode.org adresine bir göz atın - Django (bir Python çerçevesi) için bir DB taşıma kütüphanesi ama:

  1. ondan harika fikirler edinebilirsiniz (ve hatta bir PHP klonu bile bulabilirsiniz)
  2. PHP / MySQL uygulamanızın tablolarını yönetmek için Django'nun diğerlerinden bağımsız olarak kullanabilirsiniz.

Ayrıca şema güncelleme komut dosyaları oluşturabilir; ayrıca çoğu zaman otomatik olarak değişiklik tersine çevirme işlemlerini gerçekleştirir.


ne yazık ki, Django çekirdeğinin bir parçası yaptılar ve artık yalnız
değiller
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.