Оптимизированные для памяти библиотеки DLL не удаляются

8

Из BOL я понимаю, что администраторам баз данных не нужно администрировать библиотеки DLL, созданные для таблиц с оптимизированной памятью, или встроенные хранимые процедуры, так как они автоматически перекомпилируются, когда запускается служба SQL Server, и удаляются, когда она больше не нужна. Но я свидетельствую, что даже после удаления таблицы, оптимизированной для памяти, и перезапуска службы библиотеки DLL все еще существуют в файловой системе и по-прежнему загружаются в память SQL и подключаются к процессу. Это может быть засвидетельствовано тем фактом, что они все еще видны в sys_dm_os_loaded_modules и заблокированы в файловой системе, если вы попытаетесь удалить их во время работы службы SQL.

Это ошибка? Или они убраны позже? Если позже, что запускает очистку, если это не перезапуск экземпляра?

Пит
источник

Ответы:

4

Это ошибка?

Нет, это не ошибка. Его дизайн. Они хранятся для устранения неполадок и поддержки.

Из SQL_Server_2014_In-Memory_OLTP White_Paper

Администраторам баз данных не нужно поддерживать файлы, сгенерированные собственной компиляцией. SQL Server автоматически удаляет созданные файлы, которые больше не нужны, например, при удалении таблиц и хранимых процедур, а также при удалении базы данных, а также при перезапуске сервера или базы данных.

Я попытался воспроизвести ваш сценарий на SQL Server 2014 + RTM + (Build12.0.2000.8)сервере Dev Edition, создав тестовую таблицу, оптимизированную для памяти, и проверил dll, загруженную с помощью

     SELECT name, description FROM sys.dm_os_loaded_modules
WHERE description = 'XTP Native DLL'

После того, как я удалил свою таблицу, dllв выводе вышеупомянутого оператора select все еще появляется значок, и файлы все еще находятся в папке, и после перезапуска они все еще там.

Из книг онлайн -

Для управления этими файлами взаимодействие с пользователем не требуется ( .c, .obj, .xml, .pdb., .dll). SQL Server будет создавать и удалять файлы по мере необходимости.

Так что я думаю, мы просто должны следовать тому, что говорит Microsoft - SQL-сервер будет управлять ими за нас :-)

ТОЛЬКО ДЛЯ ОБРАЗОВАТЕЛЬНОЙ ЦЕЛИ:

Мне удалось очистить старые файлы

  • Выпуск мануала CHECKPOINTпо базе данных.
  • Перевод базы данных в автономный режим, а затем вывод ее в онлайн

В идеале, вам не следует перезапускать экземпляр сервера, просто ручная контрольная точка и автономная / онлайн-база данных очистят файлы.

например, Repro:

USE master
GO
create database db1
GO
ALTER DATABASE db1 ADD FILEGROUP db1_mod CONTAINS memory_optimized_data
GO
-- adapt filename as needed
ALTER DATABASE db1 ADD FILE (name='db1_mod', filename='D:\SQLServer2014\MSSQL12.SQL2014\MSSQL\DATA\db1_mod') -- change here as per your need !!
 TO FILEGROUP db1_mod
GO
USE db1
GO
CREATE TABLE dbo.t1
(c1 int not null primary key nonclustered,
c2 int)
WITH (MEMORY_OPTIMIZED=ON)
GO

--- теперь проверь, загружена ли dll или нет

ВЫБЕРИТЕ имя, описание ОТ sys.dm_os_loaded_modules, ГДЕ описание = 'Собственная DLL XTP'

введите описание изображения здесь

--- теперь бросьте таблицу и сделайте ручную контрольную точку

use db1;
drop table dbo.t1;
checkpoint

Тем не менее модуль загружен в память (даже перезапуск сервера иногда загружает модуль )

введите описание изображения здесь

( .c, .obj, .xml, .pdb., .dll) Все еще присутствуют в папке:

введите описание изображения здесь

Теперь переведите базу данных в автономный режим, а затем включите ее - все ( .c, .obj, .xml, .pdb., .dll) исчезли ...

введите описание изображения здесь

Кин Шах
источник