0Pricing
SQL Academy · Ders

Çevrimiçi Geçişler: ALTER TABLE Neden Kilitler

Hangi ALTER TABLE biçimlerinin ACCESS EXCLUSIVE kilidi aldığını ve tabloyu yeniden yazdığını, hangilerinin yalnızca meta veri işlemi olduğunu anlayın.

Çevrimiçi Geçişler: ALTER TABLE Neden Kilitler, CoddyKit'te ücretsiz bir SQL Academy dersidir. Bu, 4 dersinin 1. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, SQL Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. SQL Academy kursu toplamda 4 dersten oluşur.

Üretim Ortamında Geçiş Sorunu

Küçük bir veri tabanında ALTER TABLE anında tamamlanır. Canlı ve 500GB büyüklüğündeki bir tabloda ise aynı komut, yazma işlemlerini 20 dakika boyunca kilitleyebilir. Hangi ALTER işlemlerinin güvenli, hangilerinin güvenli olmadığını bilmek çok önemlidir.

Kilit Düzeyleri

PostgreSQL kilitleri şu düzeylerde uygulanır:

  • ACCESS SHARE — okuma sorguları
  • ROW EXCLUSIVE — yazma işlemleri
  • SHARE / SHARE ROW EXCLUSIVE — okumalarla birlikte çalışabilen DDL
  • EXCLUSIVE — okuma sorgularını engeller
  • ACCESS EXCLUSIVE — EVERYTHING engellenir

ALTER TABLE İşlemlerinin Aldığı Kilitler

Çoğu ALTER çeşidi ACCESS EXCLUSIVE kilidi alır; işlem tamamlanana kadar hem okuma hem de yazma işlemlerini engeller.

Hızlı (Yalnızca Üst Veri) ALTER İşlemleri

Bazı ALTER işlemleri yalnızca katalogu değiştirir ve çok büyük tablolarda bile milisaniyeler içinde tamamlanır:

ALTER TABLE t RENAME COLUMN a TO b;
ALTER TABLE t ALTER COLUMN a SET DEFAULT ...;
ALTER TABLE t ADD COLUMN x INT;             -- nullable, no default: metadata only (PG 11+)
ALTER TABLE t ADD COLUMN x INT NOT NULL DEFAULT 0;  -- metadata only PG 11+ if default is constant

Yavaş (Yeniden Yazma Gerektiren) ALTER İşlemleri

Bunlar tablonun tamamını yeniden yazar:

ALTER TABLE t ALTER COLUMN x TYPE BIGINT;     -- when types not binary-compatible
ALTER TABLE t SET LOGGED;
CLUSTER t USING idx;                          -- physically reorders rows
VACUUM FULL t;                                -- rewrites whole table

NOT NULL Kısıtını Güvenle Ekleme

Büyük bir tabloda:

-- BAD: full table scan + ACCESS EXCLUSIVE lock
ALTER TABLE t ALTER COLUMN x SET NOT NULL;

-- BETTER:
ALTER TABLE t ADD CONSTRAINT x_not_null CHECK (x IS NOT NULL) NOT VALID;
ALTER TABLE t VALIDATE CONSTRAINT x_not_null;     -- scans without exclusive lock
-- then drop the CHECK and add NOT NULL (still cheap because already validated):
ALTER TABLE t ALTER COLUMN x SET NOT NULL;
ALTER TABLE t DROP CONSTRAINT x_not_null;

Yabancı Anahtarları Çevrimiçi Ekleme

Aynı NOT VALID yöntemi:

ALTER TABLE orders
  ADD CONSTRAINT orders_user_fk FOREIGN KEY (user_id) REFERENCES users(id) NOT VALID;
ALTER TABLE orders VALIDATE CONSTRAINT orders_user_fk;

Kilit Bekleme Sorunları

ACCESS EXCLUSIVE kilidi bekleyen bir ALTER, uzun süren her işlemin arkasında sıraya girer. Daha yeni işlemler de ALTER'ın arkasında sıraya girer; böylece engellenen sorgular zinciri oluşur.

lock_timeout

Geçişlerin sonsuza kadar beklemesine izin vermeyin:

SET lock_timeout = '5s';
ALTER TABLE t ...;
-- ERROR if it can't get the lock in 5s — retry.

Yeniden Deneme Döngüleri

Geçişler lock_timeout durumunda yeniden denemelidir:

for (let i = 0; i < 20; i++) {
  try {
    await client.query('SET lock_timeout = 5000');
    await client.query('ALTER TABLE ...');
    break;
  } catch (e) {
    if (e.code === '55P03') continue;     // lock_not_available
    throw e;
  }
}

Güvenlik için statement_timeout

Bir geçiş içindeki tek bir ifadenin çalışabileceği en uzun süreyi sınırlandırın:

SET statement_timeout = '30s';

Yardımcı Araçlar

  • strong_migrations (Rails)
  • django-migrate-zero-downtime
  • pg-osc (Postgres Çevrimiçi Şema Değişikliği)
  • pgRoll

Özet

Çevrimiçi geçişlerde şu konular dikkate alınmalıdır:

  • Hangi ALTER işlemlerinin yalnızca üst veri değiştirdiği, hangilerinin tabloyu yeniden yazdığı
  • Kısıtlar için NOT VALID + VALIDATE kullanılması
  • lock_timeout ayarlanması ve yeniden deneme yapılması
  • Geçişleri engelleyen uzun süreli işlemlerden kaçınılması

Hızlı Kontrol

500GB büyüklüğündeki bir tabloya tek bir ALTER TABLE ile NOT NULL kısıtı ekliyorsunuz; yazma işlemlerine ne olur?

Sıkça Sorulan Sorular

“Çevrimiçi Geçişler: ALTER TABLE Neden Kilitler” dersi ücretsiz mi?

Evet — “Çevrimiçi Geçişler: ALTER TABLE Neden Kilitler” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve SQL Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. SQL Academy kursu toplamda 4 dersten oluşur.

“Çevrimiçi Geçişler: ALTER TABLE Neden Kilitler” dersinde ne öğreneceğim?

Hangi ALTER TABLE biçimlerinin ACCESS EXCLUSIVE kilidi aldığını ve tabloyu yeniden yazdığını, hangilerinin yalnızca meta veri işlemi olduğunu anlayın. SQL Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

SQL Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te SQL Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 1. dersidir.

“Çevrimiçi Geçişler: ALTER TABLE Neden Kilitler” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu SQL Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her SQL Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Çevrimiçi Geçişler: ALTER TABLE Neden Kilitler
  2. Eşzamanlı INDEX'ler (CREATE INDEX CONCURRENTLY)
  3. Kesinti Olmadan Sütun Adı Değiştirme
  4. Araçlar: Flyway, Liquibase, Sqitch
← SQL Academy Sayfasına Dön