2009-12-23 63 views
44

cơ sở dữ liệu của chúng tôi hiện đang ở 64 Gb và là một trong các ứng dụng của chúng tôi bắt đầu thất bại với các lỗi sau:"Tiểu filegroup là đầy đủ" trong SQL Server 2008 Standard không có lý do rõ ràng

System.Data.SqlClient.SqlException : Could not allocate space for object 'cnv.LoggedUnpreparedSpos'.'PK_LoggedUnpreparedSpos' in database 'travelgateway' because the 'PRIMARY' filegroup is full. Create disk space by deleting unneeded files, dropping objects in the filegroup, adding additional files to the filegroup, or setting autogrowth on for existing files in the filegroup.

tôi kiểm tra lại tất cả mọi thứ : tất cả các tệp trong một nhóm tệp duy nhất được phép tự động phát triển với số gia tăng hợp lý (100 Mb cho tệp dữ liệu, 10% cho tệp nhật ký), hơn 100 Gb dung lượng trống có sẵn cho cơ sở dữ liệu, tempdb được đặt thành tự động tốt với nhiều không gian HDD miễn phí trên ổ đĩa của nó.

Để giải quyết sự cố, tôi đã thêm tệp thứ hai vào nhóm tệp và lỗi đã biến mất. Nhưng tôi cảm thấy không thoải mái về tình huống này.

Trường hợp có vấn đề ở đây, các bạn?

+1

Và không có Kích thước tệp tối đa được chỉ định? –

Trả lời

25

OK, có hoạt động. Hóa ra rằng một khối lượng NTFS nơi các tệp DB được đặt có nặng nề bị phân mảnh. Ngưng SQL Server, chống phân mảnh toàn bộ điều và tất cả nó đã được tốt kể từ đó.

+0

Cảm ơn, đã thức dậy để phải giải quyết cùng một vấn đề ngày hôm nay và chống phân mảnh tệp dữ liệu (.mdf) đã sửa nó. Tôi đã sử dụng Defraggler. – dtbarne

+0

Tôi đã gặp vấn đề tương tự và sau khi chạy phân mảnh trên đĩa, tệp dữ liệu đã được lưu trữ, nó đã được giải quyết! Cảm ơn. –

2

tôi thấy rằng điều này xảy ra bởi vì: http://support.microsoft.com/kb/913399

SQL Server only releases all the pages that a heap table uses when the following conditions are true: A deletion on this table occurs. A table-level lock is being held. Note A heap table is any table that is not associated with a clustered index.

If pages are not deallocated, other objects in the database cannot reuse the pages.

However, when you enable a row versioning-based isolation level in a SQL Server 2005 database, pages cannot be released even if a table-level lock is being held.

của Microsoft giải pháp: http://support.microsoft.com/kb/913399

To work around this problem, use one of the following methods: Include a TABLOCK hint in the DELETE statement if a row versioning-based isolation level is not enabled. For example, use a statement that is similar to the following:

DELETE FROM TableName WITH (TABLOCK)

Note represents the name of the table. Use the TRUNCATE TABLE statement if you want to delete all the records in the table. For example, use a statement that is similar to the following:

TRUNCATE TABLE TableName

Create a clustered index on a column of the table. For more information about how to create a clustered index on a table, see the "Creating a Clustered Index" topic in SQL

Bạn sẽ nhận thấy ở dưới cùng của liên kết mà nó không phải là lưu ý rằng nó áp dụng cho SQL Máy chủ 2008 nhưng tôi nghĩ rằng nó có

19

Anton,

Cách tốt nhất là không nên tạo đối tượng người dùng trong nhóm tệp chính. Khi bạn có băng thông, hãy tạo một nhóm tệp mới và di chuyển các đối tượng người dùng và để các đối tượng hệ thống ở chế độ chính.

Các truy vấn sau sẽ giúp bạn xác định không gian được sử dụng trong mỗi tệp và bảng trên cùng có số hàng cao nhất và nếu có bất kỳ đống nào. Đó là một điểm khởi đầu tốt để điều tra vấn đề này.

SELECT 
ds.name as filegroupname 
, df.name AS 'FileName' 
, physical_name AS 'PhysicalName' 
, size/128 AS 'TotalSizeinMB' 
, size/128.0 - CAST(FILEPROPERTY(df.name, 'SpaceUsed') AS int)/128.0 AS 'AvailableSpaceInMB' 
, CAST(FILEPROPERTY(df.name, 'SpaceUsed') AS int)/128.0 AS 'ActualSpaceUsedInMB' 
, (CAST(FILEPROPERTY(df.name, 'SpaceUsed') AS int)/128.0)/(size/128)*100. as '%SpaceUsed' 
FROM sys.database_files df LEFT OUTER JOIN sys.data_spaces ds 
    ON df.data_space_id = ds.data_space_id; 

EXEC xp_fixeddrives 
select t.name as TableName, 
    i.name as IndexName, 
    p.rows as Rows 
from sys.filegroups fg (nolock) join sys.database_files df (nolock) 
    on fg.data_space_id = df.data_space_id join sys.indexes i (nolock) 
    on df.data_space_id = i.data_space_id join sys.tables t (nolock) 
    on i.object_id = t.object_id join sys.partitions p (nolock) 
on t.object_id = p.object_id and i.index_id = p.index_id 
where fg.name = 'PRIMARY' and t.type = 'U' 
order by rows desc 
select t.name as TableName, 
    i.name as IndexName, 
    p.rows as Rows 
from sys.filegroups fg (nolock) join sys.database_files df (nolock) 
    on fg.data_space_id = df.data_space_id join sys.indexes i (nolock) 
    on df.data_space_id = i.data_space_id join sys.tables t (nolock) 
    on i.object_id = t.object_id join sys.partitions p (nolock) 
