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
英文地址,請注明出處:http://en.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…