DB şema değişiklikleri izleme mekanizmaları [kapalı]

18 Cevap php

DB şema değişiklikleri izleme ve / veya otomatize etmek için en iyi yöntemler nelerdir? Ekibimiz sürüm kontrolü için Subversion kullanır ve biz (iterek bir üretim sunucusuna test kodunu dağıtma, bir hazırlama sunucusuna kurar) bu şekilde bizim bazı görevler otomatikleştirmek mümkün oldum ama hala elle veritabanı güncellemelerini yapıyoruz. Ben kodu ve DB güncellemeleri çeşitli sunuculara itilip edildiği bir arka uç olarak Subversion kullanmaya devam ederken bize farklı ortamlarda sunucular arasında verimli çalışmaya olanak sağlayan bir çözüm bulmak ya da oluşturmak istiyoruz.

Birçok popüler yazılım paketi DB sürüm algılamak ve gerekli değişiklikleri uygulamak otomatik güncelleme dosyaları içerir. Bu bile (birden fazla proje ve bazen birden fazla ortamları ve diller arasında) büyük bir ölçekte bunu yapmanın en iyi yolu nedir? Eğer öyleyse, varolan herhangi bir kod olduğunu sürecini kolaylaştırır ya da sadece kendi çözüm rulo iyi orada mı? Herkes önce benzer bir şey uygulanacak ve Subversion post-commit kanca içine entegre, ya da bu kötü bir fikir mi?

Birden çok platformu destekleyen bir çözüm tercih olacağını ise, biz kesinlikle bizim işin çoğunluğu bu platformda olduğu gibi Linux / Apache / MySQL / PHP yığın desteklemek gerekir.

18 Cevap

Raylar dünyasında, göç kavramı var, veritabanına değişiklikleri hangi komut yerine SQL veritabanına özgü bir lezzet daha Ruby yapılır. Sizin Ruby göç kodu geçerli veritabanı DDL spesifik dönüştürülmüştür biter; Bu çok kolay bir veritabanı anahtarlama platformları yapar.

Eğer veritabanına yaptığınız her değişiklik için, yeni bir göç yazmak. Değişiklikler uygulandığı bir "yukarı" yöntemi ve değişiklikleri geri edildiği bir "aşağı" yöntemi: Göçler genellikle iki yöntem var. Tek bir komut güncel veritabanı kadar getiriyor ve ayrıca şema belirli bir sürümüne veritabanı getirmek için kullanılabilir. Rails, göçler proje dizininde kendi dizininde tutulur ve sadece herhangi bir diğer proje kodu gibi sürüm kontrolü içine kontrol olsun.

This Oracle guide to Rails migrations oldukça iyi göçler kapsar.

Diğer dilleri kullanan geliştiricilerin göçler baktım ve kendi dil özel versiyonları hayata geçirdik. Ben Rails'in hicretinden sonra modellenmiştir Ruckusing , bir PHP göçler sisteminin biliyorum; o aradığınız şey olabilir.

Biz veritabanı şemaları 5 farklı tesisler (üretim, evreleme ve birkaç geliştirme sistemler) arasında senkronize ve sürüm kontrol yedeklenen tutmak için bcwoord benzer şeyleri kullanmak, ve oldukça iyi çalışıyor. Ben biraz ayrıntılı olacak:


Veritabanı yapısını senkronize etmek için, biz komut geçerli sürüm numarasını saklamak için ekstra bir tabloyu kullanan tek bir komut dosyası, update.php, vb sayılı dosya sayısı 1.SQL, 2.sql, 3.sql var veritabanı. N.sql dosyalar veritabanı sürümü N sürümü (N-1) gitmek için, elle hazırlanmış bulunmaktadır.

Bunlar, tablolar eklemek sütun eklemek, Temelde, her şeyi yapabilir, kullanıcı tipleri, vb gibi "usta" veri satırları eklemek, sütun bırakın sonra yeni bir sütun biçiminde eski bir veri göç ve doğru veri ile kullanılabilir göç komut verileri asla kaybetmeyeceğim.

Güncelleştirme script gibi çalışır:

  • Veritabanına bağlanın.
  • (Malzeme will yanlış çünkü) [mysqldump] geçerli veritabanının yedeğini.
  • O yoksa (_meta denir) muhasebe tablo oluşturun.
  • _meta Tablosundan mevcut sürümünü okuyun. Bulunamadı eğer 0 varsayalım.
  • Tüm. Sql dosyaları, VERSİYONU daha yüksek numaralı sırayla onları yürütmek
  • Dosyalardan biri bir hata üretilen eğer: geri yedekleme rulo
  • Aksi takdirde, idam yüksek. Sql dosyası muhasebe tablodaki sürümünü güncellemek.

