ProgramlamaDevOps Mühendisi / DBA

SQL'de çalışma veritabanında tablo yapısının (ALTER TABLE) güvenli bir şekilde değiştirilmesi nasıl organize edilir, böylece kesinti süresini ve veri kaybı risklerini en aza indirebiliriz?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

Soru Geçmişi

Tablo şemasının değiştirilmesi, Agile metodolojilerinin yaygınlaşmasıyla birlikte önemli hale geldi. Projeler evrim geçiriyor, gereksinimler değişiyor ve zamanla sütun ekleme/değiştirme/silme ihtiyacı kesinlikle ortaya çıkıyor. Çalışma üretim veritabanlarında bu tür değişiklikler özellikle risklidir.

Problem

Yapının değiştirilmesi şunlara yol açabilir:

  • Uzun süreli kilitlenmelere
  • Eski verilerin kaybına veya hatalı göçüne
  • Dış kısıtlamaların, tetikleyicilerin veya uygulama mantığının ihlaline

Özellikle diğer hizmetler tarafından aktif olarak kullanılan büyük tablolardaki değişiklikler (milyonlarca satır) oldukça karmaşıktır.

Çözüm

ALTER TABLE ile etkili çalışma - aşamalı değişiklikler, veri kopyaları oluşturma, test ortamında deneme yapma, kesinti süresini sınırlama. İşlemler öncesinde yedekleme, aşamalı göç ve işlemler için kullanılacak olan işlemler. Yüksek yük altında olan veritabanlarında genellikle "online" algoritmalar kullanılır.

Kod örneği:

-- Varsayılan değere sahip yeni bir sütun ekleme ALTER TABLE siparişler ADD COLUMN durum VARCHAR(20) DEFAULT 'new'; -- Yeni sütunların kademeli olarak doldurulması UPDATE siparişler SET durum = CASE WHEN gönderildiği_tarih IS NOT NULL THEN 'gönderildi' ELSE 'beklemede' END;

Ana özellikler:

  • Yeni sütunlar önce oluşturulmalı, ardından veriler kademeli olarak taşınmalıdır
  • Büyük işlemler, yoğun saatler dışında gerçekleştirilmelidir
  • Her zaman yedekleme ve otomatik test yapılmalıdır

Zor Sorular.

ALTER TABLE atomik olarak mı gerçekleştirilir?

Çoğu zaman hayır: tablo değişikliği çok zaman alabilir. Hata durumunda bazı değişiklikler geri alınabilir, ancak bazıları durabilir. Bu nedenle, bazı veritabanı sistemleri (örneğin, PostgreSQL) DDL komutları için işlem korumasını yalnızca bazıları uygulamaktadır.


Sütun tipini INTEGER'dan VARCHAR'a sorunsuz bir şekilde değiştirmek mümkün mü?

Her zaman değil: Eğer sütunda eski veriler yeni formatla uyumlu değilse veya ilişkili nesneler (indeksler, tetikleyiciler, anahtarlar) varsa, veritabanı türü değiştirmeye izin vermeyebilir veya veriler hasar görebilir.


ALTER TABLE her zaman tüm tablo üzerine özel kilit uygular mı?

Veritabanı sistemine bağlıdır: MySQL ve eski SQL Server sürümlerinde herhangi bir ALTER işlemi genellikle tabloyu tamamlanana kadar tamamen kilitler, ancak modern veritabanı sistemleri "online DDL" desteği sunarak kilitlenme süresini azaltır.

Tipik Hatalar ve Antipatlar

  • Yedekleme olmadan yapı değişikliği yapmak
  • Test ortamında deneme yapmadan büyük tabloların göçü
  • Bağımlılık kontrolü olmadan sütun isimlerini değiştirmek (örneğin, dış anahtarlar, prosedürler)
  • Yoğun saatlerde toplu ALTER işlemleri

Hayattan Bir Örnek

Olumsuz Örnek

DevOps mühendisi ALTER TABLE ile üç önemli tabloda toplu değişiklikler yaptı ve eski sütunları sildi. Bu sütunların dış anahtarlara ve tetikleyicilere bağlı olduğunu göz önünde bulundurmadı. ALTER çalışırken veritabanı 20 dakika boyunca çalıştı - bu süre zarfında hizmetler gerekli alanların yokluğundan "çöktü".

Artılar:

  • Değişiklikler TŞ'ye göre gerçekleştirildi

Eksiler:

  • Hizmetlerin bir kısmının çalışmaz hale gelmesi
  • İşletmenin neredeyse yarım saatlik durdurulması
  • Bağımlılıkların geri getirilmesi ve silinen verilerin geri kazandırılması için yoğun çalışma gerekliliği

Olumlu Örnek

Analist, sütun eklemeyi birkaç aşamada planladı: öncelikle varsayılan olan bir sütun oluşturuldu, bir kopyada test yükü yüklenerek, yalnızca ondan sonra gerçek ALTER yapıldı ve tüm geliştiricilere göç penceresinin geleceği bildirildi.

Artılar:

  • Her şey hızlı ve sorunsuz geçti
  • Veri kaybı ve kilitlenme riski azaldı

Eksiler:

  • Ek test yapmaya zaman harcamak zorunda kaldı