Khi được phát hiện và kiểm tra trang Torn được giới thiệu cho SQL Server và các hành vi nâng cấp là gì?


15

Có hai tùy chọn khác nhau trong SQL Server hiện đại để xác minh trang; được Torn Trang DetectionChecksum . Không có tất nhiên cũng là một lựa chọn.

Tôi tin rằng Checksum đã được giới thiệu trong SQL Server 2005 và việc nâng cấp hoặc khôi phục DB từ phiên bản trước sẽ duy trì phương thức xác minh trang trước đó. tức là không có nâng cấp ngầm.

Vấn đề liên quan là chúng tôi có một cơ sở dữ liệu sản xuất được đưa vào sản xuất bằng SQL Server 2000 và từ đó đã chuyển sang máy chủ SQL Server 2008 R2. Xác minh trang được đặt thành Không khi tôi đã mong đợi nó là Phát hiện trang bị rách . Quay trở lại lượng thời gian này dường như chúng ta nghĩ rằng DB ban đầu được phát triển trong SQL Server 7.0 sau đó được chuyển sang SQL Server 2000 và điều này có thể giải thích kết quả quan sát được.

Tôi đã tự hỏi khi Torn Trang DetectionChecksum trở thành một tính năng của SQL Server, và cách họ cư xử khi di cư hoặc nâng cấp lên phiên bản mới hơn.

Chỉnh sửa: Tóm tắt một số câu trả lời:

Có một chút khác biệt về một số ngày mà Phát hiện Trang Torn xuất hiện trong SQL Server.
Liên kết 1: http://support.microsoft.com/kb/230785
Liên kết 2: http://technet.microsoft.com/en-us/l Library / aa337525 (v = sql.90) .aspx

Liên kết đầu tiên chỉ ra SQL 7.0 và SQL2000 thứ hai. Tôi có xu hướng đặt niềm tin vào đề xuất SQL7.0 và liên kết hai đã bị nhầm lẫn về việc nó bị tắt theo mặc định trong SQL7.0 và theo mặc định trong SQL2000.


2
nó được giới thiệu khi mã được cam kết.
swasheck

Tại sao nó quan trọng? Vấn đề đang được giải quyết ở đây là gì?
Mary

@swasheck - xin lỗi tôi không hiểu bình luận của bạn
Paul

1
@Paul đã bỏ phiếu để mở lại
swasheck

1
@Paul Tôi đã thêm thông tin trang dbcc để kiểm tra các trang bị rách hoặc các bit tổng kiểm tra trong câu trả lời của tôi.
Kin Shah

Câu trả lời:


15

Trong SQL Server 2000, nếu bạn muốn xác định các trang bị hỏng, thì tùy chọn cơ sở dữ liệu TORN_PAGE_DETMENT phải được đặt thành TRUE.

Nhưng trong SQL 2005 trở lên, một cài đặt mới PAGE_VERIFY đã thay thế TORN_PAGE_DETMENT cũ cho phép chọn từ hai loại xác minh trang khác nhau: TORN_PAGE_DETMENT và CHECKSUM.

Bây giờ câu hỏi đặt ra cái nào sẽ được đặt - TORN_PAGE_DETMENT hoặc CHECKSUM?

TORN_PAGE_DETMENT - ghi một bit cho mỗi 512 byte trong một trang cho phép bạn phát hiện khi một trang không được ghi thành công vào đĩa. Điều hấp dẫn là nó sẽ không cho bạn biết liệu dữ liệu được lưu trữ trong 512 byes đó có thực sự chính xác hay không do thực tế là một vài byte có thể đã được viết không chính xác.

KIỂM TRA - sẽ nhân một tổng kiểm tra của trang cả khi một trang được viết và khi một trang được đọc, giả sử nó có tổng kiểm tra trên đó.

Máy chủ SQL tính toán tổng kiểm tra dựa trên mẫu bit trên trang, lưu nó trong tiêu đề trang và sau đó phát hành I / O để viết trang. Khi SQL Server đọc trang, nó sẽ tính lại tổng kiểm tra bằng cách sử dụng cùng logic và sau đó so sánh nó với giá trị có sẵn trong tiêu đề trang. Nếu giá trị tổng kiểm tra khớp thì đó là giả sử trang không bị hỏng trong chu kỳ ghi-đọc.

Vì chi phí tính toán tổng kiểm tra phát sinh trên mỗi trang đọc và ghi, nên nó có thể thêm vào chi phí CPU và có thể ảnh hưởng đến thông lượng của khối lượng công việc của bạn. Một lưu ý khác là tổng kiểm tra không phải là duy nhất cho một mẫu bit cụ thể trên trang. Hai trang có thể có thể ánh xạ tới cùng một giá trị tổng kiểm tra. Vì vậy, có khả năng từ xa rằng tham nhũng trang có thể không bị phát hiện.

