Oracle大表数据清理优化与注意事项详解

一、性能优化策略

1. 批量处理优化

  • 批量大小选择

    • 小批量(1,000-10,000行):减少UNDO生成,但需要更多提交次数
    • 中批量(10,000-100,000行):平衡性能与资源消耗
    • 大批量(100,000+行):适合高配置环境,但需监控资源使用
  • 批量删除示例

BEGINFOR i IN 1..100 LOOPEXECUTE IMMEDIATE 'DELETE /*+ PARALLEL(4) */ FROM 大表 WHERE ROWNUM <= 100000 AND 条件 AND MOD(id,100)=:i' USING i;COMMIT;DBMS_LOCK.SLEEP(0.1); -- 控制速度END LOOP;
END;

2. 并行处理优化

  • 并行查询设置

    ALTER SESSION ENABLE PARALLEL DML;
    ALTER SESSION FORCE PARALLEL DML PARALLEL 8;
    
  • 并行删除示例

    DELETE /*+ PARALLEL(大表 8) */ FROM 大表 
    WHERE 创建时间 < ADD_MONTHS(SYSDATE, -36)
    AND ROWNUM <= 1000000;
    

3. 资源控制优化

  • UNDO表空间管理

    • 增大UNDO表空间:ALTER TABLESPACE undo_ts ADD DATAFILE size 10G
    • 设置UNDO保留期:ALTER SYSTEM SET UNDO_RETENTION=900 (秒)
  • 临时表空间优化

    -- 检查临时表空间使用
    SELECT tablespace_name, file_name, bytes/1024/1024 MB 
    FROM dba_temp_files;-- 添加临时文件
    ALTER TABLESPACE temp ADD TEMPFILE '/path/to/temp02.dbf' SIZE 20G;
    

4. 索引优化策略

  • 删除前禁用索引

    -- 查询表索引
    SELECT index_name FROM user_indexes WHERE table_name='大表';-- 禁用索引
    ALTER INDEX idx_name UNUSABLE;-- 删除后重建索引
    ALTER INDEX idx_name REBUILD TABLESPACE index_ts;
    
  • 选择性重建索引

    -- 只重建碎片化严重的索引
    SELECT index_name, blevel, leaf_blocks, (leaf_blocks*8)/1024/1024 "Size(GB)",(select count(*) from 大表) "Table_Rows"
    FROM user_indexes 
    WHERE table_name='大表'
    ORDER BY (leaf_blocks*8)/1024/1024 DESC;
    

二、空间回收策略

1. 段空间回收

  • SHRINK SPACE操作

    -- 启用行移动
    ALTER TABLE 大表 ENABLE ROW MOVEMENT;-- 收缩表空间
    ALTER TABLE 大表 SHRINK SPACE CASCADE;-- 禁用行移动
    ALTER TABLE 大表 DISABLE ROW MOVEMENT;
    
  • MOVE操作

    -- 移动表到新表空间
    ALTER TABLE 大表 MOVE TABLESPACE new_ts;-- 移动后重建索引
    SELECT 'ALTER INDEX '||index_name||' REBUILD;' FROM user_indexes 
    WHERE table_name='大表';
    

2. 表空间重组

  • 表空间导出/导入重组
    -- 1. 导出表空间
    expdp system/password tablespaces=users directory=DATA_PUMP_DIR 
    dumpfile=users_ts.dmp logfile=exp_users.log-- 2. 删除表空间文件
    -- 3. 重建表空间
    CREATE TABLESPACE users DATAFILE '/path/to/users01.dbf' SIZE 50G;-- 4. 导入数据
    impdp system/password tablespaces=users directory=DATA_PUMP_DIR 
    dumpfile=users_ts.dmp logfile=imp_users.log
    

3. ASM空间回收

  • ASM磁盘组空间释放
    -- 检查ASM空间使用
    SELECT name, total_mb, free_mb FROM v$asm_diskgroup;-- 手动释放空间(需要ASM权限)
    ALTER DISKGROUP dg_name REBALANCE POWER 10 WAIT;
    

三、日志与事务管理

1. 重做日志优化

  • 调整日志大小和数量
    -- 检查当前日志配置
    SELECT group#, bytes/1024/1024 MB, members, status FROM v$log;-- 添加新的大日志组
    ALTER DATABASE ADD LOGFILE GROUP 4 ('/path/to/redo04a.log','/path/to/redo04b.log') SIZE 2G;-- 切换日志
    ALTER SYSTEM SWITCH LOGFILE;-- 删除旧日志组(确认不再使用后)
    ALTER DATABASE DROP LOGFILE GROUP 1;
    

