Оптимизированные для памяти библиотеки 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) исчезли ...

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.