Bảng rút gọn 200GB nhưng không gian đĩa không được phát hành


23

Tôi chỉ còn 2GB, vì vậy tôi cần xóa bảng lịch sử này. Bảng này bây giờ trống nhưng không gian đĩa cơ sở dữ liệu không được phát hành. Và tệp cơ sở dữ liệu là 320GB.


Tôi đã thành lập một số dấu vết của Sao chép trên cơ sở dữ liệu, điều này làm tăng đáng kể kích thước nhật ký và ngăn chặn để xóa hoặc thu nhỏ.
Lucas Coleues Sena

Câu trả lời:


25

Nếu bạn đang tham chiếu mức tiêu thụ tệp cơ sở dữ liệu thực tế trên ổ đĩa, thì SQL Server sẽ không tự động xử lý việc đó . Chỉ vì bạn đã xóa dữ liệu khỏi cơ sở dữ liệu không có nghĩa là các tệp cơ sở dữ liệu sẽ co lại để chỉ khớp với dữ liệu hiện có.

Những gì bạn đang tìm kiếm, nếu bạn phải lấy lại không gian trên ổ đĩa, sẽ thu nhỏ tệp cụ thể với DBCC SHRINKFILE. Điều đáng chú ý là một vài thực tiễn tốt nhất, theo tài liệu đó:

Thực hành tốt nhất

Xem xét các thông tin sau khi bạn định thu nhỏ tệp:

  • Một hoạt động thu nhỏ có hiệu quả nhất sau một hoạt động tạo ra nhiều không gian không sử dụng, chẳng hạn như bảng cắt ngắn hoặc hoạt động bảng thả.

  • Hầu hết các cơ sở dữ liệu yêu cầu một số không gian trống có sẵn cho các hoạt động hàng ngày. Nếu bạn thu nhỏ cơ sở dữ liệu nhiều lần và nhận thấy rằng kích thước cơ sở dữ liệu tăng trở lại, điều này cho thấy rằng không gian bị thu hẹp là cần thiết cho các hoạt động thông thường. Trong những trường hợp này, việc thu hẹp cơ sở dữ liệu nhiều lần là một hoạt động lãng phí.

  • Một hoạt động thu nhỏ không bảo tồn trạng thái phân mảnh của các chỉ mục trong cơ sở dữ liệu và thường làm tăng sự phân mảnh đến một mức độ. Đây là một lý do khác để không liên tục thu hẹp cơ sở dữ liệu.

  • Thu nhỏ nhiều tệp trong cùng một cơ sở dữ liệu theo tuần tự thay vì đồng thời. Sự tham gia vào các bảng hệ thống có thể gây ra sự chậm trễ do chặn.

Cũng cần lưu ý:

DBCC SHRINKFILE các hoạt động có thể được dừng lại tại bất kỳ điểm nào trong quy trình và mọi công việc đã hoàn thành đều được giữ lại.

Chắc chắn có một vài điều cần xem xét khi thực hiện điều này và tôi khuyên bạn nên xem bài đăng trên blog của Paul Randal về những gì xảy ra khi bạn thực hiện thao tác này.

Bước đầu tiên chắc chắn sẽ là xác minh bao nhiêu dung lượng và dung lượng trống bạn thực sự có thể thay thế, cũng như không gian được sử dụng trên (các) tệp:

use AdventureWorks2012;
go

;with db_file_cte as
(
    select
        name,
        type_desc,
        physical_name,
        size_mb = 
            convert(decimal(11, 2), size * 8.0 / 1024),
        space_used_mb = 
            convert(decimal(11, 2), fileproperty(name, 'spaceused') * 8.0 / 1024)
    from sys.database_files
)
select
    name,
    type_desc,
    physical_name,
    size_mb,
    space_used_mb,
    space_used_percent = 
        case size_mb
            when 0 then 0
            else convert(decimal(5, 2), space_used_mb / size_mb * 100)
        end
from db_file_cte;

6

Đây là hành vi bình thường khi bạn cắt bớt bảng và liên quan đến việc xóa hơn 128 phạm vi dưới dạng Sách trực tuyến

Khi bạn thả hoặc xây dựng lại các chỉ mục lớn hoặc thả hoặc cắt bớt các bảng lớn, Công cụ cơ sở dữ liệu sẽ trì hoãn các giao dịch trang thực tế và các khóa liên quan của chúng cho đến khi giao dịch được thực hiện. Việc triển khai này hỗ trợ cả giao dịch tự động và giao dịch rõ ràng trong môi trường nhiều người dùng và áp dụng cho các bảng và chỉ mục lớn sử dụng hơn 128 phạm vi.

Công cụ cơ sở dữ liệu tránh các khóa phân bổ được yêu cầu để thả các đối tượng lớn bằng cách chia quá trình theo hai giai đoạn riêng biệt: logic và vật lý.

