前一天晚上做大表删除操作测试,分段删除,没删除100000条commit一次,由于存储过程打印了执行时间中途断网,无法看到执行时间
于是直接kill了任务
结果早上登录测试数据库发现空间爆满
然后一时糊涂去弄了表的shrink跟dbms_stats.gather_table_stats想着收缩表释放空间
弄到一半突然想起,表的收缩最多是释放表空间的空闲空间,并非系统空间
后来想想,大量删除反复操作过程引发了undo的扩展,后来检查表空间后确实如此
最后在线更换undo tablespace后删除原tablespace后恢复

附上存储过程

 create or replace procedure delete_table as
i number(15);
l_start number default dbms_utility.get_time;
begin
dbms_output.put_line('begin time:'||to_char(SYSTIMESTAMP,'HH24:MI:SS:FF2'));
i:=0;
for x in (select log_id from user_log where user_log_id<46380000)
loop
delete from user_log where user_log_id = x.user_log_id;
i:=i+1;
if (i>10000) then
begin
--dbms_output.put_line('delete ok.'||i);
commit;
i:=0;
end;
end if;
end loop;
commit;
dbms_output.put_line('ok.end time:'||to_char(SYSTIMESTAMP,'HH24:MI:SS:FF2'));
exception when others then
rollback;
end;
/

delete_table

另外调试时记得 set serveroutput on

遇到的报错提示

[oracle@centos5 osa]$ dba

SQL*Plus: Release 10.2.0.4.0 - Production on Fri Jun 21 09:23:18 2013

Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.

ERROR:
ORA-09817: Write to audit file failed.
Linux-x86_64 Error: 28: No space left on device
ORA-01075: you are currently logged on Enter user-name:
ERROR:
ORA-01017: invalid username/password; logon denied Enter user-name:
ERROR:
ORA-01017: invalid username/password; logon denied SP2-0157: unable to CONNECT to ORACLE after 3 attempts, exiting SQL*Plus

检查磁盘空间,爆满

[oracle@centos5 osa]$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 93G 89G 0 100% /
/dev/sda1 99M 12M 82M 13% /boot
tmpfs 1006M 0 1006M 0% /dev/shm

想着收缩下大表就有空间了,,,糊里糊涂开始shrink

[oracle@centos5 osa]$ sqlplus test/test

SQL*Plus: Release 10.2.0.4.0 - Production on Fri Jun 21 09:23:26 2013

Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.

Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options SQL> select table_name,BLOCKS,EMPTY_BLOCKS,NUM_ROWS from user_tables where table_name = upper('user_log'); TABLE_NAME BLOCKS EMPTY_BLOCKS NUM_ROWS
------------------------------ ---------- ------------ ----------
user_log 2606643 0 176544060 SQL> alter table user_log enable row movement; Table altered. SQL> alter table user_log shrink space cascade; --索引也能缩小 Table altered. SQL> select table_name,BLOCKS,EMPTY_BLOCKS,NUM_ROWS from user_tables where table_name = upper('user_log'); TABLE_NAME BLOCKS EMPTY_BLOCKS NUM_ROWS
------------------------------ ---------- ------------ ----------
user_log 2606643 0 176544060 SQL>

shrink后还需要重新收集统计信息,但是当空间爆满时同样无法进行统计信息收集