Tham khảo: Tổng kiểm tra trong SQL2005

Để trả lời cụ thể câu hỏi của bạn:

Tôi tin rằng Checksum đã được giới thiệu trong SQL2005 và việc nâng cấp hoặc khôi phục DB từ phiên bản trước sẽ duy trì phương thức xác minh trang trước đó. tức là không có nâng cấp ngầm.

Có CHECKSUM đã được giới thiệu trong SQL Server 2005 và là DEFAULT . Khi bạn nâng cấp từ 2000 lên 2005, bạn phải thay đổi rõ ràng tùy chọn cơ sở dữ liệu Trang Xác minh để sử dụng CHECKSUM.

Nếu bạn khôi phục cơ sở dữ liệu đã được tạo trên sql 2005 sang một máy chủ khác chạy sql 2005, bạn không phải thiết lập nó. Nó sẽ tiếp tục với những gì bạn đã đặt tùy chọn Xác minh trang thành.

Tôi đã không thành công trong việc nghiên cứu khi Phát hiện trang bị rách

Từ: http://support.microsoft.com/kb/230785

Các phiên bản của SQL Server sớm hơn 7.0

Các phiên bản của SQL Server trước 7.0 không cung cấp các phương tiện phát hiện bit chẵn lẻ hoặc rách bit. Trên thực tế, các phiên bản đó có thể viết cùng một trang nhật ký nhiều lần cho đến khi các bản ghi nhật ký điền vào trang nhật ký 2 KB. Điều này có thể phơi bày các giao dịch đã cam kết thành công. Nếu trang nhật ký đang được viết lại trong một thất bại, một khu vực với giao dịch đã cam kết có thể không được viết lại đúng cách.

Do đó, TORN_PAGE_DETMENT đã xuất hiện kể từ SQL Server 7.0. Ngay cả khi đó, mặc định là nó không được kích hoạt (cùng một liên kết) .

Lưu ý Phát hiện trang bị rách không được bật theo mặc định trong SQL Server 7.0. Xem sp_dboption để biết cách kích hoạt phát hiện trên hệ thống của bạn.

Do đó, nếu cơ sở dữ liệu được phát triển dựa trên phiên bản 7.0 và sau đó được nâng cấp, thì nó sẽ nâng cấp tùy chọn PAGE VERIFY còn tồn tại của NONE (như @ThomasStringer đã lưu ý trong câu trả lời của anh ấy).


Chỉnh sửa: 24/9/2013 Để cải thiện câu trả lời:

Tham khảo Máy chủ SQL của tôi Ghi chú nội bộ từ SQLSkills, tôi thấy rằng bằng cách sử dụng kết xuất trang, bạn có thể xác minh xem phát hiện bit bị rách - TORN_PAGE_DETMENT hoặc CHECKSUM đã được bật hay chưa:

use database_name -- change here for your database !!
checkpoint
go 
dbcc traceon (3604)   -- send output to screen
go
dbcc page (dbaalert, 1,1,0)
dbcc traceoff (3604)  -- turn off the trace flag
go

m_tornBits : Cái này giữ tổng kiểm tra trang hoặc các bit bị thay thế bởi các bit bảo vệ trang bị rách - tùy thuộc vào hình thức bảo vệ trang nào được cung cấp cho cơ sở dữ liệu.

Lưu ý : Tôi không có bất kỳ phiên bản máy chủ sql cũ nào đang chạy. Dưới đây được xác nhận từ máy chủ sql 2000 trở lên . Nếu bạn có 7.0 hoặc 6.5 chạy xung quanh, bạn cũng có thể xác nhận nó :-)

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


@Kin aye Tôi cũng biết nó có trong SQL2000, muốn biết khi nào nó được giới thiệu lần đầu tiên. bởi cụm từ "chuyển sang các phiên bản trước", chúng ta hãy giả vờ TPD đã được giới thiệu trong SQL2000 sau đó chuyển từ SQL7 sang SQL2000 sẽ được chuyển giữa các phiên bản trước SQL2005. Tôi muốn biết liệu TPD có bị thay đổi trong quá trình di chuyển như vậy không. Tôi hoàn toàn mong đợi nó sẽ không nhưng chưa thể xác minh như vậy.
Paul

@paul Tôi đã xóa chúng vì tôi cảm thấy rằng bản chỉnh sửa của mình bao gồm các bình luận
swasheck

@Kin Tôi đã thử mã DBCC của bạn trên SQL2008R2 và nhận được giá trị m_tornbits là 1711843878 .. vì vậy, đó có phải là thước đo thay vì boolean không?
Paul