Trong pha logic, các đơn vị phân bổ hiện có được sử dụng bởi bảng hoặc chỉ mục được đánh dấu để phân bổ và khóa cho đến khi giao dịch được thực hiện. Với một chỉ mục được nhóm bị loại bỏ, các hàng dữ liệu được sao chép và sau đó được chuyển sang các đơn vị phân bổ mới được tạo cho cửa hàng hoặc là một chỉ mục cụm được xây dựng lại hoặc một đống. (Trong trường hợp xây dựng lại chỉ mục, các hàng dữ liệu cũng được sắp xếp.) Khi có một rollback, chỉ có pha logic này cần được khôi phục.

Giai đoạn vật lý xảy ra sau khi giao dịch cam kết. Các đơn vị phân bổ được đánh dấu cho thỏa thuận được giảm vật lý theo lô. Những giọt này được xử lý bên trong các giao dịch ngắn xảy ra trong nền và không yêu cầu nhiều khóa.

Vì pha vật lý xảy ra sau khi giao dịch được thực hiện, không gian lưu trữ của bảng hoặc chỉ mục có thể vẫn xuất hiện dưới dạng không khả dụng. Nếu không gian này là cần thiết để cơ sở dữ liệu phát triển trước khi hoàn thành giai đoạn vật lý, Công cụ cơ sở dữ liệu sẽ cố gắng khôi phục không gian từ các đơn vị phân bổ được đánh dấu để phân bổ. Để tìm không gian hiện đang được sử dụng bởi các đơn vị phân bổ này, hãy sử dụng chế độ xem danh mục sys.allocation_units.

Các hoạt động thả hoãn lại không giải phóng không gian được phân bổ ngay lập tức và chúng đưa ra các chi phí bổ sung trong Cơ sở dữ liệu. Do đó, các bảng và chỉ mục sử dụng 128 hoặc ít hơn mức độ bị bỏ, cắt bớt và được xây dựng lại giống như trong SQL Server 2000. Điều này có nghĩa là cả hai giai đoạn logic và vật lý xảy ra trước khi giao dịch được thực hiện.

Bạn sẽ phải chờ và tất nhiên bạn sẽ phải thu nhỏ tệp theo cách thủ công để lấy lại không gian, điều đáng nói là việc thu hẹp gây ra sự phân mảnh logic và nên tránh trừ khi nhu cầu của bạn là nghiêm trọng. Bạn sẽ phải cân bằng giữa việc thu nhỏ và phân mảnh. Tốt hơn hết là bạn nên tự hỏi liệu thu nhỏ có thực sự giải quyết được vấn đề khi xem xét kịch bản mà dữ liệu sẽ lại phát triển hay không.

Sử dụng truy vấn bên dưới để kiểm tra có bao nhiêu dung lượng trống trong cơ sở dữ liệu

SELECT name ,size/128.0 - CAST(FILEPROPERTY(name, 'SpaceUsed') AS int)/128.0 AS AvailableSpaceInMB
FROM sys.database_files;

6

Ngoài câu trả lời của Tom và Shanky, nếu cơ sở dữ liệu của bạn chứa dữ liệu LOB / BLOB, DBCC SHRINKFILE có thể không hoạt động. Nếu đó là trường hợp, thì bạn có hai tùy chọn, tùy thuộc vào việc bạn có thể lấy cơ sở dữ liệu ngoại tuyến hay không. Nếu bạn có thể lấy cơ sở dữ liệu ngoại tuyến, thì bạn sẽ cần sao chép dữ liệu ra và sao chép lại để xóa khoảng trống. Bạn có thể thực hiện điều này bằng một trong những điều sau đây:

  1. Sử dụng câu lệnh CHỌN VÀO để chuyển toàn bộ bảng sang một bảng mới. Bỏ bảng gốc, chạy DBCC SHRINKFILE . Đổi tên bảng mới thành tên bảng ban đầu.
  2. Sử dụng bcp để sao chép bảng ở chế độ gốc, thả bảng, chạy DBCC SHRINKFILE , tạo bảng và sau đó bcp dữ liệu vào bảng.
  3. Sử dụng Xuất / Nhập để di chuyển tất cả dữ liệu sang cơ sở dữ liệu mới, bỏ cơ sở dữ liệu hiện có, đổi tên cơ sở dữ liệu mới thành tên cơ sở dữ liệu gốc.

Nếu bạn không thể lấy cơ sở dữ liệu ngoại tuyến, thì bạn có thể sử dụng lệnh DBCC SHRINKFILE với tùy chọn EMPTYFILE .

Chi tiết cho bản sao ngoại tuyến: http://support.microsoft.com/kb/324432/en-us

Thông tin hiện tại cho tùy chọn EMPTYFILE http://msdn.microsoft.com/en-us/l Library / ms189493 (v = sql.105) .aspx

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.