PHP / MySQL uygulama için göç (şema ve veri) otomatikleştirmek için nasıl

9 Cevap php

I have an application in PHP/MySQL. I am searching for an automated way upgrading database behind the application. I don't need to have the compatibility with older versions once it is upgraded.

I jeff's ve bu konuda K. Scott Allen's makaleleri okudum.

Ben hala bir PHP / MySQL uygulama için bu uygulamaya nasıl emin değilim.

Bunun için herhangi bir basit ve iyi bir süreç var mı?

9 Cevap

Ben kullanmak bir "şema" nesne var - ama sınıfsız aynısını yapabilirdi ..

Ne yapmak istediğinizi bir 'db_schema_versions' tablo oluşturun:

CREATE TABLE db_schema_versions (
  `table` varchar(255) NOT NULL PRIMARY KEY, 
  `version` INT NOT NULL
)

Lütfen veritabanı sonra ne olduğunu sürümü # izleyebilirsiniz - otomatik SQL yükseltmeleri yapabilirsiniz.

Şema yükseltme yaparken şema tabloyu kilitlemek gerekir. Bu şekilde alışkanlık şema yükseltmek için çalışırken aynı anda iki istekleri var.

Yani - sizden yükseltme sürümü takip - Bir büyük geçiş inşa - böyle bir şey:

class SNTrack_Db_Schema extends MW_Db_Schema_Abstract {
  protected $table = "sntrack_db_schema";
  protected $version = 5;

  protected function upgrade($fromVersion) {
    // don't break
    switch($fromVersion) {
      case 0:
        $this->db->query('CREATE TABLE sntrack_inbound_shipment (
            `id` INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
            `from` VARCHAR(255) NOT NULL,
            `date` DATE NOT NULL,
            `invoice` VARCHAR(255) NOT NULL,
            `notes` TEXT
          )');
        $this->setVersion(1);
      case 1:
        $this->db->query('ALTER TABLE sntrack_details ADD `shipment_id` INT');
        $this->db->query('ALTER TABLE sntrack_product ADD `inventory` INT NOT NULL DEFAULT 0');
        $this->db->query('CREATE TABLE sntrack_inventory_shipment (
            `shipment_id` INT NOT NULL,
            `product_id` INT NOT NULL,
            `qty` INT NOT NULL,
            PRIMARY KEY (`shipment_id`, `product_id`)
          )');
        $this->setVersion(2);
...etc

Komut satırı (canlı veya SQL script) MySQL veritabanı şemaları karşılaştırır ve SQL ALTER komut dosyası olarak fark çıkışlar mysql-diff aracı kullanabilir.

mysql-fark Eğer fark bakmak, diff çıktılar, ve OK ise sadece bu gibi mysql de diff yürütmek:

mysql-diff <server> newdb.sql > newdb.sql
less newdb.sql # Is it OK?
mysql < newdb.sql # apply the diff

Ben aşağıdaki ile çalışır Gnarf önerisine benzer:

  • Şema her değişiklik çalıştırdığınızda yeni sürüme eski sürümden götürecek bir SQL dosya için (bu ana sürümü veya daha küçük birçok değişiklik başına bir dosya olabilir).
  • Onlar (altta yeni, üstünde eski) uygulanmalıdır sırayla SQL dosya adlarının her listeleyen ayrı bir dosya oluşturmak
  • Lütfen veritabanı (tüm ihtiyacı tek bir VARCHAR sütun) basit bir "sürüm" tablo oluşturma

Şimdi şu şekilde çalışır basit bir komut dosyası yazmak gerekiyor:

  • Uygulanan son SQL güncelleştirme dosyası adı için sürüm tablosunu sorgula
  • Sırayla onları çalıştırmak çalıştırmak için yeni bir SQL değişiklik dosyaları varsa
  • uygulanan yeni SQL dosyasının adını kaydedin

Ben mantıklı umut

Şema göç için bu aracı kullanmaya çalışın: http://bitbucket.org/idler/mmp

Eğer bu konuda gitmek bir yolu mysqldump kullanarak büyük bir sql dosyası içine veritabanı dökümü etmektir. Sadece bu dosyayı almak ve yeni yükleme içinde bunu kaynak.

Sen yapamazsın. Ya

  1. Kaynak çevre üzerinde çalıştırılan ve daha sonra onları (yukarıda belirtilen), SVN gibi idam edilen tüm SQL'ın ile güncelleme dosyalarını yazın. Sql yazma yürütme ve manuel çalışma için php script Need

  2. Her iki ortamlarda post-analiz ve güncellemeleri geçirilmeli kullanıcıya öneririz. Eğer göç değil, küçük parçalar için çok büyük bir adım olması dışında ilki, temelde aynı şeydir. SQLyog şema hem de veri için FARKLAR analiz edebilirsiniz.

Ben PHP MySQL için küçük bir göç komut dosyası oluşturulur. Erken evre projeleri ve bu (henüz) ihtiyacı daha karmaşık göç komut için iyi. https://github.com/kennberg/php-mysql-migrate

Ayrıca ücretsiz API kullanabilirsiniz SqlQuerySync

ya da kendiniz için bir veritabanı tablosu yönetmek oluşturmak CREATE / ALTER / DELETE sorgularında.

@ Malukenho gelen migratedb https://github.com/malukenho/MigrateDB kullanın