Microsoft SQL Server 2016 (SP1-GDR) (KB4505219) - 13.0.4259.0 (X64) Jun 15 2019 19:20:12 Copyright (c) Microsoft Corporation Enterprise Edition: Core-based Licensing (64-bit) on Windows Server 2019 Datacenter 6.3 <X64> (Build 17763: ) (Hypervisor)
Порядок действий.
1. Проверка базы
1.
DBCC CHECKDB (N'vs05_tv_test') WITH NO_INFOMSGS
Результат:
1.
Выполнение команд успешно завершено.
2. Сжатие данных.
Скрипт.
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109.
DECLARE @Dblist NVARCHAR(MAX);
DECLARE @Dbname NVARCHAR(1024);
DECLARE @Indexlist NVARCHAR(MAX);
DECLARE @Indexname NVARCHAR(1024);
DECLARE @Schemalist NVARCHAR(MAX);
DECLARE @Schemaname NVARCHAR(1024);
DECLARE @Objectlist NVARCHAR(MAX);
DECLARE @Objectname NVARCHAR(1024);
DECLARE @Script NVARCHAR(MAX);
DECLARE @Delimeter CHAR(1);
DECLARE @Paramdefinition NVARCHAR(1024);
DECLARE @Paraminit NVARCHAR(1024);
SET @Indexlist = '';
SET @Schemalist = '';
SET @Objectlist = '';
SET @Dblist = '';
SET @Delimeter = ',';
WITH DB_CTE([dbname])
AS
(SELECT sysinfo.name
FROM sys.databases AS sysinfo
INNER JOIN [CompressionSettings].[dbo].[Databases] AS compressedb
ON sysinfo.database_id = compressedb.dbid and compressedb.active = 1 and compressedb.must_compress = 1
)
SELECT @Dblist = @Dblist + [dbname] + @Delimeter
FROM DB_CTE;
WHILE LEN(@Dblist) > 0
BEGIN
SELECT @Dbname = SUBSTRING(@DbList, 1, CHARINDEX(@Delimeter, @Dblist, 1) - 1);
SELECT @Dblist = REPLACE(@Dblist, @Dbname + @Delimeter,'');
SELECT @Script = 'USE [' + @Dbname + '];'
SELECT @Script = @Script + N'EXEC sp_MSforeachtable N''ALTER TABLE ? REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = PAGE)''';
-- Сжатие всех таблиц
EXEC sp_executesql @Script;
-- Сжатие индексов таблиц
SELECT @Script = 'USE [' + @Dbname + '];
WITH INDEX_CTE([ind_name], [schema_name], [object_name])
AS (SELECT IND.NAME, OBJECT_SCHEMA_NAME(OBJ.ID), OBJECT_NAME(OBJ.id)
FROM sys.sysindexes IND INNER JOIN sys.sysobjects OBJ ON IND.id = OBJ.id
WHERE OBJECTPROPERTY(OBJ.id, ''IsUserTable'') > 0 AND
INDEXPROPERTY(IND.id, IND.name, ''IsAutoStatistics'') = 0 AND
INDEXPROPERTY(IND.id, IND.name, ''IsStatistics'') = 0 AND
IND.NAME IS NOT NULL
)
SELECT @Indlist = @Indlist + [ind_name] + @Delim,
@Schlist = @Schlist + [schema_name] + @Delim,
@Objlist = @Objlist + [object_name] + @Delim
FROM INDEX_CTE;'
SELECT @Paramdefinition = N'@Indlist NVARCHAR(MAX) OUTPUT,
@Schlist NVARCHAR(MAX) OUTPUT,
@Objlist NVARCHAR(MAX) OUTPUT,
@Delim CHAR(1)';
EXEC sp_executesql @Script,
@Paramdefinition,
@Indlist = @Indexlist OUTPUT,
@Schlist = @Schemalist OUTPUT,
@Objlist = @Objectlist OUTPUT,
@Delim = @Delimeter
WHILE LEN(@Indexlist) > 0
BEGIN
SELECT @Indexname = SUBSTRING(@Indexlist, 1, CHARINDEX(@Delimeter, @Indexlist, 1) - 1);
SELECT @Schemaname = SUBSTRING(@Schemalist, 1, CHARINDEX(@Delimeter, @Schemalist, 1) - 1);
SELECT @Objectname = SUBSTRING(@Objectlist, 1, CHARINDEX(@Delimeter, @Objectlist, 1) - 1);
PRINT('Processing index name..' + @Indexname);
--PRINT('schema name ' + @Schemaname);
--PRINT('object name ' + @Objectname);
SELECT @Script = N'USE [' + @Dbname + '];
ALTER INDEX [' + @Indexname + '] ON
[' + @Dbname + '].[' + @SchemaName + '].[' + @ObjectName + ']
REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = PAGE);';
--PRINT(@Script);
EXEC sp_executesql @Script;
SELECT @Indexlist = REPLACE(@Indexlist, @Indexname + @Delimeter,'');
SELECT @Schemalist = SUBSTRING(@Schemalist, CHARINDEX(@Delimeter, @Schemalist) + 1, LEN(@Schemalist) - CHARINDEX(@Delimeter, @Schemalist));
SELECT @Objectlist = SUBSTRING(@Objectlist, CHARINDEX(@Delimeter, @Objectlist) + 1, LEN(@Objectlist) - CHARINDEX(@Delimeter, @Objectlist));
END
UPDATE [CompressionSettings].[dbo].[Databases]
SET [must_compress] = 0
WHERE [dbid] = DB_ID(@Dbname)
END;
3. Шринк файла базы
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
USE [vs05_tv_test]
GO
ALTER DATABASE [vs05_tv_test] SET RECOVERY SIMPLE
GO
DBCC SHRINKFILE (vs05_tv_test, 10)
GO
ALTER DATABASE [vs05_tv_test] SET RECOVERY FULL
1. 2.
DbId FileId CurrentSize MinimumSize UsedPages EstimatedPages
37 1 149384 1024 88736 88688
4. Через некоторое время по неустановленной причине при проверке базы получаю
Скрипт
1.
DBCC CHECKDB (N'vs05_tv_test') WITH NO_INFOMSGS
1. 2. 3. 4. 5. 6. 7. 8.
Сообщение 2533, уровень 16, состояние 1, строка 1
Ошибка в таблице. Не обнаружена страница (1:129336), выделенная идентификатору объекта 179128029, идентификатору индекса 1, идентификатору секции 72057602124218368, идентификатору единицы распределения 72057601768816640 (тип In-row data). Страница недопустима либо имеет неверный идентификатор единицы распределения в заголовке.
Сообщение 8977, уровень 16, состояние 1, строка 1
Ошибка в таблице. Идентификатор объекта 179128029, идентификатор индекса 1, идентификатор секции 72057602124218368, идентификатор единицы распределения 72057601768816640 (тип In-row data). Не обнаружен родительский узел для страницы (1:128697).
Сообщение 8977, уровень 16, состояние 1, строка 1
Ошибка в таблице. Идентификатор объекта 179128029, идентификатор индекса 1, идентификатор секции 72057602124218368, идентификатор единицы распределения 72057601768816640 (тип In-row data). Не обнаружен родительский узел для страницы (1:128693).
Сообщение 8977, уровень 16, состояние 1, строка 1
Ошибка в таблице. Идентификатор объекта 179128029, идентификатор индекса 1, идентификатор секции 72057602124218368, идентификатор единицы распределения 72057601768816640 (тип In-row data). Не обнаружен родительский узел для страницы (1:128703).
Тест со сжатием выполнялся несколько раз. В результате финальной проверки сообщения DBCC были различными. Думал, есть проблемы с дисками/памятью.
Администратор говорит, все нормально.
В частности, "Windows успешно проверила диск D (SSD, на нем лежат базы). Ошибок не обнаружено."
Память также проверялась - ошибок нет.
Из особенностей - было включено теневое копирование. Вчера отключили.
Сегодня выполнял свежий тест (восстановил базу из архива).
Вылетел на п.3
1. 2. 3. 4. 5.
Сообщение 8959, уровень 16, состояние 1, строка 8
Ошибка в таблице. IAM-страница (1:148275) для объекта с идентификатором 0, идентификатором индекса -1, идентификатором секции 0, идентификатором единицы распределения 72057600150994944 (тип Unknown) связана в цепочку IAM для объекта с идентификатором 288316387, идентификатором индекса 3, идентификатором секции 72057600671547392, идентификатором единицы распределения 72057600350486528 (тип In-row data) по странице (0:0).
Сообщение 8959, уровень 16, состояние 1, строка 8
Ошибка в таблице. IAM-страница (1:149004) для объекта с идентификатором 0, идентификатором индекса -1, идентификатором секции 0, идентификатором единицы распределения 72057600153092096 (тип Unknown) связана в цепочку IAM для объекта с идентификатором 317504460, идентификатором индекса 4, идентификатором секции 72057600677183488, идентификатором единицы распределения 72057600356122624 (тип In-row data) по странице (0:0).
Сообщение 8959, уровень 16, состояние 1, строка 8
Подскажете хотя бы направления, куда копать?
Спасибо.
|