undo表空间异常增大印发的空间不足问题

今日同事发现他负责的一个数据库服务器出现了异常,症状为UNDOTBS表空间增大,导致磁盘空间不足,其请我协助解决这个问题。

系统是linux的,原则上来讲这个问题其实很好解决,建立新的UNDOTBS表空间,然后让系统默认使用这个表空间,等到切换完毕,删除老的UNDOTBS表空间即可。

但是在实际解决的时候却一波三折,现总结如下:

刚开始的时候给了他一个文档,其内容是如何建立新的UNDOTBS表空间并删除旧的,此文档详见http://blog.csdn.net/wxlbrxhb/article/details/14448777

但是他在使用之后等了一会发现现有的UNDOTBS表空间并未离线。手工执行了离线命令无效,估计此时应该还有数据在处理。

他有些着急,故此建议他重启数据库让后让再开起来这样数据库默认就直接使用新的UNDOTBS表空间了,旧的直接删掉。

但是重启后进入sqlplus开启数据库发现异常:

提示没有权限,有时候oracle没有加入DBA用户组也可能会有权限不足的问题出现,所以让他查了一下,结果发现oracle已经在DBA用户组中了。

看来思路还是不对,不是这个问题。尝试直接使用sqlplus / as sysdba登录,结果如下:

SQL> ORA-09945: Unable to initialize the audit trail file

Linux Error: 28: No space left on device

SQL>

./dbstart: Database instance "tnitsora" warm started.

/u01/app/oracle/product/10.2.0/db_1/bin/dbstart: Starting up database "tnitsora"

注意到一个提示ORA-09945: Unable to initialize the audit trail file

,无法初始化审计文件。似乎有门,oracle在正常使用的时候会涉及到一个权限的审计问题,一般来讲会创建一个审计的文件在/u01/app/oracle/admin/tnitsora/adump下,正巧今天有空间磁盘空间不足的现象,会不会是因为这个所以无法创建新的审计文件从而导致了无法进入sysdba,并且无法正常启动数据库呢。

抱着这个想法进入了oracle目录,进入了/u01/app/oracle/admin/tnitsora目录下 ,使用du –sh查看各个目录的占用率,发现了问题,bdump居然有24G这也太大了。赶紧删除了bdump下的大部分文件,此时在使用sysdba登录发现已经可以正常登录了,进入之后开启数据库也正常,至此事情暂时告一段落。

Bdump这个目录存放的是后台进程跟踪文件目录,一般来讲这个文件夹下的文件是可以删除的。

同事把应用都起来之后发现新的UNDOTBS表空间增大的很快,半个小时就已经用了8G了,UNDOTBS增大是正常的,但是这也增大的太快了,决定继续分析处理。

先询问了近期是否有对数据库各类参数调整,同事表示没有,但是修改过表结构等方面的东西。一般来讲如果是undo_retention参数设置的时间过大有可能到导致UNDOTBS表空间中有大量未提交的数据从而快速增大,使用show parameter undo进行了查看未见异常。

询问其是否有自动备份数据库的脚本或者程序在运行,其表示没有。又查看了操作大量数据的job,发现和job也没关系,job是晚上执行的。

继续分析,想到如果一个表未做索引,那么他在进行dml时会产生效率很低,也有可能导致UNDOTBS表空间异常增大。一般来说INSERT生成的UNDO最少,因为对于INSERT而言,Oracle 只要记录其对应的一个“删除“行的rowid即可。其次就是UPDATE 操作,对于该操作而言,只记录修改的字节;通常,在多数情况下,我们只修改行的一小部分,那么,UNDO会将该部分记录。相对上述两种操作,DELETE操作会生成最多的UNDO,因为Oracle必须把整行的前影像都记录到了undo段中。

请按着我这边一个未出问题的数据库的表结构对比了数据量较大的几个表,发现索引都一样未见异常,奇怪了问题出在哪里?

在网上早来一段检查回滚段事务情况的语句

SELECT r.NAME 回滚段名,s.sid SID,s.serial# Serial,

s.username 用户名,s.machine 机器名,

t.start_time 开始时间,t.status 状态,

t.used_ublk 撤消块,USED_UREC 撤消记录,

t.cr_get 一致性取,t.cr_change 一致性变化,

t.log_io "逻辑I/O",t.phy_io "物理I/O",

t.noundo NoUndo,g.extents Extents,substr(s.program, 1, 50) 操作程序

FROM v$session s, v$transaction t, v$rollname r,v$rollstat g

WHERE t.addr = s.taddr

AND t.xidusn = r.usn

AND r.usn = g.usn

ORDER BY t.used_ublk desc

发现有个进程一直在使用回退段,且已经执行了2个多小时了,状态还是active