2. NOLOGGING模式使用

  • 设置表为NOLOGGING
    ALTER TABLE 大表 NOLOGGING;-- 重要操作后恢复LOGGING模式
    ALTER TABLE 大表 LOGGING;-- 对分区表设置
    ALTER TABLE 大表 MODIFY PARTITION part_name NOLOGGING;
    

3. 事务控制策略

  • 分批提交控制
    -- 每10,000行提交一次
    DECLAREv_counter NUMBER := 0;
    BEGINFOR rec IN (SELECT * FROM 大表 WHERE 条件 FOR UPDATE) LOOPDELETE FROM 大表 WHERE id = rec.id;v_counter := v_counter + 1;IF MOD(v_counter, 10000) = 0 THENCOMMIT;DBMS_LOCK.SLEEP(0.05); -- 控制速度END IF;END LOOP;COMMIT;
    END;
    

四、备份与恢复策略

1. 清理前备份方案

  • RMAN备份策略

    -- 备份整个表空间
    RMAN> BACKUP TABLESPACE users FORMAT '/backup/users_%U.bkp';-- 备份特定表(11g+)
    RMAN> BACKUP DATAFILE 5 TAG='TABLE_BACKUP' SECTION SIZE 1G;
    
  • 数据泵备份

    -- 创建目录对象
    CREATE DIRECTORY backup_dir AS '/backup';
    GRANT READ, WRITE ON DIRECTORY backup_dir TO username;-- 导出表数据
    expdp username/password tables=大表 directory=backup_dir 
    dumpfile=large_table.dmp logfile=exp_large.log
    

2. 闪回技术使用

  • 闪回表恢复

    -- 启用行移动
    ALTER TABLE 大表 ENABLE ROW MOVEMENT;-- 闪回表到时间点
    FLASHBACK TABLE 大表 TO TIMESTAMP TO_TIMESTAMP('2023-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS');-- 或闪回到SCN
    FLASHBACK TABLE 大表 TO SCN 123456789;
    
  • 闪回查询验证

    -- 查询历史数据
    SELECT COUNT(*) FROM 大表 AS OF TIMESTAMP 
    SYSTIMESTAMP - INTERVAL '1' HOUR WHERE 条件;
    

五、监控与验证

1. 实时监控脚本

  • 监控删除进度
    -- 监控会话的等待事件
    SELECT s.sid, s.serial#, s.username, s.status, s.machine, s.program, se.wait_class, se.event
    FROM v$session s, v$session_wait se
    WHERE s.sid = se.sid
    AND s.username = 'YOUR_USERNAME'
    AND s.status = 'ACTIVE';-- 监控表空间使用
    SELECT df.tablespace_name "表空间",df.bytes/1024/1024 "总大小(MB)",(df.bytes-fs.bytes)/1024/1024 "已使用(MB)",fs.bytes/1024/1024 "空闲(MB)",ROUND(100*(1-fs.bytes/df.bytes)) "使用率(%)"
    FROM (SELECT tablespace_name, SUM(bytes) bytes FROM dba_data_files GROUP BY tablespace_name) df,(SELECT tablespace_name, SUM(bytes) bytes FROM dba_free_space GROUP BY tablespace_name) fs
    WHERE df.tablespace_name = fs.tablespace_name;
    

2. 验证清理结果

  • 数据完整性检查
    -- 检查记录数
    SELECT 'Before' AS status, COUNT(*) FROM 大表@source_db UNION ALL
    SELECT 'After' AS status, COUNT(*) FROM 大表;-- 检查关键业务数据
    SELECT COUNT(*) FROM 大表 WHERE 关键字段 IS NULL;-- 检查分区数据分布
    SELECT partition_name, num_rows 
    FROM user_tab_partitions 
    WHERE table_name='大表'
    ORDER BY partition_position;
    

六、异常处理方案

1. 常见错误处理

  • 空间不足错误(ORA-01653/ORA-01654)

    -- 解决方案:
    -- 1. 添加数据文件
    ALTER TABLESPACE users ADD DATAFILE '/path/to/users05.dbf' SIZE 10G AUTOEXTEND ON;-- 2. 扩展现有数据文件
    ALTER DATABASE DATAFILE '/path/to/users01.dbf' RESIZE 20G;
    
  • 锁等待超时(ORA-30006)

    -- 检查阻塞会话
    SELECT blocking_session, sid, serial#, wait_class, seconds_in_wait
    FROM v$session
    WHERE blocking_session IS NOT NULL;-- 终止阻塞会话(谨慎使用)
    ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE;
    

2. 回滚策略

  • 创建恢复点

    -- 创建保证恢复点
    CREATE RESTORE POINT before_cleanup GUARANTEE FLASHBACK DATABASE;-- 执行清理操作...-- 出现问题时回滚
    FLASHBACK DATABASE TO RESTORE POINT before_cleanup;-- 删除恢复点
    DROP RESTORE POINT before_cleanup;
    
  • 基于时间点的恢复

    -- 1. 关闭数据库
    SHUTDOWN IMMEDIATE;-- 2. 启动到mount状态
    STARTUP MOUNT;-- 3. 执行不完全恢复
    RECOVER DATABASE UNTIL TIME '2023-11-01:12:00:00';-- 4. 打开数据库
    ALTER DATABASE OPEN RESETLOGS;
    

