2009-04-22 30 views
24

Tôi có cơ sở dữ liệu có tệp nhật ký giao dịch 28gig. Chế độ phục hồi rất đơn giản. Tôi chỉ cần lấy một bản sao lưu đầy đủ của cơ sở dữ liệu, và sau đó chạy cả:Tại sao tôi không thể thu nhỏ tệp nhật ký giao dịch, ngay cả sau khi sao lưu?

backup log dbmcms with truncate_only

DBCC SHRINKFILE ('Wxlog0', TRUNCATEONLY)

Tên của db là db_mcms và tên của tập tin nhật ký giao dịch là Wxlog0.

Không giúp được gì. Tôi không chắc phải làm gì tiếp theo.

+0

Không thể chạy lệnh đầu tiên ở trên vì cơ sở dữ liệu của tôi ở chế độ khôi phục đầy đủ (mặc dù tôi nghĩ nó đơn giản). Kết quả từ chúng tôi thường xuyên khôi phục cơ sở dữ liệu từ sản xuất sang QA và không thay đổi mô hình phục hồi thành đơn giản. – dudeNumber4

Trả lời

42

Cảm ơn bạn để tất cả mọi người để trả lời.

Cuối cùng, chúng tôi đã tìm thấy sự cố. Trong sys.databases, log_reuse_wait_desc bằng 'replication'. Rõ ràng điều này có nghĩa là một cái gì đó để ảnh hưởng của SQL Server chờ đợi cho một nhiệm vụ nhân rộng để kết thúc trước khi nó có thể tái sử dụng không gian đăng nhập.

Sao chép chưa bao giờ được sử dụng trên DB này hoặc máy chủ này được chơi cùng một lúc trên db này. Chúng tôi đã xóa trạng thái không chính xác bằng cách chạy sp_removedbreplication. Sau khi chúng tôi chạy điều này, đăng nhập sao lưu và dbcc shrinkfile làm việc tốt.

Chắc chắn là một trong các thủ thuật.

Nguồn:

http://social.technet.microsoft.com/Forums/pt-BR/sqlreplication/thread/34ab68ad-706d-43c4-8def-38c09e3bfc3b

http://www.eggheadcafe.com/conversation.aspx?messageid=34020486&threadid=33890705

+3

Tôi đã tìm kiếm một thời gian dài để tìm bài đăng của bạn. Đây chính xác là tình huống của tôi. kích hoạt sau đó vô hiệu hóa db phản ánh.Đây là một tạo tác của điều đó.Ông cảm ơn bạn – smoore4

+1

Cảm ơn cho điều này! Giải quyết vấn đề của tôi quá – sys49152

+0

Lạ những gì trở lại với bạn sau một thời gian .... Tôi nhớ bây giờ một quản trị viên sys đã toyed với Bản sao trên cơ sở dữ liệu này Nó chỉ không xuất hiện trong đầu của tôi vào thời điểm đó –

0

Bạn đã thử từ trong studio quản lý SQL Server bằng GUI. Nhấp chuột phải vào cơ sở dữ liệu, nhiệm vụ, thu nhỏ, tập tin. Chọn filetype = Nhật ký.

Tôi đã làm việc cho tôi cách đây một tuần.

+0

