Megosztás a következőn keresztül:


Gyorsított adatbázis-helyreállítás monitorozása és hibaelhárítása

A következőkre vonatkozik: Az SQL Server 2019 (15.x) és újabb verziói az Azure SQL DatabaseAzure SQL Managed InstanceSQL 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:

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:

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, SNAPSHOT vagy RCSI helyett. Ez a probléma gyakrabban fordul elő az SNAPSHOT elkü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 SNAPSHOT elkü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 Count kiszolgá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ű IX zá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 VersionCleaner problé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_xdesid oszlopot. 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 a sys.sysseobjvalues rendszertá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.