七、最佳实践总结

  1. 测试环境验证:在生产环境执行前,务必在测试环境验证清理脚本

  2. 分阶段实施

    • 第一阶段:小批量测试(1-10万行)
    • 第二阶段:中等批量(10-100万行)
    • 第三阶段:全量清理
  3. 资源监控

    • 监控CPU、内存、I/O使用率
    • 监控UNDO和临时表空间使用
    • 监控等待事件和会话状态
  4. 文档记录

    • 记录清理前的数据量
    • 记录清理条件和范围
    • 记录执行时间和资源消耗
    • 记录验证结果和异常处理
  5. 自动化监控

    • 设置告警阈值(如表空间使用率>85%)
    • 配置自动扩展策略
    • 实现自动清理任务调度

通过以上优化策略和注意事项,可以确保Oracle大表清理过程高效、安全且可恢复,最大限度地减少对生产环境的影响。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/90811.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/90811.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Anaconda及Conda介绍及使用

文章目录Anaconda简介为什么选择 Anaconda&#xff1f;Anaconda 安装Win 平台macOS 平台Linux 平台Anaconda 界面使用Conda简介Conda下载安装conda 命令环境管理包管理其他常用命令Jupyter Notebook&#xff08;可选&#xff09;Anaconda简介 Anaconda 是一个数据科学和机器学…

外包干了一周,技术明显退步

我是一名本科生&#xff0c;自2019年起&#xff0c;我便在南京某软件公司担任功能测试的工作。这份工作虽然稳定&#xff0c;但日复一日的重复性工作让我逐渐陷入了舒适区&#xff0c;失去了前进的动力。两年的时光匆匆流逝&#xff0c;我却在原地踏步&#xff0c;技术没有丝毫…

【QT】多线程相关教程

一、核心概念与 Qt 线程模型 1.线程与进程的区别: 线程是程序执行的最小单元&#xff0c;进程是资源分配的最小单元&#xff0c;线程共享进程的内存空间(堆&#xff0c;全局变量等)&#xff0c;而进程拥有独立的内存空间。Qt线程只要关注同一进程内的并发。 2.为什么使用多线程…

VS 版本更新git安全保护问题的解决

问题&#xff1a;我可能移动了一个VS C# 项目&#xff0c;然后&#xff0c;发现里面的git版本检测不能用了 正在打开存储库: X:\Prj_C#\3D fatal: detected dubious ownership in repository at X:/Prj_C#/3DSnapCatch X:/Prj_C#/3D is owned by:S-1-5-32-544 but the current …

Git常用命令一览

Git 是基于 Linux内核开发的版本控制工具。与常用的版本控制工具 CVS, Subversion 等不同&#xff0c;它采用了分布式版本库的方式&#xff0c;不必服务器端软件支持&#xff08;ps&#xff1a;这得分是用什么样的服务端&#xff0c;使用http协议或者git协议等不太一样。并且在…

基于 JSON 文件定位图片缺陷点并保存

基于JSON的图片缺陷处理流程 ├── 1. 输入检查 │ ├── 验证图片文件是否存在 │ └── 验证JSON文件是否存在 │ ├── 2. 数据加载 │ ├── 打开并加载图片 │ └── 读取并解析JSON文件 │ ├── 3. 缺陷信息提取 │ ├── 检查JSON中是否存在shapes字…

Redis基础学习(五大值数据类型的常用操作命令)

目录 一、Redis基本知识与Redis键&#xff08;key&#xff09;常用操作命令。 二、Redis的五大值的数据类型。&#xff08;value&#xff09; 三、Redis关于键&#xff08;key&#xff09;的值常用操作指令表格统计。 &#xff08;1&#xff09;字符串&#xff08;String&#…

Ubuntu——办公软件 LibreOffice 安装与使用指南

十四、LibreOffice 安装与使用1、核心组件组件​​​​图标​​​​对应MS Office​​​​核心功能定位​​​​Writer​​&#x1f4dd;Word专业文档处理与排版​​Calc​​&#x1f4ca;Excel数据计算与分析​​Impress​​&#x1f3ac;PowerPoint演示文稿制作​​Draw​​&…

Securecrt丢失tab以及终端重新配色

今天在使用 Securecrt 的时候&#xff0c;发现 Securecrt 的 tab 标签消失不见了&#xff0c;仔细回想起来&#xff0c;应该是上一次误按了 alt enter 最大化&#xff0c;然后导致配置丢失的问题 还有表现就是菜单中的 Session Tabs 无论勾选还是不勾选都没有任何变化&#xf…

