CHECKPOINT hoặc CAMIT ghi vào đĩa?


12

Giả sử, đối với SQLServer2008R2 trở lên, với cơ sở dữ liệu chế độ khôi phục đầy đủ.

Tôi luôn nghĩ:

  1. Khi một giao dịch được cam kết (CAM KẾT), giao dịch được ghi vào nhật ký giao dịch trong RAM.

  2. Khi xảy ra CHECKPOINT (sau một thời gian và / hoặc một số giao dịch và các tiêu chí khác), các giao dịch giữa CHECKPOINT cuối cùng và hiện tại được ghi vào đĩa.

  3. Khi một BACKUP LOG xảy ra, các dữ liệu được ghi vào tệp MDF.

Tôi có đúng không? Một số đồng nghiệp của tôi nói rằng tôi sai và thật khó để tìm câu trả lời chính xác, ngay cả với BOL.

Cảm ơn!


Câu trả lời:


20

Thật không may, có một số lỗi trong các câu trả lời cho đến nay về cách thức hoạt động của CAMIT, vì vậy tôi sẽ thêm một lỗi khác. Xem cách thức hoạt động: Trình bày I / O SQL Server của Bob Dorr để biết chi tiếtKhái niệm cơ bản về I / O của SQL Server 2000 . Đây là cách nó làm việc:

  • Tất cả ghi dữ liệu được ghi đầy đủ (thay đổi) xảy ra theo trình tự chính xác sau (xem Hiểu cách SQL Server thực hiện Truy vấn: Viết dữ liệu ):

    • Trang dữ liệu được chốt độc quyền
    • Một bản ghi nhật ký mô tả sự thay đổi được thêm vào nhật ký, trong bộ nhớ. Bản ghi nhật ký mới tạo LSN mới, xem LSN: Số thứ tự nhật ký là gì .
    • Trang dữ liệu được sửa đổi (cả bản ghi dữ liệu và last_update_lsn trên trang). Trang này hiện đã được sửa đổi ('bẩn').
    • Các chốt trang dữ liệu được phát hành
    • không có gì được ghi vào đĩa trực tiếp do kết quả của bản cập nhật
  • CAM KẾT thực hiện như sau

    • thêm một bản ghi nhật ký mới mô tả CAM KẾT vào nhật ký, trong bộ nhớ
    • tất cả các bản ghi nhật ký không được xóa vào đĩa, tối đa và bao gồm cả bản ghi được tạo ở trên, được xóa (ghi vào đĩa)
    • khối luồng chờ cho đến khi HĐH báo cáo ghi ở trên là bền (IO hoàn thành)
    • Tuyên bố CAMIT (hoặc tuyên bố DML với cam kết ngầm) hoàn thành
  • CHECKPOINT thực hiện các thao tác sau (đơn giản hóa), xem Cách các điểm kiểm tra hoạt động và những gì được ghi lại :

    • Tất cả các trang bẩn trong bộ nhớ được ghi vào đĩa
      • Đối với mỗi trang bẩn, trước khi bắt đầu ghi vào đĩa, đăng nhập và bao gồm LSN là last_update_lsn trên trang đó được xóa (ghi vào đĩa). Lưu ý rằng việc tuôn ra bất kỳ LSN nào ngụ ý tất cả các LSN trước đó cũng bị xóa, do đó, đối với các trang bẩn nhất, đây không phải là hoạt động vì chính Last_update của nó có khả năng đã bị xóa.
    • bản ghi nhật ký mô tả điểm kiểm tra được ghi vào nhật ký và xóa
    • trang khởi động cơ sở dữ liệu được cập nhật với LSN của bản ghi được tạo ở trên

Viết hoạt động khác nhau cho các hoạt động được ghi nhật ký tối thiểu, xem Hoạt động có thể được ghi nhật ký tối thiểu . Các hoạt động được ghi lại tối thiểu hoạt động như sau (đơn giản hóa):

  • Trước khi chèn các hàng trong một trang như một phần của thao tác được ghi tối thiểu, một bản ghi nhật ký mô tả thực tế rằng trang tham gia vào các hoạt động được ghi nhật ký tối thiểu đang được tạo và gắn vào nhật ký (trong bộ nhớ)
  • Trang được ghi tối thiểu đang được cập nhật, vì nhiều phần chèn đang được viết trên đó là phù hợp. Không có gì được ghi lại, nothign được ghi vào đĩa.
  • Khi một hoạt động được ghi lại tối thiểu cam kết, trước khi nó cam kết, tất cả các trang tham gia vào các hoạt động được ghi lại tối thiểu trong giao dịch đó sẽ được ghi vào đĩa. Onyl sau khi quá trình ghi này hoàn tất, bản ghi nhật ký CAMIT có thể được thêm vào nhật ký (trong bộ nhớ) và nhật ký, lên đến và bao gồm bản ghi nhật ký cam kết mới được thêm này, được xóa (ghi) vào đĩa.

8

