Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Nhật ký giao dịch SQL Server, Phần 1:Khái niệm cơ bản về ghi nhật ký

Trong suốt sự nghiệp của mình với tư cách là một chuyên gia dữ liệu, cả trong Microsoft và với tư cách là một nhà tư vấn, tôi đã nhận thấy một trong những phần bị hiểu lầm nhiều nhất của cơ sở dữ liệu SQL Server là nhật ký giao dịch. Thiếu kiến ​​thức về cách nhật ký giao dịch hoạt động và cần được quản lý, hoặc chỉ là những quan niệm sai lầm đơn giản, có thể dẫn đến tất cả các loại vấn đề sản xuất, bao gồm:

  • Nhật ký giao dịch ngày càng mất kiểm soát và có khả năng hết dung lượng
  • Các vấn đề về hiệu suất do thu hẹp nhật ký giao dịch lặp đi lặp lại
  • Các vấn đề về hiệu suất từ ​​một sự cố được gọi là phân mảnh VLF mà tôi đã thảo luận trong bài đăng này
  • Không thể khôi phục về thời điểm mong muốn bằng cách sử dụng sao lưu nhật ký giao dịch
  • Không thể thực hiện sao lưu nhật ký đuôi trong quá trình khôi phục sau thảm họa (xem tại đây để biết giải thích về sao lưu nhật ký đuôi)
  • Các vấn đề khác nhau xung quanh việc chuyển đổi dự phòng và khôi phục hiệu suất

Với bài đăng này, tôi sẽ bắt đầu một loạt bài không thường xuyên về nhật ký giao dịch và cách nó hoạt động và nên được quản lý, đồng thời tôi sẽ đề cập đến tất cả các vấn đề ở trên trong suốt quá trình của nó. Trong bài đăng này, tôi sẽ giải thích ghi nhật ký là gì và tại sao cần ghi nhật ký.

Thuật ngữ cơ bản về ghi nhật ký

Khi tôi đang nói về bất kỳ cơ chế nào trong SQL Server, tôi nhận thấy có một vấn đề khó khăn trong đó tôi cần sử dụng một từ hoặc cụm từ trước khi giải thích. Để tránh vấn đề đó trong loạt bài này, tôi sẽ bắt đầu bằng cách giải thích một số thuật ngữ cần được sử dụng khi thảo luận về ghi nhật ký và tôi sẽ mở rộng về nhiều thuật ngữ này khi loạt bài tiếp tục.

Giao dịch, Cam kết và Hoàn vốn

Một giao dịch bao gồm một thay đổi hoặc một tập hợp các thay đổi đối với cơ sở dữ liệu. Nó có một khởi đầu xác định và một kết thúc xác định. Bắt đầu là khi câu lệnh BEGIN TRANSACTION được sử dụng hoặc SQL Server tự động bắt đầu một giao dịch cho bạn. Kết thúc có thể là một trong bốn điều:

  • Giao dịch được cam kết khi một câu lệnh GIAO DỊCH CAM KẾT được thực hiện
  • Giao dịch được cam kết khi SQL Server tự động thực hiện giao dịch trong trường hợp giao dịch tự động gửi
  • Giao dịch kết thúc quay trở lại sau khi câu lệnh GIAO DỊCH ROLLBACK được thực hiện
  • Giao dịch kết thúc khôi phục sau khi xảy ra sự cố và SQL Server tự động khôi phục giao dịch

Khi một giao dịch được cam kết, những thay đổi mà giao dịch đã thực hiện sẽ được hoàn thiện trong cơ sở dữ liệu và có giá trị lâu dài trong nhật ký giao dịch SQL Server trên đĩa. Lưu ý rằng tôi đã nói, "trong nhật ký giao dịch." Các thay đổi thực tế đối với các trang tệp dữ liệu trong bộ nhớ * không * được ghi vào đĩa khi giao dịch thực hiện. Chúng không cần phải được duy trì lâu dài trong các tệp dữ liệu vì các thay đổi đã có sẵn trong nhật ký giao dịch. Cuối cùng, các trang tệp dữ liệu sẽ được ghi vào đĩa bằng thao tác điểm kiểm tra.

