Làm thế nào để bạn xóa nhật ký giao dịch SQL Server?


577

Tôi không phải là chuyên gia SQL và tôi được nhắc nhở về thực tế mỗi khi tôi cần làm gì đó ngoài những điều cơ bản. Tôi có một cơ sở dữ liệu thử nghiệm có kích thước không lớn, nhưng nhật ký giao dịch chắc chắn là có. Làm thế nào để tôi xóa nhật ký giao dịch?



3
Cần có một lệnh trong Studio quản lý: "Nhấp để thu nhỏ nhật ký" và bạn đã hoàn tất.
Frenchie

Câu trả lời:


749

Làm cho một tệp nhật ký nhỏ hơn thực sự nên được dành riêng cho các tình huống mà nó gặp phải sự tăng trưởng bất ngờ mà bạn không mong muốn xảy ra lần nữa. Nếu tệp nhật ký sẽ phát triển trở lại cùng kích thước, thì sẽ không thực hiện được nhiều bằng cách thu nhỏ tạm thời. Bây giờ, tùy thuộc vào mục tiêu khôi phục cơ sở dữ liệu của bạn, đây là những hành động bạn nên thực hiện.

Đầu tiên, hãy sao lưu toàn bộ

Không bao giờ thực hiện bất kỳ thay đổi nào đối với cơ sở dữ liệu của bạn mà không đảm bảo bạn có thể khôi phục nó nếu có sự cố.

Nếu bạn quan tâm đến việc phục hồi tại thời điểm

(Và bằng cách khôi phục tại thời điểm, ý tôi là bạn quan tâm đến việc có thể khôi phục lại bất cứ thứ gì ngoài bản sao lưu đầy đủ hoặc khác biệt.)

Có lẽ cơ sở dữ liệu của bạn đang ở FULLchế độ phục hồi. Nếu không, hãy chắc chắn rằng nó là:

ALTER DATABASE testdb SET RECOVERY FULL;

Ngay cả khi bạn đang thực hiện sao lưu toàn bộ thường xuyên, tệp nhật ký sẽ phát triển và phát triển cho đến khi bạn thực hiện sao lưu nhật ký - đây là để bảo vệ bạn, không cần phải ăn mất không gian đĩa. Bạn nên thực hiện các bản sao lưu nhật ký này khá thường xuyên, theo mục tiêu phục hồi của bạn. Ví dụ: nếu bạn có một quy tắc kinh doanh nói rằng bạn có thể đủ khả năng để mất không quá 15 phút dữ liệu trong trường hợp xảy ra thảm họa, bạn nên có một công việc sao lưu nhật ký cứ sau 15 phút. Đây là một tập lệnh sẽ tạo các tên tệp được đánh dấu thời gian dựa trên thời gian hiện tại (nhưng bạn cũng có thể thực hiện việc này với các kế hoạch bảo trì, v.v., đừng chọn bất kỳ tùy chọn thu nhỏ nào trong các kế hoạch bảo trì, chúng thật tồi tệ).

DECLARE @path NVARCHAR(255) = N'\\backup_share\log\testdb_' 
  + CONVERT(CHAR(8), GETDATE(), 112) + '_'
  + REPLACE(CONVERT(CHAR(8), GETDATE(), 108),':','')
  + '.trn';

BACKUP LOG foo TO DISK = @path WITH INIT, COMPRESSION;

Lưu ý rằng \\backup_share\phải ở trên một máy khác đại diện cho một thiết bị lưu trữ bên dưới khác. Sao lưu chúng vào cùng một máy (hoặc cho một máy khác sử dụng cùng một đĩa bên dưới hoặc một VM khác trên cùng một máy chủ vật lý) không thực sự giúp bạn, vì nếu máy nổ, bạn đã mất cơ sở dữ liệu của mình bản sao lưu của nó. Tùy thuộc vào cơ sở hạ tầng mạng của bạn, có thể có ý nghĩa hơn để sao lưu cục bộ và sau đó chuyển chúng đến một vị trí khác phía sau hậu trường; trong cả hai trường hợp, bạn muốn đưa chúng ra khỏi máy cơ sở dữ liệu chính càng nhanh càng tốt.

Bây giờ, một khi bạn có các bản sao lưu nhật ký thường xuyên đang chạy, sẽ rất hợp lý khi thu nhỏ tệp nhật ký thành một cái gì đó hợp lý hơn bất cứ thứ gì nó được thổi cho đến bây giờ. Điều này không có nghĩa là chạy đi chạy SHRINKFILElại cho đến khi tệp nhật ký là 1 MB - ngay cả khi bạn thường xuyên sao lưu nhật ký, nó vẫn cần điều chỉnh tổng của bất kỳ giao dịch đồng thời nào có thể xảy ra. Các sự kiện autogrow tệp nhật ký rất tốn kém, vì SQL Server phải loại bỏ các tệp (không giống như các tệp dữ liệu khi bật khởi tạo tệp tức thời) và các giao dịch của người dùng phải chờ trong khi điều này xảy ra. Bạn muốn thực hiện thói quen tăng-giảm-tăng-thu nhỏ này càng ít càng tốt và bạn chắc chắn không muốn làm cho người dùng của mình trả tiền cho nó.

Lưu ý rằng bạn có thể cần sao lưu nhật ký hai lần trước khi có thể thu nhỏ (cảm ơn Robert).

Vì vậy, bạn cần phải đưa ra một kích thước thực tế cho tệp nhật ký của bạn. Không ai ở đây có thể cho bạn biết đó là gì mà không biết nhiều về hệ thống của bạn, nhưng nếu bạn thường xuyên thu hẹp tệp nhật ký và nó đã phát triển trở lại, một hình mờ tốt có thể cao hơn 10-50% so với lớn nhất . Giả sử có tới 200 MB và bạn muốn bất kỳ sự kiện tự động phát sinh tiếp theo nào là 50 MB, thì bạn có thể điều chỉnh kích thước tệp nhật ký theo cách này:

USE [master];
GO
ALTER DATABASE Test1 
  MODIFY FILE
  (NAME = yourdb_log, SIZE = 200MB, FILEGROWTH = 50MB);
GO

Lưu ý rằng nếu tệp nhật ký hiện tại> 200 MB, bạn có thể cần chạy tệp này trước:

USE yourdb;
GO
DBCC SHRINKFILE(yourdb_log, 200);
GO

Nếu bạn không quan tâm đến việc phục hồi tại thời điểm

