处理在线日志数据过大问题之一--根据rowid批量删除

Oracle DELETE操作全解析:从原理到高性能批量删除实战 在数据库管理中,数据删除是基础且关键的操作。其核心原理在于事务控制,通过生成回滚段(Undo Segment)的前镜像实现可回滚性,这确保了数据的一致性与安全性。从技术价值看,理解删除机制能有效避免锁竞争、空间碎片和性能下降等问题,对于维护数据库稳定运行至关重要。在实际应用场景中,尤其是在处理海量数据时,直接使用DELETE语句可能导致长时间锁表和资源耗尽。因此,掌握分批次删除等优化技术,结合合理的监控与错误处理,是提升工程实践效率的关键。本文聚焦Oracle数据库,深入探讨DELETE操作的高阶实践与性能 阅读详情

         我们有一个实时日志表数据量太大了(这个不是分区表),这个表不能中断业务,我们先要在线删除部分数据。有这个是生产库不能中断业务不能使用create table rename 的方法来搞。我就老老实实的使用rowid批删除的方法。


1、先创建了一个存储过程:
create or replace procedure delete_table_by_condition(table_name varchar2,
                                                      condition  varchar2) is
  type mycursor_type is ref cursor;
  mycursor mycursor_type;
  --cursor mycursor is
  -- SELECT ROWID FROM table_name WHERE condition order by rowid;
  type rowid_table_type is table of rowid index by pls_integer;
  v_rowid         rowid_table_type;
  v_sql_getrowid  varchar2(400);
  v_sql_del_table varchar2(400);
BEGIN
  v_sql_getrowid  := 'SELECT ROWID FROM ' || table_name || ' WHERE ' ||
                     condition || ' order by rowid ';
  v_sql_del_table := 'delete from ' || table_name || ' WHERE rowid = :1';
  dbms_output.put_line(v_sql_getrowid);
  open mycursor for v_sql_getrowid;
  loop
    fetch mycursor bulk collect--------每次处理5000行,也就是每5000行一提交
      into v_rowid limit 5000;
    exit when v_rowid.count = 0;
    forall i in v_rowid.first .. v_rowid.last
      execute immediate v_sql_del_table using v_rowid(i);
    commit;
  end loop;
  close mycursor;
END;

2、在创建一个job,让他每天5点中跑。

declare
  JOBNAME varchar2(100) := 'JOB_delete_table';
  JOB_CNT int;
begin
  select count(*) into JOB_CNT from user_scheduler_jobs uj where upper(uj.JOB_NAME) = upper(JOBNAME);
  if JOB_CNT >= 1 then
    begin dbms_scheduler.drop_job(job_name => JOBNAME); end;
  end if;
end;

/

begin
  dbms_scheduler.create_job(job_name        => 'JOB_delete_table',
                            job_type        => 'PLSQL_BLOCK',
                            job_action      => 'begin delete_table_by_condition(''ACCESSLOG'',''logtime < to_char(trunc(sysdate-1),''''yyyy-mm-dd hh24:mi:ss'''')'');end;',
                            repeat_interval => 'FREQ=DAILY;BYHOUR=5;byminute=0',
                            enabled         => true);
end;

/

exec DBMS_SCHEDULER.enable('JOB_delete_table');

3、处理完以后,检查表碎片
  SELECT table_name,
         ROUND (BLOCKS * 8192 / 1024 / 1024 , 2) "total_size(M)",
         ROUND (num_rows * AVG_ROW_LEN / 1024 / 1024 , 2) "used_size(M)",
         ROUND ( ( (BLOCKS * 8192 / 1024 / 1024 ) - (num_rows * AVG_ROW_LEN / 1024 / 1024 )), 2) "wasted_size(M)",
         ROUND (ROUND ( ( (BLOCKS * 8192 / 1024 / 1024 )- (num_rows * AVG_ROW_LEN / 1024 / 1024 )),2)/
                     ROUND (BLOCKS * 8192 / 1024 / 1024 , 2),2)* 100|| '%' wasted_percent
    FROM user_tables
   WHERE   ROUND (BLOCKS * 8192 / 1024 / 1024 , 2) <> 0
