MySQL için İşlemsel DDL iş akışı


25

DDL deyimlerinin ( alter table, create indexvb.) MySQL'deki mevcut işlemi dolaylı olarak yerine getirdiğini keşfetmekten biraz şaşırdım . MS SQL Server'dan gelince, yerel olarak bir işlemde yerel olarak veritabanı değişiklikleri yapma yeteneği (daha sonra geri alındı) iş akışımın önemli bir parçasıydı. Sürekli entegrasyon için, geri dönüş, herhangi bir nedenden ötürü hile yapmak durumunda kaldı, böylece veritabanını yarı geçirilmiş bir durumda bırakmadık.

İnsanlar MySQL'i göçler ve sürekli entegrasyonla kullanırken bu iki sorunu nasıl çözüyorlar?


SO'dan gönderilen haç. stackoverflow.com/q/28197013/614523 Orada çok fazla aşk alamadım.
sennett

1
Sürekli Entegrasyon için LVM Anlık Görüntülerini bilinen bir durumda olan tüm ortamı çok hızlı bir şekilde oluşturmanın bir yolu olarak düşünün.
Rick James,

5
Her zaman Postgres'e yükseltebilirsiniz - işlemsel DDL'yi (SCNR) destekler.
a_horse_with_no_name

3
@A_horse_with_no_name ile aynı fikirdeyim, eğer bu sizin iş akışınızsa, diğer pek çok hoş özellik ile birlikte işlemsel DDL olan PosgreSQL'in kullanımını ciddiye alın.
Renzo

Yanıtlar:


9

Birçok insan için, MySQL Achilles'in topuğu gizlidir.

Kitabın 3. Fıkrası uyarınca

MySQL 5.0 Sertifika Çalışma Kılavuzu

Aşağıdaki komutlar bir işlemi kırabilir ve kırabilir

  • ALTER TABLE
  • BEGIN
  • CREATE INDEX
  • DROP DATABASE
  • DROP INDEX
  • DROP TABLE
  • RENAME TABLE
  • TRUNCATE TABLE
  • LOCK TABLES
  • UNLOCK TABLES
  • SET AUTOCOMMIT = 1
  • START TRANSACTION

ÖNERİ

MySQL söz konusu olduğunda, inşa ettiğiniz herhangi bir ContinuousIntegration (CI) / SelfService işinde her zaman İşlemsel işler ve DDL komut dosyaları birbirini dışlar.

Bu size olacak paradigmalar yaratma fırsatı verir

  • START TRANSACTION/COMMITbloklarla uygun şekilde yalıtılmış işlemleri destekleyin
  • DDL'yi kendiniz yazarak, DDL'yi yapıcı veya yıkıcı olarak çalıştırarak kontrol etme
    • Yapıcı: DDL Yeni Bir Tasarımla Tablolar Yapacak
    • Yıkıcı: Masaları Önceki Tasarıma Geri Döndüren DDL
  • bu işlemleri asla bir iş altında birleştirmeyin

UYARI: Bunun için MyISAM kullanıyorsanız, MyISAM'ı bir işlemi kırabilecek şeyler listesine nazikçe ekleyebilirsiniz (un) 'i kesin bir şekilde yerine getirin; gerekli.

Neden LVM değil?

LVM anlık görüntüleri mükemmeldir ve ağır SQL işlemesi yapmak zorunda kalmadan tüm veritabanı örneklerini geri yüklemek idealdir. Ancak, MySQL söz konusu olduğunda, iki depolama motorunu hesaba katmanız gerekir: InnoDB ve MyISAM.

All-InnoDB Veritabanı