on t.object_id = p.object_id and i.index_id = p.index_id 
where fg.name = 'PRIMARY' and t.type = 'U' and i.index_id = 0 
order by rows desc 
+0

Kịch bản tuyệt vời. Một trong những vấn đề mà tôi gặp phải là "kích thước/128" số nguyên tính toán mà gây ra một bộ phận bằng lỗi số không. Thay đổi nó thành "size/128". – Dave

+0

Tập lệnh này không hoạt động đối với tôi. Tôi nhận được một số hàng bị ảnh hưởng và sau đó là một lỗi - Msg 8134, Cấp 16, Tiểu bang 1, Dòng 1 Chia cho số lỗi không gặp phải. – Steam

+0

Dave đã đăng giải pháp đó lên trên bình luận của bạn ... – Charleh

2

Tôi vừa gặp phải vấn đề tương tự. Lý do là tệp bộ nhớ ảo "pagefile.sys" được đặt trên cùng ổ đĩa với các tệp dữ liệu của chúng tôi cho cơ sở dữ liệu của chúng tôi (ổ D:). Nó đã tăng gấp đôi kích thước và lấp đầy đĩa nhưng các cửa sổ đã không nhặt nó lên, tức là nó trông giống như chúng tôi đã có 80 GB miễn phí khi chúng tôi thực sự không.

Khởi động lại máy chủ SQL không giúp được gì, có lẽ chống phân mảnh sẽ cho thời gian hệ điều hành giải phóng tệp trang, nhưng chúng tôi vừa khởi động lại máy chủ và thì đấy, tệp trang đã bị thu hẹp và mọi thứ hoạt động tốt.

Điều thú vị là trong 30 phút chúng tôi đã điều tra, cửa sổ không tính kích thước của pagefile.sys ở tất cả (80gb). Sau khi khởi động lại các cửa sổ đã tìm thấy các pagefile và bao gồm kích thước của nó trong việc sử dụng tổng số đĩa (bây giờ 40gb - mà vẫn còn quá lớn).

3

Tôi cũng chạy vào cùng một vấn đề, trong đó kích thước dtabase ban đầu được đặt thành 4Gb và tự động phát được đặt bằng 1Mb. Ổ đĩa TrueCrypt được mã hóa ảo mà databse đang bật, dường như có nhiều không gian.

tôi đã thay đổi một vài (trên) điều:

  • Tôi quay các dịch vụ Windows cho Sql Server Express từ tự động-thủ, vì vậy chỉ những 'thường xuyên' Sql Server đang chạy . (Mặc dù tôi đang chạy SQL Server 2008 R2 mà nên cho phép 10 GB.)
  • Tôi đã thay đổi autogrowth từ 1 MB đến 10%
  • Tôi đã thay đổi autogrowth tăng kích thước từ 10% đến 1000 MB
  • tôi chống phân mảnh ổ đĩa
  • tôi thu hẹp cơ sở dữ liệu:
    • tay DBCC SHRINKDATABASE('...')
    • nhấp chuột tự động ngay trên cơ sở dữ liệu | "thuộc tính" | "Tự động thu nhỏ" | "Truncate log vào điểm kiểm tra")

All để ít avail (tôi có thể chèn một số hồ sơ nhiều hơn, nhưng nhanh chóng chạy vào cùng một vấn đề). Các pagefile được đề cập bởi Tobbi, làm cho tôi thử một ổ đĩa ảo lớn hơn. (Mặc dù ổ đĩa của tôi không được chứa bất kỳ tập tin hệ thống như vậy, kể từ khi tôi chạy mà không có nó là gắn kết rất nhiều thời gian.)

  • tôi đã thực hiện một ổ đĩa ảo mới lớn hơn với TrueCrypt

Khi thực hiện điều này, tôi chạy vào một câu hỏi TrueCrypt, nếu tôi sẽ lưu trữ các tệp lớn hơn 4gb (as shown in this SuperUser question).

  • Tôi nói với TrueCrypt tôi sẽ lưu trữ các file lớn hơn 4 GB

Sau những cuối cùng hai tôi đang làm tốt, và tôi giả định cuối cùng này đã làm các trick. Tôi nghĩ TrueCrypt chọn hệ thống tệp exfat (as described here), giới hạn tất cả các tệp thành 4GB. (Vì vậy, tôi có lẽ không cần phải mở rộng ổ đĩa sau khi tất cả, nhưng tôi đã làm anyway.)

Đây có lẽ là một trường hợp biên giới rất hiếm, nhưng có lẽ nó là giúp đỡ cho ai đó.

2

xin chceck loại tăng trưởng tập tin cơ sở dữ liệu, nếu hạn chế của nó làm cho nó không hạn chế

3

Thực hiện một điều, đi đến thuộc tính của cơ sở dữ liệu chọn tập tin và tăng kích thước ban đầu của cơ sở dữ liệu và thiết lập filegroup chính như được tự động. Khởi động lại máy chủ sql.

Bạn sẽ có thể sử dụng cơ sở dữ liệu như trước đó.

17

Chạy vào cùng một vấn đề và lần đầu tiên chống phân mảnh dường như hoạt động. Nhưng nó chỉ trong một thời gian ngắn. Tắt máy chủ mà khách hàng đang sử dụng, đang chạy số Express version và có giới hạn cấp phép khoảng 10gb.

Vì vậy, ngay cả khi kích thước được đặt thành "không giới hạn", thì không phải vậy.

0

vấn đề của chúng tôi là ổ đĩa cứng đã giảm xuống không gian sẵn có.

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