Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Cách phát hiện và ngăn chặn sự phát triển không mong muốn của cơ sở dữ liệu SQL Server TempDB

Mỗi phiên bản SQL Server chứa cơ sở dữ liệu SQL Server hệ thống được gọi là TempDB. Nó là điển hình cho tất cả các kết nối cơ sở dữ liệu và hầu hết mọi truy vấn đều sử dụng cơ sở dữ liệu TempDB. Nó giống như một trái tim cho phiên bản SQL Server. Thực tế, chúng tôi không thể làm việc mà không có cơ sở dữ liệu TempDB.

Hãy để chúng tôi có một bản tóm tắt nhanh về các hoạt động trong đó SQL Server sử dụng TempDB.

  • Sắp xếp theo mệnh đề và Nhóm theo mệnh đề
  • Tạo chỉ mục và xây dựng lại chỉ mục trực tuyến
  • Lưu trữ bảng tạm thời và biến bảng nằm trong cơ sở dữ liệu TempDB.
  • Cách ly ảnh chụp nhanh và đọc cách ly ảnh chụp nhanh đã cam kết
  • Các lệnh DBCC
  • Hàm băm kết hợp với các con trỏ tĩnh, các giao dịch chạy lâu dài.
  • Truy vấn XML
  • Các đối tượng bên trong được tạo bởi công cụ cơ sở dữ liệu SQL Server.
  • Cửa hàng phiên bản
  • Nhiều bộ bản ghi đang hoạt động (MARS)

Bạn có thể đọc thêm về TempDB trong bài viết này.

SQL Server tạo lại cơ sở dữ liệu TempDB này trên động cơ cơ sở dữ liệu Khởi động lại dịch vụ. Việc khởi động lại này có thể do khởi động lại dịch vụ SQL tự động hoặc thủ công. Chúng tôi có thể truy vấn sys.databases để xem ngày tạo TempDB cũng là thời gian khởi động dịch vụ cơ sở dữ liệu:

SELECT create_date AS 'SQL Service Startup Time'
FROM sys.databases
WHERE name = 'tempdb';

Các cấu hình cơ sở dữ liệu TempDB SQL Server và các phương pháp hay nhất

Đôi khi, chúng tôi nhận thấy sự phát triển bất ngờ của cơ sở dữ liệu TempDB. Bước đầu tiên để tránh điều này là định cấu hình nó theo các phương pháp hay nhất. Trong phần này, chúng ta hãy xem cấu hình TempDB là các phiên bản khác nhau của SQL Server.

Định cấu hình TempDB cho nhiều Tệp DATA với tốc độ tăng trưởng đồng đều

Theo phương pháp hay nhất, chúng ta nên có nhiều tệp dữ liệu với sự phát triển đồng đều của tất cả các tệp. Số lượng tệp phụ thuộc vào bộ xử lý logic.

Bộ xử lý

Số lượng tệp dữ liệu TempDB

Bộ xử lý logic nhỏ hơn hoặc bằng tám

Tám

Bộ xử lý logic lớn hơn tám

Bắt đầu với tám tệp dữ liệu.

Tăng các tệp dữ liệu thành nhiều trong bốn và theo dõi bộ đếm hiệu suất để tranh chấp TempDB.

Đối với các phiên bản SQL Server trước năm 2016, chúng tôi không có sẵn cấu hình trong quá trình cài đặt.

Theo mặc định, nó chỉ tạo một dữ liệu và tệp nhật ký với các cấu hình sau:

Tệp chính TempDB

Tự động tăng tệp dữ liệu lên mười phần trăm (cho đến khi đĩa đầy)

Tệp nhật ký TempDB

Tự động tăng tệp dữ liệu lên mười phần trăm (cho đến khi đĩa đầy hoặc kích thước tệp nhật ký tối đa đạt đến 2 TB)

Cấu hình cơ sở dữ liệu SQL Server TempDB SQL Server 2014

SQL Server 2016 cung cấp các cải tiến cho cấu hình TempDB trong quá trình cài đặt theo phương pháp hay nhất:

TempDB Tệp chính và tệp phụ

Tự động tăng thêm 64 MB (cho đến khi đĩa đầy)

Tệp nhật ký TempDB

Tự động tăng thêm 64 MB (cho đến khi đĩa đầy hoặc kích thước tệp nhật ký tối đa đạt đến 2 TB)

Cấu hình TempDB SQL Server 2016 trở đi

Cơ sở dữ liệu SQL Server tự động tăng trưởng không đều TempDB

