Возобновляемый онлайн-индекс - ошибка sys.dm_db_database_page_allocations
Возможно, ошибка в Microsoft SQL Server 2019 (CTP3.0). DMV sys.dm_db_database_page_allocations с подробными отчетами о режиме, следующими
Сообщение 824, уровень 24, состояние 2, строка 1 SQL Server обнаружил логическую ошибку ввода-вывода на основе согласованности: неверный идентификатор страницы (ожидаемый 1:457714; фактический 0:0). Это произошло во время чтения страницы (1:457714) в базе данных с идентификатором 6 по смещению 0x000000df7e4000 в файле 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\test.mdf'. Дополнительные сообщения в журнале ошибок SQL Server или журнале ошибок операционной системы могут предоставить более подробную информацию. Это серьезная ошибка, которая угрожает целостности базы данных и должна быть немедленно исправлена. Выполните полную проверку согласованности базы данных (DBCC CHECKDB). Эта ошибка может быть вызвана многими факторами; Дополнительные сведения см. в электронной документации по SQL Server.
Тестовый скрипт
-- Create table to hold sample data
CREATE TABLE Visits2
(
ID INT,
I100 INT,
I1000 INT,
I10000 INT,
I100000 INT,
I1000000 INT,
I10000000 INT,
IP_Address VARCHAR(15),
VisitDate DATE
);
GO
-- Create Tally Table
GO
CREATE VIEW vw_Tally AS
--Itzik style tally table
WITH lv0 AS (SELECT 0 g UNION ALL SELECT 0)
,lv1 AS (SELECT 0 g FROM lv0 a CROSS JOIN lv0 b) -- 4
,lv2 AS (SELECT 0 g FROM lv1 a CROSS JOIN lv1 b) -- 16
,lv3 AS (SELECT 0 g FROM lv2 a CROSS JOIN lv2 b) -- 256
,lv4 AS (SELECT 0 g FROM lv3 a CROSS JOIN lv3 b) -- 65,536
,lv5 AS (SELECT 0 g FROM lv4 a CROSS JOIN lv4 b) -- 4,294,967,296
,Tally (n) AS
(SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM lv5)
SELECT TOP (1000000) n
FROM Tally
ORDER BY n;
GO
-- Populate Visits2 with sample data
SET NOCOUNT ON;
DECLARE @Max bigint = (select ISNULL(max(ID),0) From Visits2);
WHILE @Max < 60000000 BEGIN
WITH TallyTable AS (
SELECT n + @Max as N,
CAST(RAND(CHECKSUM(NEWID())) * 255 as INT) + 1 AS A4,
CAST(RAND(CHECKSUM(NEWID())) * 255 as INT) + 1 AS A3,
CAST(RAND(CHECKSUM(NEWID())) * 255 as INT) + 1 AS A2,
1.0 + floor(1 * RAND(convert(varbinary, newid()))) AS A1,
DATEADD(DD, 1.0 + floor(62 *
RAND(convert(varbinary, newid()))),'2018-07-01') AS VisitDate
FROM vw_Tally)
INSERT INTO Visits2 (ID, I100, I1000, I10000, I100000,
I1000000, I10000000, IP_Address, VisitDate)
SELECT n,n%100, n%1000, n%10000,n%100000,
n%1000000, n%10000000,
CAST(A1 AS VARCHAR) + '.' + CAST(A2 AS VARCHAR) +
'.' + CAST(A3 AS VARCHAR) +
'.' + CAST(A4 AS VARCHAR), VisitDate
FROM TallyTable
set @Max = (select ISNULL(max(ID),0) From Visits2);
END
Откройте новое окно запроса для выполнения
CREATE INDEX NC_Visits2_1 ON dbo.Visits2 (I100)
WITH (ONLINE = ON,RESUMABLE = ON);
Откройте второе окно для выполнения
ALTER INDEX NC_Visits2_1 ON dbo.Visits2 PAUSE;
Откройте 3-е окно и выполните
SELECT *
FROM sys.dm_db_database_page_allocations
(
DB_ID(),
OBJECT_ID('dbo.Visits2'),
NULL,
NULL,
'detailed'
)
Ошибка возникает только при использовании режима DETAILED. Интересно, что CHECKDB не сообщает об ошибках.
Кто-нибудь еще получает такую же ошибку?
1 ответ
Я смог воспроизвести эти симптомы, используя CTP 3.1 в Linux (Ubuntu). Кажется недокументированным sys.dm_db_database_page_allocation
DMV неправильно учитывает страницы в состоянии паузы во время создания.
Вы можете сообщить об этой ошибке на форуме обратной связи Azure для осведомленности, но помните, что она может или не может быть устранена. Исправить это остается на усмотрение команды разработчиков, поскольку это недокументированная и неподдерживаемая функция (хотя и полезная).