Nếu đây là cơ sở dữ liệu kiểm tra và bạn không quan tâm đến việc khôi phục tại thời điểm, thì bạn nên đảm bảo rằng cơ sở dữ liệu của mình đang ở SIMPLEchế độ khôi phục.

ALTER DATABASE testdb SET RECOVERY SIMPLE;

Đặt cơ sở dữ liệu vào SIMPLEchế độ khôi phục sẽ đảm bảo rằng SQL Server sử dụng lại các phần của tệp nhật ký (về cơ bản loại bỏ các giao dịch không hoạt động) thay vì phát triển để giữ một bản ghi của tất cả các giao dịch (như FULLphục hồi cho đến khi bạn sao lưu nhật ký). CHECKPOINTcác sự kiện sẽ giúp kiểm soát nhật ký và đảm bảo rằng nó không cần phát triển trừ khi bạn tạo ra nhiều hoạt động t-log giữa CHECKPOINTcác s.

Tiếp theo, bạn nên chắc chắn tuyệt đối rằng sự tăng trưởng nhật ký này thực sự là do một sự kiện bất thường (giả sử, làm sạch mùa xuân hàng năm hoặc xây dựng lại các chỉ số lớn nhất của bạn), và không phải do sử dụng hàng ngày, bình thường. Nếu bạn thu nhỏ tệp nhật ký thành kích thước nhỏ một cách lố bịch và SQL Server chỉ cần phát triển lại để phù hợp với hoạt động bình thường của bạn, bạn đã đạt được gì? Bạn có thể sử dụng không gian đĩa mà bạn đã giải phóng tạm thời không? Nếu bạn cần khắc phục ngay lập tức, thì bạn có thể chạy như sau:

USE yourdb;
GO
CHECKPOINT;
GO
CHECKPOINT; -- run twice to ensure file wrap-around
GO
DBCC SHRINKFILE(yourdb_log, 200); -- unit is set in MBs
GO

Nếu không, thiết lập một kích thước phù hợp và tốc độ tăng trưởng. Theo ví dụ trong trường hợp khôi phục tại thời điểm, bạn có thể sử dụng cùng mã và logic để xác định kích thước tệp nào là phù hợp và đặt tham số tự động hợp lý.

Một số điều bạn không muốn làm

  • Sao lưu nhật ký với TRUNCATE_ONLYtùy chọn và sau đóSHRINKFILE . Đối với một, TRUNCATE_ONLYtùy chọn này đã không được chấp nhận và không còn có sẵn trong các phiên bản hiện tại của SQL Server. Thứ hai, nếu bạn đang ở trong FULLmô hình khôi phục, điều này sẽ phá hủy chuỗi nhật ký của bạn và yêu cầu một bản sao lưu mới, đầy đủ.

  • Tháo cơ sở dữ liệu, xóa tệp nhật ký và đính kèm lại . Tôi không thể nhấn mạnh mức độ nguy hiểm của nó. Cơ sở dữ liệu của bạn có thể không sao lưu, nó có thể xuất hiện dưới dạng nghi ngờ, bạn có thể phải quay lại bản sao lưu (nếu bạn có), v.v.

  • Sử dụng tùy chọn "thu nhỏ cơ sở dữ liệu" . DBCC SHRINKDATABASEvà tùy chọn kế hoạch bảo trì để làm tương tự là những ý tưởng tồi, đặc biệt nếu bạn thực sự chỉ cần giải quyết vấn đề về nhật ký. Nhắm mục tiêu tệp bạn muốn điều chỉnh và điều chỉnh độc lập, sử dụng DBCC SHRINKFILEhoặc ALTER DATABASE ... MODIFY FILE(ví dụ ở trên).

  • Thu nhỏ tệp nhật ký thành 1 MB . Điều này có vẻ hấp dẫn bởi vì, hey, SQL Server sẽ cho phép tôi làm điều đó trong các tình huống nhất định và xem xét tất cả không gian mà nó giải phóng! Trừ khi cơ sở dữ liệu của bạn chỉ được đọc (và đó là, bạn nên đánh dấu nó như vậy bằng cách sử dụng ALTER DATABASE), điều này hoàn toàn sẽ dẫn đến nhiều sự kiện tăng trưởng không cần thiết, vì nhật ký phải điều chỉnh các giao dịch hiện tại bất kể mô hình khôi phục. Điểm giải phóng không gian đó tạm thời là gì, để SQL Server có thể lấy lại từ từ và đau đớn?

  • Tạo một tệp nhật ký thứ hai . Điều này sẽ cung cấp cứu trợ tạm thời cho ổ đĩa đã lấp đầy đĩa của bạn, nhưng điều này giống như cố gắng sửa chữa phổi bị thủng bằng băng hỗ trợ. Bạn nên trực tiếp xử lý tệp nhật ký có vấn đề thay vì chỉ thêm một vấn đề tiềm năng khác. Khác với việc chuyển hướng một số hoạt động nhật ký giao dịch sang một ổ đĩa khác, tệp nhật ký thứ hai thực sự không có gì cho bạn (không giống như tệp dữ liệu thứ hai), vì mỗi lần chỉ có một tệp có thể được sử dụng. Paul Randal cũng giải thích lý do tại sao nhiều tệp nhật ký có thể cắn bạn sau này .

Được chủ động

Thay vì thu nhỏ tệp nhật ký của bạn xuống một số lượng nhỏ và để nó tự động liên tục ở một tỷ lệ nhỏ, hãy đặt nó ở một kích thước lớn hợp lý (một giao dịch sẽ chứa tổng số các giao dịch đồng thời lớn nhất của bạn) và đặt tự động hợp lý thiết lập như một dự phòng, để nó không phải tăng trưởng nhiều lần để đáp ứng các giao dịch đơn lẻ và do đó sẽ tương đối hiếm khi nó phải phát triển trong các hoạt động kinh doanh thông thường.

Các cài đặt tồi tệ nhất có thể có ở đây là tăng trưởng 1 MB hoặc tăng trưởng 10%. Thật thú vị, đây là những mặc định cho SQL Server (tôi đã phàn nàn và yêu cầu thay đổi không có kết quả ) - 1 MB cho các tệp dữ liệu và 10% cho các tệp nhật ký. Cái trước quá nhỏ trong thời đại ngày nay và cái sau dẫn đến các sự kiện dài hơn và dài hơn mỗi lần (giả sử, tệp nhật ký của bạn là 500 MB, tăng trưởng đầu tiên là 50 MB, tăng trưởng tiếp theo là 55 MB, tăng trưởng tiếp theo là 60,5 MB , v.v. - và trên I / O chậm, tin tôi đi, bạn sẽ thực sự chú ý đến đường cong này).

