2013-08-21 32 views
7

Các truy vấn sau đây có thể được sử dụng để liệt kê các đối tượng cơ sở dữ liệu của người sử dụng:Làm thế nào để thả Oracle LOB

select object_name, object_type from user_objects; 

Có vài mục nơi object_type là LOB.

Làm cách nào để các đối tượng LOB này có thể bị loại bỏ trong Oracle?

Trả lời

16

Một trường hợp mà bạn có thể thấy LOB trong user_objects nhưng việc tham gia user_lobs không tìm thấy bất kỳ điều gì là nếu bảng đã bị xóa, nhưng is in the recycle bin.

create table t42 (my_clob clob); 

table T42 created. 

Đúng như dự đoán, truy vấn của Justin cho bạn thấy những cột:

select l.table_name, 
     l.column_name, 
     l.segment_name lob_name 
    from user_lobs l 
     join user_objects o 
     on(o.object_name = l.segment_name); 

TABLE_NAME COLUMN_NAME LOB_NAME      
----------- ----------- ------------------------------ 
T42   MY_CLOB  SYS_LOB0000133310C00001$$  

drop table t42; 

table T42 dropped. 

Bây giờ truy vấn của Justin không tìm thấy bất cứ điều gì:

select l.table_name, 
     l.column_name, 
     l.segment_name lob_name 
    from user_lobs l 
     join user_objects o 
     on(o.object_name = l.segment_name); 

no rows selected 

Nhưng nó vẫn còn trong user_objects:

select object_name, object_type, status from user_objects 
where object_type like 'LOB%'; 

OBJECT_NAME     OBJECT_TYPE   STATUS 
------------------------------ ------------------- ------- 
SYS_LOB0000133328C00001$$  LOB     VALID 

A thứ bạn có thể nhìn thấy nó trong thùng rác:

select * from user_recyclebin; 

OBJECT_NAME     ORIGINAL_NAME     OPERATION TYPE      TS_NAME      CREATETIME   DROPTIME    DROPSCN PARTITION_NAME     CAN_UNDROP CAN_PURGE RELATED BASE_OBJECT PURGE_OBJECT  SPACE 
------------------------------ -------------------------------- --------- ------------------------- ------------------------------ ------------------- ------------------- ---------- -------------------------------- ---------- --------- ---------- ----------- ------------ ---------- 
SYS_IL0000133310C00001$$  SYS_IL0000133310C00001$$   DROP  LOB INDEX     USERS       2013-08-22:08:33:21 2013-08-22:08:33:21 1.0E+13         NO   NO   133310  133310  133310   0 
SYS_LOB0000133310C00001$$  SYS_LOB0000133310C00001$$  DROP  LOB      USERS       2013-08-22:08:33:21 2013-08-22:08:33:21 1.0E+13         NO   NO   133310  133310  133310   0 
BIN$5IUNXtWkUXLgQwEAAH9TlQ==$0 T42        DROP  TABLE      USERS       2013-08-22:08:33:21 2013-08-22:08:33:21 1.0E+13         YES  YES   133310  133310  133310   0 

Các LOB vẫn còn tồn tại trên đĩa và sử dụng lưu trữ, mà tôi đoán là những gì bạn đang quan tâm. Vì vậy, để loại trả lời câu hỏi của bạn, để thực sự thả LOB và phát hành lưu trữ của nó, bạn cần phải thanh lọc toàn bộ bảng:

purge table t42; 

table purged. 

select object_name, object_type, status from user_objects 
where object_type like 'LOB%'; 

no rows selected 

Điều thú vị là bạn không nhìn thấy hiệu ứng này nếu bạn đặt tên cho phân khúc LOB:

create table t42 (my_clob clob) 
lob (my_clob) store as my_clob_segment; 

Lặp lại các bước trên, mục nhập đã đi từ user_objects sau drop.

drop table t42; 

table T42 dropped. 

select object_name, object_type, status from user_objects 
where object_type like 'LOB%'; 

no rows selected 

select * from user_recyclebin; 

OBJECT_NAME     ORIGINAL_NAME     OPERATION TYPE      TS_NAME      CREATETIME   DROPTIME    DROPSCN PARTITION_NAME     CAN_UNDROP CAN_PURGE RELATED BASE_OBJECT PURGE_OBJECT  SPACE 
------------------------------ -------------------------------- --------- ------------------------- ------------------------------ ------------------- ------------------- ---------- -------------------------------- ---------- --------- ---------- ----------- ------------ ---------- 
BIN$5IUNXtWnUXLgQwEAAH9TlQ==$0 MY_CLOB_SEGMENT     DROP  LOB      USERS       2013-08-22:08:36:41 2013-08-22:08:36:41 1.0E+13         NO   NO   133316  133316  133316   0 
BIN$5IUNXtWoUXLgQwEAAH9TlQ==$0 T42        DROP  TABLE      USERS       2013-08-22:08:36:41 2013-08-22:08:36:41 1.0E+13         YES  YES   133316  133316  133316   0 
SYS_IL0000133316C00001$$  SYS_IL0000133316C00001$$   DROP  LOB INDEX     USERS       2013-08-22:08:36:41 2013-08-22:08:36:41 1.0E+13         NO   NO   133316  133316  133316   0 

Bộ nhớ vẫn đang được sử dụng và bạn vẫn cần phải thanh lọc để giải phóng nó, nó có vẻ đồng nhất hơn một chút trong từ điển dữ liệu. Vì vậy, điều này trông giống như một lỗi (rất nhỏ), có thể, nhiều nhất. Nó có thể liên quan đến hành vi được nhắc đến trong chú thích hỗ trợ 394442.1.

+0

Cảm ơn bạn đã giải thích chi tiết và truy vấn mẫu – byneri

+1

+1. Rất đẹp. Cảm ơn bạn vì câu trả lời ngắn gọn (và có thể đọc được)! – spencer7593

3

Đối tượng LOB sẽ bị xóa nếu và khi bạn thả bảng chứa cột LOB được liên kết hoặc thả cột LOB khỏi bảng đó. Bạn có thể xem cột nào đối tượng LOB hỗ trợ bằng cách truy vấn DBA_LOBS, ALL_LOBS hoặc USER_LOBS tùy thuộc vào đặc quyền của bạn.

Ví dụ

SELECT l.table_name, 
     l.column_name, 
     l.segment_name lob_name 
    FROM user_lobs l 
     JOIN user_objects o 
     ON(o.object_name = l.segment_name) 

sẽ cho bạn thấy những gì bảng và những gì cột mỗi LOB đối tượng trong hỗ trợ giản đồ của bạn.

+1

Truy vấn trên trả về 0 hàng cho người dùng của tôi. – byneri

+1

Ngoài ra 0 hàng khi truy vấn all_lobs (thay vì user_lobs). Không thể truy vấn dba_lobs: "ORA-00942: bảng hoặc chế độ xem không tồn tại" – byneri