运维攻坚之压缩表空间解决oracle数据库磁盘满问题

赛博架构师
• 阅读 2465

背景

某项目数据库磁盘告警,磁盘使用率接近100%

$ df -Th
Filesystem     Type      Size  Used Avail Use% Mounted on
/dev/vda1      ext4       99G   60G   35G  64% /
devtmpfs       devtmpfs   32G     0   32G   0% /dev
tmpfs          tmpfs      32G   69M   32G   1% /dev/shm
tmpfs          tmpfs      32G  7.8M   32G   1% /run
tmpfs          tmpfs      32G     0   32G   0% /sys/fs/cgroup

/dev/vdc1      ext4       99G   94G   52M 100% /u01/oracle


/dev/vdb4      ext3       99G   30G   64G  32% /soa
tmpfs          tmpfs     6.3G     0  6.3G   0% /run/user/1002
tmpfs          tmpfs     6.3G   52K  6.3G   1% /run/user/1003
tmpfs          tmpfs     6.3G     0  6.3G   0% /run/user/1005

可以看到/dev/vdc1使用率已经100%

排查

/u01/oracle目录执行du命令查找占用空间的目录

$ du -hc --max-depth=1
88G     ./oradata
831M    ./diag
9.5M    ./fast_recovery_area
4.0K    ./checkpoints
488K    ./cfgtoollogs
304M    ./admin
352K    ./oradiag_oracle
4.3G    ./product
81G     .
93G     total

可以看到主要是oradata目录占用空间,该目录存储数据库数据文件,该目录下存在几个大文件

$ ll -h
total 88G

-rwxrw-rw- 1 oracle oinstall 7.8G Aug  1 14:09 DSGC_LOG_PL_PINITED_01.DBF
-rwxrw-rw- 1 oracle oinstall  16G Aug  1 14:09 DSGC_LOG_REC_PINITED_01.DBF
....
-rwxrw-rw- 1 oracle oinstall 6.1G Aug  1 14:09 sysaux01.dbf
...
-rwxrw-rw- 1 oracle oinstall  24G May 15 15:58 temp01.dbf
-rw-r----- 1 oracle oinstall 8.1G Aug  1 14:01 temp02.dbf

DSGC是业务系统数据,sysaux01是系统表空间数据,temp01和temp02都是临时表空间数据,由于一些历史原因,目前磁盘无法进行扩展,那么在磁盘无法扩展的情况下,如何解决磁盘满问题?可以对表空间进行resize,也就是对表空间重新设置大小,避免表空间浪费,但前提条件是表空间有剩余空间给你resize。

resize

sys用户登录,执行以下sql查询可resize的表空间