đọc thêm

Xin đừng dừng lại ở đây; trong khi nhiều lời khuyên bạn thấy ngoài kia về việc thu hẹp các tệp nhật ký vốn đã xấu và thậm chí có khả năng gây thảm họa, có một số người quan tâm nhiều hơn đến tính toàn vẹn dữ liệu hơn là giải phóng không gian đĩa.

Một bài đăng trên blog tôi đã viết vào năm 2009, khi tôi thấy một vài bài viết "đây là cách thu nhỏ tệp nhật ký" xuất hiện .

Một bài đăng trên blog Brent Ozar đã viết bốn năm trước, chỉ ra nhiều tài nguyên, để đáp lại bài viết của Tạp chí SQL Server không nên được xuất bản .

Một bài đăng trên blog của Paul Randal giải thích lý do tại sao bảo trì t-log là quan trọngtại sao bạn cũng không nên thu nhỏ các tệp dữ liệu của mình .

Mike Walsh cũng có một câu trả lời tuyệt vời bao gồm một số khía cạnh này, bao gồm cả lý do tại sao bạn không thể thu nhỏ tệp nhật ký của mình ngay lập tức .


5
Phục hồi tại thời điểm không phải là lý do duy nhất để sử dụng mô hình khôi phục hoàn toàn. Lý do chính là để ngăn ngừa mất dữ liệu. Khả năng mất dữ liệu của bạn là độ dài giữa các lần sao lưu. Nếu bạn chỉ thực hiện sao lưu hàng ngày, khả năng mất dữ liệu của bạn là 24 giờ. Nếu sau đó bạn thêm bản sao lưu nhật ký cứ sau nửa giờ, khả năng mất dữ liệu của bạn sẽ trở thành 30 phút. Ngoài ra, sao lưu nhật ký là cần thiết để thực hiện bất kỳ loại khôi phục từng phần (như để phục hồi từ tham nhũng).
Robert L Davis

9
Điều đó sang một bên, đây là câu trả lời đầy đủ và chính xác nhất được đưa ra trên trang này.
Robert L Davis

11
Tôi cũng muốn thêm rằng việc xóa nhật ký được thực hiện bằng cách sao lưu nhật ký (trong phục hồi được ghi nhật ký đầy đủ hoặc hàng loạt) hoặc một điểm kiểm tra (trong phục hồi đơn giản). Tuy nhiên, nếu bạn ở trong tình huống phải thu nhỏ tệp nhật ký, điều đó là không đủ. Bạn cần làm cho VLF hiện đang hoạt động quay trở lại bắt đầu tệp nhật ký. Bạn có thể buộc điều này trong SQL 2008 và mới hơn bằng cách phát hành hai bản sao lưu nhật ký hoặc điểm kiểm tra back-to-back. Cái đầu tiên xóa nó và cái thứ hai quay trở lại bắt đầu tập tin.
Robert L Davis

2
@Doug_Ivison vì tại bất kỳ thời điểm nào, hồ sơ nhật ký có thể bị xóa. Điều gì sẽ là điểm cho phép bạn sao lưu một bản ghi không đầy đủ? Trong phục hồi đơn giản, nhật ký chỉ thực sự được sử dụng để cho phép khôi phục giao dịch. Khi một giao dịch đã được cam kết hoặc khôi phục, giây tiếp theo nó có thể bị xóa khỏi nhật ký.
Aaron Bertrand

3
@zinczinc Ok, cảm ơn bạn đã phản hồi. Vấn đề tôi thấy khi đặt câu trả lời lên đầu và giải thích sau là họ sẽ không bao giờ đọc những phần quan trọng. Bài giảng tôi nhấn chìm người đọc thực sự quan trọng hơn nhiều so với câu trả lời ở cuối, và IMHO nền tảng tôi cung cấp là khá quan trọng để đưa ra những lựa chọn đó. Nhưng này, nếu bạn muốn gửi câu trả lời một dòng vì bạn nghĩ rằng điều đó tốt hơn cho OP, xin vui lòng sử dụng phần câu trả lời của tôi để làm cho câu trả lời tốt hơn mà chúng ta có thể học hỏi.
Aaron Bertrand

200
-- DON'T FORGET TO BACKUP THE DB :D (Check [here][1]) 


USE AdventureWorks2008R2;
GO
-- Truncate the log by changing the database recovery model to SIMPLE.
ALTER DATABASE AdventureWorks2008R2
SET RECOVERY SIMPLE;
GO
-- Shrink the truncated log file to 1 MB.
DBCC SHRINKFILE (AdventureWorks2008R2_Log, 1);
GO
-- Reset the database recovery model.
ALTER DATABASE AdventureWorks2008R2
SET RECOVERY FULL;
GO

Từ: DBCC SHRINKFILE (Transact-SQL)

Bạn có thể muốn sao lưu trước.


cảm ơn Maimonides, từ tài liệu, vì vậy tôi sẽ nói nó là tốt nhất: P đặc biệt vì không được tôi phát minh ra :)
Rui Lima

1
Sau khi tôi làm điều đó, kích thước nhật ký của tôi không thay đổi một chút. tôi đã làm gì sai sao?
chester89

1
Cách tiếp cận này đặt loại khôi phục thành "ĐẦY ĐỦ", ngay cả khi loại khôi phục là thứ khác trước đó
Vil

1
Làm việc như ma thuật! Lưu ý rằng tên của tệp nhật ký thực sự là tên logic của nó (có thể tìm thấy trong các tệp db-> property->)
Bizhan

2
Tôi muốn bao gồm một mệnh đề BACKUP DATABASE trong tập lệnh này, vì vậy không ai quên phần này. Tôi nói điều này, bởi vì vài năm trước tôi đã thu nhỏ một cơ sở dữ liệu trong một đĩa mà nó có quá ít không gian trống. Trong quá trình thu nhỏ, các tệp ngày càng lớn hơn và lỗi Out of Space bị ném. Kết quả: Tôi bị mất cơ sở dữ liệu. May mắn thay là một cơ sở dữ liệu nhật ký đã mất khả năng chịu đựng.
Cesar

185

TUYÊN BỐ TỪ CHỐI: Vui lòng đọc kỹ các bình luận bên dưới và tôi cho rằng bạn đã đọc câu trả lời được chấp nhận. Như tôi đã nói gần 5 năm trước:

