可恢复在线索引 - 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 上报告此错误以提高认识,但请注意它可能会或可能不会得到解决。修复此问题由产品团队自行决定,因为它是一个未记录且不受支持的功能(尽管很有用)。
可能是 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 上报告此错误以提高认识,但请注意它可能会或可能不会得到解决。修复此问题由产品团队自行决定,因为它是一个未记录且不受支持的功能(尽管很有用)。