该脚本需区分 对象的管理方式是 自动还是 手动, 对手动管理方式 的表显示很全面
SQL> exec show_space_old('MAN_TAB','DEV','TABLE');
Free Blocks.............................4
Total Blocks............................2560
Total bytes.............................20971520
Unused Blocks...........................98
Unused bytes............................802816
Last Used Ext Fileid....................5
Last Used Ext Blocked...................7296
Last Used Block.........................30
SQL> exec show_space_old('AUTO_TAB','DEV','TABLE');
BEGIN show_space_old('AUTO_TAB','DEV','TABLE'); END;
*
ERROR at line 1:
ORA-10618: Operation not allowed on this segment
ORA-06512: at "SYS.DBMS_SPACE", line 191
ORA-06512: at "DEV.SHOW_SPACE_OLD", line 21
ORA-06512: at line 1
Show_space_old,脚本如下:
create or replace procedure show_space_old (
p_segname in varchar2,
p_owner in varchar2 default 'dev',
p_type in varchar2 default 'TABLE',
p_partition in varchar2 default null)
as
l_free_blks number;
l_total_blocks number;
l_total_bytes number;
l_unused_blocks number;
l_unused_bytes number;
l_lastusedextfileid number;
l_lastusedextblockid number;
l_last_used_block number;
procedure p(p_label in varchar2,p_num in number)
is
begin
dbms_output.put_line(rpad(p_label,40,'.')||p_num);
end;
begin
dbms_space.free_blocks(
segment_owner=> p_owner,
segment_name=> p_segname,
segment_type=> p_type,
partition_name=> p_partition,
freelist_group_id=> 0,
free_blks=> l_free_blks);
dbms_space.unused_space(
segment_owner => p_owner,
segment_name => p_segname,
segment_type => p_type,
partition_name => p_partition,
total_blocks => l_total_blocks,
total_bytes => l_total_bytes,
unused_blocks => l_unused_blocks,
unused_bytes => l_unused_bytes,
last_used_extent_file_id => l_lastusedextfileid,
last_used_extent_block_id => l_lastusedextblockid,
last_used_block =>l_last_used_block);
p('Free Blocks',l_free_blks);
p('Total Blocks',l_total_blocks);
p('Total bytes',l_total_bytes);
p('Unused Blocks',l_unused_blocks);
p('Unused bytes',l_unused_bytes);
p('Last Used Ext Fileid',l_lastusedextfileid);
p('Last Used Ext Blocked',l_lastusedextblockid);
p('Last Used Block',l_last_used_block);
end show_space_old;
该脚本需区分 对象的管理方式是 自动还是 手动,对 自动管理方式 的表显示很全面
SQL> exec show_space_1810('MAN_TAB','DEV','TABLE');
Total Blocks............................2560
Total Bytes.............................20971520
Unused Blocks...........................98
Unused Bytes............................802816
Last Used Ext FileId....................5
Last Used Ext BlockId...................7296
Last Used Block.........................30
BEGIN show_space_1810('MAN_TAB','DEV','TABLE'); END;
*
ERROR at line 1:
ORA-10614: Operation not allowed on this segment
ORA-06512: at "SYS.DBMS_SPACE", line 214
ORA-06512: at "DEV.SHOW_SPACE_1810", line 93
ORA-06512: at line 1
SQL> exec show_space_1810('AUTO_TAB','DEV','TABLE');
Total Blocks............................3840
Total Bytes.............................31457280
Unused Blocks...........................0
Unused Bytes............................0
Last Used Ext FileId....................4
Last Used Ext BlockId...................4224
Last Used Block.........................128
*************************************************
The segment is analyzed
0% -- 25% free space blocks.............3
0% -- 25% free space bytes..............24576
25% -- 50% free space blocks............1
25% -- 50% free space bytes.............8192
50% -- 75% free space blocks............0
50% -- 75% free space bytes.............0
75% -- 100% free space blocks...........23
75% -- 100% free space bytes............188416
Unused Blocks...........................62
Unused Bytes............................507904
Total Blocks............................3683
Total bytes.............................30171136
Show_space_1810,脚本如下:
create or replace procedure show_space_1810
( p_segname_1 in varchar2,
p_owner_1 in varchar2 default user,
p_type_1 in varchar2 default 'TABLE',
p_space in varchar2 default 'AUTO',
p_analyzed in varchar2 default 'Y'
)
as
p_segname varchar2(100);
p_type varchar2(10);
p_owner varchar2(30);
l_unformatted_blocks number;
l_unformatted_bytes number;
l_fs1_blocks number;
l_fs1_bytes number;
l_fs2_blocks number;
l_fs2_bytes number;
l_fs3_blocks number;
l_fs3_bytes number;
l_fs4_blocks number;
l_fs4_bytes number;
l_full_blocks number;
l_full_bytes number;
l_free_blks number;
l_total_blocks number;
l_total_bytes number;
l_unused_blocks number;
l_unused_bytes number;
l_LastUsedExtFileId number;
l_LastUsedExtBlockId number;
l_LAST_USED_BLOCK number;
procedure p( p_label in varchar2, p_num in number )
is
begin
dbms_output.put_line( rpad(p_label,40,'.') ||
p_num );
end;
begin
p_segname := upper(p_segname_1); -- rainy changed
p_owner := upper(p_owner_1);
p_type := p_type_1;
if (p_type_1 = 'i' or p_type_1 = 'I') then --rainy changed
p_type := 'INDEX';
end if;
if (p_type_1 = 't' or p_type_1 = 'T') then --rainy changed
p_type := 'TABLE';
end if;
if (p_type_1 = 'c' or p_type_1 = 'C') then --rainy changed
p_type := 'CLUSTER';
end if;
dbms_space.unused_space
( segment_owner => p_owner,
segment_name => p_segname,
segment_type => p_type,
total_blocks => l_total_blocks,
total_bytes => l_total_bytes,
unused_blocks => l_unused_blocks,
unused_bytes => l_unused_bytes,
LAST_USED_EXTENT_FILE_ID => l_LastUsedExtFileId,
LAST_USED_EXTENT_BLOCK_ID => l_LastUsedExtBlockId,
LAST_USED_BLOCK => l_LAST_USED_BLOCK );
if p_space = 'MANUAL' or (p_space <> 'auto' and p_space <> 'AUTO') then
dbms_space.free_blocks
( segment_owner => p_owner,
segment_name => p_segname,
segment_type => p_type,
freelist_group_id => 0,
free_blks => l_free_blks );
p( 'Free Blocks', l_free_blks );
end if;
p( 'Total Blocks', l_total_blocks );
p( 'Total Bytes', l_total_bytes );
p( 'Unused Blocks', l_unused_blocks );
p( 'Unused Bytes', l_unused_bytes );
p( 'Last Used Ext FileId', l_LastUsedExtFileId );
p( 'Last Used Ext BlockId', l_LastUsedExtBlockId );
p( 'Last Used Block', l_LAST_USED_BLOCK );
/*IF the segment is analyzed */
if p_analyzed = 'Y' then
dbms_space.space_usage(segment_owner => p_owner ,
segment_name => p_segname ,
segment_type => p_type ,
unformatted_blocks => l_unformatted_blocks ,
unformatted_bytes => l_unformatted_bytes,
fs1_blocks => l_fs1_blocks,
fs1_bytes => l_fs1_bytes ,
fs2_blocks => l_fs2_blocks,
fs2_bytes => l_fs2_bytes,
fs3_blocks => l_fs3_blocks ,
fs3_bytes => l_fs3_bytes,
fs4_blocks => l_fs4_blocks,
fs4_bytes => l_fs4_bytes,
full_blocks => l_full_blocks,
full_bytes => l_full_bytes);
dbms_output.put_line(rpad(' ',50,'*'));
dbms_output.put_line('The segment is analyzed');
p( '0% -- 25% free space blocks', l_fs1_blocks);
p( '0% -- 25% free space bytes', l_fs1_bytes);
p( '25% -- 50% free space blocks', l_fs2_blocks);
p( '25% -- 50% free space bytes', l_fs2_bytes);
p( '50% -- 75% free space blocks', l_fs3_blocks);
p( '50% -- 75% free space bytes', l_fs3_bytes);
p( '75% -- 100% free space blocks', l_fs4_blocks);
p( '75% -- 100% free space bytes', l_fs4_bytes);
p( 'Unused Blocks', l_unformatted_blocks );
p( 'Unused Bytes', l_unformatted_bytes );
p( 'Total Blocks', l_full_blocks);
p( 'Total bytes', l_full_bytes);
end if;
end show_space_1810;
**************************** 3 **************************************
该脚本需 区分 对象的管理方式是 自动还是 手动,只对管理方式是 手动管理 的表有效
SQL> exec show_space('MAN_TAB','DEV','TABLE');
Free Blocks.............................4
Total Blocks............................2560
Total bytes.............................20971520
Unused Blocks...........................98
Unused bytes............................802816
Last Used Ext Fileid....................5
Last Used Ext Blocked...................7296
Last Used Block.........................30
PL/SQL procedure successfully completed.
SQL> exec show_space('AUTO_TAB','DEV','TABLE');
BEGIN show_space('AUTO_TAB','DEV','TABLE'); END;
*
ERROR at line 1:
ORA-10618: Operation not allowed on this segment
ORA-06512: at "SYS.DBMS_SPACE", line 191
ORA-06512: at "DEV.SHOW_SPACE", line 21
ORA-06512: at line 1
Show_space脚本,如下:
create or replace procedure show_space (
p_segname in varchar2,
p_owner in varchar2 default 'dev',
p_type in varchar2 default 'TABLE',
p_partition in varchar2 default null)
as
l_free_blks number;
l_total_blocks number;
l_total_bytes number;
l_unused_blocks number;
l_unused_bytes number;
l_lastusedextfileid number;
l_lastusedextblockid number;
l_last_used_block number;
procedure p(p_label in varchar2,p_num in number)
is
begin
dbms_output.put_line(rpad(p_label,40,'.')||p_num);
end;
begin
dbms_space.free_blocks(
segment_owner=> p_owner,
segment_name=> p_segname,
segment_type=> p_type,
partition_name=> p_partition,
freelist_group_id=> 0,
free_blks=> l_free_blks);
dbms_space.unused_space(
segment_owner => p_owner,
segment_name => p_segname,
segment_type => p_type,
partition_name => p_partition,
total_blocks => l_total_blocks,
total_bytes => l_total_bytes,
unused_blocks => l_unused_blocks,
unused_bytes => l_unused_bytes,
last_used_extent_file_id => l_lastusedextfileid,
last_used_extent_block_id => l_lastusedextblockid,
last_used_block =>l_last_used_block);
p('Free Blocks',l_free_blks);
p('Total Blocks',l_total_blocks);
p('Total bytes',l_total_bytes);
p('Unused Blocks',l_unused_blocks);
p('Unused bytes',l_unused_bytes);
p('Last Used Ext Fileid',l_lastusedextfileid);
p('Last Used Ext Blocked',l_lastusedextblockid);
p('Last Used Block',l_last_used_block);
end show_space;
**************************** 4 **************************************
该脚本不需 区分 对象的管理方式是 自动还是 手动,确实很智能
SQL> exec show_space_1052(P_SEGNAME_1=>'MAN_TAB',P_TYPE_1=>'TABLE',P_OWNER_1=>'DEV');
Free Blocks.............................4
Total Blocks............................2560
Total Bytes.............................20971520
Unused Blocks...........................98
Unused Bytes............................802816
Last Used Ext FileId....................5
Last Used Ext BlockId...................7296
Last Used Block.........................30
SQL> exec show_space_1052(P_SEGNAME_1=>'AUTO_TAB',P_TYPE_1=>'TABLE',P_OWNER_1=>'DEV');
Total Blocks............................3840
Total Bytes.............................31457280
Unused Blocks...........................0
Unused Bytes............................0
Last Used Ext FileId....................4
Last Used Ext BlockId...................4224
Last Used Block.........................128
执行该脚本,需要事先 授予 对象的 select权限,如下
SQL> grant select on dba_segments to public;
Grant succeeded.
SQL> grant select on dba_tablespaces to public;
Grant succeeded.
SQL> grant select on dba_tablespaces to dev;
Grant succeeded.
SQL> grant select on dba_segments to dev;
Grant succeeded.
show_space_1052脚本如下:
create or replace procedure show_space_1052
( p_segname_1 in varchar2,
p_type_1 in varchar2 default 'TABLE' ,
p_analyzed in varchar2 default 'N',
p_owner_1 in varchar2 default user)
authid current_user
as
p_segname varchar2(100);
p_type varchar2(10);
p_owner varchar2(30);
p_space varchar2(10);
l_unformatted_blocks number;
l_unformatted_bytes number;
l_fs1_blocks number;
l_fs1_bytes number;
l_fs2_blocks number;
l_fs2_bytes number;
l_fs3_blocks number;
l_fs3_bytes number;
l_fs4_blocks number;
l_fs4_bytes number;
l_full_blocks number;
l_full_bytes number;
l_free_blks number;
l_total_blocks number;
l_total_bytes number;
l_unused_blocks number;
l_unused_bytes number;
l_LastUsedExtFileId number;
l_LastUsedExtBlockId number;
l_LAST_USED_BLOCK number;
procedure p( p_label in varchar2, p_num in number )
is
begin
dbms_output.put_line( rpad(p_label,40,'.') ||
p_num );
end;
begin
p_segname := upper(p_segname_1); -- rainy changed
p_owner := upper(p_owner_1);
p_type := p_type_1;
if (p_type_1 = 'i' or p_type_1 = 'I') then --rainy changed
p_type := 'INDEX';
end if;
if (p_type_1 = 't' or p_type_1 = 'T') then --rainy changed
p_type := 'TABLE';
end if;
if (p_type_1 = 'c' or p_type_1 = 'C') then --rainy changed
p_type := 'CLUSTER';
end if;
select t.segment_space_management into p_space
from dba_tablespaces t , dba_segments s
where s.tablespace_name = t.tablespace_name
and s.segment_name = p_segname
and s.owner = p_owner
and s.segment_type = p_type ; -- RollingPig change it.
-- if you compile with error,you may login with sys and grant select on dba_tablespace,dba_segments to current_user
dbms_space.unused_space
( segment_owner => p_owner,
segment_name => p_segname,
segment_type => p_type,
total_blocks => l_total_blocks,
total_bytes => l_total_bytes,
unused_blocks => l_unused_blocks,
unused_bytes => l_unused_bytes,
LAST_USED_EXTENT_FILE_ID => l_LastUsedExtFileId,
LAST_USED_EXTENT_BLOCK_ID => l_LastUsedExtBlockId,
LAST_USED_BLOCK => l_LAST_USED_BLOCK );
if p_space = 'MANUAL' or (p_space <> 'auto' and p_space <> 'AUTO') then
dbms_space.free_blocks
( segment_owner => p_owner,
segment_name => p_segname,
segment_type => p_type,
freelist_group_id => 0,
free_blks => l_free_blks );
p( 'Free Blocks', l_free_blks );
end if;
p( 'Total Blocks', l_total_blocks );
p( 'Total Bytes', l_total_bytes );
p( 'Unused Blocks', l_unused_blocks );
p( 'Unused Bytes', l_unused_bytes );
p( 'Last Used Ext FileId', l_LastUsedExtFileId );
p( 'Last Used Ext BlockId', l_LastUsedExtBlockId );
p( 'Last Used Block', l_LAST_USED_BLOCK );
/*IF the segment is analyzed */
if p_analyzed = 'Y' then
dbms_space.space_usage(segment_owner => p_owner ,
segment_name => p_segname ,
segment_type => p_type ,
unformatted_blocks => l_unformatted_blocks ,
unformatted_bytes => l_unformatted_bytes,
fs1_blocks => l_fs1_blocks,
fs1_bytes => l_fs1_bytes ,
fs2_blocks => l_fs2_blocks,
fs2_bytes => l_fs2_bytes,
fs3_blocks => l_fs3_blocks ,
fs3_bytes => l_fs3_bytes,
fs4_blocks => l_fs4_blocks,
fs4_bytes => l_fs4_bytes,
full_blocks => l_full_blocks,
full_bytes => l_full_bytes);
dbms_output.put_line(rpad(' ',50,'*'));
dbms_output.put_line('The segment is analyzed');
p( '0% -- 25% free space blocks', l_fs1_blocks);
p( '0% -- 25% free space bytes', l_fs1_bytes);
p( '25% -- 50% free space blocks', l_fs2_blocks);
p( '25% -- 50% free space bytes', l_fs2_bytes);
p( '50% -- 75% free space blocks', l_fs3_blocks);
p( '50% -- 75% free space bytes', l_fs3_bytes);
p( '75% -- 100% free space blocks', l_fs4_blocks);
p( '75% -- 100% free space bytes', l_fs4_bytes);
p( 'Unused Blocks', l_unformatted_blocks );
p( 'Unused Bytes', l_unformatted_bytes );
p( 'Total Blocks', l_full_blocks);
p( 'Total bytes', l_full_bytes);
end if;
end show_space_1052;
该脚本不需 区分 对象的管理方式是 自动还是 手动,确实很智能,只是简单的 把 输入参数 upper处理下
SQL> exec show_space_1052(P_SEGNAME=>'MAN_TAB',P_TYPE=>'TABLE',P_OWNER=>'DEV');
Free Blocks.............................4
Total Blocks............................2560
Total Bytes.............................20971520
Unused Blocks...........................98
Unused Bytes............................802816
Last Used Ext FileId....................5
Last Used Ext BlockId...................7296
Last Used Block.........................30
SQL> exec show_space_1052(P_SEGNAME_1=>'AUTO_TAB',P_TYPE_1=>'TABLE',P_OWNER_1=>'DEV');
Total Blocks............................3840
Total Bytes.............................31457280
Unused Blocks...........................0
Unused Bytes............................0
Last Used Ext FileId....................4
Last Used Ext BlockId...................4224
Last Used Block.........................128
执行该脚本,需要事先 授予 对象的 select权限,如下
SQL> grant select on dba_segments to public;
Grant succeeded.
SQL> grant select on dba_tablespaces to public;
Grant succeeded.
SQL> grant select on dba_tablespaces to dev;
Grant succeeded.
SQL> grant select on dba_segments to dev;
Grant succeeded.
show_space_1052脚本如下: 只是稍微修改下,把输入参数 upper 处理
create or replace procedure show_space_1052
( p_segname in varchar2,
p_type in varchar2 default 'TABLE' ,
p_analyzed in varchar2 default 'N',
p_owner in varchar2 default user)
authid current_user
as
p_segname varchar2(100);
p_type varchar2(10);
p_owner varchar2(30);
p_space varchar2(10);
l_unformatted_blocks number;
l_unformatted_bytes number;
l_fs1_blocks number;
l_fs1_bytes number;
l_fs2_blocks number;
l_fs2_bytes number;
l_fs3_blocks number;
l_fs3_bytes number;
l_fs4_blocks number;
l_fs4_bytes number;
l_full_blocks number;
l_full_bytes number;
l_free_blks number;
l_total_blocks number;
l_total_bytes number;
l_unused_blocks number;
l_unused_bytes number;
l_LastUsedExtFileId number;
l_LastUsedExtBlockId number;
l_LAST_USED_BLOCK number;
procedure p( p_label in varchar2, p_num in number )
is
begin
dbms_output.put_line( rpad(p_label,40,'.') ||
p_num );
end;
begin
p_segname := upper(p_segname_1); -- rainy changed
p_owner := upper(p_owner_1);
p_type := p_type_1;
if (p_type_1 = 'i' or p_type_1 = 'I') then --rainy changed
p_type := 'INDEX';
end if;
if (p_type_1 = 't' or p_type_1 = 'T') then --rainy changed
p_type := 'TABLE';
end if;
if (p_type_1 = 'c' or p_type_1 = 'C') then --rainy changed
p_type := 'CLUSTER';
end if;
select t.segment_space_management into p_space
from dba_tablespaces t , dba_segments s
where s.tablespace_name = t.tablespace_name
and s.segment_name = p_segname
and s.owner = p_owner
and s.segment_type = p_type ; -- RollingPig change it.
-- if you compile with error,you may login with sys and grant select on dba_tablespace,dba_segments to current_user
dbms_space.unused_space
( segment_owner => p_owner,
segment_name => p_segname,
segment_type => p_type,
total_blocks => l_total_blocks,
total_bytes => l_total_bytes,
unused_blocks => l_unused_blocks,
unused_bytes => l_unused_bytes,
LAST_USED_EXTENT_FILE_ID => l_LastUsedExtFileId,
LAST_USED_EXTENT_BLOCK_ID => l_LastUsedExtBlockId,
LAST_USED_BLOCK => l_LAST_USED_BLOCK );
if p_space = 'MANUAL' or (p_space <> 'auto' and p_space <> 'AUTO') then
dbms_space.free_blocks
( segment_owner => p_owner,
segment_name => p_segname,
segment_type => p_type,
freelist_group_id => 0,
free_blks => l_free_blks );
p( 'Free Blocks', l_free_blks );
end if;
p( 'Total Blocks', l_total_blocks );
p( 'Total Bytes', l_total_bytes );
p( 'Unused Blocks', l_unused_blocks );
p( 'Unused Bytes', l_unused_bytes );
p( 'Last Used Ext FileId', l_LastUsedExtFileId );
p( 'Last Used Ext BlockId', l_LastUsedExtBlockId );
p( 'Last Used Block', l_LAST_USED_BLOCK );
/*IF the segment is analyzed */
if p_analyzed = 'Y' then
dbms_space.space_usage(segment_owner => p_owner ,
segment_name => p_segname ,
segment_type => p_type ,
unformatted_blocks => l_unformatted_blocks ,
unformatted_bytes => l_unformatted_bytes,
fs1_blocks => l_fs1_blocks,
fs1_bytes => l_fs1_bytes ,
fs2_blocks => l_fs2_blocks,
fs2_bytes => l_fs2_bytes,
fs3_blocks => l_fs3_blocks ,
fs3_bytes => l_fs3_bytes,
fs4_blocks => l_fs4_blocks,
fs4_bytes => l_fs4_bytes,
full_blocks => l_full_blocks,
full_bytes => l_full_bytes);
dbms_output.put_line(rpad(' ',50,'*'));
dbms_output.put_line('The segment is analyzed');
p( '0% -- 25% free space blocks', l_fs1_blocks);
p( '0% -- 25% free space bytes', l_fs1_bytes);
p( '25% -- 50% free space blocks', l_fs2_blocks);
p( '25% -- 50% free space bytes', l_fs2_bytes);
p( '50% -- 75% free space blocks', l_fs3_blocks);
p( '50% -- 75% free space bytes', l_fs3_bytes);
p( '75% -- 100% free space blocks', l_fs4_blocks);
p( '75% -- 100% free space bytes', l_fs4_bytes);
p( 'Unused Blocks', l_unformatted_blocks );
p( 'Unused Bytes', l_unformatted_bytes );
p( 'Total Blocks', l_full_blocks);
p( 'Total bytes', l_full_bytes);
end if;
end show_space_1052;
转载于:https://www.cnblogs.com/iyoume2008/p/5242328.html
相关资源:JAVA上百实例源码以及开源项目