Lệnh cắt ngắn tệp nhật ký SQL Server là gì?


192

Tôi cần làm trống một tệp LDF trước khi gửi cho đồng nghiệp. Làm cách nào để buộc SQL Server cắt bớt nhật ký?

Câu trả lời:


131

nếu tôi nhớ rõ ... trong phân tích truy vấn hoặc tương đương:

BACKUP LOG  databasename  WITH TRUNCATE_ONLY

DBCC SHRINKFILE (  databasename_Log, 1)

2
Điều này chắc chắn tốt hơn so với việc đặt mô hình khôi phục cơ sở dữ liệu thành SIMPLE (như trong câu trả lời của Blorgbeard) bởi vì nếu mô hình khôi phục của bạn là ĐẦY ĐỦ, bạn sẽ đặt nó theo cách đó vì một lý do.
Scott Whitlock

52
truncate_only không được hỗ trợ trong SQL Server 2008, do đó bạn phải chuyển db sang phục hồi đơn giản msdn.microsoft.com/en-us/l Library / ms143729 (MySQL.90) .aspx
Justin Moore

10
Đối với SQL Server 2012, nó hoạt động, nhưng không có WITH TRUNCATE_ONLY.
net_prog

4
Thêm vào những gì net_prog đã nói, đối với SQL Server 2012 tôi đã thay thế dòng đầu tiên cho BACKUP LOG DatabaseNameHere TO DISK='NUL:'.
Aaron Newton

'TRUNCATE_ONLY' không phải là tùy chọn BACKUP được công nhận. (SQL Server 2019 RC1)
Tomasz Gandor

304

Trong studio quản lý:

  • Đừng làm điều này trên một môi trường sống, nhưng để đảm bảo bạn thu nhỏ dev db của mình càng nhiều càng tốt:
    • Bấm chuột phải vào cơ sở dữ liệu, chọn Properties, sau đó Options.
    • Đảm bảo "Mô hình khôi phục" được đặt thành "Đơn giản", không phải "Đầy đủ"
    • Nhấn vào OK
  • Nhấp chuột phải vào cơ sở dữ liệu một lần nữa, chọn Tasks-> Shrink->Files
  • Thay đổi loại tệp thành "Nhật ký"
  • Nhấn OK.

Ngoài ra, SQL để làm điều đó:

 ALTER DATABASE mydatabase SET RECOVERY SIMPLE
 DBCC SHRINKFILE (mydatabase_Log, 1)

Tham chiếu: http://msdn.microsoft.com/en-us/l Library / ms189493.aspx


1
Câu trả lời của bạn vừa tiết kiệm trong ngày của tôi! Tôi không biết tùy chọn "nhấp chuột phải - Nhiệm vụ -> Thu nhỏ". Cảm ơn bạn!
René

7
Bạn làm gì trong môi trường sống? Sao lưu nhật ký trước?
John Bubriski

1
Tôi không phải là DBA, nhưng vâng, tôi tin rằng việc sao lưu nhật ký sẽ cắt bớt nó: technet.microsoft.com/en-us/l Library / ms179478.aspx
Blorgbeard sẽ ra vào

2
@JohnBubriski Nếu bạn đang sử dụng mô hình khôi phục không đơn giản, nhật ký là cơ sở để khôi phục dữ liệu hoặc khôi phục giao dịch. Vì vậy, trong sản xuất, trước tiên bạn cần sao lưu các nhật ký này trước khi bạn có thể thu nhỏ các tệp nhật ký. Nếu không, sẽ không có khả năng phục hồi thực tế. Thật không may, nếu bạn đang ở trong tình huống khôi phục, bạn sẽ phải tải lại tất cả các bản sao lưu nhật ký giao dịch để khôi phục hoàn toàn DB. Thời gian vui vẻ, để chắc chắn! :)
định nghĩa

1
trong SQL Server 2012 tôi đã phải use mydatabasethực hiện trước khi thực hiệndbcc shrinkfile
knb

62

Đối với SQL Server 2008, lệnh là:

ALTER DATABASE ExampleDB SET RECOVERY SIMPLE
DBCC SHRINKFILE('ExampleDB_log', 0, TRUNCATEONLY)
ALTER DATABASE ExampleDB SET RECOVERY FULL

