Çok büyük mysql tablolarının sütunlarını, kesinti süresi çok az olan veya hiç olmayan değiştirme


18

Periyodik olarak, çoğunlukla sütun ekleyerek mysql 5.1 tablolarda değişiklik yapmam gerekiyor. Alter table komutu ile çok basit. Ama şu anda 40 milyon sıraya kadar tablolarım var ve hızla büyüyorlar ... Yani bu değiştirme tablo komutları birkaç saat sürüyor. Birkaç ay içinde tahmin ettiğim günler alacaklar.

Amazon RDS kullandığım için, oynamak ve daha sonra ustalaşmak için köle sunucularım olamaz. Benim sorum şu: Bunu en az kesinti süresi ile yapmanın bir yolu var mı? Kullanıcılar tabii ki db kullanabilirsiniz hala saatler hatta günler süren bir işlem umursamıyorum ... en azından sütunları eklenirken okuyabilir miyim? Uygulamam yazmaya çalışırsa ne olur? Ekleme veya güncelleme? Hemen başarısız olursa, bu gerçekten çok kötü değil, sadece asılı ve db sunucusu için sorunlara neden olursa büyük bir sorun ..

Bu oldukça yaygın bir ölçeklendirme sorunu olmalı, herkes sütun eklemelidir .. Genellikle bir üretim db ne yapılır? Köle -> ana göç?

Güncelleme - innodb depolama motorunu kullandığımı söylemeyi unuttum


1
Birisi hala bir cevap arıyor .. blog.staginginstance.com/… ^^
İsimsiz Coder

Yanıtlar:


10

Periyodik olarak, çoğunlukla sütun ekleyerek mysql 5.1 tablolarda değişiklik yapmak gerekiyor.

Yapma. Hayır gerçekten. Sadece yapma. Bu olduğunda Bu çok nadir bir fırsat olmalıdır şimdiye gerekli.

Verilerinizin gerçekten başlamak için normalleştirildiğini varsayarsak, sorunu çözmenin doğru yolu, temel tabloya 1: 1 ilişkisi olan yeni bir tablo eklemektir (yeni tabloda zorunlu değildir).

Düzenli olarak sütun eklemeniz genellikle normalleştirilmemiş bir veritabanının göstergesidir - şemanız normalleştirilmediyse düzeltmeniz gereken sorun budur.

Son olarak, şemanız gerçekten, gerçekten normalleştirilmişse ve gerçekten, gerçekten sütun eklemeye devam etmelisiniz:

  1. Veritabanında bir zaman damgası sütununuz olduğundan veya çoğaltma günlükleri oluşturduğundan emin olun
  2. Tablonun (A) bir kopyasını (B) oluşturma
  3. B'ye yeni sütunlar ekleyin (bu yine de myisam ile engellenir)
  4. işlemleri devre dışı bırak
  5. özgün tabloyu (A) başka bir şey olarak yeniden adlandırma (yedekleme)
  6. yeni tabloyu (B) orijinal tablonun adıyla (A) yeniden adlandırın
  7. işlemleri işlemin başlangıcından çoğaltma günlüğünden veya yedekleme tablosundan yeniden yürütme
  8. işlemleri etkinleştir.

2
Adım adım yaklaştığınız için teşekkür ederiz. Tabloları değiştirmek gerçekten nadir mi? Bunun yerine yeni sütun ile başka bir tablo ekleyebileceğimi (bir sütun eklemeye ihtiyaç duyulması durumunda) ve 1: 1 ilişkide orijinal büyük tabloya başvurabileceğini anlıyorum. Ancak, hepsi 1 tabloda olması gerektiğinde 15 çok büyük 1: 1 tabloya sahip olmak doğru görünmüyor ... Tabii ki sorgulama performansı da endeksleme sorunlarından bahsetmiyoruz. Ben bir uzman değilim, ama benim veritabanı oldukça iyi normalleştirilmiş ve periyodik olarak değiştirmek gerekir doğal görünüyor ..
apptree

2
"Tabloları değiştirmek gerçekten nadir mi?" - Evet.
symcbean

1
Hayır, ancak bu önemli bir yazılım yükseltmesinin parçası olarak DÜZENLİ olursa gerçekleşirse, o zaman birisinin tüm tabloların ilk etapta orada olması gerektiğini fark etmediği için kovulması gerekir. Burada sorun / hile "düzenli olarak", "her birkaç ayda bir" değil.
TomTom

22
Bir dev, özellikle yeni kurulan ve genç şirketlerde çalışan biri olarak, symcbean ve @TomTom ile daha az anlaşamadım. İşler değişiyor, ürünler değişiyor, iş hedefleri değişiyor ve veritabanı yapısının onlarla değişmesi gerekiyor. İyi bir DBA hizmeti sunmak, bu değişikliklere "evet" demek, ardından bunları nasıl verimli bir şekilde uygulayacağınızı bulmak demektir. Ağır normalleştirilmiş veritabanları uzun zaman önce ölmüş bir kavramdır. Kötü performans ve yavaş dev çevrimleri ile sonuçlanırlar.
pents90