Nếu bất cứ ai có bất kỳ ý kiến ​​để thêm cho các tình huống khi đây KHÔNG phải là một giải pháp đầy đủ hoặc tối ưu thì hãy bình luận bên dưới


  • Nhấp chuột phải vào tên cơ sở dữ liệu.

  • Chọn Nhiệm vụ → Thu hẹp → Cơ sở dữ liệu

  • Sau đó bấm vào OK!

Tôi thường mở thư mục Windows Explorer chứa các tệp cơ sở dữ liệu, vì vậy tôi có thể thấy ngay hiệu quả.

Tôi thực sự khá ngạc nhiên khi làm việc này! Thông thường tôi đã sử dụng DBCC trước đây, nhưng tôi chỉ thử nó và nó không thu nhỏ bất cứ thứ gì, vì vậy tôi đã thử GUI (2005) và nó hoạt động rất tốt - giải phóng 17 GB trong 10 giây

Trong chế độ Khôi phục hoàn toàn, điều này có thể không hoạt động, do đó bạn phải sao lưu nhật ký trước hoặc thay đổi thành Khôi phục đơn giản, sau đó thu nhỏ tệp. [cảm ơn @onupdatecascade vì điều này]

-

Tái bút: Tôi đánh giá cao những gì một số người đã nhận xét về sự nguy hiểm của việc này, nhưng trong môi trường của tôi, tôi không có bất kỳ vấn đề nào khi thực hiện việc này, đặc biệt là vì tôi luôn luôn sao lưu toàn bộ trước tiên. Vì vậy, vui lòng xem xét môi trường của bạn là gì và điều này ảnh hưởng đến chiến lược sao lưu và bảo mật công việc của bạn trước khi tiếp tục. Tất cả những gì tôi đang làm là chỉ cho mọi người một tính năng do Microsoft cung cấp!


50
Trong chế độ Khôi phục hoàn toàn, điều này có thể không hoạt động, do đó bạn phải sao lưu nhật ký trước hoặc thay đổi thành Khôi phục đơn giản, sau đó thu nhỏ tệp.
onupdatecascade

7
@onupdatecascade - cuộc gọi tốt về thủ thuật phục hồi hoàn toàn. có một cơ sở dữ liệu khác với một bản ghi lớn: chuyển sang đơn giản, sau đó thu nhỏ cơ sở dữ liệu và chuyển trở lại đầy đủ. đăng nhập tập tin xuống 500kb!
Simon_Weaver

26
Lấy làm tiếc. Nhưng câu trả lời này chỉ đơn giản là KHÔNG THỂ THÊM sai. Bằng cách thu hẹp cơ sở dữ liệu, bạn S grow phát triển tệp nhật ký giao dịch. BẤT K time thời gian nào bạn di chuyển dữ liệu trong cơ sở dữ liệu SQL Server, bạn sẽ yêu cầu ghi nhật ký - làm đầy tệp nhật ký. Để giảm kích thước nhật ký, hãy đặt DB thành Phục hồi đơn giản HOẶC (nếu bạn quan tâm / cần dữ liệu đã ghi - và hầu như bạn luôn luôn làm trong sản xuất) sao lưu nhật ký. Xem chi tiết trong những đơn giản, miễn phí, video: sqlservervideos.com/video/logging-essentials sqlservervideos.com/video/sql2528-log-files
Michael K. Campbell

30
Wow, kudos để nhận được hơn 1300 đại diện cho câu trả lời này, nhưng nó thực sự là một lời khuyên khủng khiếp.
Aaron Bertrand

8
Đây là một cường điệu để chứng minh những gì đang xảy ra và tại sao việc thu hẹp lại cực kỳ quan trọng trên cơ sở định kỳ: Bản ghi A được thay đổi 1 triệu lần trước khi thực hiện sao lưu. Có gì trong nhật ký? 999.999 mẩu dữ liệu không liên quan. Nếu nhật ký không bao giờ bị thu hẹp, bạn sẽ không bao giờ biết được chi phí vận hành thực sự của cơ sở dữ liệu là bao nhiêu. Ngoài ra, rất có thể bạn đang tích trữ các tài nguyên có giá trị trên SAN, rất có thể. Shrinking là bảo trì tốt và giữ cho bạn liên lạc với môi trường của bạn. Chỉ cho tôi một người nghĩ rằng bạn không bao giờ nên thu nhỏ và tôi sẽ cho bạn thấy ai đó bỏ qua môi trường của họ.
Newclique 10/2/2015

54

Dưới đây là tập lệnh thu nhỏ nhật ký giao dịch, nhưng tôi chắc chắn khuyên bạn nên sao lưu nhật ký giao dịch trước khi thu nhỏ nó.

Nếu bạn chỉ thu nhỏ tệp, bạn sẽ mất một tấn dữ liệu có thể đến như một trình cứu sinh trong trường hợp thảm họa. Nhật ký giao dịch chứa rất nhiều dữ liệu hữu ích có thể được đọc bằng trình đọc nhật ký giao dịch của bên thứ ba (có thể đọc bằng tay nhưng rất nỗ lực).

Nhật ký giao dịch cũng là điều bắt buộc khi đến thời điểm phục hồi, vì vậy đừng chỉ vứt nó đi mà hãy đảm bảo bạn sao lưu trước.

Dưới đây là một số bài đăng mà mọi người đã sử dụng dữ liệu được lưu trữ trong nhật ký giao dịch để thực hiện khôi phục:

 

USE DATABASE_NAME;
GO

ALTER DATABASE DATABASE_NAME
SET RECOVERY SIMPLE;
GO
--First parameter is log file name and second is size in MB
DBCC SHRINKFILE (DATABASE_NAME_Log, 1);

ALTER DATABASE DATABASE_NAME
SET RECOVERY FULL;
GO

Bạn có thể gặp lỗi giống như thế này khi thực hiện các lệnh ở trên

Không thể thu nhỏ tệp nhật ký (tên tệp nhật ký) vì tệp nhật ký logic nằm ở cuối tệp đang được sử dụng

Điều này có nghĩa là TLOG đang được sử dụng. Trong trường hợp này, hãy thử thực hiện điều này nhiều lần liên tiếp hoặc tìm cách giảm hoạt động cơ sở dữ liệu.


30

Đây là một cách đơn giản và rất không phù hợpcó khả năng nguy hiểm .

  1. DB dự phòng
  2. Tách DB
  3. Đổi tên tệp nhật ký
  4. Đính kèm DB
  5. Tệp nhật ký mới sẽ được tạo lại
  6. Xóa tập tin Nhật ký đổi tên.

