数据库中表不断的insert,delete,update,导致表和索引出现碎片。这会导致HWM之前有很多的空闲空间,而oracle在做全表扫描的时候会读取HWM一下的所有块,这样会产生更多的IO,影响性能。

oracle提供了shrink space碎片整理的功能,对于索引要采取rebuild online的方式进行碎片整理。

高水位的管理机制

高水位的管理机制在 MSSM 和 ASSM 中不同,在以往的手动段空间管理中(MSSM),高水位标记 HWM,一个段分成三部分,header block,used block(row data),unusedblock,其中 used block 和 unused block 之间的分界线就是高水位标记 HWM,当进行全表扫描的时候,会扫描到 HWM 下的所有数据块,即使 used block 中很多数据被删除了,全表扫描还是以HWM为准。

在自动段管理(ASSM)中,利用位图来代替空闲列表,当会话向表插入数据时,数据库只格式一个单独的位图块,而不是像 MSSM 中那样,会预先格式化一组块。在ASSM表空间中,除了一个 HWM 外,还有一个低 HWM。在 MSSM 中,HWM 推进时,所有的块都会格式化并立即生效,这样 Oracle 就可以安全的读取这些块。但是对于 ASSM,当 HWM推进时,Oracle 并不会立即格式所有的块,只是在第一次使用的时候才会对这些块进行格式化。也就是说,在第一次使用的的时候,即进行 insert 操作时,数据会插入到块中的任意水位线,位于低水位线(LHMW)和高水位线(HHMW)之间。因此在这个区域的许多块就不会被格式化。

背景

生产中这S_OPERATELOG, S_T_RTNRP_STATUS, S_T_SEND_REPORT三张表实际使用量不大(即truncate分区后),表空间数据文件还是占用很高,几个T,现需要释放不用的空间。

生产中遇到的案例

以下是生产中的三张表,且都是按天生成的分区表(不足一个月的数据,一年数据量很大)

select segment_name,round(sum(bytes / 1024 / 1024 / 1024), 2) G

from user_segments

where segment_name in

('S_OPERATELOG', 'S_T_RTNRP_STATUS', 'S_T_SEND_REPORT') group by segment_name;

可以看出使用的并不是很大。

查看表使用的表空间

select owner, table_name, tablespace_name

from dba_tables

where owner = 'SMART'

AND TABLE_NAME in

('S_OPERATELOG', 'S_T_RTNRP_STATUS', 'S_T_SEND_REPORT')

UNION

select TABLE_OWNER,TABLE_NAME,TABLESPACE_NAME

from dba_Tab_Partitions

where

TABLE_OWNER='SMART'

AND TABLE_NAME in

('S_OPERATELOG', 'S_T_RTNRP_STATUS', 'S_T_SEND_REPORT')

查看表空间使用情况:

select tablespace_name,

ROUND(sum(bytes / 1024 / 1024 / 1024),2) G,ROUND(sum(maxbytes / 1024 / 1024 / 1024),2) max_G

from dba_data_files

where file_name like '+FDATADG%'

GROUP BY TABLESPACE_NAME ORDER BY 2 DESC;

可以看出几个表空间占用空间很大,尤其是前三个表空间。

查看表空间数据文件情况:

SELECT a.tablespace_name,

a.file_name,

round(a.bytes/1024/1024/1024,2) AS "current_bytes(GB)",

round(a.bytes/1024/1024/1024 - b.resize_to/1024/1024/1024,2) AS "shrink_by_bytes(GB)",

round(b.resize_to/1024/1024/1024,2) AS "resize_to_bytes(GB)"

FROM   dba_data_files a,

(SELECT file_id, MAX((block_id+blocks-1)*&v_block_size) AS resize_to

FROM   dba_extents

GROUP by file_id) b

WHERE  a.file_id = b.file_id

and a.TABLESPACE_NAME in

(

'SMART_OPLOG01',

'SMART_NRRPSTA01',

'SMART_NRRPSTA02',

'SMART_NSNRP01',

'SMART_NSNRP02'

)

ORDER BY a.tablespace_name, a.file_name;

块大小是16K的。16384

后三列表示当前占用大小,能够收缩大小,最小的resize大小。

处理办法:

1)    Shrink对应的表

注意:由于在线上,不能进行有表锁的操作,所以我并没有采用这种办法

alter table TABLE_NAME enable ROW MOVEMENT;--启动行移动功能

alter table TABLE_NAME shrink space compact;  --只整理碎片 不回收空间

-- 重置高水位,此时不能有DML操作

alter table TABLE_NAME shrink space; --整理碎片并回收空间,并调整水位线。业务少时执行

alter table TABLE_NAME disable ROW MOVEMENT;--关闭行移动

2)    Resize 数据文件