Ngược lại, khi một giao dịch quay trở lại, những thay đổi dữ liệu mà giao dịch đã thực hiện sẽ không còn xuất hiện trong cơ sở dữ liệu. Vẫn sẽ có một số thay đổi vật lý trong cơ sở dữ liệu, vì việc lùi một giao dịch có nghĩa là thực hiện nhiều thay đổi hơn, nhưng bạn có thể nghĩ rằng một giao dịch được lùi lại là không ảnh hưởng đến dữ liệu trong cơ sở dữ liệu.

Các điểm kiểm tra và hoạt động khôi phục là những chủ đề xứng đáng với các bài đăng của riêng họ, vì vậy tôi sẽ giải thích chúng ở phần sau của loạt bài này.

Tôi thảo luận sâu hơn về ba thuật ngữ này trong hướng dẫn Giới thiệu về giao dịch SQL Server trên blog SentryOne.

Ghi nhật ký, Bản ghi Nhật ký và Nhật ký Giao dịch Máy chủ SQL

Ghi nhật ký đơn giản có nghĩa là tạo ra một mô tả lâu dài về sự thay đổi đối với cơ sở dữ liệu, hầu như luôn luôn trong ngữ cảnh của một giao dịch. Khi một thay đổi được thực hiện, thay đổi được mô tả trong một bản ghi nhật ký. Một bản ghi nhật ký thường có đủ thông tin trong đó để cho phép thay đổi được phát lại trong cơ sở dữ liệu hoặc quay trở lại cơ sở dữ liệu nếu cần.

Bản ghi nhật ký này ban đầu sẽ nằm trong bộ nhớ và có thể được ghi vào đĩa trước khi giao dịch thực hiện, nhưng chắc chắn phải được ghi vào đĩa trước giao dịch có thể hoàn tất việc cam kết, nếu không giao dịch sẽ không lâu dài. Một ngoại lệ cho quy tắc này là khi độ bền bị trì hoãn tính năng được bật, Aaron Bertrand thảo luận trong bài đăng này.

Các bản ghi nhật ký được lưu trữ trong nhật ký giao dịch (một hoặc nhiều tệp nhật ký trên đĩa), có kiến ​​trúc bên trong hơi phức tạp và tôi sẽ thảo luận về điều đó và nhiều hơn nữa về các bản ghi nhật ký trong bài tiếp theo của loạt bài này.

Khôi phục sự cố

Sự cố là nơi Máy chủ SQL tắt đột ngột và các cơ sở dữ liệu đã thay đổi khác nhau không thể tắt đúng cách (đảm bảo tất cả các trang tệp dữ liệu đã thay đổi đều được ghi vào đĩa và cơ sở dữ liệu được đánh dấu là đã tắt sạch).

Khi SQL Server khởi động, nó sẽ kiểm tra tất cả các cơ sở dữ liệu để xem có cơ sở dữ liệu nào không được đánh dấu là đã tắt hoàn toàn hay không. Nếu nó tìm thấy một, cơ sở dữ liệu đó phải trải qua quá trình khôi phục sự cố. Điều này đảm bảo những điều sau:

  • Đối với bất kỳ giao dịch nào đã được cam kết trước khi xảy ra sự cố, hãy đảm bảo tất cả các thay đổi trong giao dịch được phản ánh trong cơ sở dữ liệu (tức là phát lại giao dịch)
  • Đối với bất kỳ giao dịch nào không được cam kết trước khi xảy ra sự cố, hãy đảm bảo không có bất kỳ thay đổi nào trong giao dịch được phản ánh trong cơ sở dữ liệu (tức là khôi phục giao dịch)

