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.
A következőkre vonatkozik: Az SQL Server 2019 (15.x) és újabb verziói
az Azure SQL Database
Azure SQL Managed Instance
SQL Database-adatbázist a Microsoft Fabricben
Ez a cikk segít monitorozni, diagnosztizálni és megoldani a gyorsított adatbázis-helyreállítással (ADR) kapcsolatos problémákat az SQL Server 2019(15.x) és újabb verzióiban, a Felügyelt Azure SQL-példányban, az Azure SQL Database-ben és az SQL Database-ben a Microsoft Fabricben.
A PVS méretének vizsgálata
Az sys.dm_tran_persistent_version_store_stats DMV használatával állapítsa meg, hogy az állandó verziótár (PVS) mérete nagyobb-e a vártnál.
Az alábbi példa diagnosztikai lekérdezés az aktuális PVS-méretre, a törlési folyamatokra és az összes olyan adatbázis egyéb részleteire vonatkozó információkat mutatja be, amelyekben a PVS mérete nullánál nagyobb:
SELECT pvss.database_id,
DB_NAME(pvss.database_id) AS database_name,
pvss.persistent_version_store_size_kb / 1024. / 1024 AS persistent_version_store_size_gb,
100 * pvss.persistent_version_store_size_kb / df.total_db_size_kb AS pvs_percent_of_database_size,
df.total_db_size_kb / 1024. / 1024 AS total_db_size_gb,
pvss.online_index_version_store_size_kb / 1024. / 1024 AS online_index_version_store_size_gb,
pvss.current_aborted_transaction_count,
pvss.aborted_version_cleaner_start_time,
pvss.aborted_version_cleaner_end_time,
pvss.oldest_aborted_transaction_id,
pvss.oldest_active_transaction_id,
dt.database_transaction_begin_time AS oldest_transaction_begin_time,
asdt.session_id AS active_transaction_session_id,
asdt.elapsed_time_seconds AS active_transaction_elapsed_time_seconds,
pvss.pvs_off_row_page_skipped_low_water_mark,
pvss.pvs_off_row_page_skipped_min_useful_xts,
pvss.pvs_off_row_page_skipped_oldest_aborted_xdesid
FROM sys.dm_tran_persistent_version_store_stats AS pvss
CROSS APPLY (
SELECT SUM(size * 8.) AS total_db_size_kb
FROM sys.master_files AS mf
WHERE mf.database_id = pvss.database_id
AND
mf.state = 0
AND
mf.type = 0
) AS df
LEFT JOIN sys.dm_tran_database_transactions AS dt
ON pvss.oldest_active_transaction_id = dt.transaction_id
AND
pvss.database_id = dt.database_id
LEFT JOIN sys.dm_tran_active_snapshot_database_transactions AS asdt
ON pvss.min_transaction_timestamp = asdt.transaction_sequence_num
OR
pvss.online_index_min_transaction_timestamp = asdt.transaction_sequence_num
WHERE pvss.persistent_version_store_size_kb > 0
ORDER BY persistent_version_store_size_kb DESC;
A pvs_percent_of_database_size oszlopban megtekintheti a PVS méretét az adatbázis teljes méretéhez viszonyítva. Figyelje meg a tipikus PVS-méret és az alkalmazástevékenységek jellemző időszakában látott alapkonfigurációk közötti különbséget. A PVS akkor tekinthető nagynak, ha jelentősen nagyobb az alapértéknél vagy ha közel van az adatbázis méretének 50%-hez.
Ha a PVS mérete nem csökken, az alábbi hibaelhárítási lépésekkel keresse meg és oldja meg a nagy PVS-méret okát.
Tip
Az alábbi hibaelhárítási lépésekben említett oszlopok a jelen szakaszban található diagnosztikai lekérdezés eredményhalmazában szereplő oszlopokra vonatkoznak.
A nagy PVS-méretet az alábbi okok bármelyike okozhatja:
- hosszan futó aktív tranzakciók
- hosszan tartó aktív pillanatkép-vizsgálatok
- hosszútávú lekérdezések másodpéldányokon
- Megszakított tranzakciók
Hosszú ideig futó aktív tranzakciók keresése
A hosszan futó aktív tranzakciók megakadályozhatják a PVS-törlést azon adatbázisokban, amelyeken engedélyezve van az ADR. Ellenőrizze a legrégebbi aktív tranzakció kezdő időpontját a oldest_transaction_begin_time oszlop használatával. A hosszú ideig futó tranzakciók megkereséséhez használja az alábbi példa lekérdezést. A tranzakció időtartamára és a létrehozott tranzakciónapló mennyiségére vonatkozó küszöbértékeket állíthat be:
DECLARE @LongTxThreshold int = 900; /* The number of seconds to use as a duration threshold for long-running transactions */
DECLARE @LongTransactionLogBytes bigint = 1073741824; /* The number of bytes to use as the generated log threshold for long-running transactions */
SELECT dbtr.database_id,
DB_NAME(dbtr.database_id) AS database_name,
st.session_id,
st.transaction_id,
atr.name,
sess.login_time,
dbtr.database_transaction_log_bytes_used,
CASE WHEN GETDATE() >= DATEADD(second, @LongTxThreshold, tr.transaction_begin_time) THEN 'DurationThresholdExceeded'
WHEN dbtr.database_transaction_log_bytes_used >= @LongTransactionLogBytes THEN 'LogThresholdExceeded'
ELSE 'Unknown'
END
AS reason
FROM sys.dm_tran_active_transactions AS tr
INNER JOIN sys.dm_tran_session_transactions AS st
ON tr.transaction_id = st.transaction_id
INNER JOIN sys.dm_exec_sessions AS sess
ON st.session_id = sess.session_id
INNER JOIN sys.dm_tran_database_transactions AS dbtr
ON tr.transaction_id = dbtr.transaction_id
INNER JOIN sys.dm_tran_active_transactions AS atr
ON atr.transaction_id = st.transaction_id
WHERE GETDATE() >= DATEADD(second, @LongTxThreshold, tr.transaction_begin_time)
OR
dbtr.database_transaction_log_bytes_used >= @LongTransactionLogBytes;
Ha a munkamenetek azonosíthatók, érdemes megfontolni a munkamenet megszüntetését, ha lehetséges. Tekintse át az alkalmazást a problémás tranzakciók jellegének meghatározásához, hogy a jövőben elkerülhesse a problémát.
A hosszú ideig futó lekérdezések hibaelhárításával kapcsolatos további információkért lásd:
- Lassú lekérdezések hibaelhárítása az SQL Server
- A lekérdezési teljesítmény szűk keresztmetszeteinek észlelhető típusai az Azure SQL Database-ben
- A lekérdezési teljesítmény szűk keresztmetszeteinek észlelhető típusai az SQL Serverben és a felügyelt Azure SQL-példányban
Hosszú ideig futó aktív pillanatkép-vizsgálatok ellenőrzése
A hosszú ideig futó aktív pillanatkép-vizsgálatok megakadályozhatják a PVS-törlést azon adatbázisokban, amelyeken engedélyezve van az ADR. Az READ COMMITTED pillanatkép-elkülönítést (RCSI) vagy SNAPSHOTelkülönítési szinteket használó utasítások példányszintű időbélyegeket kapnak. A pillanatkép-vizsgálat az időbélyeg használatával határozza meg az RCSI vagy SNAPSHOT tranzakció verziósorának láthatóságát. Az RCSI-t használó összes utasítás saját időbélyegzővel rendelkezik, míg SNAPSHOT elkülönítés tranzakciószintű időbélyegzővel rendelkezik.
Ezeket a példányszintű tranzakciós időbélyegeket még az egyadatbázisos tranzakciókban is használják, mivel bármely tranzakció előléptethető adatbázisközi tranzakcióként. A pillanatkép-vizsgálatok ezért megakadályozhatják a PVS-törlést az ugyanazon adatbázismotor-példányon található adatbázisokban. Hasonlóképpen, még akkor is, ha az ADR nincs engedélyezve, a pillanatképes ellenőrzések megakadályozhatják a verziótároló törlését a tempdbterületen. Ennek eredményeképpen a PVS mérete növekedhet, ha hosszú ideig futó tranzakciók SNAPSHOT vagy RCSI-t használnak.
A pvs_off_row_page_skipped_min_useful_xts oszlop a hosszú pillanatkép-ellenőrzés miatt kihagyott lapok számát jeleníti meg. Ha ez az oszlop nagymértékű értéket jelenít meg, az azt jelenti, hogy egy hosszú pillanatkép-ellenőrzés megakadályozza a PVS-törlést.
A következő példa lekérdezéssel megkeresheti a hosszú ideig futó SNAPSHOT vagy RCSI-tranzakcióval rendelkező munkameneteket:
SELECT sdt.transaction_id,
sdt.transaction_sequence_num,
s.database_id,
s.session_id,
s.login_time,
GETDATE() AS query_time,
s.host_name,
s.program_name,
s.login_name,
s.last_request_start_time
FROM sys.dm_tran_active_snapshot_database_transactions AS sdt
INNER JOIN sys.dm_exec_sessions AS s
ON sdt.session_id = s.session_id;
A PVS karbantartási késleltetésének megakadályozása:
- Ha lehetséges, érdemes lehet törölni a PVS-törlést késleltető hosszú aktív tranzakciós munkamenetet.
- A hosszú ideig futó lekérdezések hangolása a lekérdezések időtartamának csökkentése érdekében.
- Tekintse át az alkalmazást a problémás aktív pillanatkép-vizsgálat jellegének meghatározásához. A PVS-törlést késleltető hosszú ideig futó lekérdezések esetében fontolja meg egy másik elkülönítési szintet, például
READ COMMITTED,SNAPSHOTvagy RCSI helyett. Ez a probléma gyakrabban fordul elő azSNAPSHOTelkülönítési szinttel. - Az Azure SQL Database rugalmas készleteiben fontolja meg a hosszú ideig futó tranzakciókat tartalmazó adatbázisok áthelyezését a rugalmas készletből
SNAPSHOTelkülönítés vagy RCSI használatával, hogy elkerülje a PVS-karbantartási késést az ugyanabban a készletben lévő többi adatbázisban.
Ellenőrizze a hosszú ideig futó lekérdezéseket a másodlagos replikákon
Ha az adatbázis másodlagos replikákkal rendelkezik, ellenőrizze, hogy a másodlagos alacsony vízjel előrehalad-e.
A pvs_off_row_page_skipped_low_water_mark oszlopban lévő nagy érték jelezheti a tisztítási késedelmet, amelyet egy hosszan futó lekérdezés okoz egy másodlagos replikán. Egy másodlagos replikán futó hosszú ideig tartó lekérdezés nemcsak a PVS-törlést, hanem a szellemkarbantartást is akadályozhatja.
Az elsődleges replikán az alábbi példalekérdezésekkel megállapíthatja, hogy a másodlagos replikákon lévő hosszú ideig futó lekérdezések megakadályozzák-e a PVS-törlést. Ha egy írási számítási feladat az elsődleges replikán fut, de a low_water_mark_for_ghosts oszlop értéke nem növekszik a példalekérdezés egyik végrehajtásától a következőig, akkor előfordulhat, hogy a PVS-t és a szellemkarbantartást egy hosszú ideig futó lekérdezés tartja fent egy másodlagos replikán.
SELECT database_id,
DB_NAME(database_id) AS database_name,
low_water_mark_for_ghosts,
synchronization_state_desc,
synchronization_health_desc,
is_suspended,
suspend_reason_desc,
secondary_lag_seconds
FROM sys.dm_hadr_database_replica_states
WHERE is_local = 1
AND
is_primary_replica = 1;
További információt a low_water_mark_for_ghosts oszlopának leírásában talál.
Csatlakozzon minden egyes olvasható másodlagos replikához, keresse meg a hosszan futó lekérdezést futtató munkamenetet, és ha lehetséges, fontolja meg a munkamenet megszakítását. További információ: Lassú lekérdezések keresése.
Nagy számú megszakított tranzakció ellenőrzése
Ellenőrizze a aborted_version_cleaner_start_time és aborted_version_cleaner_end_time oszlopokat, hogy az utolsó megszakított tranzakciókarbantartás befejeződött-e. A oldest_aborted_transaction_id-nak magasabbra kell emelkednie, miután a megszakított tranzakció törlése befejeződik. Ha a oldest_aborted_transaction_id sokkal alacsonyabb, mint oldest_active_transaction_id, és a current_abort_transaction_count értéke nagy, valószínűleg egy régi megszakított tranzakció akadályozza a PVS-törlést.
A nagy számú megszakított tranzakció miatti PVS-törlési késés megoldásához vegye figyelembe a következőket:
- Ha SQL Server 2022-t (16.x) használ, növelje a
ADR Cleaner Thread Countkiszolgáló konfigurációjának értékét. További információért lásd: kiszolgálókonfiguráció: ADR Cleaner szálak száma. - Ha lehetséges, állítsa le a munkaterhelést, hogy a verziótisztító haladhasson.
- Tekintse át az alkalmazást a magas tranzakciós megszakítási sebesség problémájának azonosításához és megoldásához. A megszakítások a holtpontok, duplikált kulcsok, kényszermegsértések vagy lekérdezési időtúllépések magas arányából származhatnak.
- Optimalizálja a számítási feladatot a PVS-tisztító által igényelt objektumszintű vagy partíciószintű
IXzárolásokkal nem kompatibilis zárolások csökkentésére. További információért lásd: Zárolási kompatibilitás. - Ha SQL Servert használ, tiltsa le az ADR-t vészhelyzeti lépésként a PVS-méret szabályozásához. Lásd az ADR letiltását.
- Ha SQL Servert használ, és a megszakított tranzakció törlése a közelmúltban nem fejeződött be sikeresen, ellenőrizze, hogy vannak-e a hibanaplóban
VersionCleanerproblémákra utaló üzenetek. - Ha a PVS-méret még a tisztítás befejezése után sem csökken a várt módon, ellenőrizze a
pvs_off_row_page_skipped_oldest_aborted_xdesidoszlopot. Nagy értékek azt jelzik, hogy a megszakított tranzakciók sorverziói továbbra is foglalják a helyet.
A PVS méretének szabályozása
Ha nagy mennyiségű DML-utasítást (INSERT, UPDATE, DELETE, MERGE) tartalmazó számítási feladattal rendelkezik, például nagy mennyiségű OLTP-t, és megfigyeli, hogy a PVS mérete nagy, előfordulhat, hogy növelnie kell a ADR Cleaner Thread Count kiszolgáló konfigurációjának értékét a PVS-méret szabályozása érdekében. További információkért lásd a Kiszolgáló Konfigurációja: ADR Tisztább Szálak Számacímű részt, amely az SQL Server 2022 (16.x)-től érhető el.
Az SQL Server 2019-ben (15.x), vagy ha a ADR Cleaner Thread Count beállítás értékének növelése nem segít a PVS méretének megfelelő csökkentésében, előfordulhat, hogy a munkafolyamatnak szüksége van egy pihenőszakaszra a PVS tisztítási folyamatának elvégzéséhez a hely felszabadítása érdekében.
Ha manuálisan szeretné aktiválni a PVS-tisztítási folyamatot a számítási feladatok között vagy a karbantartási időszakokban, használja a rendszer által tárolt eljárást sys.sp_persistent_version_cleanup.
Például:
EXEC sys.sp_persistent_version_cleanup [WideWorldImporters];
Egy aktív tranzakció megakadályozhatja a PVS-törlési folyamat elindítását. Ha ez történik, a sys.sp_persistent_version_cleanup tárolt eljárást futtató munkamenet a PVS_CLEANUP_LOCK várakozási típussal várakozik. Megvárhatja, amíg a tranzakció befejeződik, vagy ha lehetséges, érdemes lehet megölnie a blokkoló munkamenetet egy aktív tranzakcióval.
Tisztítási hibák rögzítése
Az SQL Server 2022 -től (16.x) kezdődően a rendszer a hibanaplóban rögzíti a jelentős PVS-törlési üzeneteket. A törlési statisztikákat a tx_mtvc2_sweep_statskiterjesztett esemény szintén jelenti.
Ismert problémák
- Az SQL Server 2025 (17.x) esetén, ha az
tempdb-ben engedélyezve van az ADR, és az ideiglenes táblák létrehozása, eltávolítása, vagy csonkolása nagy sebességgel történik, a számítási feladatok átviteli sebessége jelentősen csökkenhet asys.sysseobjvaluesrendszertáblán lévő reteszes versengés miatt. A probléma kivizsgálása folyamatban van. A javítást egy későbbi kiadásra tervezik.