select  ' alter database datafile '''||file_name ||''' resize 43g;' from dba_data_files where tablespace_name

in (

'SMART_NRRPSTA01'

);

收缩前表空间使用如下:

收缩后表空间使用如下:

磁盘组使用如下:

原+FDATADG磁盘中使用达到96%,释放了20%的空间。

ORACLE 11g 生产中高水位线(HWM)处理的更多相关文章

  1. 在Oracle 11g r2中,EXP无法导出个别空的表

    在Oracle 11g r2中,发现传统的exp无法不能导出空的表,上网搜索了一下找到了原因. 主要是Oracle 11g 新增了一个参数:deferred_segment_creation,含义是段 ...

  2. 測试oracle 11g cluster 中OLR的重要性

     測试oracle 11g cluster 中OLR的重要性 called an Oracle Local Registry (OLR): each node in a cluster has a ...

  3. oracle 11g GRID 中 关于 OLR 须要知道的一些内容

     oracle 11g GRID 中 关于 OLR 须要知道的一些内容 1.检查olr 的状态: [root@vmrac1 ~]# ocrcheck -local Status of Oracle ...

  4. Oracle高水位线(HWM)及性能优化

    说到HWM,我们首先要简要的谈谈ORACLE的逻辑存储管理.我们知道,ORACLE在逻辑存储上分4个粒度:表空间,段,区和块.    (1)块:是粒度最小的存储单位,现在标准的块大小是8K,ORACL ...

  5. CentOS6.5 静默安装Oracle 11g过程中提示:Exception in thread “main” java.lang.NoClassDefFoundError

    原来是系统中设置了DISPLAY环境变量,执行: [oracle@qa26 database]$ ./runInstaller  -silent -responseFile /usr/local/or ...

  6. Oracle 11g rac中关于crsctl stop cluster/crs/has的区别

    转载至http://www.oracleplus.net/arch/1203.html,整理后得. 1 通过命令查看cluster/has/crs管理的内容 [root@11rac1 ~]# crsc ...

  7. Oracle数据库入门——高水位线详解

    一.什么是水线(High Water Mark)? 所有的oracle段(segments,在此,为了理解方便,建议把segment作为表的一个同义词) 都有一个在段内容纳数据的上限,我们把这个上限称 ...

  8. oracle 高水位线详解

    一.什么是水线(High Water Mark)? 所有的oracle段(segments,在此,为了理解方便,建议把segment作为表的一个同义词) 都有一个在段内容纳数据的上限,我们把这个上限称 ...

  9. 一、oracle 高水位线详解

    一.什么是水线(High Water Mark)? 所有的oracle段(segments,在此,为了理解方便,建议把segment作为表的一个同义词) 都有一个在段内容纳数据的上限,我们把这个上限称 ...

随机推荐

  1. Webpack 打包学习

    前段时间项目主管让测试组长研究webpack打包方式,闲暇时自己想学习一下,留着备用,本周日学习一下. https://www.jianshu.com/p/42e11515c10f

  2. VTK嵌入MFC同步显示

    使用VTK嵌入MFC,实现四视图更新,机制和细节参考原文. 原文链接:http://blog.csdn.net/www_doling_net/article/details/8939115 原文代码: ...

  3. 编译Caffe-Win错误集锦

    Caffe在Windows下编译还是遇到不少麻烦的... 1.visual studio 2013 error C2371: 'int8_t' : redefinition; 引入的unistd.h文 ...

  4. 排序算法Java版

    选择排序: public static void selectSort(int[]a) { int minIndex=0; int temp=0; if((a==null)||(a.length==0 ...

  5. [Intermediate Algorithm] - Drop it

    题目 队友该卖就卖,千万别舍不得. 当你的队伍被敌人包围时,你选择拯救谁.抛弃谁非常重要,如果选择错误就会造成团灭. 如果是AD或AP,优先拯救. 因为AD和AP是队伍输出的核心. 其次应该拯救打野. ...

  6. 【sqli-labs】 less17 POST - Update Query- Error Based - String (基于错误的更新查询POST注入)

    这是一个重置密码界面,查看源码可以看到username作了防注入处理 逻辑是先通过用户名查出数据,在进行密码的update操作 所以要先知道用户名,实际情况中可以注册用户然后实行攻击,这里先用admi ...

  7. APICloud上啦加载下拉刷新模块

    apicloud有自带的上啦加载下拉刷新,当让也可以用第三方或者在模块库里面找一个使用 一.下拉刷新,一下代码写在 apiready = function (){} 里面 apiready = fun ...

  8. C++ (带有默认参数的函数参数)缺省函数参数

    缺省参数?在C++中,允许实参的个数与形参的个数不同.在声明函数原型时,为一个或者多个形参指定默认值,以后调用这个函数时,若省略某一个实参,c++则自动的以默认值作为相应参数的值. 实列说明:#inc ...

  9. jmeter的性能监控框架搭建记录(Influxdb+Grafana+Jmeter)

    查看笔记 http://note.youdao.com/noteshare?id=c700365713abb98bd3d10e6f45393af9&sub=6F4E14FF3F9D4167AE ...

  10. C#第九节课

    try catch using System;using System.Collections.Generic;using System.Linq;using System.Text;using Sy ...