Tôi đoán rằng bạn không thực hiện sao lưu nhật ký. (Cắt ngắn nhật ký). Lời khuyên của tôi là thay đổi mô hình phục hồi từ đầy đủ sang đơn giản . Điều này sẽ ngăn chặn sự phình to đăng nhập.


15
Trân trọng, xóa / đổi tên / tạo lại / thay thế nhật ký là một ý tưởng rất xấu. Shrink phải ít rủi ro hơn, cộng với việc thực hiện khá đơn giản.
onupdatecascade

12
+1 - Không liên quan hay không, phương pháp này đã đưa tôi ra khỏi nước nóng một vài lần với các bản ghi cơ sở dữ liệu đã lấp đầy toàn bộ đĩa, do đó ngay cả một lệnh thu nhỏ cũng không thể chạy.
Shaul Behr

3
Không có rủi ro của các giao dịch không được kiểm tra hiện có trong nhật ký?
Paul

Điều này cũng có thể tốt cho các DB nhỏ hơn, nhưng nếu bạn có DB 3 hoặc 4 TB, thì đó có thể không phải là giải pháp tốt nhất.
Jaques

Điều này có vẻ ổn nếu bạn đã phát triển một hệ thống trong một thời gian dài và tải / xóa hàng ngàn bản ghi trong thời gian phát triển. Sau đó, khi bạn muốn sử dụng cơ sở dữ liệu này để triển khai, dữ liệu thử nghiệm / phát triển đã được ghi lại là dư thừa và do đó không có vấn đề gì nếu bị mất, không?
JsonStatham

28

Nếu bạn không sử dụng nhật ký giao dịch để khôi phục (tức là Bạn chỉ thực hiện sao lưu toàn bộ), bạn có thể đặt Chế độ khôi phục thành "Đơn giản" và nhật ký giao dịch sẽ thu nhỏ lại và không bao giờ lấp đầy nữa.

Nếu bạn đang sử dụng SQL 7 hoặc 2000, bạn có thể bật "cắt bớt nhật ký trên điểm kiểm tra" trong tab tùy chọn cơ sở dữ liệu. Điều này có tác dụng tương tự.

Điều này rõ ràng không được đề xuất trong môi trường sản xuất, vì bạn sẽ không thể khôi phục lại đến một thời điểm.


1
Đặt chế độ khôi phục thành đơn giản sẽ không tự mình thu nhỏ nhật ký giao dịch.
Aaron Bertrand

@Aaron Không phải của riêng nó, không. Tôi giả định rằng OP sẽ sử dụng cơ sở dữ liệu thử nghiệm của họ và do đó "nhật ký giao dịch sẽ bị thu hẹp trong thời gian ngắn", nhưng bạn đã đúng khi nói rằng đó là một tác dụng phụ: Chế độ khôi phục đơn giản có thể sẽ khiến bạn bị thu hẹp đăng nhập giao dịch sớm
Jonathan

" Simple... Và không bao giờ điền lại" - không đúng. Tôi đã thấy điều đó xảy ra (trong 48 giờ qua) trên cơ sở dữ liệu nơi Mô hình khôi phục được đặt thành "ĐƠN GIẢN". Filegrowth của logfile được đặt thành "bị hạn chế" và chúng tôi đã thực hiện một số hoạt động lớn trên đó ... Tôi hiểu rằng đó là một tình huống bất thường. (Trong tình huống của chúng tôi, nơi chúng tôi có nhiều không gian đĩa, chúng tôi đã tăng kích thước logfile và đặt filfrowth thành "không bị giới hạn" ... bằng cách đó - lỗi giao diện - xuất hiện, sau khi thay đổi, như "bị hạn chế "với kích thước tối đa 2.097.152 MB.)
Doug_Ivison

2
@Doug_Ivison Có, nhật ký giao dịch sẽ có các giao dịch mở trong đó, nhưng chúng sẽ bị xóa trong chế độ đơn giản sau khi một điểm kiểm tra đã diễn ra. Câu trả lời này chỉ nhằm mục đích nhanh chóng "hộp phát triển / thử nghiệm của tôi có nhật ký giao dịch lớn và tôi muốn nó biến mất vì vậy tôi không cần phải lo lắng về nó quá thường xuyên", thay vì dự định đi vào sản xuất Môi trường. Để lặp lại: Không làm điều này trong sản xuất .
Jonathan

1
Điều đó hoàn toàn đúng và tôi hiểu rằng đó là một cách tiếp cận nhanh chóng chỉ dành cho phát triển. Tại sao tôi nhận xét: cho đến khi nó xảy ra với tôi, tôi thực sự nghĩ rằng mô hình phục hồi đơn giản KHÔNG BAO GIỜ được lấp đầy ... và tôi nghĩ rằng tôi phải mất nhiều thời gian hơn để tìm ra / giải quyết, trong khi tôi hiểu rằng các giao dịch lớn bất thường có thể làm điều đó.
Doug_Ivison

9

Kỹ thuật này mà John khuyến nghị không được khuyến nghị vì không có gì đảm bảo rằng cơ sở dữ liệu sẽ đính kèm mà không có tệp nhật ký. Thay đổi cơ sở dữ liệu từ đầy đủ sang đơn giản, buộc một điểm kiểm tra và chờ vài phút. Máy chủ SQL sẽ xóa nhật ký, sau đó bạn có thể thu nhỏ bằng DBCC SHRINKFILE.


... nhưng tôi đã làm điều đó hàng chục lần mà không vấn đề gì. có lẽ bạn có thể giải thích tại sao db có thể không đính kèm lại.
Johnno Nolan

Đôi khi tôi (không thường xuyên) thấy SQL Server không thể đính kèm cơ sở dữ liệu trở lại cơ sở dữ liệu khi tệp nhật ký đã bị xóa. Điều này để lại cho bạn một tập tin MDF vô dụng. Có một số khả năng có thể gây ra vấn đề. Giao dịch chờ rollback đến với tâm trí.
mrdenny

4
Tôi đồng ý với chiến thuật này, nhưng nó nên được dành riêng cho các trường hợp nhật ký bị nổ do một số sự kiện không lường trước và / hoặc bất thường. Nếu bạn thiết lập một công việc để làm điều này mỗi tuần, thì bạn đang làm nó rất, rất sai.
Aaron Bertrand

2
Rất, rất đúng Aaron.
mrdenny