@Paul có nghĩa là tổng kiểm tra hoặc trang torm đang BẬT. Trên a2005 trở lên, bạn chỉ nên dùng CHECKSUM. Tự hỏi nếu bạn có bất kỳ 7.0 nằm xung quanh để kiểm tra?
Kin Shah

6

Hãy xem tài liệu tham khảo từ BOL :

Khi cơ sở dữ liệu người dùng hoặc hệ thống được nâng cấp lên SQL Server 2005 hoặc phiên bản mới hơn, giá trị PAGE_VERIFY (NONE hoặc TORN_PAGE_DETMENT) được giữ lại. Chúng tôi khuyên bạn nên sử dụng KIỂM TRA

Điều này ra lệnh rằng trước SQL Server 2005, tùy chọn TORN_PAGE_DETECTIONtồn tại, nhưng không CHECKSUM.

Và để trả lời điểm thứ hai của bạn:

... và việc nâng cấp hoặc khôi phục DB từ phiên bản trước sẽ duy trì phương thức xác minh trang trước đó.

Vâng, đó là chính xác. Bạn sẽ cần phải thiết lập một cách rõ ràng cơ sở dữ liệu để sử dụng các CHECKSUMphương pháp xác minh trang.


Cảm ơn bạn đã tham khảo @Thomas nhưng điều đó không trả lời khi TORN PAGE DETATION lần đầu tiên có sẵn trong SQL Server.
Paul

2
@Paul Điều này trả lời rằng phát hiện trang bị rách đã tồn tại trước SQL Server 2005. Bạn đang tìm kiếm phiên bản SQL Server nào mà xác minh trang đã phát hành? Bên cạnh một bài học lịch sử, tôi không chắc bạn đang muốn đạt được điều gì ở đó. Vấn đề chính xác là bạn đang cố gắng giải quyết?
Thomas Stringer

Tôi đang tìm cách biết khi nào nó tồn tại và nó hoạt động như thế nào trong quá trình di cư. Tôi hy vọng hiểu làm thế nào một số DB rất cũ của chúng tôi đã có các cài đặt họ thực hiện trên một số máy chủ hiện đại (ish, SQL2008R2) của chúng tôi.
Paul

Nếu cơ sở dữ liệu của bạn có TORN_PAGE_DETMENT, thì điều đó chắc chắn có thể dẫn đến việc nâng cấp từ SQL Server 2005 và tùy chọn xác minh trang đó vẫn tồn tại.
Thomas Stringer

họ không kích hoạt TPD, đó là phần khó hiểu. Các câu trả lời khác đã cung cấp giải pháp cho vấn đề ngay bây giờ (SQL7.0 có TPD, nhưng không được bật theo mặc định và đây là phiên bản ban đầu được phát triển)
Paul

3

Có hai tùy chọn khác nhau trong SQL Server hiện đại để xác minh trang

Có ba như bạn đã nêu: TORN_PAGE_DETMENT, CHECKSUM và KHÔNG.

Tôi tin rằng CHECKSUM đã được giới thiệu trong SQL Server 2005

Theo trích dẫn từ này bài viết MSDN có tựa đề "Quản lý bộ đệm": phát hiện trang Torn đã được giới thiệu trong SQL Server 2000. Checksum được giới thiệu trong SQL Server 2005.

Một bản tóm tắt của những điều khác được lưu ý trong bài viết này là cơ chế xác minh trang được chỉ định tại thời điểm tạo cơ sở dữ liệu. Vì vậy, nó phụ thuộc vào người và cách họ tạo cơ sở dữ liệu như những gì nó được đặt, cũng có thể được kiểm soát bởi cơ sở dữ liệu mô hình nào được cấu hình. Một điều thú vị cần lưu ý là nếu bạn thay đổi cài đặt thì nó sẽ không ảnh hưởng đến toàn bộ cơ sở dữ liệu, chỉ khi trang được viết tiếp theo. Theo Paul Randal, nó chỉ được thực hiện khi trang được đọc vào bộ nhớ, thay đổi và sau đó được ghi lại vào đĩa; rằng thông tin là ở đây .

Tôi có một cơ sở dữ liệu sản xuất được đưa vào sản xuất bằng SQL Server 2000, mặc dù có thể đã được phát triển dựa trên SQL Server 7.0 và từ đó đã chuyển sang máy chủ SQL Server 2008 R2. Xác minh trang được đặt thành KHÔNG mặc dù tôi dự kiến ​​nó sẽ là PHÁT HIỆN TRANG.

Bất cứ ai có quyền đối với cơ sở dữ liệu đều có thể sửa đổi giá trị đó. Nó có thể đã tồn tại thông qua các bản nâng cấp như đã nêu trên MSDN tại đây :