Her kaynak kontrolü gider ve her kurulum (uygun veritabanı şifre vs ile update.php çağırarak) tek bir komut dosyası ile en son sürüme güncellemek için bir komut dosyası var. Biz otomatik veritabanı güncelleme komut dosyasını çağıran bir komut dosyası aracılığıyla güncelleme evreleme ve üretim ortamlarını SVN, yani bir kod güncellemesi gerekli veritabanı güncellemeleri ile birlikte geliyor.

Biz de sıfırdan tüm veritabanını yeniden aynı komut dosyasını kullanabilirsiniz; biz sadece bırakın ve veritabanı yeniden, daha sonra tamamen veritabanını yeniden doldurmanız olacaktır komut dosyasını çalıştırın. Biz de otomatik test için boş bir veritabanı doldurmak için komut dosyasını kullanabilirsiniz.


Bu sistemi kurmak için sadece birkaç saat sürdü, bu kavramsal basit ve herkes sürüm numaralandırma düzeni alır ve ileriye taşımak için yeteneğine sahip ve değişiklikleri iletişim veya elle çalıştırmak zorunda kalmadan, veritabanı tasarımı gelişen paha biçilmez olmuştur tüm veritabanları üzerinde.

Beware when pasting queries from phpMyAdmin though! Bu oluşmaya sorguları genellikle bu komut kıracak beri kesinlikle istemediğiniz veritabanı adını içerir! Sistemi üzerinde veritabanı Mydb denir değilse mydb. newtable (...) başarısız olacaktır CREATE TABLE gibi bir şey. Biz izin vermemek olacaktır. Birisi kopya / uygun kontrol olmadan phpMyAdmin yapıştırılan bir işaretidir mydb dizesini içeren sql dosyaları ön-Yorum SVN kanca yarattı.

Benim takımım üzerinden komut tüm veritabanı değişiklikleri ve uygulamanın her sürümü ile birlikte, SVN için bu komut taahhüt. Bu herhangi bir veri kaybetmeden, veritabanı artımlı değişiklikler için izin verir.

Bir sürümden sonraki sayfaya gitmek için, sadece değişim komut kümesini çalıştırmak için gereken, ve veritabanı up-to-date, ve hala tüm veri var. Bu kolay bir yöntem olmayabilir, ama kesinlikle etkili.

Hala çözümler arıyorsanız: Biz neXtep tasarımcısı olarak adlandırılan bir araç öneriyorlar. Bu sürüm kontrolü altında tüm veritabanını koymak hangi ile bir veritabanı geliştirme ortamıdır. Sen her değişiklik izlenebilir bir sürüm kontrollü bir depo üzerinde çalışmak.

Eğer bir güncelleme yayınlayacak gerektiğinde, size bileşenleri işlemek ve ürün otomatik olarak önceki sürümden yükseltme SQL komut dosyası üretecektir. Tabii ki, herhangi bir 2 sürümlerinden bu SQL üretebilirsiniz.

Sonra birçok seçenek var: mevcut mekanizma tarafından konuşlanmış olacak böylece bu komut almak ve app kod ile SVN'de koyabilirsiniz. Başka bir seçenek neXtep teslim mekanizmasını kullanmaktır: komut bir "teslimat paketi" (SQL komut + XML tanımlayıcı) denilen bir şey ihraç edilir ve bir yükleyici bu paketi anlamak ve strcutural tutarlılık, bağımlılık sağlarken bir hedef sunucuya dağıtabilirsiniz , kayıt yüklü sürüm, çek vb

The product is GPL and is based on Eclipse so it runs on Linux, Mac and windows. It also support Oracle, Mysql and Postgresql at the moment (DB2 support is on the way). Have a look at the wiki where you will find more detailed information : http://www.nextep-softwares.com/wiki

Bir dosya halinde şema dökümü ve kaynak denetimi ekleyin. Sonra basit bir fark değiştiğini gösterecektir.