frp搭建内网穿透教程

frp搭建内网穿透教程 步骤1&#xff1a;准备工作 公网服务器&#xff1a;需要一台具有公网IP的服务器作为中转服务器&#xff0c;安装frp服务器端&#xff08;frps&#xff09;。内网设备&#xff1a;需要暴露服务的内网设备&#xff0c;安装frp客户端&#xff08;frpc&#xf…

【JavaEE进阶】图书管理系统(未完待续)

目录 用户登录 添加图书 图书列表 修改图书 删除图书 批量删除 拦截器 &#x1f343;前言 什么是拦截器? 拦截器的基本使用 自定义拦截器 注册配置拦截器 拦截路径 拦截器执行流程 项目实现统一拦截 定义拦截器 注册配置拦截器 前⾯图书管理系统, 咱们只完成了⽤⼾登录和图书列…

基于同花顺API的熊市与牛市识别模型开发及因子分析

基于同花顺API的熊市与牛市识别模型开发及因子分析 1. 引言 1.1 研究背景与意义 金融市场中的牛市与熊市识别一直是投资者和研究人员关注的重点问题。牛市(Bull Market)通常指价格持续上涨的市场环境,投资者信心充足,交易活跃;而熊市(Bear Market)则指价格持续下跌的市场…

AMD 锐龙 AI MAX+ 395 处理器与端侧 AI 部署的行业实践

2025 年 7 月 10 日&#xff0c;AMD 在深圳召开 Mini AI 工作站行业解决方案峰会&#xff0c;正式发布基于锐龙 AI MAX 395 处理器的端侧 AI 部署方案&#xff0c;与 200 余家生态伙伴共同探讨 AI 技术在千行百业的落地路径。这一硬件平台通过异构计算架构与开放生态设计&#…

期权盘位是什么意思?

本文主要介绍期权盘位是什么意思&#xff1f;“期权盘位”并非金融交易中的标准术语&#xff0c;可能是口语化表达或对某些概念的简化描述。期权盘位是什么意思&#xff1f;1. 期权盘口的“价位”&#xff08;买卖报价位置&#xff09;在期权交易中&#xff0c;“盘口”通常指实…

【Trea】Trea国内版|国际版|海外版下载|Mac版|Windows版|Linux下载配置教程

【Trea】Trea国内版&#xff5c;国际版&#xff5c;海外版下载&#xff5c;Mac版&#xff5c;Windows版下载配置教程 本文适用读者&#xff1a; 想要第一次安装 Trea需要在 Windows 或 macOS 上完成环境配置想深入了解 Doubao、DeepSeek、ChatGPT、Claude 等模型在 Trea 中的接…

MyBatis实现分页查询-苍穹外卖笔记

首先分页查询的原理是SQL的limit关键字。LIMIT 子句用于限制 SQL 查询返回的记录数。它接受一个或两个整数参数&#xff0c;第一个参数表示偏移量&#xff0c;第二个参数表示返回的最大记录数。我们完全可以使用前端传给我们的page,pageSize,自己去计算limit的参数&#xff0c;…

系统性能评估方法深度解析:从经典到现代

评估本质&#xff1a;系统性能评估是通过量化分析衡量计算机系统在特定工作负载下的表现能力&#xff0c;核心目标是建立可比较的性能基准&#xff0c;为系统设计、选型和优化提供科学依据。一、评估方法分类体系 #mermaid-svg-0ceD4AA2KDwzwtb6 {font-family:"trebuchet …

WebSocket实现多人实时在线聊天

最近公司在做一个婚恋app&#xff0c;需要增加一个功能&#xff0c;实现多人实时在线聊天。基于WebSocket在Springboot中的使用&#xff0c;前端使用vue开发。 一&#xff1a;后端 1. 引入 websocket 的 maven 依赖 <dependency><groupId>org.springframework.bo…

学习笔记随记-FPGA/硬件加速

一、FPGA&#xff1a;Field Programmable Gate Array 现场可编程门阵列 可编程输入/输出单元、基本可编程逻辑单元、嵌入式块RAM、丰富的布线资源、底层嵌入功能单元和内嵌专用硬核。 可编程输入/输出单元&#xff08;I/O&#xff09;单元 输入/输出&#xff08;Input/Ouput&…

docker宿主机修改ip后起不来问题解决

确保容器已经连接到了正确的网络。如果没有&#xff0c;你可以使用以下命令将容器连接到网络&#xff1a; 1、停止docker网络 ifconfig docker0 down1. 停止 Docker 服务 sudo systemctl stop docker2. 删除 docker0 接口 sudo ip link delete docker03、删除旧的网桥 docker n…