Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Vonatkozik a következőkre:SQL Server
Azure SQL Database
Azure SQL-felügyelt példány
Az SQL Server tranzakciók véglegesítése lehet teljesen tartós, ami az SQL Server alapértelmezett beállítása, vagy késleltetett tartós (más néven elhalasztott véglegesítés).
A teljes mértékben tartós tranzakciós véglegesítések szinkronban vannak, és sikeresként jelentik a véglegesítést, és csak akkor adnak vissza vezérlést az ügyfélnek, ha a tranzakció naplórekordjait lemezre írták. A késleltetett tartós tranzakciók véglegesítése aszinkron módon történik, és a véglegesítést sikeresnek jelzi, mielőtt a tranzakció naplórekordjait lemezre írják. A tranzakciónapló bejegyzéseinek lemezre írása szükséges ahhoz, hogy a tranzakció tartós legyen. A késleltetett tartós tranzakciók akkor lesznek tartósak, ha a tranzakciónapló bejegyzései ki vannak ürítve a lemezre.
Ez a cikk a késleltetett tartós tranzakciókat ismerteti.
Teljes és késleltetett tranzakciós tartósság
Mind a teljes, mind a késleltetett tranzakció tartósságának megvannak az előnyei és hátrányai. Egy alkalmazás teljes és késleltetett tartós tranzakciók kombinációjával rendelkezhet. Gondosan mérlegelje üzleti igényeit, és hogy ezek hogyan illenek ezekhez az igényekhez.
Teljes tranzakciós tartósság
A teljes mértékben tartós tranzakciók a tranzakciónaplót lemezre írják, mielőtt visszajuttatják az irányítást az ügyfélnek. Teljes mértékben tartós tranzakciókat kell használnia, amikor:
A rendszer nem tolerálja az adatvesztést. Tekintse meg a Mikor veszíthetem el az adatokat , ha információra van szüksége arról, hogy mikor veszítheti el egyes adatait.
Nem a tranzakciónapló írási késése okozza a szűk keresztmetszetet.
A késleltetett tranzakciótartósság csökkenti a napló I/O késleltetését azáltal, hogy a tranzakciónapló rekordjait a memóriában tartja, és kötegekben írja a tranzakciónaplóba, így kevesebb I/O-műveletet igényel. A késleltetett tranzakció-tartósság potenciálisan csökkentheti az I/O-naplóversengést, így csökkentve a várakozási időket a rendszerben.
teljes tranzakciós tartóssági garanciák
A tranzakció véglegesítésének sikerességét követően a tranzakció által végrehajtott módosítások láthatók lesznek a rendszer többi tranzakciója számára. További információért a tranzakció elkülönítési szintekről lásd: SET TRANSACTION ISOLATION LEVEL (Transact-SQL) vagy tranzakciók Memory-Optimized táblákkal.
A tartósság garantált a véglegesítéskor. A megfelelő naplórekordok a tranzakció véglegesítése előtt megmaradnak a lemezen, és visszaadják az irányítást az ügyfélnek.
Késleltetett tranzakció tartóssága
A tranzakciók késleltetett tartóssága a lemezre történő aszinkron naplóírások használatával történik. A tranzakciónapló-rekordok egy pufferben vannak tárolva, és a lemezre íródnak, amikor a puffer megtelik vagy puffer kiürítési esemény történik. A késleltetett tranzakció tartóssága csökkenti a késést és a rendszeren belüli versengést is, mivel:
A tranzakció véglegesítésének feldolgozása nem várja meg, amíg a napló IO befejeződik, és visszaadja az irányítást az ügyfélnek.
Az egyidejű tranzakciók kevésbé valószínű, hogy versengenének a napló I/O-ért; ehelyett a naplópuffer nagyobb blokkokban írható ki a lemezre, csökkentve a versengést és növelve az átviteli sebességet.
Jegyzet
Előfordulhat napló I/O ütközés, ha magas a párhuzamosság mértéke, különösen akkor, ha gyorsabban töltjük meg a naplópuffert, mint ahogy kiürítjük.
Mikor érdemes késleltetett tranzakciós tartósságot használni?
Néhány olyan eset, amikor a tranzakciók késleltetett tartóssága előnyös lehet:
Eltűrheti az adatvesztést.
Ha tolerál némi adatvesztést, például ha az egyes adatok nem kritikusak, feltéve, hogy az adatok többsége megmarad, akkor érdemes lehet megfontolni a késleltetett tartósság alkalmazását. Ha nem tolerálja az adatvesztést, ne használjon késleltetett tranzakciós tartósságot.
Szűk keresztmetszetet tapasztal a tranzakciós napló írása során.
Ha a teljesítménnyel kapcsolatos problémákat a tranzakciónapló-írások késése okozza, az alkalmazás valószínűleg kihasználja a tranzakció késleltetett tartósságát.
A számítási feladatok magas versengési arányt tartalmaznak.
Ha a rendszer magas versengési szintű feladatokkal rendelkezik, sok idő veszik el, amíg feloldódnak a zárolások. A késleltetett tranzakció tartóssága csökkenti a véglegesítési időt, így gyorsabban oldja fel a zárolásokat, ami nagyobb átviteli sebességet eredményez.
Késleltetett tranzakciós tartóssági garanciák
A tranzakció véglegesítésének sikerességét követően a tranzakció által végrehajtott módosítások láthatók lesznek a rendszer többi tranzakciója számára.
A tranzakció tartóssága csak a memórián belüli tranzakciónapló lemezre való kiürítése után garantált. A memóriabeli tranzakciónaplót a rendszer a lemezre üríti, ha:
Egy teljesen tartós tranzakció ugyanabban az adatbázisban változást hoz létre az adatbázisban, és sikeresen véglegesíti.
A felhasználó sikeresen végrehajtja a rendszer által tárolt eljárást,
sp_flush_log.Ha egy teljes mértékben tartós tranzakció vagy az sp_flush_log sikeresen végbemegy, az összes korábban elkötelezett késleltetett tartóssági tranzakció garantáltan tartóssá vált.
Az SQL Server megpróbálja a naplót lemezre üríteni a napló létrehozása és időzítése alapján, még akkor is, ha az összes tranzakció tartósan késik. Ez általában akkor sikeres, ha az IO-eszköz folyamatosan működik. Az SQL Server azonban nem biztosít a tartós tranzakciókon és sp_flush_log kívül semmilyen tartós tartóssági garanciát.
A tranzakciók tartósságának szabályozása
Adatbázisszintű vezérlés
Ön, a DBA az alábbi utasítással szabályozhatja, hogy a felhasználók használhatják-e az adatbázisok késleltetett tranzakciós tartósságát. A késleltetett tartóssági beállítást az ALTER DATABASE használatával kell beállítania.
ALTER DATABASE ... SET DELAYED_DURABILITY = { DISABLED | ALLOWED | FORCED }
LETILTOTT
[alapértelmezett] Ezzel a beállítással az adatbázisban véglegesíteni kívánt összes tranzakció teljes mértékben tartós, függetlenül a véglegesítési szint beállításától (DELAYED_DURABILITY=[ON | KI]). Nincs szükség tárolt eljárás módosítására és újrafordítására. Ez lehetővé teszi, hogy a késleltetett tartósság révén soha ne kerüljön veszélybe adat.
ENGEDÉLYEZETT
Ezzel a beállítással minden tranzakció tartóssága tranzakciós szinten van meghatározva – DELAYED_DURABILITY = { KI | BE }. További információért lásd: Atomblokkszint-vezérlés – Natív módon fordított tárolt eljárások és Elkötelezési szint vezérlés.
KÉNYSZERÍTETT
Ezzel a beállítással az adatbázison véglegesített összes tranzakció tartósan késik. A tranzakció késleltetett tartósságú, függetlenül attól, hogy teljes tartósságot határoz meg (DELAYED_DURABILITY = OFF) vagy nincs specifikáció. Ez a beállítás akkor hasznos, ha a tranzakciók késleltetett tartóssága hasznos egy adatbázis esetében, és nem szeretné módosítani az alkalmazás kódját.
Atomi blokkszintű vezérlés – Natív fordítású tárolt eljárások
Az alábbi kód az atomblokkba kerül.
DELAYED_DURABILITY = { OFF | ON }
KI
[alapértelmezett] A tranzakció teljes mértékben tartós, kivéve, ha a DELAYED_DURABILITY = KÉNYSZERÍTETT adatbázis-beállítás érvényben van, ebben az esetben a véglegesítés aszinkron és így késleltetett tartóssággal rendelkezik. További információért lásd: Adatbázisszintű vezérlő.
BE
A tranzakció tartósan késik, kivéve, ha az adatbázis-beállítás DELAYED_DURABILITY = LETILTVA van, ebben az esetben a véglegesítés szinkron és így teljes mértékben tartós. További információért lásd: Adatbázisszintű vezérlő.
példakód:
CREATE PROCEDURE [<procedureName>] /* parameters go here */
WITH NATIVE_COMPILATION, SCHEMABINDING, EXECUTE AS OWNER
AS BEGIN ATOMIC WITH
(
DELAYED_DURABILITY = ON,
TRANSACTION ISOLATION LEVEL = SNAPSHOT,
LANGUAGE = N'English'
)
/* procedure body goes here */
END
1. táblázat: Tartósság atomblokkokban
| Atomblokk tartóssági lehetőség | Nincs meglévő tranzakció | Folyamatban lévő tranzakció (teljes vagy késleltetett tartós) |
|---|---|---|
| DELAYED_DURABILITY = KI | Az atomblokk egy új, teljesen tartós tranzakciót indít el. | Az atomblokk létrehoz egy mentési pontot a meglévő tranzakcióban, majd elindítja az új tranzakciót. |
| DELAYED_DURABILITY = BE | Az atomi blokk egy új késleltetett tartós tranzakciót indít el. | Az atomblokk létrehoz egy mentési pontot a meglévő tranzakcióban, majd elindítja az új tranzakciót. |
COMMIT szint szabályozás –Transact-SQL
A COMMIT szintaxisa ki van terjesztve, így lehetőséget ad a késleltetett tranzakció tartósságának kényszerítésére. Ha a DELAYED_DURABILITY le van tiltva vagy meg van erőltetve az adatbázis szintjén (lásd fent), akkor a COMMIT beállítást figyelmen kívül hagyják.
COMMIT [ { TRAN | TRANSACTION } ] [ transaction_name | @tran_name_variable ] ] [ WITH ( DELAYED_DURABILITY = { OFF | ON } ) ]
KI
[alapértelmezett] A tranzakció COMMIT teljes mértékben tartós, kivéve, ha az adatbázis beállítása szerint DELAYED_DURABILITY = FORCED van érvényben, ebben az esetben a COMMIT aszinkron módon történik, és így késleltetett tartóssá válik. További információért lásd: Adatbázisszintű vezérlő.
BE
A tranzakció COMMIT végrehajtása késleltetett tartóssággal történik, kivéve, ha az adatbázisban a DELAYED_DURABILITY = LETILTVA paraméter van érvényben; ebben az esetben a COMMIT szinkron módon hajtódik végre, és ezáltal teljes mértékben tartós. További információért lásd: Adatbázisszintű vezérlő.
A lehetőségek és azok interakcióinak összefoglalása
Ez a táblázat az adatbázisszintű késleltetett tartóssági beállítások és a véglegesítési szint beállításai közötti interakciókat foglalja össze. Az adatbázisszintű beállítások mindig elsőbbséget élveznek a véglegesítési szint beállításaival szemben.
| Véglegesítés beállítás/Adatbázis-beállítás | KÉSLELTETETT_TARTÓSSÁG = KIKAPCSOLVA | DELAYED_DURABILITY = ENGEDÉLYEZETT | DELAYED_DURABILITY = KÉNYSZERÍTETT |
|---|---|---|---|
| DELAYED_DURABILITY = OFF adatbázisszintű tranzakciók. | A tranzakció teljes mértékben tartós. | A tranzakció teljes mértékben tartós. | A tranzakció tartósan késik. |
| DELAYED_DURABILITY = ON Adatbázisszintű tranzakciók késleltetett tartósság beállítása. | A tranzakció teljes mértékben tartós. | A tranzakció tartósan késik. | A tranzakció tartósan késik. |
| DELAYED_DURABILITY = KIKAPCSOLVA Keresztadatbázis vagy elosztott tranzakció. | A tranzakció teljes mértékben tartós. | A tranzakció teljes mértékben tartós. | A tranzakció teljes mértékben tartós. |
| DELAYED_DURABILITY = ON Adatbázisközi vagy elosztott tranzakció. | A tranzakció teljes mértékben tartós. | A tranzakció teljes mértékben tartós. | A tranzakció teljes mértékben tartós. |
Hogyan kényszeríthető ki egy tranzakciónapló ürítése
A tranzakciónapló lemezre való kényszerített kiürítésére két mód van.
Hajtsa végre az azonos adatbázist módosító, teljesen tartós tranzakciókat. A művelet kényszeríti, hogy az összes korábban véglegesített késleltetett tartóssági tranzakció naplórekordja lemezre kerüljön.
Hajtsa végre a rendszer által tárolt eljárást
sp_flush_log. Ez az eljárás az összes korábbi véglegesített késleltetett tartós tranzakció naplórekordjainak kiürítését kényszeríti a lemezre. További információ: sys.sp_flush_log (Transact-SQL).
Késleltetett tartósság és egyéb SQL Server-funkciók
tranzakciós replikáció, változáskövetés és változásadatrögzítés
A tranzakciós replikációhoz vagy adatrögzítéshez (CDC) engedélyezett adatbázisok esetében a késleltetett tartósság használata nem támogatott.
A változáskövetés támogatott késleltetett tartósság esetén. A Változáskövetéssel rendelkező összes tranzakció teljes mértékben tartós. Egy tranzakció rendelkezik a változáskövetési tulajdonságával, ha írási műveleteket végez olyan táblákon, amelyek engedélyezték a változáskövetést.
Az SQL Server 2022 CU 2-től és az SQL Server 2019 CU 20-tól kezdve a következőt láthatja:
Error 22891: Could not enable '_FeatureName_' for database '_DatabaseName_'. '_FeatureName_' cannot be enabled on a DB with delayed durability set, ha olyan adatbázison próbálja engedélyezni a tranzakciós replikációt vagy az adatrögzítés módosítását, amely lehetővé tette a késleltetett tartósságot.Error 22892: Could not enable delayed durability on DB. Delayed durability cannot be enabled on a DB while '_FeatureName_' is enabled, ha egy tranzakciós replikációval vagy adatrögzítés módosításával konfigurált adatbázis késleltetett tartósságát próbálja engedélyezni.
összeomlás utáni helyreállítás
A konzisztencia garantált, de az elhalasztott, tartós tranzakciók bizonyos módosításai elveszhetnek.
Adatbázisközi integráció és DTC
Ha egy tranzakció adatbázisközi vagy elosztott, akkor az adatbázis- vagy tranzakció-véglegesítési beállítástól függetlenül teljes mértékben tartós.
Always On elérhetőségi csoportok és tükrözés
A késleltetett tartós tranzakciók egyáltalán nem garantálják a tartósságot sem az elsődleges, sem a másodlagos rendszerek esetében. Emellett nem garantálják a másodlagos tranzakcióval kapcsolatos ismereteket. A véglegesítés után a vezérlés visszakerül az ügyfélhez, mielőtt bármilyen visszajelzést kapna bármely szinkronizált másodlagos rendszertől. A másodlagos replikákra történő másolás továbbra is folytatódik, amint az elsődlegen a lemezre írás megtörténik.
hibatűrő fürtözés
Előfordulhat, hogy néhány késleltetett tranzakciót tartalmazó írás elveszik.
Sql--hez készült Azure Synapse Link
Az SQL-hez készült Azure Synapse Link nem támogatja a késleltetett tartós tranzakciókat.
Naplók szállítási
Csak a tartóssá tett tranzakciók szerepelnek a kiszállított naplóban.
tranzakciónapló biztonsági mentési
A biztonsági mentés csak a tartóssá tett tranzakciókat tartalmazza.
Mikor veszíthetem el az adatokat?
Ha bármely táblán késleltetett tartósságot valósít meg, tisztában kell lennie azzal, hogy bizonyos körülmények adatvesztéshez vezethetnek. Ha nem tolerálja az adatvesztést, ne használjon késleltetett tartósságot a táblákon.
Katasztrofális események
Olyan katasztrofális esemény esetén, mint például egy kiszolgáló összeomlása, a lemezre nem mentett összes véglegesített tranzakció adatait elveszíti. A késleltetett tartós tranzakciókat a rendszer minden alkalommal a lemezre menti, amikor egy teljesen tartós tranzakciót hajtanak végre az adatbázis bármelyik tábláján (legyen az tartósmemória-optimalizált vagy lemezalapú), vagy amikor a sp_flush_log parancsot meghívják. Ha késleltetett tartós tranzakciókat használ, érdemes lehet létrehoznia egy kis táblát az adatbázisban, amelyet rendszeres időközönként frissíthet vagy rendszeres időközönként meghívhat sp_flush_log az összes függőben lévő tranzakció mentéséhez. A tranzakciónapló is kiürül, amikor megtelik, de ezt nehéz előrejelezni, és lehetetlen szabályozni.
AZ SQL Server leállítása és újraindítása
A késleltetett tartósság érdekében nincs különbség a váratlan leállítás és az SQL Server várható leállítása/újraindítása között. A katasztrofális eseményekhez hasonlóan az adatvesztést is érdemes megtervezni. Tervezett leállítás/újraindítás esetén előfordulhat, hogy a lemezre nem írt tranzakciók némelyike a leállítás előtt menthető a lemezre, de nem érdemes megtervezni. Úgy tervezze meg, mintha a tervezett vagy nem tervezett leállítás/újraindítás ugyanúgy veszítené el az adatokat, mint egy katasztrofális esemény.