Scott Ambler aslında senin şema korumak için TDD ilkeleri ve uygulamaları uygulamak gerekir düşüncesi ile, makale (ve yazarlarından book) veritabanı üzerinde üstlenmeden büyük bir dizi üretir. Sen yapısı ve veritabanı için tohum veri birimi bir dizi test kurmak. Sonra, hiçbir şey değiştirmeden önce, bu değişikliği yansıtmak için / yazma testleri değiştirebilirsiniz.

Biz bir süre için şimdi bu yapıyor ve iş gibi görünüyor. Biz bir birim test paketi içinde temel sütun adı ve veri türü kontrolleri oluşturmak için kod yazdı. Biz SVN çıkış içinde veritabanı uygulama aslında çalıştığı db canlı eşleştiğini doğrulamak için her zaman bu testleri yeniden çalıştırabilirsiniz.

Olarak çıkıyor, geliştiriciler de bazen SVN'de şema dosyasını güncellemek için kendi sandbox veritabanı ve ihmal çimdik. Daha sonra kod hata bu tür aşağı pin çıldırtırcasına zor olabilir iade edilmemiş bir db değişikliği bağlıdır, ancak test paketi hemen bulacaktır. Eğer daha büyük bir sürekli entegrasyon planına yerleşik varsa, bu özellikle güzel.

K. Scott Allen burada diğer yanıtlar başvurulan artan güncelleme komut / göçler kavramını kullanır şema sürüm üzerinde iyi bir makale ya da iki, vardır; bkz http://odetocode.com/Blogs/scott/archive/2008/01/31/11710.aspx.

Bu tür düşük teknoloji, ve orada daha iyi bir çözüm olabilir, ama sadece veritabanı oluşturmak için çalıştırılabilir bir SQL komut dosyası şema saklamak olabilir. Ben bu senaryoyu oluşturmak için bir komut yürütebilirsiniz düşünüyorum, ama ne yazık ki komutu bilmiyorum.

Sonra, üzerinde çalıştığı kodu ile birlikte kaynak denetimi içine komut işlemek. Eğer kodu ile birlikte şemasını değiştirmek gerektiğinde, komut değiştirilen şema gerektiriyorsa kodu ile birlikte kontrol edilebilir. Sonra senaryo üzerinde diffs şema değişiklikleri diffs gösterecektir.

Bu komut ile, DBUnit veya yapı komut çeşit ile entegre olabilir, bu yüzden sizin zaten otomatik işlemler ile uygun olabilir gibi görünüyor.

C # kullanıyorsanız, Subsonic, çok yararlı bir ORM aracı bir göz var, ama aynı zamanda düzeni ve \ veya veri yeniden sql komut dosyası üretir. Bu komut dosyaları sonra kaynak denetimi içine konabilir.

http://subsonicproject.com/

Ben yapı sürümleri adını klasörler oluşturmak ve yükseltmek ve orada komut downgrade koydu. 1.0.0, 1.0.1 ve 1.0.2: Örneğin, aşağıdaki klasörleri olabilir. Her biri sürümleri arasında veritabanı yükseltme veya downgrade sağlar komut dosyası içerir.

Bir müşteri veya müşteri sürüm 1.0.1 ile bir sorun aramak gerekir ve geri onun sürüme veritabanını getirerek, 1.0.2 kullanıyorsanız bir sorun olmayacak.

Senin veritabanında, veritabanı güncel sürümü koymak "şema" adlı bir tablo oluşturun. Sonra sizin için veritabanı yükseltme veya downgrade bir program yazıyorum kolaydır.

Eğer Rails dünyada ise Joey dediği gibi, göçler kullanın. :)

Ben çeşitli projeler için Visual Studio aşağıdaki veritabanı proje yapısını kullandım ve oldukça iyi çalıştı:

Veritabanı

Komut değiştirin

0.PreDeploy.sql

1.SchemaChanges.sql

2.DataChanges.sql

3.Permissions.sql

Komut oluşturma

SPROCs

Fonksiyonlar

İzlenme

Bizim yapı sistemi sonra aşağıdaki sırayla komut çalıştırarak sonraki bir sürüm veritabanını günceller:

1.PreDeploy.sql

2.SchemaChanges.sql

Contents of Komut oluşturma folder

2.DataChanges.sql

3.Permissions.sql

Each developer checks in their changes for a particular bug/feature by appending their code onto the end of each file. Once a major version is complete and branched in source control, the contents of the .sql files in the Komut değiştirin folder are deleted.

Biz çok basit ama henüz etkili bir çözüm kullanın.