Vâng, điều này chỉ xảy ra với chúng tôi. Chúng tôi muốn bỏ 20G tệp nhật ký vì chúng tôi vừa sao lưu dữ liệu trước khi di chuyển cơ sở dữ liệu. MSSQL sẽ không cho phép chúng tôi đính kèm lại cơ sở dữ liệu mới mà không có tệp nhật ký hài hước.
George M Tái lập Monica

9

Hầu hết các câu trả lời ở đây cho đến nay đều cho rằng bạn không thực sự cần tệp Nhật ký giao dịch, tuy nhiên nếu cơ sở dữ liệu của bạn đang sử dụng FULLmô hình khôi phục và bạn muốn giữ bản sao lưu của mình trong trường hợp bạn cần khôi phục cơ sở dữ liệu, thì đừng cắt bớt hoặc xóa đăng nhập tập tin theo cách nhiều câu trả lời đề nghị.

Loại bỏ tệp nhật ký (thông qua việc cắt bớt nó, loại bỏ nó, xóa nó, v.v.) sẽ phá vỡ chuỗi sao lưu của bạn và sẽ ngăn bạn khôi phục lại bất kỳ thời điểm nào kể từ lần sao lưu đầy đủ, khác biệt hoặc nhật ký giao dịch cuối cùng cho đến lần đầy đủ tiếp theo hoặc sao lưu vi sai được thực hiện.

Từ bài viết của Microsoft vềBACKUP

Chúng tôi khuyên bạn không bao giờ sử dụng NO_LOG hoặc TRUNCATE_ONLY để cắt ngắn nhật ký giao dịch theo cách thủ công, vì điều này phá vỡ chuỗi nhật ký. Cho đến khi sao lưu cơ sở dữ liệu đầy đủ hoặc khác biệt tiếp theo, cơ sở dữ liệu không được bảo vệ khỏi lỗi phương tiện truyền thông. Sử dụng cắt bớt nhật ký thủ công chỉ trong những trường hợp rất đặc biệt và tạo bản sao lưu dữ liệu ngay lập tức.

Để tránh điều đó, hãy sao lưu tệp nhật ký của bạn vào đĩa trước khi thu nhỏ nó. Cú pháp sẽ trông giống như thế này:

BACKUP LOG MyDatabaseName 
TO DISK='C:\DatabaseBackups\MyDatabaseName_backup_2013_01_31_095212_8797154.trn'

DBCC SHRINKFILE (N'MyDatabaseName_Log', 200)

3
Tôi đồng ý với câu trả lời của bạn, ngoại trừ , 1)phần. Vấn đề là nếu bạn thu nhỏ nó xuống còn 1 MB, các sự kiện tăng trưởng dẫn đến kích thước nhật ký bình thường sẽ khá tốn kém và sẽ có nhiều trong số đó nếu tốc độ tăng trưởng được để mặc định là 10%.
Aaron Bertrand

9

Nhật ký giao dịch SQL Server cần được duy trì đúng cách để ngăn chặn sự tăng trưởng không mong muốn của nó. Điều này có nghĩa là chạy sao lưu nhật ký giao dịch thường xuyên đủ. Khi không làm điều đó, bạn có nguy cơ nhật ký giao dịch trở nên đầy đủ và bắt đầu phát triển.

Bên cạnh các câu trả lời cho câu hỏi này, tôi khuyên bạn nên đọc và hiểu nhật ký giao dịch phổ biến. Những bài đọc này có thể giúp hiểu được nhật ký giao dịch và quyết định sử dụng các kỹ thuật nào để "xóa" nó:

Từ 10 huyền thoại nhật ký giao dịch SQL Server quan trọng nhất :

Quan niệm: Máy chủ SQL của tôi quá bận. Tôi không muốn tạo bản sao lưu nhật ký giao dịch SQL Server

Một trong những hoạt động chuyên sâu hiệu suất lớn nhất trong SQL Server là sự kiện tự động phát triển của tệp nhật ký giao dịch trực tuyến. Bằng cách không thực hiện sao lưu nhật ký giao dịch thường xuyên đủ, nhật ký giao dịch trực tuyến sẽ trở nên đầy đủ và sẽ phải phát triển. Kích thước tăng trưởng mặc định là 10%. Cơ sở dữ liệu càng bận rộn, nhật ký giao dịch trực tuyến sẽ phát triển nhanh hơn nếu các bản sao lưu nhật ký giao dịch không được tạo Tạo bản sao lưu nhật ký giao dịch SQL Server không chặn nhật ký giao dịch trực tuyến, nhưng sự kiện tăng trưởng tự động thì có. Nó có thể chặn tất cả các hoạt động trong nhật ký giao dịch trực tuyến

Từ huyền thoại Nhật ký giao dịch :

Quan niệm: Thu hẹp nhật ký thường xuyên là một thực hành bảo trì tốt

SAI. Tăng trưởng log rất tốn kém vì phần mới phải được loại bỏ. Tất cả hoạt động ghi dừng trên cơ sở dữ liệu đó cho đến khi zeroing kết thúc và nếu đĩa ghi của bạn chậm hoặc kích thước tự động lớn, việc tạm dừng đó có thể rất lớn và người dùng sẽ nhận thấy. Đó là một lý do tại sao bạn muốn tránh tăng trưởng. Nếu bạn thu nhỏ nhật ký, nó sẽ phát triển trở lại và bạn đang lãng phí hoạt động của đĩa vào trò chơi thu nhỏ và phát triển lại không cần thiết


5

Đầu tiên kiểm tra mô hình phục hồi cơ sở dữ liệu. Theo mặc định, SQL Server Express Edition tạo cơ sở dữ liệu cho mô hình khôi phục đơn giản (nếu tôi không nhầm).

Nhật ký sao lưu DatabaseName With Truncate_Only:

DBCC ShrinkFile(yourLogical_LogFileName, 50)

SP_helpfile sẽ cung cấp cho bạn tên tệp nhật ký logic.

Tham khảo:

Khôi phục từ nhật ký giao dịch đầy đủ trong cơ sở dữ liệu SQL Server

Nếu cơ sở dữ liệu của bạn ở Mô hình khôi phục hoàn toàn và nếu bạn không thực hiện sao lưu TL, thì hãy đổi nó thành SIMPLE.


Đây là cách tôi xóa các tệp nhật ký trên hộp dev của tôi. Môi trường prod với tất cả các chiến lược sao lưu được liên kết, v.v. Tôi rời khỏi DBA :-)
Joon

TRUNCATE_ONLYkhông còn là một tùy chọn trong các phiên bản SQL Server hiện tại và nó không được khuyến nghị cho các phiên bản hỗ trợ nó (xem câu trả lời của Rachel ).
Aaron Bertrand

