Brak synchronizacji statystyk systemu
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
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