select a.file#,
       a.name,
       a.bytes / 1024 / 1024 CurrentMB,
       trunc(ceil(HWM * a.block_size) / 1024 / 1024 + 1) ResizeTo,
       trunc((a.bytes - HWM * a.block_size) / 1024 / 1024 + 1) ReleaseMB,
       'alter database datafile ''' || a.name || ''' resize ' ||
       trunc(ceil(HWM * a.block_size) / 1024 / 1024 + 1) || 'M;' ResizeCmd
  from v$datafile a,
       (SELECT file_id, MAX(block_id + blocks - 1) HWM
          FROM DBA_EXTENTS
         GROUP BY file_id) b
 where a.file# = b.file_id(+)
   And (a.bytes - HWM * a.block_size) > 0

运维攻坚之压缩表空间解决oracle数据库磁盘满问题

  • ReleaseMB:可以resize的大小
  • ResizeCmd:resize命令,可直接执行

我们可以按ReleaseMB降序排序,找到可resize相对较多空间的表空间进行resize,resize命令可直接复制ResizeCmd字段,举例如下:

alter database datafile '/u01/oracle/11.2.0.4/oradata/xx/test.DBF' resize 161M;

resize后数据文件也会相应变小。

上面我们看到临时表空间数据文件temp01.dbf已经达到了24G,通过以上sql是无法查询到临时表空间数据文件,v$datafile不包含临时表空间数据文件,通过以下语句可以查询临时表空间使用情况

SQL> select t.tablespace_name,
           trunc(t.tablespace_size / 1024 / 1024) || 'M' tablespace_size,
           trunc(t.allocated_space / 1024 / 1024) || 'M' allocated_space,
           trunc(t.free_space / 1024 / 1024) || 'M' free_space,
            'alter database tempfile ''' || f.file_name || ''' resize ' ||
           trunc(t.allocated_space / 1024 / 1024 + 1)|| 'M;' ResizeCmd
      from dba_temp_free_space t, dba_temp_files f
     where t.tablespace_name = f.tablespace_name
     order by t.free_space desc;
 
TABLESPACE_NAME TABLESPACE_SIZE  ALLOCATED_SPACE  FREE_SPACE  RESIZECMD
-------------------------------- ---------------- ----------- --------------------------------------------------------------------------------
TEMP            23601M           2M               23599M      alter database tempfile '/u01/oracle/11.2.0.4/oradata/xx/temp01.dbf' resize 3M;
TEMP02          8192M            1395M            8190M       alter database tempfile '/u01/oracle/11.2.0.4/oradata/xx/temp02.dbf' resize 1396M;
 
2 rows selected

TEMP临时表空间基本没有使用,TEMP02使用率也不高,可以将其resize,语句中resizecmd只是将剩余空间+1M,可以根据实际情况进行修改,本次resize如下

alter database tempfile '/u01/oracle/11.2.0.4/oradata/xx/temp01.dbf' resize 512M;
alter database tempfile '/u01/oracle/11.2.0.4/oradata/xx/temp02.dbf' resize 2048M;

resize后磁盘占用情况:

$ df -Th
Filesystem     Type      Size  Used Avail Use% Mounted on
/dev/vda1      ext4       99G   60G   35G  64% /
devtmpfs       devtmpfs   32G     0   32G   0% /dev
tmpfs          tmpfs      32G   69M   32G   1% /dev/shm
tmpfs          tmpfs      32G  7.8M   32G   1% /run
tmpfs          tmpfs      32G     0   32G   0% /sys/fs/cgroup

/dev/vdc1      ext4       99G   59G   35G  63% /u01/oracle

tmpfs          tmpfs     6.3G   12K  6.3G   1% /run/user/42
tmpfs          tmpfs     6.3G  4.0K  6.3G   1% /run/user/0
tmpfs          tmpfs     6.3G     0  6.3G   0% /run/user/1002
tmpfs          tmpfs     6.3G   52K  6.3G   1% /run/user/1003
tmpfs          tmpfs     6.3G     0  6.3G   0% /run/user/1005

可以看到,使用率从100%降到了63%

其他

运维攻坚系列是我精心整理的运维实战记录系列,每个案例都来自于真实的线上环境,如果你有兴趣点击以下链接查看其他文章

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Easter79 Easter79
3年前
swap空间的增减方法
(1)增大swap空间去激活swap交换区:swapoff v /dev/vg00/lvswap扩展交换lv:lvextend L 10G /dev/vg00/lvswap重新生成swap交换区:mkswap /dev/vg00/lvswap激活新生成的交换区:swapon v /dev/vg00/lvswap
Wesley13 Wesley13
3年前
java中比较两个时间的差值
项目背景1.某篇文稿的发布时间是publishDate,例如:2020072118:00:41。2.现要求判断该篇文稿的发布时间是否在近30天之内。publicstaticlongdayDiff(DatecurrentDate,DatepublishDate){LongcurrentTimecurrentDat
Wesley13 Wesley13
3年前
MySQL 磁盘满了,怎么办??
问题使用命令发现磁盘使用率为100%了,还剩几十兆。一系列神操作:备份数据库,删除实例、删除数据库表、重启mysql服务.结果磁盘空间均为释放怎么办网上查了很多资源,说要进行磁盘碎片化整理。原因是datafree占据的空间太多啦。具体可以通过这个sql查看。SELECTCONCAT(TRUNCATE(S
Stella981 Stella981
3年前
DOIS 2019 DevOps国际峰会北京站来袭~
DevOps国际峰会是国内唯一的国际性DevOps技术峰会,由OSCAR 联盟指导、DevOps时代社区与高效运维社区联合主办,共邀全球80余名顶级专家畅谈DevOps体系与方法、过程与实践、工具与技术。会议召开时间:2019070508:00至2019070618:00结束会议召开地点:北京主办单位:DevOps
Wesley13 Wesley13
3年前
oracle查询表数据并重新插入到本表
oracle查询表数据并重新插入到本表CreateTime2018年5月17日10:30:10Author:Marydon1.情景描述查询表中数据SELECTFROMat_aut
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Log4j疯狂写日志问题排查 | 京东云技术团队
最近有个Java系统上线后不久就收到了磁盘使用率告警,磁盘使用率已经超过了90%以上,并且磁盘使用率还在不停增长。
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
美凌格栋栋酱 美凌格栋栋酱
5个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
赛博架构师
赛博架构师
Lv1
明月照高楼,流光正徘徊。
文章
4
粉丝
0
获赞
0