5

Sử dụng DBCC ShrinkFile ({logicalLogName}, TRUNCATEONLY)lệnh. Nếu đây là cơ sở dữ liệu thử nghiệm và bạn đang cố gắng lưu / lấy lại dung lượng, điều này sẽ giúp ích.

Hãy nhớ rằng các bản ghi TX có một loại kích thước trạng thái tối thiểu / ổn định mà chúng sẽ tăng lên. Tùy thuộc vào mô hình khôi phục của bạn, bạn có thể không thể thu nhỏ nhật ký - nếu trong FULL và bạn không phát hành bản sao lưu nhật ký TX, nhật ký không thể bị thu hẹp - nó sẽ phát triển mãi mãi. Nếu bạn không cần sao lưu nhật ký TX, hãy chuyển mô hình khôi phục của bạn sang Đơn giản .

Và hãy nhớ, không bao giờ trong bất kỳ trường hợp nào xóa tệp nhật ký (LDF)! Bạn sẽ có khá nhiều cơ sở dữ liệu tham nhũng ngay lập tức. Nấu chín! Làm xong! Mất dữ liệu! Nếu không được "sửa chữa", tệp MDF chính có thể bị hỏng vĩnh viễn.

Không bao giờ xóa nhật ký giao dịch - bạn sẽ mất dữ liệu! Một phần dữ liệu của bạn nằm trong Nhật ký TX (bất kể mô hình khôi phục) ... nếu bạn tách và "đổi tên" tệp nhật ký TX có hiệu quả xóa một phần cơ sở dữ liệu của bạn.

Đối với những người đã xóa Nhật ký TX, bạn có thể muốn chạy một vài lệnh checkdb và sửa lỗi hỏng trước khi mất thêm dữ liệu.

Kiểm tra bài viết trên blog của Paul Randal về chính chủ đề này, lời khuyên tồi .

Ngoài ra, nói chung, không sử dụng tệp thu nhỏ trên các tệp MDF vì nó có thể phân đoạn dữ liệu của bạn một cách nghiêm trọng. Kiểm tra phần Tư vấn xấu của anh ấy để biết thêm thông tin ("Tại sao bạn không nên thu nhỏ tệp dữ liệu của mình")

Hãy xem trang web của Paul - anh ấy bao gồm những câu hỏi này. Tháng trước, anh ấy đã xem qua nhiều vấn đề trong loạt phim A A Day của mình .


+1 Vì là câu trả lời đầu tiên đề cập rằng đây có thể không phải là một ý tưởng hay! OP chỉ định một cơ sở dữ liệu thử nghiệm nhưng đó là một điểm rất đáng để thực hiện cho trường hợp tổng quát hơn.
Martin Smith

Tôi nên đã thêm - Nếu bạn xóa nhật ký TX - Cập nhật sơ yếu lý lịch!
ripvlan 11/03/2016

4

Để cắt bớt tệp nhật ký:

  • Sao lưu cơ sở dữ liệu
  • Tách cơ sở dữ liệu, bằng cách sử dụng Trình quản lý doanh nghiệp hoặc bằng cách thực hiện: Sp_DetachDB [DBName]
  • Xóa tệp nhật ký giao dịch. (hoặc đổi tên tệp, chỉ trong trường hợp)
  • Đính kèm lại cơ sở dữ liệu một lần nữa bằng cách sử dụng: Sp_AttachDB [DBName]
  • Khi cơ sở dữ liệu được đính kèm, một tệp nhật ký giao dịch mới được tạo.

Để thu nhỏ tệp nhật ký:

  • Nhật ký sao lưu [DBName] với No_Log
  • Thu nhỏ cơ sở dữ liệu bằng một trong hai cách sau:

    Sử dụng Trình quản lý doanh nghiệp: - Nhấp chuột phải vào cơ sở dữ liệu, Tất cả tác vụ, Thu nhỏ cơ sở dữ liệu, Tệp, Chọn tệp nhật ký, OK.

    Sử dụng T-SQL: - Thu nhỏ Dbcc ([Log_Logical_Name])

Bạn có thể tìm thấy tên logic của tệp nhật ký bằng cách chạy sp_helpdb hoặc bằng cách tìm trong các thuộc tính của cơ sở dữ liệu trong Trình quản lý doanh nghiệp.


Không bao giờ xóa nhật ký giao dịch. Một phần dữ liệu của bạn nằm trong Nhật ký. Xóa nó và cơ sở dữ liệu sẽ bị hỏng. Tôi không có đại diện để bỏ phiếu.
ripvlan

4

Theo kinh nghiệm của tôi trên hầu hết các Máy chủ SQL, không có bản sao lưu nhật ký giao dịch. Sao lưu toàn bộ hoặc sao lưu vi sai là thông lệ phổ biến, nhưng sao lưu nhật ký giao dịch thực sự hiếm khi. Vì vậy, tệp nhật ký giao dịch phát triển mãi mãi (cho đến khi đĩa đầy). Trong trường hợp này, mô hình phục hồi nên được đặt thành " đơn giản ". Đừng quên sửa đổi "mô hình" cơ sở dữ liệu hệ thống và "tempdb".

Một bản sao lưu của cơ sở dữ liệu "tempdb" không có ý nghĩa gì, vì vậy mô hình phục hồi của db này phải luôn luôn "đơn giản".


Chỉ cần thiết lập cơ sở dữ liệu thành đơn giản sẽ không thu nhỏ tệp nhật ký, ở bất kỳ trạng thái nào hiện tại. Nó chỉ có thể giúp ngăn không cho phát triển thêm (nhưng vẫn có thể).
Aaron Bertrand

4
  1. Hãy sao lưu tệp MDB.
  2. Dừng dịch vụ SQL
  3. Đổi tên tệp nhật ký
  4. Bắt đầu dịch vụ

(Hệ thống sẽ tạo một tệp nhật ký mới.)

Xóa hoặc di chuyển tệp nhật ký được đổi tên.


3

Nó xảy ra với tôi nơi tệp nhật ký cơ sở dữ liệu là 28 GB.

Bạn có thể làm gì để giảm điều này? Trên thực tế, các tệp nhật ký là những dữ liệu tệp mà máy chủ SQL lưu giữ khi giao dịch đã diễn ra. Đối với một giao dịch để xử lý máy chủ SQL phân bổ các trang cho cùng. Nhưng sau khi hoàn thành giao dịch, những giao dịch này không được phát hành đột ngột với hy vọng rằng có thể có một giao dịch đến giống như vậy. Điều này giữ không gian.

