Återupptagbara tillägg av tabellbegränsningar

Gäller för: SQL Server 2022 (16.x) och senare versioner Azure SQL DatabaseAzure SQL Managed InstanceSQL Database i Microsoft Fabric

Den återupptabara åtgärden för att skapa och återskapa onlineindex stöds redan för SQL Server 2019, Azure SQL Database och Azure SQL Managed Instance. De återupptabara åtgärderna gör att indexåtgärder kan köras medan tabellen är online (ONLINE=ON) och även:

  • Pausa och starta om en åtgärd för att skapa eller återskapa ett index flera gånger för att passa ett underhållsfönster

  • Återställa efter fel vid skapande eller återskapande av index, till exempel databasredundans eller slut på diskutrymme.

  • Aktivera trunkering av transaktionsloggar när ett index skapas eller återskapas.

  • När en indexåtgärd pausas kräver både det ursprungliga indexet och det nyligen skapade diskutrymmet och måste uppdateras under DML-åtgärder (Data Manipulation Language).

De nya tilläggen för SQL Server 2022, SQL Database och SQL Managed Instance tillåter en återupptagningsbar åtgärd för DDL-kommandot (Data Definition Language)ALTER TABLE ADD CONSTRAINT och lägger till en primär eller unik nyckel. Mer information om hur du lägger till en primär eller unik nyckel finns i ALTER TABLE table_constraint.

Anmärkning

Tilläggstabellbegränsningar som kan återupptas gäller endast för begränsningar för PRIMÄRNYCKEL och UNIK NYCKEL. Återupptagbara tabellbegränsningar stöds inte för FRÄMMANDE NYCKEL-begränsningar.

Åtgärder som kan återupptas

I tidigare versioner av SQL Server kan åtgärden ALTER TABLE ADD CONSTRAINT köras med alternativet ONLINE=ON . Åtgärden kan dock ta många timmar för en stor tabell att slutföras och kan förbruka ett stort antal resurser. Det finns också risk för fel eller avbrott under en sådan körning. Vi har introducerat återtagningsbara funktioner för att ALTER TABLE ADD CONSTRAINT användare ska kunna pausa åtgärden under ett underhållsfönster eller starta om den från den platsen där den avbröts under ett körningsfel, utan att starta om åtgärden från början.

Scenarier som stöds

Den nya återtagningsbara funktionen för ALTER TABLE ADD CONSTRAINT stöder följande kundscenarier:

  • Pausa eller återuppta åtgärden ALTER TABLE ADD CONSTRAINT, till exempel pausa för ett underhållsfönster och återuppta åtgärden när underhållsfönstret är klart.

  • Återuppta ALTER TABLE ADD CONSTRAINT drift efter omkopplingar och systemfel.

  • ALTER TABLE ADD CONSTRAINT Kör åtgärden på en stor tabell trots den lilla loggstorleken som är tillgänglig.

Anmärkning

Den återupptagbara operationen för ALTER TABLE ADD CONSTRAINT kräver att ALTER-kommandot utförs online (WITH ONLINE = ON).

Den här funktionen är särskilt användbar för stora tabeller.

T-SQL-syntax för ALTER TABLE

Information om den syntax som används för att aktivera återupptabara åtgärder för en tabellbegränsning finns i syntaxen och alternativen i ALTER TABLE (Transact-SQL).

Anmärkningar för ALTER TABLE

  • En ny sats MED <resumable_options har lagts till i den aktuella T-SQL-syntaxen i ALTER TABLE (Transact-SQL).

  • Alternativet RESUMABLE är nytt och har lagts till i den befintliga ALTER TABLE-syntaxen (Transact-SQL).

  • MAX_DURATION = tid [MINUTER] som används med RESUMABLE = ON (kräver ONLINE = ON). MAX_DURATION anger tid (ett heltalsvärde som anges i minuter) att en återupptabar begränsningsåtgärd för onlinetillägg körs innan den pausas. Om inte anges fortsätter åtgärden tills den har slutförts.

T-SQL-syntax för ALTER INDEX

Om du vill pausa, återuppta eller avbryta den återupptabara tabellbegränsningsåtgärden för ALTER TABLE ADD CONSTRAINTanvänder du T-SQL-syntaxen ALTER INDEX (Transact-SQL).

För begränsningar som kan återupptas används det befintliga ALTER INDEX ALL-kommandot.

ALTER INDEX ALL ON <table_name>  
      { RESUME [WITH (<resumable_index_options>,[...n])]
        | PAUSE
        | ABORT
      }
<resumable_index_option> ::=
 { 
    MAXDOP = max_degree_of_parallelism
    | MAX_DURATION =<time> [MINUTES]
    | <low_priority_lock_wait>  
 }
 <low_priority_lock_wait>::=  
{  
    WAIT_AT_LOW_PRIORITY ( MAX_DURATION = <time> [ MINUTES ] ,   
                          ABORT_AFTER_WAIT = { NONE | SELF | BLOCKERS } )  
}  

Anmärkningar för ALTER INDEX

ALTER INDEX ALL ON <Table> PAUSE

  • Pausa en återupptagbar och online-åtgärd för att lägga till en tabellbegränsning som är under utförande

ALTER INDEX ALL ON <Table> RESUME [WITH (<resumable_index_options>,[...n])]

  • Återuppta en åtgärd för att lägga till tabellbegränsningar som pausas manuellt eller på grund av ett fel.

