Temos um AOAG no SQL Server 2014 SP2 CU5 (3 nós). Há um banco de dados com nível de isolamento de instantâneo de leitura confirmada LIGADO . Temos uma grande mesa compactada. Algumas de nossas consultas maiores nesta tabela são executadas no secundário.
Em seguida, há um trabalho noturno no nó primário para reorganizar os índices em várias tabelas. Ao atingir o índice clusterizado da tabela mencionada, obtemos o seguinte erro:
Transação abortada ao acessar a linha versionada na tabela 'xxxx' no banco de dados 'yyyy'. A linha com versão solicitada não foi encontrada porque o acesso secundário legível não é permitido para a operação que tentou criar a versão.
Em algum momento, as grandes consultas estavam realizando as leituras com a dica READUNCOMMITTED
. Eu pensei que era a causa desse erro, então eu os removi. Mas o erro ainda está lá.
Alguma ideia?
Configuração atual:
- 02 secundário está em modo síncrono
- 03 secundário em modo assíncrono
Detalhes da tabela
- Contagens de linhas: 122.567.668
- Espaço total MB: 18.460
- Espaço usado MB: 18.238
Definições:
CREATE TABLE [dbo].[big_table](
[ID] [int] NOT NULL IDENTITY(1, 1),
1 [int] NULL,
2 [datetime] NULL,
3 [int] NULL,
4 [int] NULL CONSTRAINT [DF_ccc_bUnits] DEFAULT ((0)),
5 [money] NULL,
6 [money] NULL,
7 [int] NULL,
8 [int] NULL CONSTRAINT [DF_ccc_MinDays] DEFAULT ((0)),
9 [int] NULL,
10 [int] NULL,
11 [float] NULL,
12 [money] NULL,
13 [int] NULL,
14 [int] NULL,
15 [nvarchar] (200) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
16 [money] NULL,
17 [money] NULL,
18 [int] NULL,
19 [int] NULL,
20 [money] NULL,
21 [money] NULL,
22 [money] NULL,
23 [money] NULL,
24 [money] NULL,
25 [datetime] NOT NULL CONSTRAINT [DFcccadded] DEFAULT (getdate()),
26 [nvarchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
27 [money] NOT NULL CONSTRAINT [DFcccBrf] DEFAULT ((0)),
29 [money] NOT NULL CONSTRAINT [DFcccHB] DEFAULT ((0)),
30 [money] NOT NULL CONSTRAINT [DFcccFB] DEFAULT ((0)),
31 [money] NOT NULL CONSTRAINT [DFcccAllBoards] DEFAULT ((0)),
32 [money] NOT NULL CONSTRAINT [DFcccChildBrf] DEFAULT ((0)),
33 [money] NOT NULL CONSTRAINT [DFcccChildHB] DEFAULT ((0)),
34 [money] NOT NULL CONSTRAINT [DFcccChildFB] DEFAULT ((0)),
35 [money] NOT NULL CONSTRAINT [DFcccChildAllBoards] DEFAULT ((0)),
36 [int] NULL CONSTRAINT [DFcccShow_1] DEFAULT ((0)),
37 [timestamp] NOT NULL,
38 [money] NULL,
39 [money] NULL,
40 [money] NULL,
41 [money] NULL,
42 [money] NULL,
43 [money] NULL,
44 [money] NULL,
45 [money] NULL,
46 [int] NOT NULL CONSTRAINT [DFcccReleaseHour] DEFAULT ((0)),
47 [int] NULL,
48 [int] NULL,
49 [money] NULL,
50 [money] NULL,
51 [float] NULL
) ON [PRIMARY]
WITH (DATA_COMPRESSION = PAGE)
GO
CREATE UNIQUE CLUSTERED INDEX [IXccc] ON [dbo].[big_table] (1, 2) WITH (FILLFACTOR=90, DATA_COMPRESSION = PAGE) ON [PRIMARY]
GO
ALTER TABLE [dbo].[big_table] ADD CONSTRAINT [PKccc] PRIMARY KEY NONCLUSTERED ([ID]) WITH (DATA_COMPRESSION = PAGE) ON [secondary]
GO
CREATE UNIQUE NONCLUSTERED INDEX [IXcccstamp] ON [dbo].[big_table] (36) INCLUDE (1, 2) WITH (FILLFACTOR=100) ON [PRIMARY]
GO
Então, depois de esgotar as soluções possíveis, abrimos um caso de suporte para a Microsoft. Eles pediram para executar uma ferramenta para coletar algumas informações enquanto o processo estava em execução e depois analisaram. Aqui está a resposta deles:
Não temos "fora do horário comercial", funcionamos 24/7/365. Não é uma resposta definitiva, mas pelo menos sabemos a causa raiz desse problema. Portanto, a abordagem será alterar temporariamente a cadeia de conexão para que a tarefa com falha seja lida do nó AG primário em vez do nó AG secundário no dia em que a reindexação for executada.