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.
Yapının değiştirilmesi şunlara yol açabilir:
Ö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.
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:
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.
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:
Eksiler:
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:
Eksiler: