oracle磁盘满了怎么办,运维攻坚之压缩表空间解决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

1460000023461600ReleaseMB:可以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%

其他

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值