SQL Server sử dụng phương pháp vòng lặp để lấp đầy nhiều tệp dữ liệu nếu chúng không có cùng kích thước. Đôi khi, chúng tôi thấy rằng một tệp phát triển rất lớn, nhưng các tệp khác vẫn tăng trưởng tối thiểu. Trong trường hợp các tệp không đồng đều, SQL Server sử dụng tệp lớn hơn cho hầu hết các truy vấn và nó sẽ tiếp tục phát triển:

  1. Sử dụng cùng một cách tự động phát triển các tệp TempDB (như đã thảo luận ở phần trước).
  2. Bật cờ theo dõi 1117 để phát triển tất cả các tệp dữ liệu cùng nhau trong cơ sở dữ liệu.

Điểm thứ hai được sửa tự động trong SQL Server 2016 trở đi, tuy nhiên bạn nên kích hoạt nó trong các phiên bản trước đó. Chúng tôi không yêu cầu cờ theo dõi này trong SQL Server 2016 trở lên.

Các kịch bản tăng trưởng TempDB

Trong phần này, chúng ta sẽ thấy một vài kịch bản cho sự tăng trưởng TempDB của cơ sở dữ liệu SQL Server. Trong phiên bản SQL của tôi, tôi có tám tệp dữ liệu với cấu hình sau:

Bây giờ, hãy thực hiện truy vấn sau để tạo bảng tạm thời và thực hiện chèn dữ liệu. Vị trí lưu trữ bảng tạm thời là cơ sở dữ liệu TempDB. Truy vấn này sử dụng toán tử CROSS JOIN với nhiều cột và sắp xếp thêm các kết quả bằng mệnh đề ORDER BY.

Lưu ý: Không chạy truy vấn này trong hệ thống sản xuất; Tôi chỉ sử dụng nó cho mục đích demo.

SELECT *
FROM sys.configurations
CROSS JOIN sys.configurations SCA
CROSS JOIN sys.configurations SCB
CROSS JOIN sys.configurations SCC
CROSS JOIN sys.configurations SCD
CROSS JOIN sys.configurations SCE
CROSS JOIN sys.configurations SCF
CROSS JOIN sys.configurations SCG
CROSS JOIN sys.configurations SCH
ORDER BY SCA.name,
SCA.value,
SCC.value_in_use DESC;

Truy vấn này sẽ mất nhiều thời gian và có thể dẫn đến việc sử dụng CPU cao trong hệ thống của bạn. Trong khi truy vấn đang chạy, hãy mở một cửa sổ truy vấn khác và sử dụng DMV sys.dm_db_task_space_usage để nhận thông tin về phân bổ trang và phân bổ hoạt động theo nhiệm vụ. Chúng tôi tham gia DMV này với DMV khác để nhận thông tin cần thiết cho cơ sở dữ liệu SQL Server TempDB:

SELECT s.session_id, dbu.database_id
, dbu.internal_objects_alloc_page_count, dbu.internal_objects_dealloc_page_count
, (dbu.internal_objects_alloc_page_count - dbu.internal_objects_dealloc_page_count) * 8192 / 1024 kbytes_used_internal
, r.total_elapsed_time
FROM sys.dm_Exec_requests r
INNER JOIN sys.dm_exec_sessions s ON r.session_id = s.session_id
LEFT JOIN sys.dm_db_task_space_usage dbu ON dbu.session_id = r.session_id
AND dbu.request_id = r.request_id
WHERE internal_objects_alloc_page_count > 0
ORDER BY kbytes_used_internal DESC;
Trong đầu ra, chúng tôi thấy số lượng trang đối tượng nội bộ và kích thước của chúng (kbytes_used_internal) cho ID phiên 55. Trình tối ưu hóa truy vấn SQL Server thực hiện truy vấn này trong một mô hình song song; do đó, chúng ta có thể thấy nhiều ID phiên 71 trong đầu ra:

Bạn cũng có thể xem kế hoạch thực hiện ước tính và như được hiển thị bên dưới, chúng tôi nhận được hai toán tử tốn kém:

  • Song song:47,3%
  • Sắp xếp:52,3%

Trong toán tử sắp xếp, chúng ta có thể thấy chi phí toán tử ước tính cao là 138.576,5:

Truy vấn sau sử dụng DMV sys.dm_db_file_space_usage và kết hợp nó với sys.master_files để kiểm tra số lượng trang phạm vi được phân bổ và chưa được phân bổ trong cơ sở dữ liệu SQL Server TempDB trong khi truy vấn đang thực thi:

select mf.physical_name, mf.size as entire_file_page_count,
dfsu.unallocated_extent_page_count,
dfsu.user_object_reserved_page_count,
dfsu.internal_object_reserved_page_count,
dfsu.mixed_extent_page_count
from sys.dm_db_file_space_usage dfsu
join sys.master_files as mf
on mf.database_id = dfsu.database_id
and mf.file_id = dfsu.file_id

Chúng tôi có thể theo dõi việc thực thi truy vấn, việc sử dụng nó trong cơ sở dữ liệu TempDB và nếu được yêu cầu, hãy giết quá trình để giải phóng dung lượng ngay lập tức. Chúng tôi cũng nên tối ưu hóa truy vấn gây ra sự tăng trưởng TempDB lớn.

