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