Yeni yüklemeler için, biz sonra inşa sürecinde biz veritabanı oluşturmak için bu dosyayı kullanın, tüm DB şema tutan depodaki bir metadata.sql dosyası var.

Güncellemeler için, kodlanmış yazılım güncellemeleri eklemek. Biz kodlanmış biz gerçekten bir sorun IS önce sorunları çözme sevmiyorum çünkü tutmak ve bu tür bir şey bugüne kadar bir sorun olarak kanıtlamak değil.

Yani bizim yazılım biz böyle bir şey var:

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

Bu kod veritabanı sürümü 1 olup olmadığını kontrol edin (otomatik olarak oluşturulan bir tabloda depolanan) modası geçmiş ise, o zaman komut yürütülür olacaktır.

Depodaki metadata.sql güncelleştirmek için, biz yerel olarak bu yükseltmeleri çalıştırın ve daha sonra tam veritabanı meta ayıklayın.

Her öylesine sık sık olur tek şey, metadata.sql işlemekle unutmak, ama onun kolay oluşturma işlemi üzerinde test etmek ve aynı zamanda başına gelebilecek tek şey, yeni bir ile kurulumu yapmak için çünkü bu büyük bir sorun değil eski bir veritabanı ve ilk kullanımda yükseltti.

Ayrıca düşürdü desteği yok, ama bu tasarım, bir şey bir güncelleştirme üzerinde çıkarsa, biz önceki sürümünü geri ve tekrar denemeden önce güncelleştirmeyi düzeltmek.

Mevcut PHP proje için biz raylar göçlerinin kullanmak fikrini ve biz dosyaları unvanını XX göçün numarası "migration_XX.sql" tutmak hangi bir göçler dizin var. Güncellemeleri yapılmış, ancak onların yaratma kolayca modifiye edilebilir gibi şu anda bu dosyaları elle oluşturulur.

Sonra "Göç XX geçerli göç sürümünden daha büyüktür watcher" which, as we are in pre-alpha, currently runs on every page load and checks whether there is a new migration XX.sql dosyası olarak adlandırılan bir komut dosyası var. Yüzden veritabanı ve işte! Şemayla büyük sayıya kadar olan tüm migration_XX.sql dosyaları çalıştırır değişiklikler otomatik vardır.

Eğer sistem verdiği bir sürü gerektirir dönmek için yetenek gerektirir, ama basit ve bugüne kadar bizim oldukça küçük bir takım için çok iyi çalışıyor eğer.

IMHO göçler büyük bir sorun var:

Ince bir eser bir sürüm yükseltme, ama taze, tablolar yüzlerce ve değişikliklerin uzun bir geçmişi (yaptığımız gibi) varsa, sonsuza kadar sürebilir verilen bir versiyonu yükleyin yapıyor.

(Müşteriler veritabanları yüzlerce) güncel sürüme temel yana oluşan deltalar bütün tarihini Koşu çok uzun zaman alabilir.

I Yii veritabanı göçler nasıl işleyeceğini yolu gibi. Bir göç temelde CDbMigration . CDbMigration göç mantığını içeren bir up yöntemini tanımlar uygulayan bir PHP betiği. Bu göç ters desteklemek için bir down yöntemi uygulamak da mümkündür. Seçenek olarak ise, safeUp ya da safeDown göç bir işlem bağlamında yapılır olduğundan emin olmak için kullanılabilir.

Yii komut satırı aracı yiic göçler oluşturmak ve yürütmek için destek içerir. Göçler uygulanan veya ya tek tek ya da toplu olarak, iptal edilebilir. Benzersiz kullanıcı tarafından belirlenen bir zaman damgası ve bir göç adına göre adlandırılmış CDbMigration uygulayan bir PHP sınıfı için kod bir göç sonuçlar yaratıyor. Daha önce veritabanına uygulanmış tüm geçişler bir geçiş tabloda depolanır.

Daha fazla bilgi için manuel Database Migration makalesine bakın.

Esas olarak bir Java aracı değil, aynı zamanda php ile çalışır - db-Dağıt sahipsiniz.

MySQL için Toad şema adında bir fonksiyon size 2 veritabanları senkronize etmenizi sağlar karşılaştırmak vardır. Ben şimdiye kadar kullandığım en iyi araçtır.

Bir komut satırı şema diskte bir canlı veritabanı veya SQL komut olabilir veritabanı şemaları, karşılaştırır mysql-diff aracı yoktur. Bu en şema göç görevler için iyidir.