SQL Server làm thế nào để có được xung quanh nhật ký giao dịch được lấp đầy khi cập nhật một cột thành int


18

Tôi có một bảng SQL Server 2005 được gọi BRITTNEY_SPEARS_MARRIAGESvà nó có các cột sau:

MarrigeId tinyint, 
HusbandName varchar(500),
MarrigeLength int

Bây giờ tôi có một bảng khác BRITTNEY_SPEARS_MARRIAGE_STORIES

StoryId int, 
MarriageId tinyint, 
StoryText nvarchar(max)

Vấn đề là chúng tôi muốn cập nhật MarrigeIdcột thành một inttừ a tinyint. Chúng tôi chỉ cảm thấy rằng Brittney sẽ có rất nhiều cuộc hôn nhân trước khi mọi thứ được nói và làm.

Bây giờ BRITTNEY_SPEARS_MARRIAGE_STORIESbảng có 18 triệu hàng trong đó (cô gái có một số vấn đề) vì vậy khi chúng tôi thực hiện cập nhật, nhật ký giao dịch sẽ đầy và hộp SQL Server của chúng tôi chết.

Làm thế nào chúng ta có thể nhận được xung quanh này?

Có cách nào để nói "Này SQL Server Tôi sẽ cập nhật cột này và làm cho nó lớn hơn. Hãy tin tôi vào Máy chủ SQL này. Vui lòng không điền vào nhật ký giao dịch trong khi bạn cố gắng xác thực mọi thứ?"

Câu trả lời:


7

Không có cách nào để bảo SQL Server không sử dụng nhật ký giao dịch.

Những gì bạn có thể làm là đặt mô hình khôi phục của cơ sở dữ liệu thành SIMPLE, sẽ ghi đè lên các mục nhật ký cũ khi cần không gian. Tuy nhiên, bạn không nên làm điều này trên máy chủ sản xuất của mình, vì bạn sẽ không thể thực hiện một số loại khôi phục nhất định, chẳng hạn như khôi phục tại thời điểm.

Ngoài ra, bạn có thể đặt tệp nhật ký giao dịch của mình lớn hơn - như một quy tắc ngón tay cái không khoa học Tôi chắc chắn rằng A) nhật ký giao dịch của bạn có ít nhất khoảng 1,5 lần dung lượng trống so với kích thước của bảng hoặc B) rằng nhật ký giao dịch của bạn có thể tự động phát triển thành một ổ đĩa có ít nhất khoảng dung lượng đĩa trống này.

Bạn có thể giải phóng không gian nhật ký giao dịch bằng cách sao lưu nhật ký. Nếu bạn không quan tâm đến nội dung nhật ký, hãy vứt tệp đi. Một lối tắt cho điều này là BACKUP LOG <Your Database Name> TO DISK = 'NUL:'. Một lần nữa, đừng làm điều này trên một máy chủ sản xuất trừ khi bạn hoàn toàn chắc chắn rằng bạn hiểu ý nghĩa này.

Một điều khác cần cẩn thận (mặc dù nó không hoàn toàn phù hợp với câu hỏi của bạn) là đảm bảo bảng bạn đang mở rộng có một chỉ mục cụm được xác định trên đó. Nếu không, bảng có thể phải chịu một lượng rất lớn phân mảnh heap và có khả năng trở nên lớn không cần thiết đối với một thay đổi như thế này.


5
  • Bỏ bất kỳ khóa ngoại
  • Tạo bảng mới intthay vìtinyint
  • Di chuyển các hàng trên mỗi lô 1000 (chèn chúng vào bảng mới, xóa chúng khỏi bảng cũ)
  • Bỏ bàn cũ
  • Đổi tên các bảng mới thành các tên cũ bằng cách sử dụng sp_rename
  • Tạo lại khóa ngoại

pS Nếu nhật ký giao dịch của bạn lớn ... hãy kiểm tra mô hình khôi phục của bạn. Nếu mô hình khôi phục của bạn không có simple, đã bao lâu kể từ lần cuối bạn sao lưu nhật ký?


Ý bạn là vì bạn đã sao lưu nhật ký, sao lưu cơ sở dữ liệu sẽ không làm cho nhật ký nhỏ hơn.
HLGEM

@HLGEM: Bạn nói đúng, tôi vừa đọc một bài viết của Paul Randal về chủ đề đó. Mặc dù vậy, nếu bạn chỉ sao lưu toàn bộ thì bản ghi của bạn sẽ tiếp tục phát triển.
Andomar
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.