Overkill olmadan mysql schemata sürüm ile başlayarak.

10 Cevap php

Ben benim veritabanı şemaları ve değişiklikleri sürüm başlamak gerektiğini fark noktada geldik. Ben dolayısıyla bu konu hakkında SO üzerinde mevcut mesajları okudum ama devam etmek nasıl emin değilim.

Ben temelde bir adam değilim şirket ve uzun zaman önce ben bile benim kod için sürüm kontrolü kullanmalarını vermedi. Ben (Tortoise) ile Aptana (IDE) ve SVN kullanarak bir windows ortamında değilim. PHP / MySQL projeler üzerinde çalışıyoruz.

Sürümünde benim veritabanı şemaları için bir (hayır overkill) etkili ve yeterli yolu nedir?

Bazı projelerde bir çevirmen veya iki tane var ama dallanma ve devam birleştirme bir şey beklemeyin. Yani temelde benim kod değişiklikleri eşzamanlı schemata takip etmek istiyorum.

[Değiştir] Momentary solution: Şu an için ben bir etiket (kararlı sürüm) işlemek için gidiyorum zaman ben sadece gerekli ilk veri ile bir şema dökümü artı bir yapacaktır verdi. Yani şimdiki aşamada benim için yeterli gibi görünüyor. [/ Edit]

[Edit2] artı şimdi de ben kolay bir dosyada değişiklik geçmişini iz yapmak vb tarihleri ​​ile tüm değişiklikleri nereye increments.sql denilen üçüncü dosyayı kullanıyorum. zaman zaman ben diğer iki dosyaları içine entegre değişiklikleri ve increments.sql boşaltın [/ edit]

10 Cevap

Küçük bir şirket için basit yolu: SQL veritabanı dökümü ve depo eklemek. Sonra, her zaman, bir şey değiştirmek dökümü dosyasında değişiklikleri ekleyebilirsiniz.

Daha sonra sürümleri arasındaki değişiklikleri söz değil, yaptığınız değişiklikleri açıklayan sahip comments görmek için diff kullanabilirsiniz. Bu aynı zamanda MySQL yükseltmeleri için neredeyse bağışıklık yapacaktır.

Ben bu kadar gördüğüm tek dezavantajı elle dumpfile için SQL eklemek için hatırlamak zorunda olmasıdır. Her zaman hatırlıyorum, ama başkaları ile çalışmak durumunda dikkatli olmak için kendinizi eğitebilirsiniz. Eksik bir güncelleştirme sonra bir ağrı olabilir.

Bu yıkıcılık göndererek zaman sizin için bunu yapmak için bazı ayrıntılı komut dosyası oluşturarak hafifletilebilir olabilir ama bir tek adam gösterisi için biraz fazla.

Edit: Bu cevap beri gitmiştir yılında, küçük bir takım için MySQL için bir sürüm düzeni uygulamak zorunda kalmıştım. Elle her değişiklik ekleyerek bu açıklamalarda belirtildiği gibi çok hantal bir çözüm olarak görülen, bu yüzden veritabanı damping ve sürüm kontrolü için bu dosyayı ekleyerek gitti.

Ne bulduğumuz test verileri çöplükte biten ve oldukça zor değişmişti anlamaya olduğuydu. Bu şema sadece damping tarafından çözülebilir, ama bizim uygulamaların çalışması için veritabanındaki bazı verilere bağlı beri bu projeler için imkansızdı. Sonunda elle veritabanı dökümü değişiklikleri ekleyerek döndü.

Bu basit çözüm oldu, ama aynı zamanda MySQL bazı sürümleri ithalat / ihracat ile sahip olduğu bazı sorunları çözülmüş değil sadece. Normalde biz sadece o üretim veritabanı oluşturmak mümkün uygulanabilir ve bazı isimleri değiştirmek / geliştirme veritabanı dökümü herhangi bir test verileri kaldırmak, günlük girişleri, vb kaldırmak olurdu. Elle biz sonunda her şeyin hazır olduğunu, böylece bir anda, üretim biraz sona ereceğini tam olarak ne kontrol edebilecek değişiklikler ekleyerek ve üretim ortamına taşıyarak mümkün olduğunca ağrısız oldu.

Bu nasıl yaparak oluşturulan dosyayı sürüm hakkında:

mysqldump --no-data database > database.sql

Çalıştığım yerde biz yükseltme için çalıştırmak için gereken sql sahip app her yeni sürümü için bir yükleme komut dosyası var. Bu, bazı bakım sürümleri için dallanma ile 6 Devs için yeterince iyi çalışıyor. Biz Auto Patch http://autopatch.sourceforge.net/ hangi yükseltirken herhangi bir veritabanına uygulamak için yamalar ne çalışma kolları hareket düşünüyoruz. Orada oto Patch ile dallanma bazı küçük komplikasyon taşıma olabilir, ama bu sizin için bir sorun olacak gibi gelmiyor gibi görünüyor.

Ben böyle bir toplu iş dosyası (zor deneyin vermedi) işi yapmalıyım, tahmin ediyorum ...

mysqldump --no-data -ufoo -pbar dbname > path/to/app/schema.sql
svn commit path/to/app/schema.sql

sadece şema değiştirdikten sonra toplu iş dosyasını çalıştırmak, ya da bunu (ama ben bilmiyorum ... bence bir cron / zamanlayıcı izin, sadece damgaları içeriği aynı olsa bile değişti eğer işe tamamlar. yapamaz bu bir sorun olacağını biliyorum.)

