系统统计不同步

use*_*811 6 sql-server

我在一个可用性组中有两个数据库,一个作为主副本,另一个作为辅助。我有一个返回以下错误的存储过程。

DBCC 执行完成。如果 DBCC 打印错误消息,请联系您的系统管理员。消息 2767,级别 16,状态 1,过程 xxxx.sys.sp_table_statistics2_rowset,第 105 行 [批处理开始行 2] 无法在系统目录中找到统计信息“_WA_Sys_00000026_0143D405”。DBCC 执行完成。如果 DBCC 打印错误消息,请联系您的系统管理员。

当我在我的辅助副本(只读)上运行以下查询时:

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;
Run Code Online (Sandbox Code Playgroud)

统计出现:

STOJOU QTYPCU_0          _WA_Sys_00000026_0143D405
STOJOU QTYPCU_0          _WA_Sys_00000026_0143D405_readonly_database_statistics
Run Code Online (Sandbox Code Playgroud)

当我在主副本上运行查询时,它不会出现在系统表中,但是当您查看 STOJOU 表时,它会出现。

我如何重建和/或重新同步我的两个系统之间的统计数据?我无法删除/或创建我的主要数据。我是否需要停止主要和次要之间的同步来解决这个问题?谢谢你的协助。

Low*_*n M 5

不幸的是,这是SQL Server 中的一个突出错误,它已经被忽略了很长一段时间。

您可以追踪违规统计数据并删除/重新创建它,或者按照上述线程中的其他一些人的建议:

清除异步提交时与 userstore_dbmetadata 相关的池可解决该问题。 DBCC FREESYSTEMCACHE (‘dbname’)

或者创建一个存储过程来检查实例是否是 ASYNC 提交,然后使用代理作业清除缓存。

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
Run Code Online (Sandbox Code Playgroud)