Nói cách khác, khôi phục sự cố làm cho cơ sở dữ liệu nhất quán về giao dịch vào thời điểm vụ tai nạn xảy ra. Khôi phục sự cố được sử dụng:

  • Khi SQL Server khởi động và tìm thấy cơ sở dữ liệu cần được khôi phục
  • Trong quá trình chuyển đổi dự phòng sang bản sao thứ cấp của cơ sở dữ liệu
  • Khi kết thúc trình tự khôi phục liên quan đến các bản sao lưu (xem tại đây)

Khôi phục sự cố là một quá trình phức tạp và cần một vài bài đăng khác trong loạt bài trước khi tôi có thể giải thích sâu về nó.

Tại sao cần ghi nhật ký?

Lý do cơ bản nhất cho việc ghi nhật ký là cho phép cơ sở dữ liệu SQL Server thực hiện các giao dịch lâu bền, vì vậy chúng có thể được khôi phục trong quá trình khôi phục sự cố hoặc khôi phục nếu cần trong các hoạt động cơ sở dữ liệu bình thường. Nếu không có ghi nhật ký, cơ sở dữ liệu sẽ không nhất quán về giao dịch và có thể bị hỏng về cấu trúc sau sự cố.

Mặc dù vậy, nếu không ghi nhật ký, một loạt các tính năng khác trong SQL Server sẽ không thể thực hiện được, bao gồm:

  • Các bản sao lưu dữ liệu có thể được khôi phục một cách nhất quán
  • Bản sao lưu nhật ký giao dịch SQL Server có thể được sử dụng trong quá trình khôi phục và triển khai vận chuyển nhật ký
  • Nhân rộng, dựa vào việc có thể thu thập các giao dịch từ nhật ký giao dịch
  • Thay đổi Thu thập dữ liệu, sử dụng Tác nhân đọc nhật ký sao chép giao dịch để thu thập các thay đổi từ nhật ký giao dịch
  • Các nhóm phản chiếu cơ sở dữ liệu và tính khả dụng, dựa vào việc gửi các bản ghi nhật ký đến các bản sao thứ cấp của cơ sở dữ liệu để phát lại

SQL Server (và tất cả các máy chủ cơ sở dữ liệu tương tự) sử dụng cái được gọi là ghi nhật ký ghi trước . Điều này có nghĩa là các mô tả về các thay đổi phải được ghi vào đĩa trước khi chính các thay đổi đó xảy ra để đảm bảo khả năng khôi phục cơ sở dữ liệu đúng cách. Nếu một thay đổi được ghi vào tệp dữ liệu trước khi các bản ghi nhật ký mô tả nó và SQL Server bị lỗi, sẽ không có cách nào để biết những gì cần khôi phục và cơ sở dữ liệu sẽ không nhất quán. Thứ tự này là bất biến, bất kể mức độ cách ly, loại giao dịch hoặc liệu tính năng độ bền trì hoãn có được sử dụng hay không. Ghi nhật ký các bản ghi trước, các trang dữ liệu sau.

Chỉ là mẹo của tảng băng

Như bạn có thể thấy từ bài đăng giới thiệu này, một lượng lớn được đưa vào nhật ký giao dịch và đăng nhập vào cơ sở dữ liệu SQL Server và tất cả những gì tôi đã làm cho đến nay là xác định một số thuật ngữ cấp cao và giải thích lý do tại sao cần ghi nhật ký. Tôi hy vọng bạn sẽ tham gia cùng tôi khi tôi phân nhánh và đi sâu hơn khi bộ phim tiếp tục phát triển!


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Khi nào sử dụng Biểu thức bảng chung (CTE)

  2. Truy vấn dữ liệu bằng cách kết hợp hai bảng trong hai cơ sở dữ liệu trên các máy chủ khác nhau

  3. NEWID () so với NEWSEQUENTIALID () trong SQL Server:Sự khác biệt là gì?

  4. Cách nhanh nhất để chạy cùng một truy vấn nhiều lần trong SQL Server

  5. Không sử dụng sp_depends trong SQL Server (nó không được dùng nữa)