1.背景
数据库UNDOTBS1表空间报警:
##告警172.0.0.1_Oracle数据库读写分离–Oracle_TableSpace:UNDOTBS1使用率超过90,故障已持续0m(IP地址172.0.0.1;告警时间2020.03.11 09:47:53;检查项oracle.check[pre,UNDOTBS1] ;当前状态PROBLEM;值92 %)

2.操作排查问题
(1)看到此报错,一般认为数据库的表空间不足,查询之后,表空间还存在很大的空余,之后认真查看了一下表空间名称,一看是UNDOTBS1(回滚表空间),这就知道什么原因了。
(2)知识普及:UNDOTBS1是一个回滚表空间,随着数据库的使用,默认会自动扩展。当它增大到一定程度,占用了过多的磁盘空间时,就需要进行清理了。
(3)网上查询一下,发现有好多说操作要重启数据库,由于数据库上正在跑着数据,不能重启,所以这种方案被否决。

3.解决方案
这里以表空间UNDOTBS1为例,undotbs2 为新建的表空间
(1)登录数据库服务器
执行:su - oracle
(2)使用dab登录
执行:sqlplus / as sysdba
(3)查询表空间信息
执行:select * from dba_data_files;
(4)查询当前使用的undotbs表空间
SQL>show parameters undo;
(5)重新建立一个新的undo表空间
执行:create undo tablespace undotbs2 datafile '/user/oracle/oradata/undotbs02.dbf' size 8048m;
(6)设置数据库的undo表空间为新的undotbs2表空间
执行:alter system set undo_tablespace=undotbs2;
(7)删除旧的undo表空间及其内容
执行:drop tablespace undotbs1 including contents and datafiles;

(8)再次执行语句查看表空间

SELECT a.tablespace_name "表空间名", 
    total "表空间大小", 
    free "表空间剩余大小", 
    (total - free) "表空间使用大小", 
    total / (1024 * 1024 * 1024) "表空间大小(G)", 
    free / (1024 * 1024 * 1024) "表空间剩余大小(G)", 
    (total - free) / (1024 * 1024 * 1024) "表空间使用大小(G)", 
    round((total - free) / total, 4) * 100 "使用率 %" 
    FROM (SELECT tablespace_name, SUM(bytes) free 
    FROM dba_free_space 
    GROUP BY tablespace_name) a, 
    (SELECT tablespace_name, SUM(bytes) total 
    FROM dba_data_files 
    GROUP BY tablespace_name) b 
    WHERE a.tablespace_name = b.tablespace_name;

(8)但是即使按照上面的方式清空UNDOTBS表空间,主要频繁执行update语句也会很快让空间饱和,所以可以考虑关闭undo retention的自动优化特性,即将数据库参数_undo_autotune设置为FALSE,
执行:Alter system set "_undo_autotune" = false;
该参数可以在线调整,不需要重启数据库,也不会影响系统额正常运行。

(10)增大临时文件大小
alter database tempfile ‘/user/oracle/oradata/undotbs02.dbf’ RESIZE 4096M;

参考:https://blog.csdn.net/ziele_008/article/details/104792752

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