DLL tối ưu hóa bộ nhớ không bị xóa


8

Từ BOL, tôi hiểu rằng các DBA không cần quản trị DLL được tạo cho các bảng được tối ưu hóa bộ nhớ hoặc các thủ tục lưu trữ được biên dịch tự nhiên, vì chúng được biên dịch lại tự động, khi dịch vụ SQL Server khởi động và được gỡ bỏ khi không còn cần thiết. Nhưng tôi đang chứng kiến ​​rằng ngay cả sau khi một bảng tối ưu hóa bộ nhớ đã bị hủy và dịch vụ được khởi động lại, các DLL vẫn tồn tại trong hệ thống tệp VÀ vẫn được tải vào bộ nhớ SQL và được gắn vào quy trình. Điều này có thể được chứng kiến ​​bởi thực tế là chúng vẫn hiển thị trong sys_dm_os_loaded_modules và bị khóa trong hệ thống tệp nếu bạn cố xóa chúng, trong khi Dịch vụ SQL đang chạy.

Đây có phải là một lỗi? Hay họ được làm sạch vào một ngày sau đó? Nếu vào một ngày sau đó, điều gì sẽ kích hoạt việc dọn dẹp, nếu đó không phải là một trường hợp khởi động lại?

Câu trả lời:


4

Đây có phải là một lỗi?

Không, nó không phải là một lỗi. Đó là do thiết kế. Chúng được giữ cho mục đích khắc phục sự cố và hỗ trợ.

Từ SQL_Server_2014_In-Memory_OLTP White_Paper

Quản trị viên cơ sở dữ liệu không cần phải duy trì các tệp được tạo bởi quá trình biên dịch gốc. SQL Server tự động loại bỏ các tệp được tạo không còn cần thiết, ví dụ như trên bảng và xóa thủ tục được lưu trữ, và trên cơ sở dữ liệu thả, mà còn trên máy chủ hoặc cơ sở dữ liệu khởi động lại.

Tôi đã cố gắng lặp lại kịch bản của bạn trên SQL Server 2014 + RTM + (Build12.0.2000.8)máy chủ - Dev Edition bằng cách tạo bảng thử nghiệm được tối ưu hóa bộ nhớ và kiểm tra dll được tải bằng cách sử dụng

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

Sau khi tôi bỏ bảng, phần dllvẫn xuất hiện trong đầu ra của câu lệnh select ở trên và các tệp vẫn nằm trong thư mục và sau khi khởi động lại chúng vẫn ở đó.

Từ sách trực tuyến -

Không cần tương tác người dùng để quản lý các tệp này ( .c, .obj, .xml, .pdb., .dll). SQL Server sẽ tạo và xóa các tệp khi cần thiết.

Vì tôi đoán, chúng ta chỉ cần làm theo những gì Microsoft nói - Máy chủ SQL sẽ quản lý chúng cho chúng ta :-)

CHỈ DÀNH CHO MỤC ĐÍCH GIÁO DỤC:

Tôi quản lý để dọn sạch các tập tin cũ bằng cách

  • Phát hành một hướng dẫn CHECKPOINTtrên cơ sở dữ liệu.
  • Lấy cơ sở dữ liệu ngoại tuyến và sau đó đưa nó trực tuyến.

Tốt nhất, bạn không nên khởi động lại phiên bản máy chủ, chỉ cần điểm kiểm tra thủ công và ngoại tuyến / trực tuyến của cơ sở dữ liệu sẽ xóa các tệp.

ví dụ: 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

--- bây giờ hãy kiểm tra xem dll đã được tải hay chưa

Tên CHỌN, mô tả TỪ sys.dm_os_loaded_modules WHERE description = 'XTP Native DLL'

nhập mô tả hình ảnh ở đây

--- bây giờ thả bảng và làm một điểm kiểm tra thủ công

use db1;
drop table dbo.t1;
checkpoint

Vẫn mô-đun được tải trong bộ nhớ ( đôi khi máy chủ khởi động lại sẽ tải mô-đun đôi khi )

nhập mô tả hình ảnh ở đây

( .c, .obj, .xml, .pdb., .dll) Vẫn còn trong thư mục:

nhập mô tả hình ảnh ở đây

Bây giờ hãy lấy cơ sở dữ liệu ngoại tuyến và sau đó mang nó trực tuyến - ( .c, .obj, .xml, .pdb., .dll) đã biến mất ...

nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.