Khi một giao dịch được cam kết (CAM KẾT), giao dịch được ghi vào nhật ký giao dịch trong RAM.

Một giao dịch được ghi vào nhật ký giao dịch trước cả khi thay đổi trang hoặc dữ liệu theo yêu cầu của truy vấn. Điều này được gọi là ghi trước khi đăng nhập (WAL). Nếu SQL Server gặp sự cố trong khi một trang đang được cập nhật trong bộ nhớ, WAL đảm bảo rằng công cụ DB có thể đọc nhật ký giao dịch và phục hồi giao dịch. Đây là thuộc tính ACID của RDBMS.

Khi xảy ra CHECKPOINT (sau một thời gian và / hoặc một số giao dịch và các tiêu chí khác), các giao dịch giữa CHECKPOINT cuối cùng và hiện tại được ghi vào đĩa.

Một điểm kiểm tra xả các trang bẩn từ bộ đệm vào đĩa. Nó hoạt động một chút khác nhau cho tempdb . Một trang bẩn là một trang đã thay đổi kể từ khi được đọc từ đĩa. Quá trình điểm kiểm tra này tạo ra một dấu trong nhật ký giao dịch cho đến thời điểm mà các giao dịch đã được thực hiện. Sau một thất bại, recovery biết rằng tất cả các giao dịch đến mốc đó đã được cam kết. Bạn có thể phát hành điểm kiểm tra thủ công bằng lệnh TSQL.

Khi một BACKUP LOG xảy ra, các dữ liệu được ghi vào tệp MDF.

Không, khi nhật ký sao lưu xảy ra SQL Server sao chép thông tin nhật ký giao dịch từ tệp nhật ký cơ sở dữ liệu vào đĩa nơi bạn đang ghi bản sao lưu. Một hoạt động sao lưu đọc dữ liệu từ đĩa và ghi dữ liệu trên đĩa.

Tôi muốn bạn đọc các liên kết dưới đây

Hiểu về Ghi nhật ký và khôi phục trong SQL Server Đã được Mark chỉ ra

Sách hướng dẫn và khắc phục sự cố SQL Server 2008

Kiến trúc và quản lý Nhật ký giao dịch


Ok, có vẻ rõ ràng. Chỉ cần chắc chắn: khi một CAM KẾT xảy ra, bạn nói rằng nó được ghi vào nhật ký giao dịch; bạn có nghĩa là bộ đệm hoặc đĩa (LDF)?
madoxav

Nó sẽ luôn được ghi vào nhật ký bộ đệm trước và sau đó được chuyển sang nhật ký giao dịch trên đĩa. Tôi đã thêm liên kết quản lý nhật ký giao dịch, vui lòng tham khảo liên kết để biết WAL hoạt động như thế nào
Shanky

"Nếu SQL Server gặp sự cố trong khi một trang đang được cập nhật trong bộ nhớ, WAL đảm bảo rằng công cụ DB có thể đọc nhật ký giao dịch và phục hồi giao dịch." Điều này chỉ đúng nếu giao dịch không được cam kết. Nếu nó đã được cam kết, không có gì có thể được khôi phục. Thông tin trong nhật ký giao dịch được sử dụng để cập nhật các tệp dữ liệu. Ngay cả khi bộ đệm không được ghi vào tệp dữ liệu trước khi sự cố.
phép lạ173

@Miracle: Tôi đoán nếu trang đang được cập nhật có liên quan đến giao dịch cụ thể của giao dịch khóa học sẽ không được cam kết.
Shanky

4

Dưới đây sẽ làm rõ những điều cho bạn:

Khi một giao dịch được cam kết (CAM KẾT), giao dịch được ghi vào nhật ký giao dịch trong RAM.

  • CAM KẾT (hoặc BEGIN) không liên quan gì đến mô hình khôi phục. Đó là ở cấp độ giao dịch. Một giao dịch phải hoàn thành đầy đủ hoặc thất bại ( hãy nhớ các thuộc tính ACID ). Vì vậy, về cơ bản, một CAMIT sẽ đánh dấu sự kết thúc của một giao dịch thành công (ngầm hoặc rõ ràng). Một tuyên bố CAMIT sẽ đảm bảo rằng tất cả các sửa đổi của giao dịch được thực hiện một phần vĩnh viễn của cơ sở dữ liệu.
  • Để thực hiện bất kỳ thay đổi nào, SQL Server sẽ sử dụng WAL (Ghi nhật ký trước) trong đó trước tiên nó sẽ mô tả trong nhật ký bất kỳ thay đổi nào sắp thực hiện, trước khi sửa đổi dữ liệu.

Khi xảy ra CHECKPOINT (sau một thời gian và / hoặc một số giao dịch và các tiêu chí khác), các giao dịch giữa CHECKPOINT cuối cùng và hiện tại được ghi vào đĩa.

Khi một BACKUP LOG xảy ra, các dữ liệu được ghi vào tệp MDF.

Tham khảo:

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.