Dọn dẹp cửa hàng phiên bản TempDB


7

Từ những gì tôi có thể tìm thấy, cửa hàng phiên bản sẽ chỉ dọn sạch các phiên bản cũ hơn giao dịch hoạt động lâu đời nhất. Câu hỏi: Là cơ sở dữ liệu giao dịch cũ nhất cụ thể hay SQL Server sẽ giữ tất cả các phiên bản, bất kể cơ sở dữ liệu, nếu có một giao dịch cũ hơn vẫn còn hoạt động, thời gian?

Backstory - SQL Server 2005 SP4 Enterprise lưu trữ khoảng 40 cơ sở dữ liệu. TempDB hiện tại là 102 GB, cửa hàng phiên bản khoảng 98 GB. Một trong những ứng dụng được lưu trữ trên phiên bản cơ sở dữ liệu có giao dịch mở đã 40 ngày tuổi dựa trên sys.dm ... database_transilities. Hai cơ sở dữ liệu lớn riêng biệt đã sử dụng rất nhiều trong tháng trước và chúng tôi đã thấy sự tăng trưởng TempDB phù hợp trùng khớp với các hoạt động này. Chúng tôi dự kiến ​​một số tăng trưởng. Chúng tôi không mong đợi nó sẽ tiếp tục phát triển. Câu hỏi: Các phiên bản được lưu trữ trong kho lưu trữ phiên bản của TempDB từ hai cơ sở dữ liệu riêng biệt này có còn bởi vì cơ sở dữ liệu độc lập thứ ba có kết nối 40 ngày và hiển thị giao dịch mở không?

Quầy Perfmon: Cửa hàng phiên bản liên tục phát triển trong vài giờ tôi đã theo dõi nó sáng nay. Tốc độ tạo phiên bản AVG khoảng 30 kb / s, Tốc độ dọn dẹp phiên bản là 0 kb / s.

Còn rất nhiều không gian cho TempDB, có khoảng 300 GB tổng số tệp dữ liệu cho tất cả các cơ sở dữ liệu người dùng, TempDB đã tăng trung bình 350 MB mỗi ngày cho mỗi 8 tệp dữ liệu kể từ lần khởi động lại cuối cùng. Hành vi này là bất thường và điều tra cho thấy các cửa hàng phiên bản lớn

Trả lời các câu hỏi bình luận để không có phần bình luận chạy dài:

Q: Tại sao tự động tăng trưởng trên tempdb? Trả lời: TempDB được thiết lập để khởi tạo ở kích thước mà chúng tôi thấy phù hợp với hầu hết thời gian. Chúng tôi cho phép tự động tăng trưởng để xử lý hoạt động cơ sở dữ liệu bất thường. Chúng tôi cũng theo dõi sự tăng trưởng tự động.

Q: Làm thế nào để bạn biết giao dịch đang hoạt động và không chỉ là một kết nối hoạt động? Trả lời: giao dịch_state cho biết hoạt động trong sys.dm_tran_active_snapshot_database_transilities và các công cụ khác. Activity Monitor cho biết mỗi kết nối có 1 giao dịch mở.

Q: Tại sao ứng dụng của bạn rất ngu ngốc? A: Bên thứ ba của nó. Một trong nhiều trường hợp này. Tôi không biết hành vi đó có bất thường hay dễ dàng sửa chữa không.

GIẢI QUYẾT

(Các) giao dịch mở nơi ngăn chặn mọi hoạt động dọn dẹp cửa hàng phiên bản, vì vậy Jon đã đúng, việc dọn dẹp cửa hàng phiên bản được thực hiện độc lập với cơ sở dữ liệu. Đóng các giao dịch vi phạm cho phép dọn dẹp cửa hàng phiên bản bắt đầu. Lý thuyết hiện tại đằng sau lý do từ Jon Seigel

Cửa hàng phiên bản chỉ có thể xóa các phiên bản dựa trên giao dịch hoạt động lâu đời nhất trong toàn bộ phiên bản, để hỗ trợ sử dụng cách ly ảnh chụp nhanh cấp độ giao dịch trên nhiều cơ sở dữ liệu cùng một lúc.

Nếu ai biết chắc chắn hoặc có thể chứng minh điều này xin vui lòng làm

Câu hỏi tham khảo: find-giao dịch-đó-đang-điền-lên-phiên bản-cửa hàng

Tài liệu tham khảo: TempDB
2005 WP
Teratrax điều chỉnh tempDB
Idera Làm sáng tỏ Tempdb


2
Chỉ vì một kết nối đã được mở trong một thời gian dài không có nghĩa là có một giao dịch đang hoạt động. Đó là cái gì Bạn có nói rằng có một giao dịch đã hoạt động trong 40 ngày?
Jon Seigel

1
Tại sao bạn để tempdb tự động liên tục? Tôi hy vọng nó không phải là mặc định, nhưng nếu bạn biết tempdb đang tăng với tốc độ này, cho đến khi bạn giải quyết được vấn đề lưu trữ phiên bản, sẽ không có ý nghĩa khi chủ động phát triển nó một lần thay vì chết bởi 1000 lần tự động?
Aaron Bertrand

