乐趣区

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

背景

某我的项目数据库磁盘告警,磁盘使用率靠近 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

  • 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%

其余

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

  • 运维攻坚之压缩表空间解决 oracle 数据库磁盘满问题
  • 运维攻坚之 Oracle 11g RAC vip OFFLINE 问题
  • 运维攻坚之 OIM 批改明码慢问题
  • 运维攻坚之 Linux 病毒清理
  • 运维攻坚之 jenkins 权限问题
  • 运维攻坚之 weblogic 内存透露
  • 运维攻坚之服务器高负载问题排查
  • 运维攻坚之 kubernetes 证书过期问题解决
  • 运维攻坚之 RAC 12c 数据库无奈启动问题
  • 运维攻坚之端口占用问题
  • 运维攻坚之 OAM 与 ADFS 单点登录问题
  • 运维攻坚之幽灵 JCO
退出移动版