Требуется временное решение для SQL Server Frozen Ghost Cleanup

15

У меня есть несколько таблиц с количеством строк от 5M до 1,5G

У каждой таблицы есть поле BLOB, размер которого варьируется от 100 байт до 30 мегабайт и который хранится в виде «типов больших значений вне строки» = ON

Таблицы хранятся в разных файловых группах по 3-4 файла на каждом диске @ разные LUNs @ очень быстрое SAN

Каждый день эти таблицы увеличиваются до 5-100 ГБ в размерах и 600К - 1,5М строк

По истечении определенного промежутка времени , который варьируется от 2 недель до 6 месяцев, некоторые строки удаляются или перемещаются в архивную БД, поэтому в рабочих таблицах старше 6 месяцев нет строк.

Текущая конфигурация сервера:

  • Ядро SQL-сервера 2008 R2 SP1 Enterprise, 24 ядра, 64 ГБ ОЗУ
  • SQL Server работает с дополнительными флагами запуска:

-Т 3640; (Устраняет отправку сообщений DONE_IN_PROC клиенту для каждого оператора в хранимой процедуре. Это похоже на настройку сеанса SET NOCOUNT ON, но при установке в качестве флага трассировки каждый сеанс клиента обрабатывается таким образом)

-T 1118; (переключает выделения в tempDB с 1pg за раз (для первых 8 страниц) на один экстент.)

-T 2301; (Включает расширенную оптимизацию, специфичную для запросов поддержки принятия решений. Этот параметр применяется к обработке поддержки принятия решений больших наборов данных)

-T 1117; (Увеличивает все файлы данных одновременно, иначе он идет по очереди.)

-E; (Увеличивает количество экстентов, которые выделяются для каждого файла в файловой группе. Этот параметр может быть полезен для приложений хранилища данных, у которых ограниченное число пользователей, выполняющих индекс или сканирование данных)

-T 834; (Заставляет SQL Server использовать выделения больших страниц Windows для памяти, выделенной для пула буферов, http://msdn2.microsoft.com/en-us/library/aa366720.aspx , http://support.microsoft. com / kb / 920093 )

  • SQL Server использует большие страницы
  • SQL Server использует опцию быстрой инициализации файла
  • AUTOSHRINK выключен для всех баз данных

Проблема в том, что, начиная с некоторой точки времени работы сервера (от пары дней до месяцев), GHOST CLEANUPпроцесс отказывается от принудительной очистки и просто выполняет свою обычную работу - очищает несколько страниц за несколько секунд ( which is seen thru Extended Events), что не подходит , потому что он не может очистить все удаленные строки

Проблема сохраняется со времен SQL Server 2005 RTM Enterprise

Как я пытался решить проблему:

  • Пытался форсировать операции SCAN над кластерными индексами таблиц.
  • Попытался принудительно выполнить операции SCAN, которые включают все содержимое столбца BLOB в кластеризованных индексах таблиц.
  • system sp_clean_db_free_space & sp_clean_db_file_free_space
  • вручную dbcc cleanpage (@dbid, @fileid, @page) для всех файлов и страниц в БД
  • кластерный индекс перестраивает и реорганизует
  • воссоздание базы данных
  • DBCC FORCEGHOSTCLEANUP

  • Когда я запускаю запрос:

    select * 
    from sys.dm_db_index_physical_stats(db_id(), object_id('ProblemTable'), 1, 0, 'detailed')

    Я вижу миллионы и десятки миллионов фиктивных записей, но только для типа единицы выделения LOB_DATA

Единственное, что помогает:

  • остановка сервера с помощью команды SHUTDOWN или перезапуск всего хоста - это помогает, после перезапуска процесс GHOST CLEANUP выполняется несколько часов и фактически очищает все скрытые записи
  • DBCC SHRINKFILE с опцией EMPTYFILE - перемещение всех данных из одного файла в другой или только что созданные файлы очищает только записи-призраки в этом файле - проблема в том, что я действительно ненавижу операции сжатия. И это занимает 3-4 дня для одного файла

вопрос - существует ли какой-либо программный (предпочтительный) или обслуживающий способ заставить GHOST CLEANUP вообще без простоя сервера, потому что время простоя сервера стоит слишком дорого, даже недопустимо - от тысяч до десятков тысяч долларов в час

Проблемы были замечены так же, как мои здесь:

И то же самое здесь:

Олег Док
источник

Ответы:

12

Наконец, MS признала проблему как ошибку: http://support.microsoft.com/kb/2622823

Вкратце: это исправлено в

  • SQL Server 2008 SP3 CU4
  • SQL Server 2008 R2 CU10
  • SQL Server 2008 R2 SP1 CU4

В Sql Server 2012 с пакетом обновления 1 (SP1) проблема не возникает более года.

Олег Док
источник
3

Это вопрос, который следует задать CSS, чтобы они могли решить эту проблему с вами. Возможно, у вас есть гарантия на программное обеспечение и контракт на поддержку. Если вы этого не сделаете, несколько сотен долларов не должны быть слишком большими, если перезапуск экземпляра обойдется вам в тысячи долларов в час.

Вы пытались разрешить закрытие базы данных и затем включить ее в сеть? Это приведет к аварийному восстановлению и может привести к удалению призрака.

Вы часто пишете на стол? Под часто я имею в виду все время?

Что касается MSKB 932115, вы видите записи о призраках, оставленные только во всех файлах, или это очищает первый файл в файловой группе?

Почему использование -T1117 и мгновенный файл init?

mrdenny
источник
1. Я обязательно пойду в службу поддержки MS. 2. Если я закрываю БД, она поднимается примерно на 10-30 минут, переворачивая назад и вперед, что недопустимо. 3. ГХ работает, но не обрабатывает удаленные записи внеблоковых больших объектов. 4. Запись в таблицы, выполняемая постоянно в зависимости от времени суток, от 20 до 600 операций записи в секунду и все время. 5. Первый файл БД не используется - он не имеет больших таблиц и используется только как системное хранилище, а значит, в нем просто нет никаких записей-призраков.
Олег Док
с -T1117 я просто хочу распределить всю нагрузку между несколькими файлами, вместо этого, когда от файловой группы остался только один файл, где все еще остается свободное пространство - он начинает замедляться на защелках PFS, мгновенный запуск файла сводит к минимуму время нарастания файла, потому что приращение установлено в 10-50 Гб за ход. Я не могу просто установить файлы настолько большими, насколько смогу, потому что это совершенно непредсказуемо - какие файлы получат свои данные сегодня и в каком объеме. Проще попросить администраторов SAN добавить больше места, чем предсказать, кому я должен добавить это место.
Олег Док