InnoDB's Architecture'a bakın (Resim Percona CTO Vadim Tkachenko'nun izniyle)

InnoDB Tesisat

InnoDB birçok hareketli parçaya sahiptir.

  • Sistem Tablo Alanı
    • Bilgi sözlüğü
    • Çift Yazma Arabelleği (veri tutarlılığını destekler; Crash Recovery için kullanılır)
    • Tampon Tak (İkincil Eşsiz Dizinlerde Arabellek Değişiklikleri)
    • Geri Alma Segmentleri
    • Boşluğu Geri Al (en kontrolsüz büyümenin olabileceği yer)
  • InnoDB Tampon Havuzu
    • Kirli Veri Sayfaları
    • Kirli Dizin Sayfaları
    • Benzersiz Olmayan Dizinlerde Değişiklikler
  • Diğer Önemli Bellek Önbellekleri

Arabellek Havuzu ve Bellek önbelleklerinde kayıtsız değişikliklerle all-InnoDB veritabanının LVM görüntüsünü almak, LUN geri yüklenip mysqld başladıktan sonra InnoDB kilitlenme kurtarması gerektiren bir veri kümesi verir.

TÜM-InnoDB İÇİN ÖNERİ

Anlık Görüntü Almadan Önce MySQL'i Kapatabilirseniz

    1. Koşmak SET GLOBAL innodb_fast_shutdown = 0;
    1. Koşmak SET GLOBAL innodb_max_dirty_pages_pct = 0;
    1. Koşmak SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_dirty';
    1. Innodb_buffer_pool_pages_dirty 0 veya olabildiğince 0'a yakın olana kadar 3. Adımı tekrarlayın
    1. service mysql stop
    1. LVM anlık görüntüsünü alın
    1. service mysql stop

Kapatamazsanız Ama MySQL Live İle Anlık Görüntü Yakalayın

    1. Koşmak SET GLOBAL innodb_max_dirty_pages_pct = 0;
    1. Koşmak SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_dirty';
    1. Innodb_buffer_pool_pages_dirty 0 veya olabildiğince 0'a yakın olana kadar 2. Adımı tekrarlayın
    1. LVM anlık görüntüsünü alın
    1. Koşmak SET GLOBAL innodb_max_dirty_pages_pct = 75;

All-MyISAM Veri Tabanı veya InnoDB / MyISAM Mix

MyISAM, erişildiğinde, ona karşı açık dosya tanıtıcısı sayısını korur. MySQL çökerse, açık dosya tanıtıcısı sayısı> 0 olan herhangi bir MyISAM tablosu çökme ve onarım ihtiyacı olarak işaretlenir (verilerde yanlış bir şey olmasa bile).

Kullanımda olan MyISAM tablolarını içeren bir veritabanının LVM anlık görüntüsünü almak, anlık görüntü geri yüklendiğinde ve mysqld başlatıldığında onarılması gereken bir veya daha fazla MyISAM tablosuna sahip olacaktır.

All-MyISAM veya InnoDB / MyISAM Mix Önerileri

Anlık Görüntü Almadan Önce MySQL'i Kapatabilirseniz

    1. Koşmak SET GLOBAL innodb_fast_shutdown = 0;
    1. Koşmak SET GLOBAL innodb_max_dirty_pages_pct = 0;
    1. Koşmak SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_dirty';
    1. Innodb_buffer_pool_pages_dirty 0 veya olabildiğince 0'a yakın olana kadar 3. Adımı tekrarlayın
    1. service mysql stop
    1. LVM anlık görüntüsünü alın
    1. service mysql stop

Kapatamazsanız Ama MySQL Live İle Anlık Görüntü Yakalayın

Bazı InnoDB masalarının temizlenmesini zorlayabilirsiniz

    1. Koşmak SET GLOBAL innodb_max_dirty_pages_pct = 0;
    1. Koşmak SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_dirty';
    1. Innodb_buffer_pool_pages_dirty 0 veya olabildiğince 0'a yakın olana kadar 2. Adımı tekrarlayın
    1. FLUSH TABLES innodb_tbl1,... FOR EXPORT;Kritik InnoDB masalarında çalıştırın
    1. Koşmak FLUSH TABLES WITH READ LOCK;
    1. LVM anlık görüntüsünü alın
    1. Koşmak UNLOCK TABLES;
    1. Koşmak SET GLOBAL innodb_max_dirty_pages_pct = 75;

MySQL Replication Yardım Edebilir mi?

Bir LVM anlık görüntüsünü iki sunucuya geri yükleyebilir ve MySQL Master / Slave Replication'ı kurarken, anlık görüntüleri geri yüklerken ekstra bir ev temizliği kaynağı olur.

Bir Master'da CI işleri yürütüyorsanız ve bu işler küçükse, çoğaltma belirli koşullar altında zaman kazandırabilir. Sadece STOP SLAVE;Slave'de koşabilir , Master'daki CI işlerini START SLAVE;başlatabilir ve Master'ın verileri onaylandığında Slave'de koşabilirsiniz .

CI işleri çok fazla veri uyarıyorsa, LVM anlık görüntüsünü geri yükleyebilir ve çoğaltmayı sıfırdan başlatabilirsiniz. Bunu sık sık yaparken kendinizi bulursanız, muhtemelen MySQL Replication'ı ayarlayarak yapabilirsiniz.

SON DÜŞÜNCELER

  • Geri yükleme ve regresyon testleri yapmak için birden çok DB Sunucusu (3 veya daha fazla) kullanmak en iyisidir.
  • Bu tabloların MyISAM kalması gerekmiyorsa, kalan MyISAM tablolarını InnoDB'ye dönüştürün.
  • Veri içeriğiniz hassassa, herhangi bir sınamaya başlamadan önce anlık görüntüyü geri yükledikten sonra verileri silmek için bir CI işi yürütmelisiniz. Alternatif olarak, önceden silinmiş verilerle MySQL'in anlık görüntülerini almak isteyebilirsiniz.

4

Sürekli entegrasyon hakkında konuşursanız, bunun bir geliştirme ortamı olduğunu varsayalım. Bu durumda, yapısal değişiklikler yapan kişinin başkaları için bir şeyleri kırmamaya özen göstermesi için test etmesi gerektiğini söyleyeceğim, aynı şekilde ortak bir kütüphaneyi güncelleyen biri: Bu tür değişiklikleri yapmadan önce kendi sanal alanınızda test edin.

Bir üretim dağıtım sürecinde, değişikliklerinizi test etmek için, herhangi bir kod değişikliği için yaptığınız gibi genellikle dev, QA veya üretim öncesi ortamlardan geçersiniz.

Bunun MySQL'e özgü olmadığını unutmayın: Oracle veritabanları 'değiştirici tablo' vb. Verirken örtük olarak KOMİTE de yapar.

Şimdi kendinizi korumak istiyorsanız, elbette önceden bir yedekleme yapabilir veya sisteminiz bunu yapabilirse bir LVM veya dosya sistemi anlık görüntüsünü alabilirsiniz. Hassas işlemlerden önce güvenlik olarak geciktirebileceğiniz / durdurabileceğiniz bir köle de olabilir.

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.