Ana ideea proje baz yolunda bu yapı ile bir klasör olmasıdır

/__DB
—-/changesets
——–/1123
—-/data
—-/tables

Now who the whole thing works is that you have 3 folders: Tables Holds the table create query. I recommend using the naming “table_name.sql”.

Data Holds the table insert data query. I recommend using the same naming “table_name.sql”. Note: Not all tables need a data file, you would only add the ones that need this initial data on project install.

Changesets This is the main folder you will work with. This holds the change sets made to the initial structure. This holds actually folders with changesets. For example i added a folder 1123 wich will contain the modifications made in revision 1123 ( the number is from your code source control ) and may contain one or more sql files.

Xx bazen belirli bir sırayla koşucu değişiklik ihtiyacı olduğundan, runned gereken sırasını söyler bir sayıdır - Onları adlandırma xx_tablename.sql ile tablolar halinde gruplandırılmış eklemek istiyorum.

Note: When you modify a table, you also add those modifications to table and data files … since those are the file s that will be used to do a fresh install.

Bu ana ideea olduğunu.

Daha fazla ayrıntı için bu kontrol edebilir blog post

SchemaSync bir göz atın. Bu yama oluşturmak ve zamanla veritabanı şeması göç ve sürüm için gerekli komut (. Sql dosyaları) dönecektir. Bu dil ve çerçeve bağımsız MySQL için bir komut satırı yardımcı programı bulunuyor.

Birkaç ay önce ben MySQL şema sürüm için aracı aradı. Ben Doktrin göç, RoR göç, Java ve Python manzum bazı araçları gibi birçok yararlı araçlar bulundu.

Ama bunların hiç biri benim gereksinimleri memnun oldu.

Benim gereksinimleri:

  1. Gereksinim, PHP ve MySQL dışlamak
  2. Doktrini schema.yml gibi bir şema yapılandırma dosyaları,
  3. Bağlantısından geçerli şema okuma ve uygulama diğer tesislerdeki aynı şemayı temsil yerine, yeni göç komut dosyası oluşturmak mümkün.

Benim göç aracı yazmaya başladı ve bugün beta sürümü var.

Please, try it, if you have an interest in this topic. Please send me future requests and bugreports.

Source code: bitbucket.org/idler/mmp/src Overview in English: bitbucket.org/idler/mmp/wiki/Home Overview in Russian: antonoff.info/development/mysql-migration-with-php-project

Bizim çözüm MySQL tezgah olduğunu. Biz düzenli olarak uygun sürüm numarasına sahip bir model haline mevcut veritabanı ters mühendislik. Bu gerektiği gibi kolayca sürümleri arasındaki farklarını gerçekleştirmek mümkündür. Ayrıca, biz, vb güzel EER Diyagramları olsun

Firmamızda biz bunu bu şekilde yaptım:

Biz tbl_Foo.sql gibi, kendi dosyasındaki tüm tablolar / db nesneleri koymak. Dosyalar ile ayrılmış birkaç "parça" içeren

-- part: create

create verilen parça için sadece bir tanımlayıcı kimlik olduğu, dosya gibi görünüyor:

-- part: create
IF not exists ...
CREATE TABLE tbl_Foo ...
-- part: addtimestamp
IF not exists ...
BEGIN
   ALTER TABLE ...
END

Then we have an xml file that references every single part that we want executed when we update database to new schema. It looks pretty much like this:

<playlist>
   <classes>
     <class name="table" desc="Table creation" />
     <class name="schema" desc="Table optimization" />
   </classes>
   <dbschema>
      <steps db="a_database">
         <step file="tbl_Foo.sql" part="create" class="table" />
         <step file="tbl_Bar.sql" part="create" class="table" />
      </steps>
      <steps db="a_database">
         <step file="tbl_Foo.sql" part="addtimestamp" class="schema" />
      </steps>
   </dbschema>          
</playlist>

<classes/> kısım <steps/> değişiklikleri parçalamaktır GUI, ve <dbschema/> ile eğer. <step/>, s ardışık olarak çalıştırılır. Biz ikili dosyaları dağıtmak gibi farklı şeyler yapmak için sqlclr gibi diğer bazı kuruluşlar var, ama bu oldukça fazla bulunuyor.

Tabii biz çalma crossreferences ve parçaları istedim dışarı alır ve daha sonra veritabanı admin olarak çalıştığı müzik dosyası alır bir bileşeni ve bir kaynak / dosya sistemi nesnesi var.

Since the "parts" in .sql's are written so they can be executed on any version of DB, we can run all parts on every previous/older version of DB and modify it to be current. Of course there are some cases where SQL server parses column names "early" and we have to later modify part's to become exec_sqls, but it doesn't happen often.

Ben bazı düzenlilik (2 ayda) ile güncelleştirmek bir 'master' dosyası (master.sql) var dışında ben Manos benzer bir şey yapmak. Daha sonra, her değişiklik için ben değişikliklerle. Sql dosyası adında bir sürümü kurmak. Bu şekilde ben basit şeyler yapmak için master.sql ile başlamak ve güncel sürüme kadar elde edene kadar. Sql dosyası adında her sürümü ekleyebilir ve ben adlı sürümünü kullanan istemcilerin güncelleyebilirsiniz. Sql dosyaları.