可恢复在线索引 - sys.dm_db_database_page_allocations 错误

Resumable Online Index - sys.dm_db_database_page_allocations error

可能是 Microsoft SQL Server 2019 (CTP3.0) 中的错误 DMV sys.dm_db_database_page_allocations 详细模式报告在

之后

Msg 824, Level 24, State 2, Line 1 SQL Server detected a logical consistency-based I/O error: incorrect pageid (expected 1:457714; actual 0:0). It occurred during a read of page (1:457714) in database ID 6 at offset 0x000000df7e4000 in file 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\test.mdf'. Additional messages in the SQL Server error log or operating system error log may provide more detail. This is a severe error condition that threatens database integrity and must be corrected immediately. Complete a full database consistency check (DBCC CHECKDB). This error can be caused by many factors; for more information, see SQL Server Books Online.

测试脚本

-- 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

打开一个新查询window执行

CREATE  INDEX NC_Visits2_1 ON dbo.Visits2  (I100)
WITH (ONLINE = ON,RESUMABLE = ON);

开第二个window执行

ALTER INDEX NC_Visits2_1 ON dbo.Visits2 PAUSE;

打开第三个window并执行

SELECT  *
  FROM sys.dm_db_database_page_allocations
       (
         DB_ID(),
         OBJECT_ID('dbo.Visits2'),
         NULL,
         NULL,
         'detailed'
       ) 

该错误仅在使用详细模式时出现。有趣的是,CHECKDB 没有报告任何错误。

还有其他人遇到同样的错误吗?

我能够在 Linux (Ubuntu) 上使用 CTP 3.1 重现这些症状。似乎未记录的 sys.dm_db_database_page_allocation DMV 没有正确说明创建期间处于暂停状态的页面。

您可以在 Azure Feedback Forum 上报告此错误以提高认识,但请注意它可能会或可能不会得到解决。修复此问题由产品团队自行决定,因为它是一个未记录且不受支持的功能(尽管很有用)。