空间使用

2020-07-11  本文已影响0人  轻飘飘D

1.表空间使用情况

SQL> grant select on dba_free_space to xag;
SQL> grant select on dba_data_files to xag;
SQL> grant select on v_$temp_extent_pool to xag;
SQL> grant select on v_$temp_space_header to xag;
SQL> grant select on dba_temp_files to xag;


create or replace view v_xag_tablespace_stat as
select tablespace_type,tablespace_name,autoext
       ,max_mb,used_mb,round(100 * used_mb / max_mb) pct_used
from
(
 select 'USER' as tablespace_type,a.tablespace_name as tablespace_name,autoext
       ,a.bytes_alloc - nvl(b.bytes_free, 0) as used_mb
       ,a.maxbytes as max_mb
 from
 (
   select f.tablespace_name,f.autoextensible as autoext
          ,trunc(sum(f.bytes)/power(2,20)) as bytes_alloc
          ,trunc(sum(decode(f.autoextensible,'YES',f.maxbytes,'NO',f.bytes))/power(2,20)) as  maxbytes
   from dba_data_files f
   group by tablespace_name,autoextensible
 ) a left join
 (
   select f.tablespace_name,trunc(sum(f.bytes)/power(2,20)) as bytes_free
   from dba_free_space f
   group by tablespace_name
 ) b on (a.tablespace_name=b.tablespace_name)
 union all
 select 'TEMP' as tablespace_type,h.tablespace_name as tablespace_name,f.autoextensible as autoext
       ,trunc(sum(nvl(p.bytes_used, 0)) / power(2, 20)) used_mb
       ,trunc(sum(decode(f.autoextensible,'YES',f.maxbytes,'NO',f.bytes))/power(2, 20)) max_mb
 from v$temp_space_header h left join v$temp_extent_pool p on(p.file_id=h.file_id and p.tablespace_name=h.tablespace_name)
     join dba_temp_files f on(f.file_id = h.file_id and f.tablespace_name = h.tablespace_name)
 group by h.tablespace_name,autoextensible
);

2.闪回区使用情况

SQL> grant select on v_$recovery_file_dest to xag;

create or replace view v_xag_fra as
select t.NAME
,trunc(t.SPACE_LIMIT/(1024*1024*1024)) as SPACE_LIMIT
,trunc(t.SPACE_USED/(1024*1024*1024)) as SPACE_USED
,trunc(100*SPACE_USED/SPACE_LIMIT) as PCT_USED
,trunc(t.SPACE_RECLAIMABLE/(1024*1024*1024)) as SPACE_RECLAIMABLE
,t."NUMBER_OF_FILES"
from sys.v_$recovery_file_dest t;

3.數據文件(磁盤)讀寫統計

select name,phyrds,phywrts,readtim,writetim
from v$filestat a,v$datafile b
where a.file#=b.file#
order by readtim desc

1   /u02/oradata/MPPAY/users_mpop_03.dbf    759630038   73441631    12633838    1269690
2   /u02/oradata/MPPAY/users_mpop.dbf   667802985   65248802    12616519    1219589
3   /u02/oradata/MPPAY/users_mpop_02.dbf    638656138   62120112    11754107    1059727
4   /u02/oradata/MPPAY/users_mpop_temp.dbf  614929104   59710400    11520040    1053707
5   /u02/oradata/MPPAY/users_mpop_04.dbf    700788426   61686392    11240767    1027103
6   /u02/oradata/MPPAY/I_USERS_MPOP1.dbf    324136523   155920043   7287802 2304233

4.臨時文件(磁盤)讀寫統計

select name,phyrds,phywrts,readtim,writetim
from v$tempstat a,v$tempfile b
where a.file#=b.file#
order by readtim desc

1   /u02/oradata/MPPAY/temp01.dbf   93067618    19891171    925 6390
2   /u02/oradata/MPPAY/risk_data_temp.dbf   642150  644978  3   42
3   /u02/oradata/MPPAY/message_send_data_temp.dbf   46  0   2   0
4   /u02/oradata/MPPAY/activity_znq_0928_temp.dbf   58  36  1   1
5   /u02/oradata/MPPAY/users_activity_2019_temp.dbf 55  3   1   0
6   /u02/oradata/MPPAY/lottery_temp20.dbf   25  4   0   0
7   /u02/oradata/MPPAY/lottery_temp.dbf 7   0   0   0

5.日志切换的时间间隔

select b.recid,b.first_time as start_time,a.recid, a.first_time as end_time
,round((a.first_time-b.first_time)*24*60,1) minutes
from v$log_history a,v$log_history b
where a.recid = b.recid+1
and b.first_time>trunc(sysdate)-15

6.大表数据大量删除后空间整理

1. 删除大部分数据,留下小部分数据。我们可以把需要保留的数据转移到别的表,然后再把大表drop掉,然后改名就行了;
          a) create table tablename_min as select * from tablename_max a where 需要保留的数据.
          b) drop table tablename_max ;
          c) rename tablename_min as tablename_max ;
       这样就能清除这个大表的hwm,而且释放掉其他空间。
---------------------------------------------------------------------------------------
使用shrink table的方式。

         a) 我们可以先用delete from tablename_max;

         b) 由于我们进行了数据的delete 所以造成了 tablename_max 这张表的数据稀疏,数据块并没有减少,hwm也没有减少,这样就会影响全表扫描需要访问更多的数据块。这时我们可以通过shrink来重组数据使数据分布更紧密,同时降低HWM释放空闲数据块。

        c)由于需要移动行数据,数据的rowid会发生变化,所以需要设置表的row movement属性:
            alter table tablename_max enable row movement; --开启行迁移功能。
            alter table tablename_max shrink space compact;--(可以在压缩期间进行DML操作和查询) ,收缩表,不会降低hwm
            alter table tablename_max shrink space; --( 调整HWM时将阻塞DML操作),收缩表,并且降低hwm

            alter table tablename_max shrink space cascade;--收缩表并降低hwm,并且回收相应的索引。

             由于我们删除了大量的数据 ,相应的索引也进行了删除,这时需要对索引进行收缩。

            alter index idxname shrink space;
       注意:shrink table只会针对assm(自动段空间管理)的表有用,否则会报: ORA-10635: Invalid segment or tablespace type。

                 alter table tablename_max enable row movement语句会造成引用表tablename_max的对象(如存储过程、包、视图等)变为无效。执行完成后,最好执行一下utlrp.sql来编译无效的对象。

                
   由于是通过DML操作进行的,会产生大量redo,注意archivelog目录的空间大小问题;同时undo表空间也会暴增。
上一篇下一篇

猜你喜欢

热点阅读