SQL Academy · Lektion

Online-migreringar: varför ALTER TABLE låser

Förstå vilka former av ALTER TABLE som tar ett ACCESS EXCLUSIVE-lås och skriver om tabellen och vilka som bara ändrar metadata.

Lektion 1 av 414 steg

Online-migreringar: varför ALTER TABLE låser är en gratis lektion i SQL Academy på CoddyKit. Detta är lektion 1 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för SQL Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i SQL Academy innehåller totalt 4 lektioner.

Problemet med migrering i produktion

I en liten databas går ALTER TABLE direkt. På en aktiv tabell på 500 GB kan samma kommando däremot låsa skrivningar i 20 minuter. Det är viktigt att veta vilka ALTER-kommandon som är säkra och vilka som inte är det.

Låsnivåer

PostgreSQL-lås finns på olika nivåer:

  • ACCESS SHARE — SELECT-frågor
  • ROW EXCLUSIVE — skrivningar
  • SHARE / SHARE ROW EXCLUSIVE — DDL som kan köras samtidigt som läsningar
  • EXCLUSIVE — blockerar SELECT-frågor
  • ACCESS EXCLUSIVE — blockerar ALLT

Vilket lås ALTER TABLE tar

De flesta varianter av ALTER tar ACCESS EXCLUSIVE – de blockerar läsningar och skrivningar tills de är klara.

Snabba ALTER-kommandon (endast metadata)

Vissa ALTER-kommandon ändrar bara katalogen och blir klara på millisekunder även för mycket stora tabeller:

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

Långsamma ALTER-kommandon (som skriver om tabellen)

Dessa skriver om hela tabellen:

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

Lägg till NOT NULL på ett säkert sätt

På en stor tabell:

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

Lägg till främmande nycklar online

Samma NOT VALID-trick:

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;

Problem med väntande lås

Ett ALTER som väntar på låset ACCESS EXCLUSIVE placeras efter alla långvariga transaktioner i kön. Nyare transaktioner hamnar också bakom ALTER-kommandot – en kedja av blockerade frågor.

lock_timeout

Låt inte migreringar hänga för evigt:

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

Loopar för nya försök

Migreringar bör försöka igen vid 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 för säkerhet

Begränsa hur länge varje enskilt kommando får köras i en migrering:

SET statement_timeout = '30s';

Verktyg som hjälper

  • strong_migrations (Rails)
  • django-migrate-zero-downtime
  • pg-osc (Postgres Online Schema Change)
  • pgRoll

Sammanfattning

Vid onlinemigreringar behöver ni känna till:

  • Vilka ALTER-kommandon som endast ändrar metadata respektive skriver om tabellen
  • Att använda NOT VALID + VALIDATE för begränsningar
  • Att ange lock_timeout och försöka igen
  • Att undvika långvariga transaktioner som blockerar migreringar

Snabbtest

Ni lägger till en NOT NULL-begränsning på en tabell på 500 GB i ett enda ALTER TABLE – vad händer med skrivningarna?

Gratis att börja

Lär dig SQL med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
46
Lektioner
183

Vanliga frågor

Är lektionen ”Online-migreringar: varför ALTER TABLE låser” gratis?

Ja – hela texten till ”Online-migreringar: varför ALTER TABLE låser” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i SQL Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i SQL Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”Online-migreringar: varför ALTER TABLE låser”?

Förstå vilka former av ALTER TABLE som tar ett ACCESS EXCLUSIVE-lås och skriver om tabellen och vilka som bara ändrar metadata. Ni övar på SQL Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig SQL Academy?

Du behöver inga förkunskaper. Utbildningen i SQL Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 1 av 4.

Hur lång tid tar lektionen ”Online-migreringar: varför ALTER TABLE låser”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här SQL Academy-lektionen?

Ja. Varje SQL Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Online-migreringar: varför ALTER TABLE låser
  2. Samtidiga index (CREATE INDEX CONCURRENTLY)
  3. Kolumnnamnsändring utan driftstopp
  4. Verktyg: Flyway, Liquibase, Sqitch
← Tillbaka till SQL Academy