ORDER BY 2 desc;

发现表碎片比较厉害,我打算收缩一下表。

4、在线收缩一下表使用的空间,降低水位。
alter table accesslog shrink space。

5、总结,效果还是可以的。查询速度比之前快了一点,磁盘也省了。但是存储过程和表shrink的时间太长了。
还是考虑分区表。
Oracle数据库错误处理:解决Invalid Rowid问题 简介:在Oracle数据库中,“invalid rowid”错误提示用户尝试访问的数据行引用无效或不存在。该问题可能由数据行删除、表结构变动、表空间问题、并发问题、索引问题或回滚段问题引起。为解决此错误,需验证查询、检查事务、分析日志、恢复数据、修复表空间、重建索引,并执行定期的数据库维护。本课程提供了一个详细的解决方案流程,帮助用户理解Oracle内部工作原理、编写健壮的SQL查询,并预防此类问题的发生。 阅读详情

相关推荐

宏基因组分析|从Binning到MAG优化的全流程实战指南

本文提供了一份宏基因组分析从Binning到MAG优化的全流程实战指南。详细解析了宏基因组分箱(Binning)的核心原理与必要性,并手把手指导如何利用Bowtie2、MetaBAT2和CheckM等工具构建分箱流水线,进行质量评估与筛选,最终获得高质量宏基因组组装基因组(MAG)。文章还分享了常见问题排查与进阶优化策略,为后续物种分类、功能注释等深度分析奠定坚实基础。

weixin_29260291的博客 455

oracle 根据rowid分片

