0Pricing
SQL Academy · Pelajaran

Migrasi Daring: Mengapa ALTER TABLE Mengunci

Pahami bentuk ALTER TABLE mana yang mengambil kunci ACCESS EXCLUSIVE dan menulis ulang tabel, serta mana yang hanya mengubah metadata

Migrasi Daring: Mengapa ALTER TABLE Mengunci adalah pelajaran SQL Academy gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar SQL Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus SQL Academy mencakup 4 pelajaran total.

Masalah Migrasi Produksi

Pada basis data kecil, ALTER TABLE berlangsung seketika. Pada tabel aktif berukuran 500GB, perintah yang sama dapat mengunci operasi tulis selama 20 menit. Mengetahui ALTER mana yang aman dan mana yang tidak sangatlah penting.

Tingkatan Kunci

Kunci PostgreSQL memiliki beberapa tingkatan:

  • ACCESS SHARE — operasi SELECT
  • ROW EXCLUSIVE — operasi tulis
  • SHARE / SHARE ROW EXCLUSIVE — DDL yang berjalan bersamaan dengan pembacaan
  • EXCLUSIVE — memblokir operasi SELECT
  • ACCESS EXCLUSIVE — memblokir EVERYTHING

Dampak ALTER TABLE

Sebagian besar varian ALTER menggunakan ACCESS EXCLUSIVE — varian tersebut memblokir pembaca dan penulis hingga selesai.

ALTER Cepat (Hanya Metadata)

Beberapa ALTER hanya mengubah katalog dan selesai dalam hitungan milidetik, bahkan pada tabel berukuran sangat besar:

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

ALTER Lambat (Penulisan Ulang)

ALTER berikut menulis ulang seluruh tabel:

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

Menambahkan NOT NULL dengan Aman

Pada tabel besar:

-- 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;

Menambahkan Kunci Asing Secara Daring

Gunakan trik NOT VALID yang sama:

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;

Masalah Menunggu Kunci

ALTER yang menunggu kunci ACCESS EXCLUSIVE akan mengantre di belakang setiap transaksi yang berjalan lama. Transaksi yang lebih baru juga mengantre di belakang ALTER tersebut — terbentuk rantai query yang terblokir.

lock_timeout

Jangan biarkan migrasi menunggu tanpa batas:

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

Putaran Percobaan Ulang

Migrasi harus mencoba ulang ketika terjadi lock_timeout:

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;
  }
}

statement_timeout untuk Keamanan

Batasi durasi eksekusi setiap pernyataan di dalam migrasi:

SET statement_timeout = '30s';

Alat yang Membantu

  • strong_migrations (Rails)
  • django-migrate-zero-downtime
  • pg-osc (Perubahan Skema Daring Postgres)
  • pgRoll

Rangkuman

Migrasi daring memerlukan pemahaman tentang:

  • ALTER mana yang hanya mengubah metadata dan mana yang menulis ulang tabel
  • Menggunakan NOT VALID + VALIDATE untuk batasan
  • Menetapkan lock_timeout dan mencoba ulang
  • Menghindari transaksi yang berjalan lama dan memblokir migrasi

Pemeriksaan Singkat

Anda menambahkan batasan NOT NULL ke tabel berukuran 500GB dalam satu ALTER TABLE — apa yang terjadi pada operasi tulis?

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Migrasi Daring: Mengapa ALTER TABLE Mengunci” gratis?

Ya — teks lengkap “Migrasi Daring: Mengapa ALTER TABLE Mengunci” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus SQL Academy, upgrade ke CoddyKit PRO. Kursus SQL Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Migrasi Daring: Mengapa ALTER TABLE Mengunci”?

Pahami bentuk ALTER TABLE mana yang mengambil kunci ACCESS EXCLUSIVE dan menulis ulang tabel, serta mana yang hanya mengubah metadata Kamu berlatih SQL Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai SQL Academy?

Tidak diperlukan pengalaman sebelumnya. SQL Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.

Berapa lama pelajaran “Migrasi Daring: Mengapa ALTER TABLE Mengunci” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran SQL Academy ini?

Ya. Setiap pelajaran SQL Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Migrasi Daring: Mengapa ALTER TABLE Mengunci
  2. Indeks Konkuren (CREATE INDEX CONCURRENTLY)
  3. Mengganti Nama Kolom Tanpa Henti
  4. Alat: Flyway, Liquibase, Sqitch
← Kembali ke SQL Academy