Có phải nội bộ Theo dõi Thay đổi đã thay đổi từ SQL Server 2008 sang 2012 không?


9

Khi gặp sự cố khi đồng bộ hóa các thiết bị bị ngắt kết nối với máy chủ cơ sở dữ liệu trung tâm, chúng tôi đang gặp sự cố sau khi nâng cấp lên SQL Server 2012 trên máy chủ. Dường như CHANGE_TRACKING_MIN_VALID_VERSION đang trả về giá trị 1 cao hơn mức cần thiết (hoặc ít nhất là so với trước khi nâng cấp.)

Tôi đã làm việc qua ví dụ đi bộ tuyệt vời của Arshad Ali về cách thiết lập một ví dụ đơn giản.

Tôi đã chạy các tập lệnh từ # 1 đến # 5 để chèn, xóa và cập nhật một hàng trong bảng Nhân viên trong cả môi trường SQL Server 2008 và 2012.

Trong năm 2008, câu lệnh sau trả về 0:

SELECT CHANGE_TRACKING_MIN_VALID_VERSION(OBJECT_ID('Employee'))

Trong năm 2012, nó trả về 1.

Khi thực hiện thêm một vài tập lệnh (6-8) trong các bài kiểm tra, tôi đặt thời gian lưu thành 1 phút để hy vọng buộc hành động dọn dẹp. Tôi rời đi trong ngày và dường như nó chạy qua đêm.

Trong phiên bản 2008, CHANGE_TRACKING_CURRENT_VERSION và CHANGE_TRACKING_MIN_VALID_VERSION bằng nhau (11). Trong ví dụ 2012, CHANGE_TRACKING_MIN_VALID_VERSION cao hơn một (12) so với CHANGE_TRACKING_CURRENT_VERSION (11). Điều này có thể có tác động đến quá trình đồng bộ hóa khi cơ sở dữ liệu không hoạt động trong thời gian dài. Và chúng tôi đã thấy rằng quá trình có thể bị vướng vào một vòng lặp, đặc biệt là khi thử nghiệm sau được thực hiện để xác định xem có phải khởi tạo lại, trái với đồng bộ hóa hay không:

IF CHANGE_TRACKING_MIN_VALID_VERSION(object_id(N'dbo.Employee')) > @sync_last_received_anchor 
       RAISERROR (N'SQL Server Change Tracking has cleaned up tracking information for table ''%s''...

Có ai khác trải qua sự thay đổi trong hành vi này? Có ai có một lời giải thích?


2
Có một mục Microsoft Connect cho vấn đề này, connect.microsoft.com/QueryServer/feedback/details/770014/ về cơ bản Microsoft nghĩ rằng vấn đề có thể liên quan đến tham nhũng trong cơ sở dữ liệu. Bạn có thể repro tình huống này trong một cơ sở dữ liệu mới được tạo ra?
Max Vernon

1
Max, tôi đã xem lại bài viết Connect. Thật không may, poster ban đầu dường như đã từ bỏ cuộc thảo luận và MS đã đóng vấn đề. Khi thiết lập tái tạo vấn đề, tôi bắt đầu thử nghiệm với các cơ sở dữ liệu mới được tạo trong cả phiên bản 2008R2 và 2012. Cả hai cơ sở dữ liệu dường như hoạt động bình thường trong tất cả các khía cạnh khác.
Glenn Estrada

3
Với các bước repro cho vấn đề, vui lòng báo cáo nó trên Connect để họ có thể khắc phục!
Jon Seigel

Bạn đã thay đổi Mức độ tương thích của DB sau khi nâng cấp? Tôi không sử dụng theo dõi thay đổi, nhưng hãy nghĩ về một phiên bản không khớp sau khi nâng cấp.
Guillaume R.

Câu trả lời:


3

Người ta không sử dụng min_valid_version để theo dõi các thay đổi. Điều này chỉ được sử dụng để xác thực nếu khách hàng của bạn phải được khởi tạo lại, nếu siêu dữ liệu đã được dọn sạch trước khi khách hàng có thể sử dụng các thay đổi.

CHANGE_TRACKING_MIN_VALID_VERSION (Giao dịch-SQL)

Có được phiên bản tối thiểu hợp lệ để sử dụng để lấy thông tin theo dõi thay đổi từ bảng được chỉ định khi bạn đang sử dụng CHANGETABLEchức năng.

Min_valid_version thay đổi với phiên bản dọn dẹp và không phụ thuộc vào các thay đổi đối với bảng người dùng. Mỗi khi luồng dọn dẹp chạy, có thể có một bản cập nhật cho min_valid_version bất kể thay đổi dữ liệu.

Trước năm 2012, min_valid_version đã được đánh dấu giống như phiên bản dọn dẹp, trong khi thực tế, nó phải là một phiên bản nhiều hơn phiên bản dọn dẹp vì siêu dữ liệu cho phiên bản đó đã được dọn sạch. Vào năm 2012, đó là những gì họ đã thay đổi để đảm bảo họ cập nhật đúng min_valid_version.

Không nên theo dõi thay đổi bằng min_valid_version, thay vào đó nên lưu last_sync_version sau mỗi đồng bộ hóa và gọi CHANGETABLEđể liệt kê các thay đổi sau phiên bản đồng bộ hóa cuối cùng.

Theo thiết kế - Phiên bản hợp lệ tối thiểu thay đổi với phiên bản dọn dẹp và không phụ thuộc vào các thay đổi đối với bảng người dùng. Mỗi khi luồng dọn dẹp chạy, có thể có một bản cập nhật cho phiên bản hợp lệ tối thiểu bất kể thay đổi dữ liệu.

Giải quyết - Thay đổi quy trình để sử dụng 'current_version' thay vì 'min_valid_version'

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.