@ Cougar9000 nhưng tại sao BẤT K event sự kiện tăng trưởng nào mỗi ngày?
Aaron Bertrand

Từ truy vấn đó, begin_timegiá trị cho giao dịch đang hoạt động là gì?
Jon Seigel

1
" Một trong những ứng dụng được lưu trữ trên cơ sở dữ liệu có giao dịch mở đã 40 ngày tuổi .. " Điều này cũng không thể thực hiện sao lưu bất kỳ ưu tiên nào của bạn. Nghiêm túc mà nói, cách khắc phục tốt nhất ở đây là ngừng làm việc đó . Bất kỳ chương trình hoặc sản phẩm nào giữ giao dịch mở trong thời gian dài như vậy đều bị hỏng.
RBarryYoung

Câu trả lời:


5

(Lưu ý: đây không phải là câu trả lời chắc chắn 100% và tôi không có tài liệu tham khảo, vì vậy hãy cho tôi biết nếu bạn có thể chứng minh khác đi.)

Cửa hàng phiên bản chỉ có thể xóa các phiên bản dựa trên giao dịch hoạt động lâu đời nhất trong toàn bộ phiên bản , để hỗ trợ sử dụng cách ly ảnh chụp nhanh cấp độ giao dịch trên nhiều cơ sở dữ liệu cùng một lúc. Điều đó chỉ đơn giản là không hoạt động nếu các phiên bản "cũ" trong một cơ sở dữ liệu bị xóa ở giữa giao dịch chụp nhanh của cơ sở dữ liệu khác.

Vì vậy, nếu có một giao dịch mở rất cũ, cửa hàng phiên bản sẽ không thể xóa cho đến khi giao dịch đó được thực hiện hoặc quay trở lại.


Cảm ơn Jon. Tôi sẽ phối hợp với người dùng ứng dụng để đóng hoặc
hủy

@ Cougar9000: Được rồi. Một lần nữa, tôi sẽ thực sự cảnh giác khi đưa chúng trở lại bởi vì nó có thể liên quan đến rất nhiều công việc phụ ở phía SQL để thực hiện việc khôi phục.
Jon Seigel

Vâng, luôn luôn cảnh giác. Tôi trải qua một cuộc điều tra khá rộng rãi trước khi giết bất cứ thứ gì trên cơ sở dữ liệu. Cuộc trò chuyện và bình luận của bạn đã giúp tôi cách ly người dùng đó và ứng dụng đó là nghi phạm chính trong việc ngăn chặn việc dọn dẹp cửa hàng phiên bản
Cougar9000

4

Là cơ sở dữ liệu giao dịch lâu đời nhất cụ thể hay SQL Server sẽ giữ tất cả các phiên bản, bất kể cơ sở dữ liệu, nếu có một giao dịch cũ vẫn còn hoạt động, theo chu kỳ?

SQL Server đảm bảo rằng nó giữ tất cả các phiên bản hàng thể cần thiết.

  • Cửa hàng phiên bản được chia sẻ giữa tất cả các cơ sở dữ liệu trên ví dụ.
  • Cửa hàng phiên bản được tạo thành từ một số đơn vị lưu trữ "chỉ nối thêm" (ASU).
  • Một ASU mới được tạo ra mỗi phút, nếu cần.
  • Một ASU mới không được tạo nếu không có phiên bản hàng nào được tạo.
  • ASU hiện tại được liên kết với một giao dịch khi nó bắt đầu.
  • Một giao dịch tiếp tục viết các phiên bản hàng cho cùng ASU cho đến khi hoàn thành.
  • Một ASU thường sẽ chứa các phiên bản hàng từ nhiều phiên, cơ sở dữ liệu, bảng và chỉ mục.
  • Các phiên bản hàng riêng lẻ không bị xóa - chỉ có ASU hoàn chỉnh.
  • Một ASU chỉ bị xóa khi SQL Server có thể đảm bảo nó không còn cần thiết nữa.
  • Dọn dẹp ASU được thực hiện bởi một chủ đề nền thức dậy mỗi phút.

Để mở rộng điểm cuối cùng đó, chỉ có thể xóa ASU khi:

  1. Tất cả các giao dịch nhắm mục tiêu mà ASU đã hoàn thành.
  2. Tất cả các giao dịch có thể cần các phiên bản từ ASU đó đã hoàn thành.
  3. Tất cả các ASU trước đó đã được gỡ bỏ.

Để biết thêm chi tiết, xem các tài nguyên sau:

Sử dụng tài nguyên phiên bản hàng - MSDN
Làm việc với tempdb trong SQL Server 2005 (Tài liệu Word)

Một loạt các bài viết trên blog của Sunil Argawal từ Nhóm Công cụ lưu trữ SQL Server:

Phiên bản cơ
bản Cửa hàng Phiên bản Cửa hàng Phiên bản Cấu trúc logic
Phiên bản Lưu trữ tăng trưởng và xóa phiên bản cũ

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.