查看到进程的名字为FAKE_xxx_ xxx _ xxx.exe,估计问题就出在他身上。将这个程序关闭之后再次检查UNDOTBS表空间,此时UNDOTBS表空间的增大情况已经减小,数据库回复正常。

时间: 2024-08-05 19:36:08

undo表空间异常增大印发的空间不足问题的相关文章

【oracle11g,13】表空间管理2:undo表空间管理(调优) ,闪回原理

一.undo空间原理: dml操作会产生undo数据. update时,sever process 会在databuffer 中找到该记录的buffer块,没有就从datafile中找并读入data buffer.在修改之前,原始数据先放到undo段,并在数据块头记录undo段(acitve 状态)中该数据块的位置,读写这个块时会占用事务槽,会将该事务号记录在数据块的头部.然后在进行update,并将该块放到dirty list检查点队列,等待dbwr进行写操作. 二.创建新的undo表空间替换

记一次ORACLE的UNDO表空间爆满分析过程

这篇文章是记录一次ORACLE数据库UNDO表空间爆满的分析过程,主要整理.梳理了同事分析的思路.具体过程如下所示: 早上收到一数据库服务器的UNDO表空间的告警邮件,最早一封是7:55发出的(监控作业是15分钟一次),从告警邮件分析,好像是UNDO表空间突然一下子被耗尽了. DB Tablespace Allocated Free Used % Free % Used 192.168.xxx.xxx:1521 UNDOTBS1 16384 190.25 16193.75 1.16 99 使用一

UNDO表空间的估算

UNDO表空间和TEMP空间类似,都是循环使用的,其使用原理大致如下: 当我们使用AUM(自动UNDO管理),并设置了undo_retention以后,undo块就存在四种状态. Active:表示正在使用该undo的事务还没有提交或回滚. Inactive:表示该undo上没有活动的事务,该状态的undo可以被其他事务覆盖. Expired:表示该undo持续inactive的时间超过undo_retention所指定的时间. Freed:表示该undo块内容是空的,从来没有被使用过. 当活动

Oracle undo 表空间不可用

由于某次不小心操作,在切换表空间时没有成功,但是由于把parameter undo的undo_management值改为了MANUAL所以在启动数据库时没有报任何错误,但是给表插入数据时报错了,回滚段不可用的错误.然后查询了错误原因. 1 首先看数据库中undo信息 SQL> show parameter undo; NAME TYPE VALUE------------------------------------ ----------- --------------------------

第15章 oracle undo表空间管理

2015-10-23 目录 参考资料 [1] 林树泽.Oracle 11g R2 DBA操作指南[M].北京:清华大学出版社,2013 [2] Oracle undo 表空间管理 [3] undo表空间概述 [4] Oracle UNDO表空间的管理 [5] Oracle的UNDO表空间管理总结 [6] UNDO表空间的管理 [7] UNDO表空间的管理 [8] 监控和管理Oracle UNDO表空间的使用 [9] 谈谈undo表空间

undo表空间概述

oracle028 undo表空间概述 UNDO的简要概序: 1. 一般的表空间中的段是手动建立的,undo表空间和普通的表空间相似,但是undo表空间中undo段,undo段是自动生成的:oracle自动使用.维护undo段. 2. 一般表空间中的段是我们自己手动使用的,而undo表中的段是oracle自动使用的. show parameter undo_tablespace;//查询当前的undo表空间 NAME                                        

在线扩大数据库UNDO表空间

用oracle账号登陆ORACLE数据库服务器 方法一: 查看表空间的名字及文件所在位置: select tablespace_name, file_id, file_name,round(bytes/(1024*1024),0) total_space from dba_data_files order by tablespace_name; 修改数据库datafile文件到新的大小 alter database datafile '\oracle\oradata\undotab1.dbf'

MySQL5.7新特性——在线收缩undo表空间

1. MySQL 5.5时代的undo log 在MySQL5.5以及之前,大家会发现随着数据库上线时间越来越长,ibdata1文件(即InnoDB的共享表空间,或者系统表空间)会越来越大,这会造成2个比较明显的问题: (1)磁盘剩余空间越来越小,到后期往往要加磁盘: (2)物理备份时间越来越长,备份文件也越来越大. 这是怎么回事呢? 原因除了数据量自然增长之外,在MySQL5.5以及之前,InnoDB的undo log也是存放在ibdata1里面的.一旦出现大事务,这个大事务所使用的undo

【undo表空间的丢失-恢复-1】

使用rman进行恢复--undo丢失 restore 把文件还原回去: recover 利用日志文件重做: 关键性的文件丢失和非关键性的文件丢失(system/undo之外的丢失) 1> 删除undo文件: [[email protected] ~]$ rm /u01/oracle/oradata/jadl10g/undotbs01.dbf [[email protected] ~]$ sqlplus / as sysdba SQL*Plus: Release 10.2.0.5.0 - Prod