2010-06-14 26 views
5

Tôi có một vùng bảng LOB. Hiện đang sở hữu 9 GB trong số 12GB khả dụng. Và, theo như tôi có thể nói, việc xóa các bản ghi không đòi lại bất kỳ bộ nhớ nào trong vùng bảng. (Điều này là do phương pháp đơn giản theo dõi lưu trữ - các truy vấn đối với user_extents, đó là về tất cả những gì tôi được phép làm không phải là DBA) Tôi đang lo lắng về việc xử lý thêm.Cách lấy lại bộ nhớ cho các LOB đã xóa

Mối quan tâm của tôi chỉ đơn giản là hết dung lượng - chúng tôi có khoảng 9 GB trong số 12 GB có sẵn cho không gian bảng và tôi muốn tìm hiểu cách thu hồi dung lượng trước khi yêu cầu thêm.

Cột LOB được lưu trữ trong một vùng bảng riêng biệt, mặc dù "lưu trữ trong hàng" được phép cho các vùng nhỏ.

Đây là Oracle 11.1 và dữ liệu nằm trong cột CLOB và BLOB trong cùng một bảng. Phân đoạn chỉ mục LOB (SYS_IL ...) là nhỏ, tất cả lưu trữ nằm trong các phân đoạn dữ liệu (SYS_LOB ...)

Chúng tôi đã cố gắng thanh lọc và kết hợp và không nhận được bất kỳ đâu - cùng một số byte trong user_extents.

"Chuyển đổi bảng di chuyển" sẽ hoạt động, nhưng chúng tôi cần phải có nơi nào đó để di chuyển nó đến đó có đủ không gian cho dữ liệu đã sửa đổi. Chúng tôi cũng cần phải làm điều đó ngoài giờ và xây dựng lại các chỉ số, tất nhiên, nhưng đó là đủ dễ dàng.

Sao chép dữ liệu tốt và thực hiện cắt ngắn, sau đó sao chép lại, cũng sẽ hoạt động. Nhưng đó là khá nhiều chỉ là những gì "thay đổi bảng" lệnh nào.

Tôi có thiếu một số cách dễ dàng để thu nhỏ mọi thứ và lấy lại bộ nhớ không? Hoặc là "thay đổi bảng xxx di chuyển" cách tiếp cận tốt nhất? Hoặc đây có phải là một vấn đề không và Oracle sẽ lấy lại không gian từ các hàng lob đã bị xóa khi cần?

+0

"đó là về tất cả Tôi đang cho phép như một tổ chức phi DBA" Tôi không thể giúp nhận thấy điều này, và nó có giá trị nói rằng không phải mọi vấn đề kỹ thuật có một câu trả lời kỹ thuật. Nếu bạn là người phụ trách lo lắng về những điều này, bạn nên được cấp quyền DBA hoặc ít nhất là đặc quyền hệ thống SELECT ANY DICTIONARY. Nếu không, bạn nên báo cáo điều gì đó như thế này trước khi nó ảnh hưởng đến những người dùng khác. – durette

Trả lời

1

Nói chung, một khi mức độ được phân bổ cho một bảng, nó vẫn được phân bổ. Không gian trống trong bảng có thể được sử dụng lại nếu dữ liệu bổ sung được chèn vào bảng. Tuy nhiên rất khó để lấy lại không gian từ bên trong một bảng vì bảng có thể có, ví dụ, khối 1 đến 100, và các khối trống nằm trong các khối 50-75, hoặc các khối trống là 1,3,5,7 vv

Câu hỏi đặt ra là, bạn có lo lắng về không gian được sử dụng lại trong bảng hoặc bạn cần không gian được giải phóng cho các đối tượng khác trong không gian bảng, hay bạn cần có khả năng thu hẹp các datafiles không gian bảng?

6

Câu hỏi này cũ, nhưng chưa bao giờ có câu trả lời làm việc và có thể hữu ích cho nhiều người, vì vậy, giải pháp tôi tìm thấy khi đối mặt với vấn đề này.

Bạn nói đúng, việc xóa LOB sẽ không đòi lại bất kỳ bộ nhớ nào trong khung cảnh.

Chạy truy vấn này trước và sau khi xóa LOB sẽ cho kết quả tương tự

select bytes 
    from user_segments 
    where tablespace_name = yourTableSpace 
     and segment_name = yourTableName; 

Reading this Oracle doc, tôi phát hiện ra rằng bạn cần phải thực hiện các tuyên bố sau

ALTER TABLE yourLobTable MODIFY LOB (yourLobColumn) (SHRINK SPACE); 

Mà sẽ co lại a BASICFILE Phân đoạn LOB.

Bây giờ nếu bạn lại thực hiện truy vấn

select bytes 
    from user_segments 
    where tablespace_name = yourTableSpace 
     and segment_name = yourTableName; 

Bạn sẽ nhận thấy rằng không gian đã được phát hành cho các tablespace, và sẽ có thể tái sử dụng không gian như bạn muốn.

Bây giờ cho những ai muốn giải phóng dung lượng trên đĩa, hãy lưu ý rằng tệp dữ liệu sẽ không tự động kích thước lại và vẫn sẽ giữ kích thước đầy đủ trên đĩa của bạn.

Nhưng trước khi tái định cỡ các datafile, chắc chắn bạn deallocate gian chưa sử dụng trong một phân đoạn (lấy trộm nó từ doc giống như tuyên bố trước đó) sử dụng các truy vấn này (sử dụng một trong những bạn cần)

ALTER TABLE table DEALLOCATE UNUSED KEEP integer; 
ALTER INDEX index DEALLOCATE UNUSED KEEP integer; 
ALTER CLUSTER cluster DEALLOCATE UNUSED KEEP integer; 

Note rằng mệnh đề KEEP là tùy chọn và cho phép bạn chỉ định lượng khoảng trống được giữ lại trong phân đoạn. Bạn có thể xác minh rằng không gian deallocated được giải phóng bằng cách kiểm tra xem DBA_FREE_SPACE.

Bây giờ để thay đổi kích thước datafile của bạn,

ALTER DATABASE DATAFILE yourDatafile.dbf resize 500M 

Lưu ý rằng kích thước tối đa mà bạn có thể thu nhỏ khi thay đổi kích thước dựa trên vị trí của các khối cuối cùng của dữ liệu trong datafile của bạn. Vì vậy, có rất nhiều cơ hội sau khi xóa rất nhiều dữ liệu bạn không thể thực sự tái kích thước. Sau đó, cách dễ nhất là xuất dữ liệu và nhập lại trong vùng bảng khác, sau đó thả vùng bảng cũ. Khi nhập dữ liệu, Oracle sẽ đóng gói chúng càng nhiều càng tốt.

Nếu bạn muốn giải phóng thêm dung lượng, bạn có thể xóa không gian bảng tạm thời của bạn đôi khi chứa nhiều không gian (5 GB cho cơ sở dữ liệu của tôi). Sử dụng câu lệnh sau để kiểm tra xem nó kích thước:

SELECT tablespace_name, file_name, bytes 
    FROM dba_temp_files WHERE tablespace_name like 'TEMP%'; 
+0

Đừng quên bật chuyển động hàng nếu nó chưa được bật: ALTER TABLE x_tab ENABLE ROW MOVEMENT; – durette

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