Khi cơ sở dữ liệu người dùng hoặc hệ thống được nâng cấp lên SQL Server 2005 hoặc phiên bản mới hơn, giá trị PAGE_VERIFY (NONE hoặc TORN_PAGE_DETMENT) được giữ lại

Nó cũng có thể đã được sửa đổi sau đó vì ai đó hiểu nhầm cấu hình và đang chụp trong bóng tối để thử và giải quyết vấn đề.

Tôi đã tự hỏi khi TORN PAGE DETATION trở thành một tính năng Xác minh trang

SQL Server 2000 như đã nêu ở trên.

cách nó hoạt động khi di chuyển hoặc nâng cấp lên phiên bản mới hơn.

Cài đặt trước được giữ lại trong quá trình nâng cấp như đã nêu ở trên.

Bây giờ tôi muốn chỉ ra một thực tế rằng các liên kết khác được cung cấp bởi mọi người nói rằng SQL Server 7.0 là khi phát hiện trang bị rách có sẵn. Như đã nêu trong các bài viết đó là đúng, tuy nhiên, nhiều lần chứng minh rằng tài liệu của Microsoft không nên được coi là sự thật trong mọi trường hợp. Có nhiều nơi họ sai. Vì vậy, với những gì đã nói làm thế nào bạn có thể xác định câu trả lời là chấp nhận được? Tất cả chúng tôi cung cấp tài liệu của Microsoft để hỗ trợ câu trả lời của chúng tôi.

Cũng lưu ý rằng việc phát hiện trang bị rách nằm trong danh sách khấu hao kể từ SQL Server 2012, vì vậy mối quan tâm với cách nó được đặt trên cơ sở dữ liệu của bạn bắt đầu là gì. Nếu tôi thấy nó được đặt thành bất cứ thứ gì khác ngoài KIỂM TRA, tôi lập tức thay đổi nó và chuyển sang nhiệm vụ quan trọng khác. Tôi không quan tâm đến việc đặt cấu hình xấu như thế nào, điều quan trọng hơn là phải sửa nó và sau đó đảm bảo những người có quyền thay đổi sẽ được thông báo về lý do tại sao mục cấu hình đó không nên thay đổi thành bất kỳ thứ gì khác. Chỉ 0,02 đô la của tôi


Tôi nghĩ rằng năm 2000 là khi TPD mặc định thành ON. Cũng như nhiều tính năng SQL Server mới khác, họ sẽ phát hành tắt / tắt nó theo mặc định và buộc các DBA phải bật nó. Bằng mọi giá, +1 từ tôi cho cảnh báo khấu hao.
swasheck

Đó là một điểm tốt, bạn có một liên kết tốt dường như sao lưu những gì bạn nói. Nhưng tôi cảm thấy liên kết người khác được cung cấp ( support.microsoft.com/kb/230785 ) thay thế nó. Tôi có nhiều khả năng nghĩ rằng phần quản lý bộ đệm đã sai một nửa so với liên kết khác khiến nó sai. Nếu điều đó có ý nghĩa, không hoàn toàn chắc chắn rằng tôi đang đặt mình rất tốt!
Paul

Đó là một trong những điều như cấp phép, không có gì MS đưa ra về điều đó rất rõ ràng cả ...
Shawn Melton

0

Như cả @Thomas Stringer và @Kin đều nói rằng nó được giới thiệu trong SQL Server 2005 và tôi tin rằng nó hoạt động trong tất cả các phiên bản của SQL Server. Đối với TempDB mặc dù CHECKSUM đã được giới thiệu trong SQL Server 2008

http://bloss.msdn.com/b/sqlserverst Storageengine / archive / 2008/03/23 / checksum-and-tempdb.aspx


Cảm ơn @DaniSQL, tuy nhiên chưa có ai trả lời câu hỏi đầy đủ. tức là khi TORN PAGE DETATION được giới thiệu khi nào và nó hoạt động như thế nào trong quá trình nâng cấp / di chuyển.
Paul

Tôi sẽ để điều đó cho các nhà sử học tìm ra :-) Đối với việc nâng cấp / di chuyển sẽ không có gì xảy ra trừ khi bạn thay đổi tùy chọn xác minh trang thành CHECKSUM trong mỗi cơ sở dữ liệu. Ngay cả các trang đã có sẵn sẽ không có tổng kiểm tra. blogs.msdn.com/b/sqlserverstorageengine/archive/2006/06/29/...
DaniSQL

cảm ơn @DaniSQL, đó là cách tôi hiểu chuyển đổi sang SQL2005 trở lên để hoạt động. Tôi chỉ muốn đảm bảo các phiên bản trước cũng duy trì hành vi này
Paul
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.