对于update,delete操作,如果分区表,可以分区进行操作; 如果是一个非分区的大表,那么此时的容易引发UNDO不够,如果连接中断的话,那么回滚必然很耗时间; 所以,这里可以对非分区的大表进行rowid分片; 先验证分片数量是否正确: declare cursor c_get_rid is select dbms_rowid.rowid_create( ...

u011165335的博客 2567

Unity游戏开发客户端Unity基础

Unity游戏开发客户端面经 之 Unity 篇

Sea3752的博客 2万+

ORACLE普通表转分区表__使用ROWID将表切片迁移数据

利用11G的新特性DBMS_PARALLEL_EXECUTE按ROWID对表进行分块,具体参考文章https://blog.youkuaiyun.com/u010692693/article/details/103048115 普通表 SQL> SELECT NUM_COL, COUNT(*) FROM TEST_TAB 2 GROUP BY NUM_COL ORDER BY NUM...

u010692693的专栏 706

华为防火墙双线路配置实战:5分钟搞定主备自动切换(含健康检查避坑指南)

本文详细介绍了华为防火墙双线路配置实战,包括主备自动切换和健康检查机制的优化技巧。通过智能健康检查机制,华为防火墙能实现毫秒级故障自动切换,确保网络高可用性。文章提供了从架构设计到实战配置的全流程指南,并分享了常见配置误区与解决方案,帮助中小企业快速搭建稳定可靠的网络架构。

weixin_30872337的博客 604

NotebookLM平替实测:用Open Notebook+Ollama零成本搭建私有AI知识库

本文提供了一份详细的实战指南,教你如何利用Open Notebook与Ollama,在本地零成本搭建一个功能强大且完全私有的AI知识库。通过Docker容器化部署,实现数据绝对安全、模型自由选择与离线运行,是NotebookLM等云端工具的绝佳平替方案,尤其适合注重数据隐私的教育工作者、研究者及小团队。

weixin_29052717的博客 513

利用rowid更新,删除批量数据

一:大批量删除数据的脚本 说明: 有两张表a表(2000w数据),b表(30w数据) b.id肯定能在a.id中找到 删掉a表中b.id和a.id不能匹配的数据 如b.id有1,2,3,4 a.id有1,2,3,4,5,6,7,8 把5,6,7,8在a表中删掉 create or replace procedure DelBatchData(LimitRows number...

老A的自留地,欢迎加微信交流,微信号zhoul777 361

新手必看|HDevelop核心算子快速上手,为C#移植打基础

在上一篇文章中,我们完成了C#+HALCON的开发环境搭建。但在实际工业开发中,绝不会直接在C#中编写视觉算法HDevelop可视化调试算法 → 验证效果 → 导出C#代码 → 集成到上位机。HDevelop是HALCON专属的算法调试工具,支持实时预览图像、参数动态调节、零编译运行,是新手入门和工业算法调试的核心工具。本文聚焦工业场景高频使用的核心算子,从基础操作到实战案例,手把手教你使用HDevelop;同时重点讲解算法导出C#的规范,让你调试完成的算法,能无缝移植到WinForm上位机中。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 778

删除大表的数据:普通删除语句和游标处理的比较

一、前言 WHERE条件用不到索引的情况下如何删除大表记录? 文章中只是列举出其中一种方式而已,但仍然存在很多不严谨的地方.只是 轻描淡写随着数据表越来越大,历史数据的处理将越来越困难.且过滤字段没有索引(如时间)字段,而创建索引是需要临时表空间排序的.有越来越大,创建的维护工作也随之越来越难. 除了本文介绍的方法以外,还可以通过以下几种方法来维护历史数据: 1. 创建历史表,将历史

Robo's Blog【海阔凭鱼跃,天高任鸟飞】 1047

LM Studio中文版零基础入门:从安装到模型下载的保姆级教程(附国内镜像源配置)

本文提供LM Studio中文版的零基础入门教程,涵盖从软件安装、中文界面切换到国内镜像源配置的全流程。特别针对模型下载速度慢的问题,详细介绍了如何通过修改配置文件使用国内镜像站,并推荐适合新手的入门模型及硬件配置建议,帮助用户快速上手本地大模型运行。

pz890123456的博客 2590

大数据之VIP(Virtual IP,虚拟IP)负载均衡

VIP(Virtual IP,虚拟IP)负载均衡是一种在计算机网络中常用的技术,用于将网络请求流量均匀地分散到多个服务器上,以提高系统的可扩展性、可靠性和性能。

赵玉的专栏 4123

通过rowid逻辑并行抽取数据

在我们迁移数据,或者进行同步数据的时候,对于应用变更频繁的表进行抽取数据,经常会碰到oracle需要读取回滚段,会导致很慢,有时候甚至会报ora01555错误, 比如我们有个表比较大是40G左右,就是一个月的按月分区数据,这个时候如果想尽快抽取数据到另外一个库,有几种方法: 方法1:      大家都知道的使用append,然后不写日志,parallel抽取方式: 代码类似

星星_月亮的光芒 1086

【5】GD32H7xx CAN发送及FIFO接收

GD32H7xx CAN收发调试记录,包含源码

madao1234的博客 1813

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

** oracle 快速删除大批量数据方法(全部删除,条件删除,删除大量重复记录) ** 全部删除 如果是删除某个表的所有数据,并且不需要回滚,使用 TRUNCATE 就ok了。 SQL> truncate table table_name; 条件删除 如果删除数据有条件,如 delete from tablename where col1 = ‘lucy’;这时除了加索引外, 你可...

qq_39322392的博客 2820

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Oracle 大表数据删除/清理方法小结

costdown遇到了大量数据清理的需求,整理下基本思路及方法。

Hehuyi_In的博客 9868

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

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

全部删除如果是删除某个表的所有数据,并且不需要回滚,使用 TRUNCATE 就ok了。SQL> truncate table table_name;条件删除如果删除数据有条件,如 delete from tablename where col1 = 'lucy';这时除了加索引外, 你可以删除时加NO LOGGING选项,不写日志加快删除速度引用某人的一句话“几千万条记录的表都不...

weixin_33488806的博客 3545

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Oracle如何优雅删除大表历史数据

一次性删除数百万行数据会产生海量的 Undo 信息,极易导致 Undo 表空间耗尽,触发 ORA-01562(无法扩展回滚段)等致命错误。:单次大事务会全程持有大量的行级锁甚至表级锁,导致其他业务会话长时间被阻塞,严重影响生产环境的并发性能。将大规模删除操作分解为多个小批次,每次删除后提交,既能控制 Undo 空间的增长,又能减少锁的持有时间。这意味着即使你删除了 90% 的数据,后续的全表扫描依然会扫描这些已经变空的物理块,查询性能不会提升。,PL/SQL 引擎会将这 10000 条数据打包,

JangBingYang的博客 387

电科金仓 OID 和 ROWID,这两天折腾迁移的一点碎碎念本

摘要:本文以 Oracle 11g 迁移至电科金仓 KES 的政务云项目为背景,解析 KES 底层双轨架构:OID 是内核管理数据库对象的表级标识,严禁用于业务;ROWID 是行级物理地址伪列,适用于增量同步断点续传、孤儿数据清洗及性能调优,但会因数据变更而改变。文章通过实战案例强调信创环境下需摒弃 Oracle 思维定式,合理利用底层特性方能提升效率。

小相探索IT世界 1万+

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

全部删除 如果是删除某个表的所有数据,并且不需要回滚,使用 TRUNCATE 就ok了。关于Trancate 参见这里http://blog.youkuaiyun.com/gnolhh168/archive/2011/05/24/6442561.aspx SQL> truncate table table_name; 条件删除 如果删除数据有条件,如 delete fro...

dczjn9698的博客 325

oracle笔记整理5——delete与truncate,rowid与rownum,删除重复记录

1) delete与truncate a) delete一行一行删除,并且记录日志,truncate释放用于存储表数据的数据页(extent)来删除数据,在日志中只记录页的释放,故无法rollback,也无法flashback,从物理结构上来说,truncate之后,表所在的段头信息(segment header)被摧毁,导致段-区-数据块之间的路径被截断,无法查询到数据块上的数据,感觉就跟删除了一