SQL> exec dbms_stats.gather_table_stats('TEST','user_log');
BEGIN dbms_stats.gather_table_stats('TEST','user_log'); END; *
ERROR at line 1:
ORA-01114: IO error writing block to file %s (block # %s)

想想其实收缩、整理,只是释放表空间的已用空间到空闲空间,并不会回收实际的磁盘

先删除了一些本身在在根目录下的oracle安装文件才可以做undo表空间的重建工作,否则没空间还是无法工作

由于大量操作导致了undo的自动扩展,占用了大量空间,准备收缩undo

[root@centos5 ~]# su - oracle
cd [oracle@centos5 ~]$ sqlplus test/test SQL*Plus: Release 10.2.0.4.0 - Production on Fri Jun 21 11:39:40 2013 Copyright (c) 1982, 2007, Oracle. All Rights Reserved. Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options SQL> @space.sql TABLESPACE_NAME TOTAL USED RATIO FREE MAX_BYTES
--------------- ---------- ---------- ---------- ---------- ----------
SYSTEM 490 486.69 99.32 3.31 2.94
SYSAUX 380 377 99.21 3 .81
TEST 40960 20072.19 49.00 20887.81 3968
TS_OA 50 5.06 10.12 44.94 39.94
USERS 5 .44 8.80 4.56 4.56
TS_URP 200 5.37 2.69 194.63 190.81
UNDOTBS1 9195 134.31 1.46 9060.69 2965
OSA_TEST 500 7.31 1.46 492.69 485.94
TS_IMPTEST 50 .06 0.12 49.94 49.94 9 rows selected. SQL> select file_name,bytes/1024/1024 from dba_data_files where tablespace_name like 'UNDOTBS1'; FILE_NAME BYTES/1024/1024
-----------------------------------        ----------------
/home/oracle/oradata/osa/undotbs01.dbf 9195

undo表空间的重建工作

--1、建立一个全新的undostb2
SQL> create undo tablespace undotbs2 datafile '/home/oracle/oradata/osa/undotbs2.dbf' size 200M; Tablespace created. --2、修改系统的undo_tablespace为undotbs2
SQL> alter system set undo_tablespace=undotbs2 scope=both; System altered.
--3、删除原有undo tablespace
SQL> drop tablespace undotbs1 including contents; Tablespace dropped.
--4、删除数据文件释放空间
rm -rf /home/oracle/oradata/osa/undotbs01.dbf

再来看看空间

SQL> @space.sql              

TABLESPACE_NAME      TOTAL       USED RATIO            FREE  MAX_BYTES
--------------- ---------- ---------- ---------- ---------- ----------
SYSAUX 380 377.94 99.46 2.06 .63
SYSTEM 490 486.69 99.32 3.31 2.94
TEST 40960 20072.19 49.00 20887.81 3968
TS_OA 50 5.06 10.12 44.94 39.94
USERS 5 .44 8.80 4.56 4.56
TS_URP 200 5.37 2.69 194.63 190.81
OSA_TEST 500 7.31 1.46 492.69 485.94
UNDOTBS2 200 1.31 0.66 198.69 198.69
TS_IMPTEST 50 .06 0.12 49.94 49.94

再来收集统计信息查看下最高水位

SQL> select table_name,BLOCKS,EMPTY_BLOCKS,NUM_ROWS  from user_tables where table_name = upper('user_log');

TABLE_NAME                         BLOCKS EMPTY_BLOCKS   NUM_ROWS
------------------------------ ---------- ------------ ----------
user_log 2606643 0 176544060 SQL> exec dbms_stats.gather_table_stats('TEST','user_log'); PL/SQL procedure successfully completed. SQL> select table_name,BLOCKS,EMPTY_BLOCKS,NUM_ROWS from user_tables where table_name = upper('user_log'); TABLE_NAME BLOCKS EMPTY_BLOCKS NUM_ROWS
------------------------------ ---------- ------------ ----------
user_log 1719906 0 117470482 --shrink后统计信息更新了

如果是生产系统那会很惨,日常监控要非常注意数据库空间、系统空间

delete大批量数据引起空间爆满处理的更多相关文章

  1. Oracle impdp导入数据临时表空间与undo表空间爆满解决实例

    Oracle impdp导入数据临时表空间与undo表空间爆满解决实例 [日期:2018-01-24] 来源:Linux社区  作者:rangle [字体:大 中 小]   针对Oracle数据迁移, ...

  2. MySQL不建议delete删除数据

    InnoDB存储架构 从这张图可以看到,InnoDB存储结构主要包括两部分:逻辑存储结构和物理存储结构. 逻辑上是由表空间tablespace -> 段segment或者inode -> ...

  3. ODP方式,大批量数据写入ORACLE数据库

    项目中在同步数据的时候,需要把获得的数据DataTable,写入oracle数据库 因为System.Data.OracleClient写入方式写入大批量数据特别慢,改用Oracle.DataAcce ...

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

    这篇文章是记录一次ORACLE数据库UNDO表空间爆满的分析过程,主要整理.梳理了同事分析的思路.具体过程如下所示: 早上收到一数据库服务器的UNDO表空间的告警邮件,最早一封是7:55发出的(监控作 ...

  5. mysql delete删除记录数据库空间不减少问题解决方法

    记得在中学时学计算机时老师就告诉我delete删除记录只是给数据库中的记录加一个删除标识了,这样数据库空间并不是减少了,当时没想这么多,昨天发现一个数据库利用delete 删除之后容量没变,后来百度了 ...

  6. Linux磁盘空间爆满,MySQL无法启动

    OS: Cent OS 6.3 DB: 5.5.14 看到一个帖子,在服务器上安装了oracle和mysql数据库,mysql数据库忘记开启innodb_file_per_table,导致插入测试数据 ...

  7. oracle 快速删除大批量数据方法(全部删除,条件删除,删除大量重复记录)

    oracle 快速删除大批量数据方法(全部删除,条件删除,删除大量重复记录) 分类: ORACLE 数据库 2011-05-24 16:39 8427人阅读 评论(2) 收藏 举报 oracledel ...

  8. Sql Server数据库使用触发器和sqlbulkcopy大批量数据插入更新

    需要了解的知识 1.触发器 2.sqlbulkcopy 我的用途 开发数据库同步的工具,需要大批量数据插入和数据更新. 方式 使用SqlBulkCopy类对数据进行数据批量复制,将需要同步数据的表新建 ...

  9. RDS for MySQL 删除数据后空间没有减少处理方法

    公司的程序和数据库部署在阿里云上,数据库使用的是阿里云的RDS,这天,经理在开发群中发了一个信息: 您的RDS实例rm********0oq的磁盘在过去一周平均使用率已超过80.%,建议您对实例规格进 ...

随机推荐

  1. 使用有限状态机(FSM)编写的敌人AI

    using UnityEngine; using System.Collections; public class AttackState : FSMState { public AttackStat ...

  2. PHP调用WCF小结

    新工作第三周,做了3年多的.Net,突然急转弯做PHP,漂移过弯,速度180迈 由于数据的整合,在项目中不得不使用PHP调用WCF 一头的雾水,网上相关的资料少又少,在phpChina发个帖子,还没有 ...

  3. 使用一个HttpModule拦截Http请求,来检测页面刷新(F5或正常的请求)

    在Web Application中,有个问题就是:“我怎么来判断一个http请求到底是通过按F5刷新的请求还是正常的提交请求?” 相信了解ASP.NET的人知道我在说什么,会有同感,而且这其实不是一个 ...

  4. 输出jq对象

    console.log($()); 效果截图:

  5. hiho 分冶专题

    hiho的每周一题都不会很难,基本上就是一些很裸和经典的问题,这一次写了几道分冶专题的题,做个总结. 分冶最简单的就是二分,二分说简单,很简单,不过7,8行代码,不过也常常写挂,写成无限循环. 直接看 ...

  6. javascript中base64和Gzip的使用

    一般的使用流程(4步): 服务器端将字符串Gzip压缩为 字节数组——>通过base64转为字符串(后传递到客户端)——>解码base64字符串为字节数组——>Gzip解码字节数组为 ...

  7. HAProxy+Keepalived+PXC负载均衡和高可用的PXC环境

    HAProxy介绍 反向代理服务器,支持双机热备支持虚拟主机,但其配置简单,拥有非常不错的服务器健康检查功能,当其代理的后端服务器出现故障, HAProxy会自动将该服务器摘除,故障恢复后再自动将该服 ...

  8. struts2框架的核心内容

     Struts1和Struts2的区别和对比: Action 类: • Struts1要求Action类继承一个抽象基类.Struts1的一个普遍问题是使用抽象类编程而不是接口,而struts2的Ac ...

  9. 移动网页版Meta 标签

    viewport 大部分移动浏览器都接受,比如 Opera Mobile, iPhone, Android, Iris, IE, BlackBerry, Obigo, Firefox 最基本的例子,在 ...

  10. HDU 4121 Xiangqi

    模拟吧,算是... 被这个题wa到哭,真是什么都不想说了...上代码 #include <iostream> #include <cstring> using namespac ...