4
Tabloları değiştirmek için nadir? Belki büyük şirketlerde, ancak oldukça sık görülen çevik takımda, gereksinimler değişir ...
tibo

12

Bunu son zamanlarda yapmak zorunda kaldım. Amazon'un önerdiği şey Percona Toolkit'i kullanmaktı. Ben indirdim ve gibi bir şey çalıştırmak başardı:

./pt-online-schema-change h=databasenameHostName,D=databasename,t=tablename --recursion-method=none --execute --user username --password password --alter "MODIFY someColumn newDataType"

ve harika çalışıyor. Süreçte ne kadar zaman kaldığını size söyler.

Aslında yeni sütunu olan yeni bir tablo oluşturur ve mevcut verileri üzerine kopyalar. Ayrıca, yeni verilerin de yeni tabloya aktarılması için bir tetikleyici oluşturur. Daha sonra tabloları otomatik olarak yeniden adlandırır, eski tabloyu bırakır ve güncellemeleri beklerken yeni sütunla çalışır durumda olursunuz.


Percona ekibi, pt-online-schema-change aracı için gerekli olan RDS parametre grupları aracılığıyla (SET GLOBAL log_bin_trust_function_creators = 1, RDS üzerinde çalışmaz) log_bin_trust_function_creators özelliğini etkinleştirme hakkında kısa bir yazı yazıyor. Daha fazla detay: percona.com/blog/2016/07/01/pt-online-schema-change-amazon-rds
user1652110

benim için çalıştı
Adiii

4

symcbean bazı sağlam öneriler sunar .

Sorunuzu yanıtlamak için, etkiyi azaltmanın en kolay ve en iyi yolu, birden çok veritabanının çoğaltılmasıdır. Aktif üzerinde replikasyonu durduran uygun bir yük devretme prosedürüne sahip ikili master, aktif olanı etkilemeden aktif olmayan bir değişiklik yapılmasına izin verir.

Bunu potansiyel olarak tek bir canlı veritabanı üzerinde yapabilir ve bu cevapta ayrıntılı olarak açıkladığım prosedürü kullanarak etkiyi en aza indirebilirsiniz . Kuşkusuz, bu işaretin tarif ettiği ile benzerdir, ancak teknik detayları içerir. Yalnızca zaman damgası değil, aynı zamanda bir auto_increment alanı da kullanabilirsiniz.

Sonuç olarak, veri kümeniz çok büyüyorsa, OLTP ve OLAP veritabanları arasındaki arşivlemeyi de dikkate almanız gerekir . Uygun şekilde tasarlarsanız, işlem veri kümenizin çok büyük olması gerekmez.


2

Kılavuzdan: http://dev.mysql.com/doc/refman/5.1/en/alter-table.html

Çoğu durumda, ALTER TABLE orijinal tablonun geçici bir kopyasını oluşturur. MySQL, değişikliği kopyaya dahil eder, ardından orijinal tabloyu siler ve yenisini yeniden adlandırır. ALTER TABLE yürütülürken, orijinal tablo diğer oturumlar tarafından okunabilir. Tablodaki güncelleştirmeler ve yazılar yeni tablo hazır olana kadar durdurulur ve başarısız olan güncelleştirmeler olmadan otomatik olarak yeni tabloya yeniden yönlendirilir.

Yani, okuma iyi sonuç verecektir. Yazmalar durdurulacak, ancak daha sonra yürütülecek. Bunu önlemek istiyorsanız, yazılımınızı değiştirmeniz gerekecektir.


Bunu yaptım ve sitemin şu anda değiştirdiğim tabloya yazılan kısımlarını devre dışı bıraktım. Şimdiye kadar birkaç "Kilit bekleme zaman aşımı aşıldı; işlemi yeniden başlatmayı deneyin" istisnaları aldım, bu çok kötü değil. Ancak,
PURELY

0

Neredeyse 65GB olan işlem masamın 1'ini değiştirmek zorunda olduğum benzer bir durumdayım. 2 çözüm duyuyorum

  1. Doğrudan ALTER kullanın ve Çalışmasına izin verin (X saat veya gün sayısı)
  2. Veritabanında bir zaman damgası sütununuz olduğundan veya çoğaltma günlükleri oluşturduğundan emin olun
    • Tablonun (A) bir kopyasını (B) oluşturma
    • B'ye yeni sütunlar ekleyin (bu yine de myisam ile engellenir)
    • işlemleri devre dışı bırak
    • özgün tabloyu (A) başka bir şey olarak yeniden adlandırma (yedekleme)
    • yeni tabloyu (B) orijinal tablonun adıyla (A) yeniden adlandırın
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.