Điều này đã giảm tệp nhật ký 14GB của tôi xuống còn 1MB.


5
Vì câu hỏi không rõ ràng về phiên bản nào và câu trả lời được chấp nhận không áp dụng cho SQL Server 2008, câu trả lời này vẫn có hiệu lực bất kể tuổi tác.
Luật James

Cảm ơn, nó đã giúp tôi giảm một tệp Nhật ký lớn không phản ứng với DBCC SHRINKFILE
Christian Navelot

6
Đừng quên thay đổi mô hình khôi phục trở lại ĐẦY ĐỦ khi bạn hoàn tất!
Dan Bechard

Bạn nên sao lưu trước khi thực hiện việc này (hoặc bất kỳ tùy chọn cắt ngắn nào khác). Nếu bạn thực hiện sao lưu toàn bộ và kiểm tra 'Sao chép chỉ sao lưu' trong SSMS thì bạn không cần nhật ký nữa. (Đây chỉ là một điểm trong thời gian sao lưu).
Simon_Weaver

37

Đối với SQL 2008, bạn có thể sao lưu nhật ký vào nulthiết bị:

BACKUP LOG [databaseName]
TO DISK = 'nul:' WITH STATS = 10

Và sau đó sử dụng DBCC SHRINKFILEđể cắt bớt tệp nhật ký.


2
Đây là người duy nhất kết thúc hoạt động trong tình huống của tôi ... Tôi đã gặp lỗi khi cố gắng sử dụng bản sao lưu với TRUNCATE_ONLY
TomXP411

Lưu ý: việc này có thể mất khá nhiều thời gian, ngay cả trên SSD (nó phải đọc nhật ký để có thể loại bỏ nó). Đối với tệp nhật ký 30 GB trên máy ảo Azure được cung cấp năng lượng vừa phải, mất 10 phút để thực hiện 40%. Đảm bảo chuyển sang 'Tin nhắn' nhận trong SSMS để xem tỷ lệ phần trăm được xử lý.
Simon_Weaver

3

tên nhật ký sao lưu với truncate_only được theo sau bởi lệnh dbcc shrfile


0

Vì câu trả lời cho tôi đã bị chôn vùi trong các ý kiến. Đối với SQL Server 2012 trở lên, bạn có thể sử dụng như sau:

BACKUP LOG Database TO DISK='NUL:'
DBCC SHRINKFILE (Database_Log, 1)

-5

Một tùy chọn khác hoàn toàn là tách cơ sở dữ liệu thông qua Management Studio. Sau đó, chỉ cần xóa tệp nhật ký, hoặc đổi tên nó và xóa sau.

Quay lại Management Studio đính kèm cơ sở dữ liệu một lần nữa. Trong cửa sổ đính kèm loại bỏ tệp nhật ký khỏi danh sách các tệp.

DB đính kèm và tạo một tệp nhật ký trống mới. Sau khi bạn kiểm tra mọi thứ đều ổn, bạn có thể xóa tệp nhật ký được đổi tên.

Bạn có thể không nên sử dụng điều này cho cơ sở dữ liệu sản xuất.


4
Không bao giờ làm điều này! Có thể có dữ liệu trong nhật ký chưa được cam kết với tệp dữ liệu. Bạn sẽ mất dữ liệu đó.
Paul

Nếu, trong câu trả lời của bạn, bạn cảnh báo không nên thử nó trong sản xuất, nó không đáng để đăng lên.
Stan Shaw

9
Tôi không đồng ý với các downvoters - đó là một lựa chọn. Quản trị viên chỉ cần hiểu kịch bản của họ. Ví dụ: sẽ không có dữ liệu 'không cam kết' nếu không có giao dịch mở.
Gerard ONeill

3
Đây là giải pháp duy nhất làm việc cho tôi. Ổ đĩa của tôi đã được lấp đầy và tôi không thể sao lưu hoặc thu nhỏ và dường như không có gì khác đang hoạt động. Cảm ơn bạn!
Brian

3
Tôi đồng ý; nó không phải là một thực tiễn tốt nhất nhưng nó là một công cụ có giá trị nếu bạn không có lựa chọn nào khác như kịch bản của Brian.
ScottFoster1000
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.