TempDB sẽ không co lại. Không có giao dịch mở


9

Tôi có một TempDB trên SQL 2008 đã nhận được rất lớn (> 40gb) và tôi muốn thu nhỏ nó xuống. Tôi đã sử dụng dbcc shrdatabase, dbcc shrfile và lệnh thu nhỏ thông qua Management Studio.

Tôi nhận được lỗi sau đây:

Trang 1: 4573184 không thể di chuyển được vì đây là trang bảng làm việc.

Tôi đã có thể lấy lại một số không gian để giúp tôi thoát khỏi nguy hiểm bằng cách chạy DBCC FREEPROCCACHE và đang chạy một trong những thói quen thu nhỏ, nhưng rõ ràng điều này không lý tưởng và có thể sẽ chỉ mua cho tôi một chút thời gian.

Tôi đã chạy DBCC OpenTran và không có gì đang treo ngoài đó.

Ở mọi nơi tôi đã đọc trên internet đều có thể tái chế SQL Server ... chắc chắn phải có cách nào tốt hơn ... bất cứ ai?

Cảm ơn,

Tom

Câu trả lời:


7

Lưu ý: bài đăng này cũng có thể hữu ích:

Các vấn đề với tệp mdf TempDB ngày càng tăng

Trừ khi bạn có thể tìm ra quy trình nào đang sử dụng bảng công việc đó (và có thể tiêu diệt nó một cách an toàn), tôi sẽ phải đồng ý với những gì tìm kiếm của bạn đã mang lại: quay vòng máy chủ và bạn sẽ có thể thu nhỏ tempdb.

Một câu hỏi khác đã giải quyết việc tìm ra điều này cho các bảng #temp; Tôi không biết nếu nó có thể được điều chỉnh cho các bảng làm việc:

Tìm phiên nào đang giữ bảng tạm thời

Tôi cũng đã viết về nó (một lần nữa, cho các bảng #temp):

http://sqlperformance.com/2014/05/t-sql-queries/dude-who-owns-that-temp-table

Tôi nghi ngờ bảng làm việc có liên quan đến cách ly ảnh chụp / lưu trữ phiên bản, nhưng chỉ trong trường hợp:

Tìm các giao dịch đang lấp đầy cửa hàng phiên bản

Ngoài ra, đừng dựa vào DBCC OPENTRAN;- Tôi đã quan sát nhiều tình huống mà tôi biết tôi có một giao dịch đang hoạt động nhưng nó không hiển thị ở đó. Và lưu ý rằng bối cảnh cơ sở dữ liệu là quan trọng; cơ sở dữ liệu nơi giao dịch được kích hoạt không nhất thiết là tempdb. Bạn thấy gì ở đây? Có gì không

SELECT * FROM sys.dm_tran_active_transactions
  WHERE name = N'worktable';

Khi bạn đã thu nhỏ tempdb

Tất nhiên, đây không phải là một giải pháp lâu dài. Bạn sẽ thu nhỏ tempdb, và sau đó nó sẽ phát triển trở lại. Điều này có thể trở nên rất nhàm chán và tẻ nhạt khi chơi trò chơi này mỗi khi nó xảy ra. Và nếu nó sẽ phát triển trở lại, bạn sẽ làm gì với không gian trống đó trong lúc này? Cho thuê nó và sau đó đuổi người khi tempdb cần lại? Bạn cần phải:

  1. Khắc phục quá trình làm cho tempdb phát triển lớn bất thường ngay từ đầu.
  2. Phân bổ đủ không gian cho tempdb để nó không cần phát triển và ngừng thu hẹp nó (đặc biệt là nếu chỉ là tạm thời; đây chỉ là công việc lãng phí!).

Một vài gợi ý khác:

  • Không sử dụng SHRINKDATABASE(nên được gọi là phân đoạn tự động) hoặc UI. Viết các SHRINKFILElệnh cụ thể, nhắm mục tiêu để ảnh hưởng đến các tập tin cá nhân.
  • Cân nhắc sử dụng nhiều tệp cho tempdb (mà bạn có thể trải ra các bộ lưu trữ khác nhau nếu / khi có thể) và xem xét các cờ theo dõi 1117 (miễn là hành vi này cũng sẽ không ảnh hưởng đến cơ sở dữ liệu người dùng của bạn) và 1118.
  • Một số mẹo về giảm thiểu sử dụng tempdb tại đây:

1
CHỌN * TỪ sys.dm_tran_active_transilities WHERE name = N'worktable '; trả về 6 hàng tất cả từ cùng một ngày (7/10/14). Giao dịch_id có đại diện cho SPID không?
dùng45117

Không, giao dịch_ không phải là SPID. Nếu các giao dịch thực sự hoạt động (và chúng không phải là giao dịch hệ thống ), bạn sẽ có thể khớp với session_id trong sys.dm_tran_session_transilities. Trong mọi trường hợp, bạn có chắc chắn đây là thông điệp bạn đang nhận được từ DBCC SHRINKFILE? Điều gì về ALTER DATABASE ... MODIFY FILE? Ngoài ra tôi không chắc chắn tôi hiểu tại sao xóa bộ đệm thủ tục giúp bạn thoát khỏi rắc rối; bộ đệm thủ tục nằm trong bộ nhớ, không phải trong tempdb ...
Aaron Bertrand

Tin nhắn đến từ DBCC SHRINKDATABASE. Tôi chưa thử ALTER DATABASE ... MODIFY FILE ... sẽ tiếp theo. Xóa bộ đệm thủ tục cho phép tempdb được thu nhỏ khoảng 10% và trả lại cho tôi 4gb dung lượng ổ đĩa. Tôi không thể liên kết các giao dịch đó từ sys.dm_tran_active_transilities với bất cứ thứ gì trong sys.dm_tran_session_transilities
user45117

1
Tôi nghĩ việc xóa bộ đệm thủ tục ít liên quan đến việc "cho phép" tempdb thu nhỏ hơn bạn nghĩ. Sự trùng hợp xảy ra mọi lúc.
Aaron Bertrand

0

Ở mọi nơi tôi đã đọc trên internet đều có thể tái chế SQL Server ... chắc chắn phải có cách nào tốt hơn ... bất cứ ai?

Không, đây là một giải pháp tạm thời. Tôi đoán bạn đã đăng cùng một câu hỏi trước khi bạn có thể vui lòng cho biết tổng kích thước cơ sở dữ liệu bạn có trong phiên bản SQL Server của bạn là bao nhiêu. Kích thước của tempdb phụ thuộc vào số lượng truy vấn của bạn đang sử dụng nó. Nó không thể tự phát triển trừ khi bạn sử dụng nó. Các liên kết được chia sẻ bởi Aron sẽ giúp ích nhưng bạn cần điều chỉnh các truy vấn nếu chúng sử dụng temdbb hoặc có thể là yêu cầu mặc định của môi trường của bạn. Tôi đã thấy một vài env. trong đó 200 G của tempdb là chấp nhận được vì các truy vấn cần nhiều dung lượng tempdb.

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.