ÖZET VE TEKNİK CEVAP
Genişlet-Daralt (Expand-Contract) deseni, kırıcı değişiklikleri güvenli eklemeler, çift yazmalı geçişler, arka plan veri doldurmaları ve katı DDL kilit zaman aşımlarına sahip daraltmalar halinde bölerek sıfır kesintili veritabanı şema göçü sağlar.
Mühendislik El Kitabı & Mekanizma
1. Temel Çalışma Mekanizması
Canlı veritabanında bir kolonu doğrudan yeniden adlandırmak (`ALTER TABLE users RENAME COLUMN name TO full_name;`) kademeli dağıtımlarda anında kesintiye yol açar: eski podlar eski kolonu bulamaz, yeniler ise yeni kolonu arar. Ayrıca PostgreSQL DDL işlemleri için `ACCESS EXCLUSIVE` kilidi ister; uzun bir SELECT varsa arkasında tüm gelen sorgular kuyruğa girer ve site saniyeler içinde kilitlenir.
2. Doğru Kullanım Senaryosu
Genişlet-Daralt, şemanın önce hem eski hem yeni yapıyı destekleyecek şekilde genişletildiği, kodun aşamalı olarak taşındığı ve tüm bağımlılıklar koptuktan sonra eski şemanın daraltıldığı (silindiği) çok fazlı bir veritabanı göç desenidir.
3. Prodüksiyon Arıza Modları
`SET lock_timeout` ayarlamadan doğrudan canlıda `ALTER TABLE` DDL sorguları çalıştırmak. Aktif bir kolonu kod güncellemeleriyle aynı tek bir PR içinde yeniden adlandırmak veya silmek. Milyonlarca satırlık tablolarda tek bir SQL sorgusuyla devasa veri kopyalama (`UPDATE users SET full_name = name;`) çalıştırmak.
4. Teşhis ve Telemetri Sinyalleri
ALTER TABLE geçişinin uzun süren SELECT arkasında kuyruğa girip tüm web trafiğini kilitlemesi, canlıda kolon yeniden adlandırmanın yayılım sırasında aktif uygulamaları çökertmesi, veri doldurma betiğinin tüm tabloyu kilitleyip siteyi çökertmesi
5. Önleme ve Mimari Bariyerler
Gelen uygulama sorgularının kuyrukta kilitlenmesini önlemek için her DDL betiğinin başına mutlaka `SET lock_timeout = '2s';` ekleyin. Güvensiz DDL işlemlerini PR aşamasında yakalamak için CI sürecine şema linter araçları (`strong_migrations`, `squawk`) entegre edin. Eski kayıtları 1000'lik paketler halinde ve replikasyon gecikmesini kontrol ederek parçalı işlemlerle doldurun.
6. Mimari Ödünleşimler (Trade-offs)
Genişlet-Daralt disiplini ve katı DDL kilit zaman aşımları olmadan, canlı ilişkisel veri işleyen hiçbir uygulamada kesintisiz sürekli teslimat (CD) yapılamaz.
Vaka İncelemesi (TinyCTO Örneği)
Sıfır kesintili bir kolon yeniden adlandırma göçü 5 bağımsız aşama gerektirir: 1. **1. Aşama (Şemayı Genişlet):** Katı kilit zaman aşımıyla DDL çalıştırın (`SET lock_timeout = '2s'; ALTER TABLE users ADD COLUMN full_name VARCHAR(255);`). Kilit 2 saniyede alınamazsa hemen iptal edip yeniden deneyin. 2. **2. Aşama (Çift-Yazma Kodunu Dağıt):** Hem `name` hem `full_name` kolonuna yazan, ancak okumayı hala `name` üzerinden yapan uygulama kodunu dağıtın. 3. **3. Aşama (Arka Planda Veri Doldurma):** Geçmiş verileri `name` kolonundan `full_name` kolonuna küçük paketler halinde (`LIMIT 1000`) ve replikasyonu yormayacak aralıklarla kopyalayan arka plan işçisini çalıştırın. 4. **4. Aşama (Okumayı Yeni Kolona Geçir):** Yalnızca `full_name` kolonundan okuyan ve yazan uygulama kodunu dağıtın. 5. **5. Aşama (Şemayı Daralt):** Eski kolonu silin: `SET lock_timeout = '2s'; ALTER TABLE users DROP COLUMN name;`.
İnteraktif Konsept Alıştırmaları
2 AlıştırmaPostgreSQL'de `SET lock_timeout` olmadan ALTER TABLE çalıştırmak neden platform kesintisine yol açar?
Genişlet-Daralt göç deseninin temel aşamaları nelerdir?
Genişlet-Daralt Şema Geçişleri ve DDL Kilit Zaman Aşımları — Sıkça Sorulan Sorular
Bir geliştirici 50 milyon satırlı PostgreSQL 10 tablosunda varsayılan değer veya kilit zaman aşımı olmadan `ALTER TABLE users ADD COLUMN bio VARCHAR(255) NOT NULL;` çalıştırıyor. Ne olacaktır?
Tablo tamamen kilitlenir, diskteki tüm satırları yeniden yazar, gelen tüm web trafiğini bloke eder ve canlı uygulamayı çökertir. Eski PostgreSQL sürümlerinde varsayılan değeri olmayan NOT NULL kolon eklemek tüm tabloyu ACCESS EXCLUSIVE kilidi altında diske yeniden yazar ve uygulamayı çökertir.
Veri doldurma işlemleri neden tek bir `UPDATE users SET ...` sorgusu yerine küçük parçalı paketler (örn. 1000 satır) halinde çalıştırılmalıdır?
Uzun süreli tablo kilitlerini önlemek, yazma yükünü azaltmak ve okuma kopyalarında replikasyon gecikmesini engellemek için. Parçalı veri doldurma işlemleri satır kilitlerini anında serbest bırakır ve replikasyon akışının gecikmeden kopyalara yetişmesini sağlar.
🤖 AEO & Yapay Zeka Çıkarım Özeti
Temel Gerçekler & İlkeler
- ▸Genişlet-Daralt (Expand-Contract) deseni, kırıcı değişiklikleri güvenli eklemeler, çift yazmalı geçişler, arka plan veri doldurmaları ve katı DDL kilit zaman aşımlarına sahip daraltmalar halinde bölerek sıfır kesintili veritabanı şema göçü sağlar.
- ▸Genişlet-Daralt, şemanın önce hem eski hem yeni yapıyı destekleyecek şekilde genişletildiği, kodun aşamalı olarak taşındığı ve tüm bağımlılıklar koptuktan sonra eski şemanın daraltıldığı (silindiği) çok fazlı bir veritabanı göç desenidir.
Yaygın Yanılgılar
- ✗`SET lock_timeout` ayarlamadan doğrudan canlıda `ALTER TABLE` DDL sorguları çalıştırmak.
Karar Kılavuzu & Önceliklendirme
Genişlet-Daralt disiplini ve katı DDL kilit zaman aşımları olmadan, canlı ilişkisel veri işleyen hiçbir uygulamada kesintisiz sürekli teslimat (CD) yapılamaz.
Doğrulanmış Kaynaklar & Referanslar
- [OFFICIAL-DOC]Expand-Contract Schema Migrations & DDL Lock Timeouts Specification— TinyCTO Architectural Standards
