DBCC SHRINKFILE hoạt động với file_id nhưng không có tên logic


9

Tôi đang cố gắng thu nhỏ một tệp cơ sở dữ liệu nhưng đang gặp lỗi.

Sử dụng file_id từ sys.database_filescác tác phẩm, nhưng sử dụng tên tệp logic sẽ gây ra lỗi.

Tên tệp logic giống nhau trong cả hai câu lệnh, vì vậy đó không phải là vấn đề. Ngoài ra, cơ sở dữ liệu đang được kết nối, là như nhau. Các công việc sau đây như mong đợi:

declare @fileId as int = (select file_id from sys.database_files where name = 'XY')
DBCC SHRINKFILE (@fileId, 0, TRUNCATEONLY)

Tuy nhiên ...

DBCC SHRINKFILE ('XY' , 0, TRUNCATEONLY)

... sẽ dẫn đến lỗi 8985:

Msg 8985, Cấp 16, Trạng thái 1, Dòng 1
Không thể định vị tệp 'XY' cho cơ sở dữ liệu '<cơ sở dữ liệu của tôi>' trong sys.database_files. Các tập tin hoặc không tồn tại, hoặc đã bị loại bỏ.


1
Bạn đã thử nó mà không có dấu ngoặc đơn? DBCC SHRINKFILE (XY, 0, TRUNCATEONLY)
Thomas Stringer

@ThomasStringer Vâng, nó cũng cho tôi lỗi tương tự.
Nhà phát triển DotNet

1
Tên tệp logic thực tế là gì? Nó có bất kỳ ký tự kỳ lạ, hoặc không gian? Bạn có thể đăng nó?
Thomas Stringer

@ThomasStringer Đó chỉ là các ký tự bình thường, không có ký tự hoặc khoảng trắng hoặc số đặc biệt và không có ký tự vv .. Chỉ các ký tự chữ hoa và chữ thường. Nó tương tự như "DotNetDev".
Nhà phát triển DotNet

1
Điều gì xảy ra khi bạn nói DECLARE @filename SYSNAME; SELECT @filename = name FROM sys.database_files ...);và sau đó sử dụng @filenametrong đối số để DBCC?
Aaron Bertrand

Câu trả lời:


6

Sửa đổi câu trả lời của tôi, kiểm tra đã không hiển thị như là một lý do hợp lệ cho nó không hoạt động.

Vài điều cần kiểm tra

  1. Có không gian hàng đầu hoặc dấu trong tên tập tin?
  2. Gần đây bạn có nâng cấp lên SP3 không?

Hãy thử chuyển đổi mô hình khôi phục từ đầy đủ, đơn giản, trở lại đầy đủ một lần nữa. Có một lỗi rõ ràng khi cập nhật lên SP3. Thay đổi mô hình khôi phục sẽ đặt lại số thứ tự nhật ký và vì bất kỳ lý do gì sẽ xóa vấn đề, ít nhất là tạm thời.

cuộc trò chuyện trên mạng xã hội


Điều này đã được đề xuất bởi @thomasStringer. OP đang gặp lỗi. Xin vui lòng xem các ý kiến.
Kin Shah

Đã đồng ý. Hãy để OP trở lại và xem như có thể có vấn đề đối chiếu là tốt. Chúc mừng!
Kin Shah

@ Cougar9000 Không có không gian hàng đầu hoặc dấu. Và việc chọn tên logic từ sys.database_files hoạt động tốt theo OP của tôi. Và vâng, chúng tôi đã nâng cấp lên SP3 vài tuần trước. Nhưng đâu là mối liên hệ giữa vấn đề này và SP3?
Nhà phát triển DotNet

@ Cougar9000 Upvote, bởi vì bạn đang chỉ cho tôi đi đúng hướng. Hiện tại tôi không thực sự chắc chắn tại sao việc đặt mô hình khôi phục lại đầy đủ và trở lại đơn giản lại giải quyết vấn đề của tôi, nếu ai đó có thể làm sáng tỏ điều này, điều đó sẽ rất tuyệt. Hay đó chỉ đơn giản là một lỗi?
Nhà phát triển DotNet

@DotNetDeveloper từ những gì tôi thu thập được là một lỗi mà họ chưa xác định được. Thay đổi mô hình phục hồi sẽ thiết lập lại số thứ tự nhật ký. Vì lý do gì mà xóa vấn đề. Không chắc chắn đó sẽ là temp hay perm fix
Cougar9000

3

Sau khi xem câu trả lời và liên kết được cung cấp bởi @ Cougar9000: Có, gần đây chúng tôi đã nâng cấp lên SP3! Sau đó tôi đã chuyển mô hình phục hồi từ đơn giản sang đầy đủ và trở lại đơn giản. Và sau đó là tuyên bố

DBCC SHRINKFILE ('XY' , 0, TRUNCATEONLY)

làm.

Có ai biết chuyện gì đang xảy ra ở đây không? Đó có phải là một lỗi không?


1

Hãy thử chạy

   

select * from sys.database_files

bằng cách sử dụng cơ sở dữ liệu của bạn và sau đó làm chủ db. Bạn sẽ chỉ thấy các tệp nhật ký và cơ sở dữ liệu của db của bạn khi bạn đang sử dụng db của mình.

Vì thế - 

     

declare @fileId as int = (select file_id from sys.database_files where name = 'XY')

      DBCC SHRINKFILE (@fileId, 0, TRUNCATEONLY)

   

DBCC SHRINKFILE ('XY' , 0, TRUNCATEONLY)

cả hai đều hoạt động miễn là bạn đang sử dụng cùng một cơ sở dữ liệu.


0

Bạn cần kiểm tra xem tên tệp logic có giống nhau ở cả hai vị trí sys.master_files và sys.database_files không. Trong trường hợp này sẽ khác. Sau đó, chỉ cần thay đổi cơ sở dữ liệu cung cấp cho tệp tên logic mới mà bạn muốn có. Cả hai bảng sẽ được cập nhật và sau đó bạn có thể thu nhỏ trong GUI hoặc sử dụng tên tệp logic. Tôi đã gặp lỗi tương tự trong SQL Server 2012, điều này đã khắc phục vấn đề.


0

Tôi đã thử tất cả các cách trên và vẫn có vấn đề. Cơ sở dữ liệu đã được gọi clientdatabasevà tệp nhật ký clientdatabase_log.

Tôi quản lý để giải quyết nó bằng cách đổi tên tên logic của tệp nhật ký:

USE [clientdatabase];
ALTER DATABASE clientdatabase MODIFY FILE 
(NAME = clientdatabase_log, NEWNAME = clientdatabase_log_1);

Chạy lại tập lệnh để thu nhỏ nhật ký giao dịch (với tên logic mới) hiện đã hoạt động.

Tôi viết blog về nó ở đây:

Trả lời cho Dịch Không thể định vị tệp 'xxx_Log' cho cơ sở dữ liệu 'xxx' trong sys.database_files Lần

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.