MAX_DURATION används med RESUMABLE=ON

  • Den tid (ett heltalsvärde som anges i minuter) som den återupptabara åtgärden lägg till tabellbegränsning körs när den har återupptagits. När tiden går ut pausas den återupptagbara åtgärden om den fortfarande körs.

WAIT_AT_LOW_PRIORITY används med RESUMABLE=ON och ONLINE = ON

  • Om du återupptar en onlineåtgärd för att lägga till tabellbegränsningar efter en paus måste du vänta på blockeringsåtgärder i den här tabellen. WAIT_AT_LOW_PRIORITY anger att åtgärden lägg till tabellbegränsning väntar på lås med låg prioritet, vilket gör att andra åtgärder kan fortsätta medan den återupptabara åtgärden väntar. Om du utelämnar alternativet WAIT_AT_LOW_PRIORITY motsvarar det WAIT_AT_LOW_PRIORITY (MAX_DURATION = 0 minutes, ABORT_AFTER_WAIT = NONE). För mer information, se WAIT_AT_LOW_PRIORITY.

ALTER INDEX ALL ON <Table> ABORT

  • Avbryt en åtgärd som körs eller är pausad för att lägga till en tabellbegränsning som kan återupptas. Åtgärden avbryt måste uttryckligen köras som ett ABORT kommando för att avsluta en begränsningsåtgärd som kan återupptas. Även om en tabellbegränsningsåtgärd misslyckas eller pausas, avslutas inte operationen. I stället lämnar den operationen i ett obestämt pausläge.

Mer information om PAUSE, RESUMEoch ABORT tillgängliga alternativ för återupptabara åtgärder finns i ALTER INDEX (Transact-SQL).

Visa status för återupptabar åtgärd

Använd vyn sys.index_resumable_operations om du vill visa status för den återupptabara tabellbegränsningsåtgärden.

Permissions

Kräver ALTER behörighet för tabellen.

Inga nya behörigheter för återupptagning av ALTER TABLE ADD CONSTRAINT krävs.

Examples

Här följer några exempel på hur du använder åtgärder för att lägga till tabellbegränsningar som kan återupptas.

Exempel 1

Återupptas ALTER TABLE åtgärd för att lägga till en primärnyckel klustrad i kolumnen (a) med MAX_DURATION på 240 minuter.

ALTER TABLE table1
ADD CONSTRAINT PK_Constrain PRIMARY KEY CLUSTERED (a)
WITH (ONLINE = ON, MAXDOP = 2, RESUMABLE = ON, MAX_DURATION = 240);

Exempel 2

Återupptagbar ALTER TABLE operation för att lägga till en unik begränsning på två kolumner (a och b) med MAX_DURATION en varaktighet av 240 minuter.

ALTER TABLE table2
ADD CONSTRAINT PK_Constrain UNIQUE CLUSTERED (a,b)
WITH (ONLINE = ON, MAXDOP = 2, RESUMABLE = ON, MAX_DURATION = 240);

Exempel 3

ALTER TABLE för att lägga till en primärnyckel klustrad som pausas och återupptas.

Tabellen nedan visar två sessioner (Session #1 och Session #2) som körs kronologiskt med hjälp av följande T-SQL-instruktioner. Session #1 kör en återupptabar ALTER TABLE ADD CONSTRAINT åtgärd som skapar en primärnyckel i kolumnen Col1. Session #2 kontrollerar körningsstatusen för den aktiva begränsningen. Efter en tid pausar den återanvändbara åtgärden. Session #2 kontrollerar statusen för den pausade begränsningen. Slutligen återupptas den pausade begränsningen och statusen kontrolleras igen av Session #2.

Session nr 1 Session nr 2
Lägg till begränsning som kan återupptas

ALTER TABLE TestConstraint
ADD CONSTRAINT PK_TestConstraint PRIMARY KEY (Col1)
WITH (ONLINE = ON, MAXDOP = 2, RESUMABLE = ON, MAX_DURATION = 30);
Kontrollera begränsningsstatusen

SELECT sql_text, state_desc, percent_complete
FROM sys.index_resumable_operations;
Utdata som visar åtgärden

sql_text state_desc percent_complete
ALTER TABLE TestConstraint (...)LÖPNING43.552
Pausa begränsningen som kan återupptas

ALTER INDEX ALL ON TestConstraint PAUSE;
Error

Msg 1219, Level 16, State 1, Line 6
Your session has been disconnected because of a high priority DDL operation.

Msg 1750, Level 16, State 1, Line 6
Could not create constraint or index. See previous errors.

Msg 0, Level 20, State 0, Line 5
A severe error occurred on the current command.
The results, if any, should be discarded.
Kontrollera begränsningsstatusen

SELECT sql_text, state_desc, percent_complete
FROM sys.index_resumable_operations;
Utdata som visar åtgärden

sql_text state_desc percent_complete
ALTER TABLE TestConstraint (...)PAUSAD65.339
ALTER INDEX ALL ON TestConstraint RESUME;
Kontrollera begränsningsstatusen

SELECT sql_text, state_desc, percent_complete
FROM sys.index_resumable_operations;
Utdata som visar åtgärden

sql_text state_desc percent_complete
ALTER TABLE TestConstraint (...)LÖPNING90.238

När åtgärden är klar kör du följande T-SQL-instruktion för att kontrollera villkoret:

SELECT constraint_name, table_name, constraint_type 
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE='PRIMARY KEY';
GO

Här är resultatuppsättningen:

constraint_name tabell_namn begränsningstyp
PK_Constraint Testbegränsning PRIMÄRNYCKEL

Se även