Giám sát việc sử dụng TempDB của cơ sở dữ liệu SQL Server bằng các sự kiện mở rộng

Các sự kiện mở rộng rất hữu ích cho việc giám sát cơ sở dữ liệu TempDB. Chúng tôi có thể thêm các sự kiện mở rộng sau bằng cách sử dụng truy vấn:

  • database_file_size_change
  • databases_log_file_used_size_changed

Tạo sự kiện mở rộng

CREATE EVENT SESSION [TempDB Usage] ON SERVER
ADD EVENT sqlserver.database_file_size_change(

ACTION(sqlserver.client_hostname,sqlserver.database_id,sqlserver.session_id,sqlserver.sql_text)),
ADD EVENT sqlserver.databases_log_file_used_size_changed(

ACTION(sqlserver.client_hostname,sqlserver.database_id,sqlserver.session_id,sqlserver.sql_text))
ADD TARGET package0.event_file(SET filename=N'TempDBUsage',max_rollover_files=(0))
WITH (STARTUP_STATE=OFF)
GO

Bắt đầu phiên sự kiện mở rộng

ALTER EVENT SESSION [TempDBTest] ON SERVER STATE = START;

Bây giờ, hãy thực thi khối lượng công việc của bạn để sử dụng cơ sở dữ liệu TempDB và phát triển các tệp dữ liệu. Các sự kiện mở rộng nắm bắt sự tăng trưởng tệp dữ liệu và truy vấn đã gây ra sự tăng trưởng này.

Bạn có thể xem tệp phiên sự kiện mở rộng ở chế độ SSMS GUI hoặc sử dụng truy vấn sau để theo dõi sự tăng trưởng TempDB.

Theo dõi sự tăng trưởng TempDB

SELECT [eventdata].[event_data].[value]('(event/action[@name="session_id"]/value)[1]', 'INT') AS [SessionID],
[eventdata].[event_data].[value]('(event/action[@name="client_hostname"]/value)[1]', 'VARCHAR(100)') AS [ClientHostName],
DB_NAME([eventdata].[event_data].[value]('(event/action[@name="database_id"]/value)[1]', 'BIGINT')) AS [GrowthDB],
[eventdata].[event_data].[value]('(event/data[@name="file_name"]/value)[1]', 'VARCHAR(200)') AS [GrowthFile],
[eventdata].[event_data].[value]('(event/data[@name="file_type"]/text)[1]', 'VARCHAR(200)') AS [DBFileType],
[eventdata].[event_data].[value]('(event/@name)[1]', 'VARCHAR(MAX)') AS [EventName],
[eventdata].[event_data].[value]('(event/data[@name="size_change_kb"]/value)[1]', 'BIGINT') AS [SizeChangedKb],
[eventdata].[event_data].[value]('(event/data[@name="total_size_kb"]/value)[1]', 'BIGINT') AS [TotalSizeKb],
[eventdata].[event_data].[value]('(event/data[@name="duration"]/value)[1]', 'BIGINT') AS [DurationInMS],
[eventdata].[event_data].[value]('(event/@timestamp)[1]', 'VARCHAR(MAX)') AS [GrowthTime],
[eventdata].[event_data].[value]('(event/action[@name="sql_text"]/value)[1]', 'VARCHAR(MAX)') AS [QueryText]
FROM
(
SELECT CAST([event_data] AS XML) AS [TargetData]
FROM [sys].[fn_xe_file_target_read_file]('C:\TEMP\TempDBusage*.xel', NULL, NULL, NULL)
) AS [eventdata]([event_data])
WHERE [eventdata].[event_data].[value]('(event/@name)[1]', 'VARCHAR(100)') = 'database_file_size_change'
OR [eventdata].[event_data].[value]('(event/@name)[1]', 'VARCHAR(100)') = 'databases_log_file_used_size_changed'
AND [eventdata].[event_data].[value]('(event/@name)[1]', 'VARCHAR(MAX)') <> 'databases_log_file_used_size_changed'
ORDER BY [GrowthTime] ASC;

Cách ly ảnh chụp nhanh

Bạn có thể sử dụng tính năng cô lập ảnh chụp nhanh cho các truy vấn của mình. Trong mô hình cô lập này, SQL Server lưu trữ các phiên bản hàng cập nhật của mỗi giao dịch trong TempDB. Trong trường hợp giao dịch lớn hoặc kéo dài, bạn có thể thấy cơ sở dữ liệu TempDB khổng lồ.

Bạn có thể thực hiện giao dịch bằng lệnh SET và chỉ định cách ly Ảnh chụp nhanh:

SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
BEGIN TRAN;
UPDATE [AdventureWorks].[Person].[Person]
SET
[Title] = 'Mr.';
COMMIT TRAN;

