Возобновляемый онлайн-индекс - ошибка 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 для осведомленности, но помните, что она может или не может быть устранена. Исправить это остается на усмотрение команды разработчиков, поскольку это недокументированная и неподдерживаемая функция (хотя и полезная).

Другие вопросы по тегам