Wir haben eine AOAG in SQL Server 2014 SP2 CU5 (3 Knoten). Es gibt eine Datenbank mit Read Committed Snapshot Isolation Ebene ON . Wir haben einen großen Tisch komprimiert. Einige unserer größeren Abfragen in dieser Tabelle werden im Sekundärbereich ausgeführt.
Dann gibt es einen Nachtjob auf dem Primärknoten, um Indizes für mehrere Tabellen neu zu organisieren. Wenn es den Clustered-Index der genannten Tabelle erreicht, wird der folgende Fehler angezeigt:
Die Transaktion wurde abgebrochen, wenn auf die versionierte Zeile in der Tabelle 'xxxx' in der Datenbank 'yyyy' zugegriffen wurde. Die angeforderte versionierte Zeile wurde nicht gefunden, da der lesbare sekundäre Zugriff für den Vorgang, bei dem versucht wurde, die Version zu erstellen, nicht zulässig ist.
Irgendwann führten die großen Abfragen die Lesevorgänge mit dem Hinweis durch READUNCOMMITTED
. Ich dachte, dass es die Ursache für diesen Fehler war, also entfernte ich sie. Aber der Fehler ist immer noch da.
Irgendwelche Ideen?
Aktuelles Setup:
- 02 sekundär ist im synchronen Modus
- 03 sekundär im asynchronen Modus
Tabellendetails
- RowCounts: 122.567.668
- TotalSpaceMB: 18.460
- UsedSpaceMB: 18.238
Definitionen:
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
Antworten:
Nachdem uns die möglichen Lösungen ausgegangen waren, haben wir Microsoft einen Support-Fall eröffnet. Sie baten darum, ein Tool auszuführen, um Informationen zu sammeln, während der Prozess ausgeführt wurde, und analysierten sie anschließend. Hier ist ihre Antwort:
Wir haben keine "außerhalb der Geschäftszeiten", wir laufen 24/7/365. Ist keine endgültige Antwort, aber zumindest kennen wir die Grundursache für dieses Problem. Der Ansatz besteht also darin, die Verbindungszeichenfolge vorübergehend zu ändern, damit die fehlgeschlagene Aufgabe am Tag der Neuindizierung vom primären AG-Knoten anstelle des sekundären AG-Knotens gelesen wird.
quelle