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.
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 constantLå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 tableLä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?
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
- Online-migreringar: varför ALTER TABLE låser
- Samtidiga index (CREATE INDEX CONCURRENTLY)
- Kolumnnamnsändring utan driftstopp
- Verktyg: Flyway, Liquibase, Sqitch