亡羊补牢 3005

大表数据删除

需求: 几个关联的大表数据进行时间切割 注:  未按大表分区方法进行,理论上大表分区速度会更快 操作步骤:(建议业务低峰操作,并合理调整并行度及开关日志) 1. 为后面的操作提速,先将所有需要操作的表开启并行,并关闭日志 alter table a nologging; alter table a parallel(degree 8); alter table b

流云追风 881

rowid

本文章为网络笔记,看了warehouse老师的视频受益匪浅,更是感觉自己技术太过初级,特写了本笔记,方便以后反复学习! 如有任何不妥,请发邮件至102448567@qq.com删除文章! 关于warehouse: http://blog.itpub.net/19602/viewspace-1059211/ 11gR2视频第四版 5_01_rowid rowid、rownum都是pseudocolumn(伪列) rowid:64进制数 SQL> SELECT id,name,rowid FROM t1;

Baldwin的博客 376

ODI中删除数据的处理

一、前提知识:数据从源数据库向数据仓库抽取时,一般采用以下几种方式:全抽取模式如果表的数据量较小,则可以采取全表抽取方式,以TRUNCATE/INSERT方式进行数据抽取。 基于时间戳的抽取模式如果源数据表是不可更新的数据(如大多数事务处理数据)或者是不可删除数据(只能失效历史记录的情况),则根据变更时间戳,抽取最新变更的数据进行同步。 日志分析如果没有更新时间戳,或者源数据存在删

meteorWJ's Home—Floating clound 4384
上一篇: Linux服务器性能评估与优化
下一篇: oracle10g分区表的自动维护(原创)
RuleV5
博客等级 码龄16年 61粉丝 81原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值