Statistiques système désynchronisées
J'ai deux bases de données qui sont dans un groupe de disponibilité, une comme réplique principale et l'autre est la secondaire. J'ai une procédure de magasin qui renvoie l'erreur suivante.
Exécution DBCC terminée. Si DBCC a imprimé des messages d'erreur, contactez votre administrateur système. Msg 2767, niveau 16, état 1, procédure xxxx.sys.sp_table_statistics2_rowset, ligne 105 [Batch Start Line 2] Impossible de localiser les statistiques «_WA_Sys_00000026_0143D405» dans les catalogues système. Exécution DBCC terminée. Si DBCC a imprimé des messages d'erreur, contactez votre administrateur système.
lorsque j'exécute la requête suivante sur mon réplica secondaire (lecture seule):
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;
la statistique apparaît:
STOJOU QTYPCU_0 _WA_Sys_00000026_0143D405
STOJOU QTYPCU_0 _WA_Sys_00000026_0143D405_readonly_database_statistics
lorsque j'exécute la requête sur la réplique principale, elle n'apparaît pas dans les tables système mais lorsque vous regardez sous la table STOJOU, elle apparaît.
Comment reconstruire et / ou resynchroniser les statistiques entre mes deux systèmes? Je ne parviens pas à supprimer / ou créer la statistique sur ma primaire. Dois-je arrêter ma synchronisation entre le primaire et le secondaire pour résoudre ce problème? Merci pour votre aide.
Réponses
Il s'agit d'un bogue exceptionnel dans SQL Server qui est malheureusement ignoré depuis un certain temps.
Vous pouvez retrouver la statistique incriminée et la supprimer / la recréer, ou comme certains autres dans le fil ci-dessus l'ont suggéré:
La suppression des pools liés à userstore_dbmetadata lors de la validation ASYNC résout le problème.
DBCC FREESYSTEMCACHE (‘dbname’)
Ou créez une procédure stockée pour vérifier si l'instance est une validation ASYNC, puis effacez le cache à l'aide d'un travail d'agent.
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