Bước 1: Đầu tiên Chạy lệnh này trong điểm kiểm tra cơ sở dữ liệu khám phá

Bước 2: Nhấp chuột phải vào cơ sở dữ liệu Nhiệm vụ> Sao lưu Chọn loại sao lưu làm Nhật ký giao dịch Thêm địa chỉ đích và tên tệp để giữ dữ liệu sao lưu (.bak)

Lặp lại bước này một lần nữa và tại thời điểm này, đặt tên tệp khác

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

Bước 3: Bây giờ hãy vào cơ sở dữ liệu Nhấp chuột phải vào cơ sở dữ liệu

Nhiệm vụ> Thu hẹp> Tệp Chọn Loại tệp làm Nhật ký Thu nhỏ hành động làm giải phóng không gian không sử dụng

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

Bước 4:

Kiểm tra tệp nhật ký của bạn bình thường trong SQL 2014, có thể tìm thấy tại

C: \ Tệp chương trình \ Microsoft SQL Server \ MSSQL12.MSQuery2014EXPRESS \ MSSQL \ DATA

Trong trường hợp của tôi, nó giảm từ 28 GB xuống còn 1 MB


2

Thử cái này:

USE DatabaseName

GO

DBCC SHRINKFILE( TransactionLogName, 1)

BACKUP LOG DatabaseName WITH TRUNCATE_ONLY

DBCC SHRINKFILE( TransactionLogName, 1)

GO 

TRUNCATE_ONLYkhông còn là một tùy chọn trong các phiên bản SQL Server hiện tại và nó không được khuyến nghị cho các phiên bản hỗ trợ nó (xem câu trả lời của Rachel ).
Aaron Bertrand

Nó hoạt động với tôi bằng cách sử dụng MSSQL Server 2005 Phiên bản tiêu chuẩn
bksi

2

Cơ sở dữ liệu → nhấp chuột phải Thuộc tính → tệp → thêm tệp nhật ký khác có tên khác và đặt đường dẫn giống như tệp nhật ký cũ với tên tệp khác.

Cơ sở dữ liệu tự động chọn tệp nhật ký mới được tạo.


1
  1. DB dự phòng
  2. Tách DB
  3. Đổi tên tệp nhật ký
  4. Đính kèm DB (trong khi đính kèm loại bỏ đã đổi tên .ldf (tệp nhật ký). Chọn nó và xóa bằng cách nhấn nút Xóa)
  5. Tệp nhật ký mới sẽ được tạo lại
  6. Xóa tập tin Nhật ký đổi tên.

Điều này sẽ hoạt động nhưng nó được đề nghị sao lưu cơ sở dữ liệu của bạn trước.


1

Một số câu trả lời khác không phù hợp với tôi: Không thể tạo điểm kiểm tra trong khi db đang trực tuyến, vì nhật ký giao dịch đã đầy (thật mỉa mai). Tuy nhiên, sau khi đặt cơ sở dữ liệu về chế độ khẩn cấp, tôi có thể thu nhỏ tệp nhật ký:

alter database <database_name> set emergency;
use <database_name>;
checkpoint;
checkpoint;
alter database <database_name> set online;
dbcc shrinkfile(<database_name>_log, 200);

0

Thí dụ:

DBCC SQLPERF(LOGSPACE)

BACKUP LOG Comapny WITH TRUNCATE_ONLY

DBCC SHRINKFILE (Company_log, 500)

DBCC SQLPERF(LOGSPACE)

TRUNCATE_ONLYkhông còn là một tùy chọn trong các phiên bản SQL Server hiện tại và nó không được khuyến nghị cho các phiên bản hỗ trợ nó (xem câu trả lời của Rachel ).
Aaron Bertrand

Câu hỏi không thuộc chủ đề cho Stack Overflow như được định nghĩa trong trung tâm trợ giúp . Xin đừng trả lời những câu hỏi như vậy; thay vào đó, bạn nên gắn cờ chúng để chú ý và chúng sẽ được đóng hoặc di chuyển một cách thích hợp.
Toby Speight

0

Câu trả lời được cập nhật một chút, cho MSSQL 2017 và sử dụng phòng quản lý máy chủ SQL. Tôi đã đi chủ yếu từ các hướng dẫn này https://www.sqlshack.com/sql-server-transaction-log-backup-truncate-and-shrink-operations/

Tôi đã có một bản sao lưu db gần đây, vì vậy tôi đã sao lưu nhật ký giao dịch. Sau đó, tôi ủng hộ nó một lần nữa cho các biện pháp tốt. Cuối cùng, tôi thu nhỏ tệp nhật ký và chuyển từ 20G xuống còn 7 MB, phù hợp hơn với kích thước dữ liệu của tôi. Tôi không nghĩ rằng nhật ký giao dịch đã được sao lưu vì nó đã được cài đặt 2 năm trước .. vì vậy hãy đặt nhiệm vụ đó lên lịch vệ sinh.


-1

Nhật ký giao dịch DB Thu nhỏ kích thước tối thiểu :

  1. Sao lưu: Nhật ký giao dịch
  2. Thu nhỏ tệp: Nhật ký giao dịch
  3. Sao lưu: Nhật ký giao dịch
  4. Thu nhỏ tệp: Nhật ký giao dịch

Tôi đã thực hiện thử nghiệm trên một số DB: chuỗi này hoạt động .

Nó thường co lại thành 2MB .

HOẶC theo một kịch bản:

DECLARE @DB_Name nvarchar(255);
DECLARE @DB_LogFileName nvarchar(255);
SET @DB_Name = '<Database Name>';               --Input Variable
SET @DB_LogFileName = '<LogFileEntryName>';         --Input Variable
EXEC 
(
'USE ['+@DB_Name+']; '+
'BACKUP LOG ['+@DB_Name+'] WITH TRUNCATE_ONLY ' +
'DBCC SHRINKFILE( '''+@DB_LogFileName+''', 2) ' +
'BACKUP LOG ['+@DB_Name+'] WITH TRUNCATE_ONLY ' +
'DBCC SHRINKFILE( '''+@DB_LogFileName+''', 2)'
)
GO

1
TRUNCATE_ONLYkhông còn là một tùy chọn trong các phiên bản SQL Server hiện tại và nó không được khuyến nghị cho các phiên bản hỗ trợ nó (xem câu trả lời của Rachel ).
Aaron Bertrand
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.