Друзья, доброго времени суток.
Недавно столкнулся с новой ошибкой в логе SQL Server. Вот её содержание:
The operating system returned error 665(The requested operation could
not be completed due to a file system limitation) to SQL Server during a
write at offset 0x000053cfa2e000 in file
‘G:\Databases\TestDB.mdf:MSSQL_DBCC15’. Additional
messages in the SQL Server error log and system event log may provide
more detail. This is a severe system-level 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.
После ряда изысканий я пришёл к следующим заключениям.
Возможные причины:
1. Нехватка дискового пространства
2. Сильно фрагментированные файлы в томе NTFS не можут выйти за пределы определенного размера
3. В момент больших манипуляций с БД запущены команды DBCC
4. Создание моментального снимка базы данных в большой базе данных. После этого выполняется множество операций изменения данных или операций обслуживания в исходной базе данных.
5. Создать моментальный снимок базы данных на зеркальной базе данных.
Способы решения проблемы:
1. Установите последние hotfix на Windows и SQL Server
2. Поставьте правильное автоувеличение файла, чтобы оно не происходило слишком часто. Например, на часто изменяющихся данных поставить заведомо больший размер файла лога или файла БД или больший % автоувеличения
3. Увеличить размер сектора/кластера на диске. По-умолчанию, при форматировании диска, размер сектора 4 кб. При подобной ошибки, да и в большинстве случаев, лучше ставить 64 кб. Чтобы изменить данный размер на рабочем диске, необходимо его форматировать.
4. Не запускать команды DBCC в момент рабочей нагрузки на сервер. В крайнем случае вы можете использовать параметр WITH TABLOCK команды DBCC CHECKDB. Это позволит избежать использование внутреннего napshot
5. Не запускайте DBCC CHECKDB одновременно с планами обслуживания (перестроение индексов, обновление статистики, сжатие БД)
6. Можно создать snapshot БД на другом диске и выполнить на нём DBCC CHECKDB. Не забудьте удалить его.
7. Изучите возможность использование дополнительных параметров DBCC CHECKDB, таких как PHYSICAL_ONLY, чтобы уменьшить время жизни внутренних snapshot, созданных DBCC командой.
8. Чаще пересоздавайте snapshot
9. Создавайте snapshot на отличном от данных диске
10. Удаляйте snapshot на момент планового ослуживания, после чего не забудьте создать его заного
11. Найдите наиболее нагруженную часть БД и перенесите её на другой диск
12. Убедитесь что отсутствует фрагментация файла на уровне NTFS, например используя Operating System Disk management tools. Избавиться от такой фрагментации можно путём копирования файла на другой диск, удаления и обратного копирования
13. Установите более низкий FILLFACTOR , чтобы уменьшить разрыв страниц
14. Уменьшите размер файла данных путём разделения на несколько