Bạn cũng có thể truy vấn sys.databases chế độ xem hệ thống để kiểm tra xem có bất kỳ cơ sở dữ liệu người dùng nào có cách ly ảnh chụp nhanh hay không.

Truy vấn để bật tính năng cô lập ảnh chụp nhanh trên cơ sở dữ liệu AdventureWorks

ALTER DATABASE AdventureWorks
SET ALLOW_SNAPSHOT_ISOLATION ON
GO

Truy vấn kiểm tra cơ sở dữ liệu người dùng với cách ly ảnh chụp nhanh

SELECT *
FROM sys.databases
WHERE(snapshot_isolation_state = 1
OR is_read_committed_snapshot_on = 1)
AND database_id > 4;

Trong ảnh chụp màn hình sau, bạn có thể thấy rằng cơ sở dữ liệu AdventureWorks có tính năng cô lập ảnh chụp nhanh. Cơ sở dữ liệu TempDB cũng có tính năng cô lập ảnh chụp nhanh, nhưng trong truy vấn, chúng tôi đã bỏ qua database_id nhỏ hơn 4:

Chúng tôi có thể sử dụng DMV sys.dm_db_file_space_usage để theo dõi kho phiên bản trong TempDB:

SELECT GETDATE() AS runtime,
SUM(user_object_reserved_page_count) * 8 AS usr_obj_kb,
SUM(internal_object_reserved_page_count) * 8 AS internal_obj_kb,
SUM(version_store_reserved_page_count) * 8 AS version_store_kb,
SUM(unallocated_extent_page_count) * 8 AS freespace_kb,
SUM(mixed_extent_page_count) * 8 AS mixedextent_kb
FROM sys.dm_db_file_space_usage;

Tại đây, chúng ta có thể thấy Kích thước cửa hàng phiên bản là 67968 KB. Đối với một giao dịch lớn hoặc dài hạn, bạn có thể thấy kích thước TempDB của cơ sở dữ liệu SQL Server khổng lồ do lưu trữ phiên bản này:

Một trường hợp khác có thể gây ra kích thước lớn của cửa hàng phiên bản là Luôn ở trên bản sao Thứ cấp chỉ đọc. Nếu bạn thực hiện bất kỳ truy vấn nào trên cơ sở dữ liệu thứ cấp, nó sẽ tự động sử dụng mức cô lập ảnh chụp nhanh. Như bạn đã biết, mức cô lập ảnh chụp nhanh sẽ sao chép phiên bản hàng trong TempDB.

Bạn nên theo dõi các bộ đếm hương thơm sau:

  • SQLServer:Giao dịch \ Thời gian chạy giao dịch dài nhất - Nó ghi lại giao dịch hoạt động kéo dài nhất.
  • SQLServer:Giao dịch \ Kích thước cửa hàng phiên bản (KB) - Nó ghi lại kích thước hiện tại của tất cả các phiên bản lưu trữ trong TempDB.
  • SQLServer:Giao dịch \ Tốc độ dọn dẹp phiên bản (KB / s ) - Bạn có thể sử dụng bộ đếm này để hiển thị tốc độ dọn dẹp phiên bản trong TempDB
  • SQLServer:Giao dịch \ Tốc độ tạo phiên bản (KB / s) - Bạn có thể nắm bắt tỷ lệ nắm bắt phiên bản trong cửa hàng bằng cách sử dụng bộ đếm này.

Bạn cũng nên theo dõi sự phát triển của TempDB đối với việc lập phiên bản trong Luôn luôn trên cơ sở dữ liệu phụ. Hủy các phiên đang chạy dài để nó có thể xóa phiên bản và lấy lại dung lượng trong cơ sở dữ liệu TempDB.

Kết luận

Trong bài viết này, chúng ta đã tìm hiểu về phương pháp hay nhất về cơ sở dữ liệu SQL Server TempDB cơ sở dữ liệu và các phương pháp khác nhau để phát hiện, ngăn chặn sự phát triển không mong muốn. Bạn nên theo dõi TempDB thường xuyên và định cấu hình các cảnh báo khác nhau để chủ động.

  • Giám sát kích thước TempDB
  • Lái xe giám sát không gian
  • Các giao dịch lâu dài


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách tạo Ràng buộc KIỂM TRA trong SQL Server (Ví dụ T-SQL)

  2. Hiểu Nhóm theo Mệnh đề trong SQL Server - Hướng dẫn SQL Server / TSQL Phần 130

  3. Làm thế nào để lưu trữ mật khẩu trong cơ sở dữ liệu một cách an toàn?

  4. Cập nhật tài khoản thư cơ sở dữ liệu trong SQL Server (T-SQL)

  5. Phương pháp tốt nhất để chèn bản ghi nếu bản ghi đó chưa tồn tại là gì?