Không súc sắc. Điều kỳ lạ, nó cho tôi biết không gian trống có sẵn trong tệp là 7gigs âm. Có điều gì đó dường như bị vỡ trên DB này và tôi không biết nó là gì. :( –

0

Cố gắng sử dụng kích thước mục tiêu mà bạn cần insted of TRUNCATEONLY trong DBCC:

DBCC SHRINKFILE ('Wxlog0', 1)

Và kiểm tra này để bài viết:

http://msdn.microsoft.com/en-us/library/ms189493(SQL.90).aspx

http://support.microsoft.com/kb/907511

Edit:

Bạn có thể cố gắng để di chuyển trang được phân bổ cho đầu của file bản ghi đầu tiên với

DBCC SHRINKFILE ('Wxlog0', NOTRUNCATE)

và phía sau er rằng

DBCC SHRINKFILE ('Wxlog0', 1)

0

Hãy thử tạo một sao lưu đầy đủ sau khi bạn sao lưu các bản ghi w/truncate_only (IIRC bạn nên làm anyway này để duy trì chuỗi log). Trong chế độ khôi phục đơn giản, nhật ký của bạn không được phát triển nhiều vì nó bị cắt bớt hiệu quả sau mỗi giao dịch. Sau đó thử chỉ định kích thước bạn muốn tệp nhật ký, ví dụ:

-- shrink log file to c. 1 GB 
DBCC SHRINKFILE (Wxlog0, 1000); 

Tùy chọn TRUNCATEONLY không sắp xếp lại trang trong tệp nhật ký, vì vậy bạn có thể có trang đang hoạt động ở cuối tệp của mình, điều này có thể ngăn không cho nó bị thu hẹp.

Bạn cũng có thể sử dụng DBCC SQLPERF (LOGSPACE) để đảm bảo rằng thực sự có không gian trong tệp nhật ký được giải phóng.

0

Đặt DB trở lại chế độ Đầy đủ, chạy bản ghi nhật ký giao dịch (không chỉ sao lưu toàn bộ) và sau đó thu nhỏ lại.

Sau khi bị thu hẹp, bạn có thể đặt DB trở lại chế độ đơn giản và nhật ký txn sẽ giữ nguyên kích thước.

0

Bạn không thể thu nhỏ nhật ký giao dịch nhỏ hơn kích thước ban đầu được tạo.

1

Nếu bạn đặt chế độ khôi phục trên cơ sở dữ liệu năm 2005 (không biết trước năm 2005), nó sẽ thả tệp nhật ký lại với nhau và sau đó bạn có thể đặt lại ở chế độ khôi phục đầy đủ để khởi động lại/tạo lại logfile . Chúng tôi đã thực hiện điều này với SQL 2005 express ở chỗ chúng tôi không thể đạt tới giới hạn 4GB với dữ liệu cho đến khi chúng tôi thay đổi chế độ khôi phục.

27

Bạn có thể gặp sự cố này nếu cơ sở dữ liệu của bạn được đặt để tự động ghi nhật ký & bạn kết thúc với nhiều tệp nhật ký ảo.
Chạy DBCC LOGINFO('databasename') & xem mục nhập cuối cùng, nếu đây là 2 thì tệp nhật ký của bạn sẽ không co lại. Không giống như các tệp dữ liệu, các tệp nhật ký ảo không thể di chuyển xung quanh bên trong tệp nhật ký.

Bạn sẽ cần chạy BACKUP LOG và DBCC SHRINKFILE nhiều lần để thu thập tệp nhật ký.

Đối với điểm thưởng thêm chạy DBBC LOGINFO ở giữa log & hành vi trốn tránh

+5

Cảm ơn vì điều này, nó đã giải quyết được vấn đề của tôi.Thông tin chi tiết kỹ thuật khác tại http://technet.microsoft.com/en-us/library/ms178037%28v=sql.105%29. aspx và http://technet.microsoft.com/en-us/library/ms345414%28v=sql.105%29.aspx – jeffcook2150

2

Tôi đã có cùng một vấn đề trong quá khứ. Thông thường, một bản sao thu nhỏ và trn cần phải xuất hiện nhiều lần. Trong trường hợp cực đoan, tôi đặt DB để khôi phục "Đơn giản" và sau đó chạy một hoạt động thu nhỏ trên tệp nhật ký. Điều đó luôn làm việc cho tôi. Tuy nhiên gần đây tôi đã có một tình huống mà điều đó sẽ không hoạt động. Vấn đề là do một truy vấn chạy dài không hoàn thành, vì vậy mọi nỗ lực thu nhỏ đều vô ích cho đến khi tôi có thể giết quá trình đó sau đó chạy các hoạt động thu hẹp của tôi. Chúng tôi đang nói một tệp nhật ký đã tăng lên 60 GB và hiện đã bị thu hẹp xuống còn 500 MB.

Hãy nhớ rằng, ngay sau khi bạn thay đổi từ ĐẦY ĐỦ sang chế độ Khôi phục đơn giản và làm co lại, đừng quên đặt lại thành FULL. Sau đó ngay lập tức bạn phải thực hiện backup DB đầy đủ.

3

'sp_removedbreplication' không giải quyết được vấn đề cho tôi khi SQL vừa trả về rằng Cơ sở dữ liệu không phải là một phần của bản sao ...

Tôi tìm thấy câu trả lời của tôi ở đây:

Về cơ bản tôi đã phải tạo ra một bản sao, thiết lập lại tất cả các con trỏ sao chép to Zero; sau đó xóa bản sao tôi vừa tạo. ví dụ:

Execute SP_ReplicationDbOption {DBName},Publish,true,1 
GO 
Execute sp_repldone @xactid = NULL, @xact_segno = NULL, @numtrans = 0, @time = 0, @reset = 1 
GO 
DBCC ShrinkFile({LogFileName},0) 
GO 
Execute SP_ReplicationDbOption {DBName},Publish,false,1 
GO 
3

Câu trả lời này đã được nâng lên từ here và được đăng ở đây trong trường hợp các chủ đề khác bị xóa:

Thực tế là bạn có phi phân phối LSN trong nhật ký là vấn đề. Tôi đã thấy điều này một lần trước khi không chắc chắn lý do tại sao chúng tôi không bỏ đánh dấu giao dịch như được nhân rộng. Chúng tôi sẽ điều tra nội bộ này. Bạn có thể thực hiện lệnh sau để bỏ đánh dấu các giao dịch như nhân rộng

EXEC sp_repldone @xactid = NULL, @xact_segno = NULL, @numtrans = 0, @time = 0, @reset = 1 

Tại thời điểm này, bạn sẽ có thể cắt xén các bản ghi.

0

Tôi đã thử tất cả các giải pháp được liệt kê và không có giải pháp nào hoạt động. Tôi đã phải làm một sp_detach_db, sau đó xóa các tập tin ldf và gắn lại cơ sở dữ liệu buộc nó để tạo ra một tập tin ldf mới. Điều đó hiệu quả.

+2

Điều này không hiệu quả với tôi. t đã sao lưu các tập tin .ldf tôi sẽ đã được hoàn toàn scr ewed. FYI Tôi đang sử dụng SQL 2012 – ProfNimrod

1

Tôi biết điều này là một vài năm tuổi nhưng muốn thêm một số thông tin.

tôi tìm thấy trên các bản ghi rất lớn, đặc biệt khi DB không được đặt Transaction Log backup (logs rất lớn), sao lưu đầu tiên của các bản ghi sẽ không được thiết lập log_reuse_wait_desc không có gì nhưng để lại tình trạng như vẫn sao lưu. Điều này sẽ chặn sự co lại. Chạy sao lưu một lần thứ hai thiết lập lại đúng log_reuse_wait_desc thành NOTHING, cho phép quá trình co lại.

Các vấn đề liên quan