Brak synchronizacji statystyk systemu

Sep 10 2020

Mam dwie bazy danych, które znajdują się w grupie dostępności, jedna jako replika podstawowa, a druga jako pomocnicza. Mam procedurę magazynu, która zwraca następujący błąd.

Zakończono wykonywanie DBCC. Jeśli drukowane są komunikaty o błędach DBCC, skontaktuj się z administratorem systemu. Msg 2767, poziom 16, stan 1, procedura xxxx.sys.sp_table_statistics2_rowset, wiersz 105 [Batch Start Line 2] Nie można zlokalizować statystyk „_WA_Sys_00000026_0143D405” w katalogach systemowych. Zakończono wykonywanie DBCC. Jeśli drukowane są komunikaty o błędach DBCC, skontaktuj się z administratorem systemu.

kiedy uruchamiam następujące zapytanie na mojej replice pomocniczej (tylko do odczytu):

SELECT OBJECT_NAME(s.object_id) AS object_name
    , COL_NAME(sc.object_id, sc.column_id) AS column_name
    , s.name AS statistics_name  
FROM sys.stats AS s 
INNER JOIN sys.stats_columns AS sc ON s.stats_id = sc.stats_id AND s.object_id = sc.object_id  
WHERE s.name like  '%_WA_Sys_00000026_0143D405%'
ORDER BY s.name;

pojawi się statystyka:

STOJOU QTYPCU_0          _WA_Sys_00000026_0143D405
STOJOU QTYPCU_0          _WA_Sys_00000026_0143D405_readonly_database_statistics

kiedy uruchamiam zapytanie na replice podstawowej, nie pojawia się ono w tabelach systemowych, ale kiedy zajrzysz pod tabelę STOJOU, pojawia się.

Jak odbudować i / lub ponownie zsynchronizować statystyki między moimi dwoma systemami? Nie mogę upuścić / lub utworzyć Statystyk na moim głównym. Czy muszę zatrzymać synchronizację między serwerem podstawowym i pomocniczym, aby rozwiązać ten problem? Dziękuję za Twoją pomoc.

Odpowiedzi

5 LowlyDBA-JohnMcCall Sep 10 2020 at 04:13

Jest to wyjątkowy błąd w SQL Server, który niestety był ignorowany przez dłuższy czas.

Możesz wyśledzić obraźliwą statystykę i upuścić / odtworzyć ją lub jak sugerowali inni w powyższym wątku:

Wyczyszczenie pul związanych z userstore_dbmetadata przy zatwierdzaniu ASYNC rozwiązuje problem. DBCC FREESYSTEMCACHE (‘dbname’)

Lub utwórz procedurę składowaną, aby sprawdzić, czy instancja jest zatwierdzeniem ASYNC, a następnie wyczyść pamięć podręczną za pomocą zadania agenta.

CREATE PROCEDURE [dbo].[sp_clear_dbmetadatacache]
AS
SET NOCOUNT ON
DECLARE @dbname SYSNAME
DECLARE @linebreak AS VARCHAR
SET @linebreak = CHAR + CHAR

CREATE TABLE #dbcc
(
command VARCHAR
)

DECLARE db_cursor CURSOR FOR
SELECT DISTINCT name
FROM sys.sysdatabases db
INNER JOIN sys.dm_hadr_database_replica_cluster_states dbcs
ON db.name = dbcs.database_name
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO dbname WHILE @FETCH_STATUS = 0
BEGIN
CREATE TABLE #avmode
(
availability_mode_desc VARCHAR
)
DECLARE value AS VARCHAR(20) DECLARE @sqlcmd2 AS NVARCHAR(150) SET @sqlcmd2 = 'SELECT DISTINCT availability_mode_desc FROM sys.availability_replicas WHERE replica_server_name = @SERVERNAME’
INSERT INTO #avmode
EXECUTE sp_executesql @sqlcmd2
SELECT @value = availability_mode_desc
FROM #avmode
BEGIN
IF @value = ‘ASYNCHRONOUS_COMMIT’
GOTO A
ELSE
GOTO B
END
A:
DECLARE @sqlcmd AS NVARCHAR
SET @sqlcmd = ‘DBCC FREESYSTEMCACHE (’‘’ + @dbname +’‘’) ’+ @linebreak + ’GO’
INSERT INTO #dbcc EXECUTE sp_executesql @sqlcmd
—PRINT @sqlcmd
B:
DROP TABLE #avmode
FETCH NEXT FROM db_cursor INTO @dbname;
END
CLOSE db_cursor;
DEALLOCATE db_cursor;

GO