37-Oracle 23 ai Shrink Tablespace(一鍵收縮表空間)

小伙伴們有沒有經歷過,超大表和超大數據的導入后,數據被刪除了,然而空間遲遲不釋放,存儲添置又跟不上,業務空間告警的時候。收縮就很必須了,然而收縮需謹慎,數據大過天。DBMS_SPACE.SHRINK_TABLESPACE是Oracle 23ai新增功能,使得23 ai有了在線一鍵shrink tablespace的功能,19c及以下還需要手動操作。

一、Shrink技術特性

在Oracle 23ai中,? 大文件表空間收縮(Shrink Tablespace)?? 的核心機制是通過數據重組消除存儲碎片,關鍵技術點如下:
  • ?空間碎片整理?
當表被截斷(TRUNCATE)或數據刪除后,數據文件中會產生不連續的空白空間間隙(GAP)?。收縮操作通過移動段對象將這些碎片整理到文件末尾。
  • 在線段重組?
使用DBMS_SPACE.SHRINK_TABLESPACE時:
  • 自動識別可移動對象(表、索引等)
  • 在線移動段數據(支持DML并發)
  • 強制模式(TS_MODE_SHRINK_FORCE)處理不支持在線移動的對象
  • ?文件截斷機制?
碎片整理完成后,Oracle將空白空間從文件尾部截斷,實現物理文件收縮。
  • 操作模式?
  • ?分析模式(TS_MODE_ANALYZE)??:計算可回收空間
該模式不會實際移動數據或回收空間,而是分析表空間并返回一個報告,顯示可以回收多少空間,以及建議的目標數據文件大小。它只是模擬收縮操作,不會對數據文件做任何修改。
  • ?收縮模式(TS_MODE_SHRINK)??:執行實際空間回收
該模式會實際執行空間回收操作。它將移動表空間中可移動的段(如普通表、索引等),以壓縮數據文件中的空間,然后截斷數據文件以釋放未使用的空間。
  • TS_TARGET_MAX_SHRINK:盡可能多地回收空間(默認)
指定一個具體的數值(以字節為單位)作為目標大小。
  • 強制模式(TS_MODE_SHRINK_FORCE)
它會嘗試移動那些在普通收縮模式下無法移動的段(通過離線移動等方式)。該模式會嘗試對普通模式下無法移動的對象進行離線移動(Offline Move)。這可能會導致相關對象在移動期間不可用,因此使用時要謹慎。
可被移動對方回收空間
  • 普通堆表(Heap Table)
  • 索引組織表(IOT)
  • 索引(Index)
  • 分區表的分區(Partition)
  • 物化視圖(Materialized View)
  • 物化視圖日志(Materialized View Log)
不可移動對象?:

某些對象不能被移動,例如:

  • 包含LOB列且LOB存儲在單獨段中的表(因為LOB段可能位于不同的表空間)
  • 具有活動事務的對象
  • 包含LONG類型的表
  • 系統表空間(SYSTEM, SYSAUX)中的對象(盡管SYSAUX可以收縮,但有特殊限制)
空間回收限制?:即使使用強制模式,仍然可能無法回收所有空間,
  • 表空間中的某些對象無法移動(如上述不可移動對象)
  • 數據文件中的某些空間是正在使用的,無法回收
性能影響?:

收縮操作會移動數據,因此會消耗I/O資源。建議在業務低峰期進行。

依賴關系?:
如果表空間中的對象有依賴關系(例如表上的索引),收縮操作會自動按正確順序處理這些對象。

二、典型使用場景

  • ?批量數據清理后? - 截斷/刪除大表后回收空間
  • ?存儲空間優化? - 解決文件系統空間不足問題
  • ?數據歸檔場景? - 歷史數據遷移后回收空間
  • ?周期性維護? - 作為數據庫健康檢查的一部分

?三、Oracle 23ai 實操腳本

-- 1. 創建測試環境
ALTER SYSTEM SET db_create_file_dest='/opt/oracle/oradata/FREE';
--System altered.DROP USER IF EXISTS shrink_user CASCADE;
--User SHRINK_USER dropped.DROP TABLESPACE IF EXISTS shrink_ts INCLUDING CONTENTS AND DATAFILES;
--TABLESPACE SHRINK_TS dropped.CREATE BIGFILE TABLESPACE shrink_ts DATAFILE SIZE 10M AUTOEXTEND ON NEXT 1M;
--TABLESPACE SHRINK_TS created.CREATE USER shrink_user IDENTIFIED BY shrink_userDEFAULT TABLESPACE shrink_tsQUOTA UNLIMITED ON shrink_ts;
--User SHRINK_USER created.GRANT CREATE SESSION, CREATE TABLE TO shrink_user;
GRANT SELECT_CATALOG_ROLE TO shrink_user;
--Grant succeeded.-- 2. 創建測試數據
sqlplus shrink_user/shrink_user@localhost:1521/FREEPDB1
--
[oracle@OL97 customer_orders]$ sqlplus shrink_user/shrink_user@localhost:1521/FREEPDB1
SQL*Plus: Release 23.0.0.0.0 - Production on Sun Jun 15 13:38:32 2025
Version 23.8.0.25.04
Copyright (c) 1982, 2025, Oracle.  All rights reserved.
Connected to:
Oracle Database 23ai Free Release 23.0.0.0.0 - Develop, Learn, and Run for Free
Version 23.8.0.25.04
SHRINK_USER@localhost:1521/FREEPDB1>
--
CREATE TABLE sales_data (id      NUMBER,details VARCHAR2(4000),CONSTRAINT sales_pk PRIMARY KEY (id)
);
--Table created.INSERT /*+APPEND*/ INTO sales_data
SELECT ROWNUM, RPAD('X', 4000, 'X')
FROM dual
CONNECT BY LEVEL <= 100000;
COMMIT;
--
100000 rows created.
SHRINK_USER@localhost:1521/FREEPDB1>
Commit complete.
--收集信息
EXEC DBMS_STATS.GATHER_TABLE_STATS(null, 'SALES_DATA');
SHRINK_USER@localhost:1521/FREEPDB1> EXEC DBMS_STATS.GATHER_TABLE_STATS(null, 'SALES_DATA');
PL/SQL procedure successfully completed.-- 3. 檢查初始空間分配
SELECT tablespace_name, ROUND(bytes/1024/1024, 2) AS size_mb 
FROM dba_data_files 
WHERE tablespace_name = 'SHRINK_TS';
--
TABLESPACE_NAME                   SIZE_MB
------------------------------ ----------
SHRINK_TS                             908
--
SELECT table_name, blocks,ROUND((blocks*8)/1024, 2) AS size_mb 
FROM user_tables;
--
TABLE_NAME       BLOCKS    SIZE_MB
_____________ _________ __________
SALES_DATA       100507     785.21-- 4. 刪表模擬數據清理
TRUNCATE TABLE sales_data;
EXEC DBMS_STATS.GATHER_TABLE_STATS(null, 'SALES_DATA');
-- 刪除也可以模擬 模擬空間碎片
DELETE FROM SALES_DATA WHERE id <= 40000;
COMMIT;
--
SHRINK_USER@localhost:1521/FREEPDB1> DELETE FROM SALES_DATA WHERE id <= 40000;
40,000 rows deleted.
-- 5. 分析可回收空間 (SYS權限)
sqlplus / AS SYSDBA
SET SERVEROUTPUT ONBEGINDBMS_SPACE.SHRINK_TABLESPACE(tablespace_name => 'SHRINK_TS',shrink_mode    => DBMS_SPACE.TS_MODE_ANALYZE);
END;
/---- 5. 預收縮空間分析
SELECT segment_name,segment_type,blocks,bytes/1024/1024 size_mb
FROM user_segments;
--
SEGMENT_NAME    SEGMENT_TYPE       BLOCKS    SIZE_MB
_______________ _______________ _________ __________
SALES_DATA      TABLE              101248        791
SALES_PK        INDEX                 256          2-- 6. 執行空間收縮(SYS權限)
BEGINDBMS_SPACE.SHRINK_TABLESPACE('SHRINK_TS');
END;
/
--
[root@OL97 dbs]# su - oracle
[oracle@OL97 ~]$ sql / as sysdba;
SQLcl: Release 25.1 Production on Sun Jun 15 13:43:44 2025
Copyright (c) 1982, 2025, Oracle.  All rights reserved.
Connected to:
Oracle Database 23ai Free Release 23.0.0.0.0 - Develop, Learn, and Run for Free
Version 23.8.0.25.04
SYS@CDB$ROOT> alter session set container =FREEPDB1;
Session altered.
SYS@CDB$ROOT> BEGIN2    DBMS_SPACE.SHRINK_TABLESPACE('SHRINK_TS');3  END;4* /PL/SQL procedure successfully completed.
SYS@CDB$ROOT>-- 7. 驗證收縮結果
SELECT tablespace_name, ROUND(bytes/1024/1024, 2) AS size_mb 
FROM dba_data_files 
WHERE tablespace_name = 'SHRINK_TS';
--
TABLESPACE_NAME       SIZE_MB
__________________ __________
SHRINK_TS                 862-- 清理環境
DROP USER shrink_user CASCADE;
DROP TABLESPACE shrink_ts INCLUDING CONTENTS AND DATAFILES;

四、驗證要點?

  • 空間回收驗證
-- 收縮前后空間對比
SELECT df.tablespace_name,SUM(df.bytes)/1024/1024 allocated_mb,SUM(df.bytes - NVL(fs.free_bytes, 0))/1024/1024 used_mb
FROM dba_data_files df
LEFT JOIN (SELECT file_id, SUM(bytes) AS free_bytes  -- 添加明確別名FROM dba_free_spaceGROUP BY file_id
) fs ON df.file_id = fs.file_id
WHERE df.tablespace_name = 'SHRINK_TS'  -- 添加表別名
GROUP BY df.tablespace_name;  -- 添加表別名
--
TABLESPACE_NAME       ALLOCATED_MB     USED_MB
__________________ _______________ ___________
SHRINK_TS                      862    861.0625
  • 段移動監控??
-- 實時監控收縮操作
SELECT sql_id,sid,event,p1 TEXT,p2 BLOCKS_MOVED
FROM v$session
WHERE module = 'SHRINK_TBS';
  • 查詢依賴驗證??
-- 檢查未收縮對象
SELECT segment_name, segment_type
FROM dba_segments
WHERE tablespace_name = 'SHRINK_TS'AND blocks > 0
MINUS
SELECT segment_name, segment_type
FROM dba_segments
WHERE tablespace_name = 'SHRINK_TS'AND blocks > 0AND segment_name IN (SELECT object_name FROM dba_objectsWHERE created < SYSDATE - 1/24
);
--
SEGMENT_NAME    SEGMENT_TYPE
_______________ _______________
SALES_DATA      TABLE
SALES_PK        INDEX

五、關鍵注意事項

  • ?在線操作限制?標準模式僅處理支持在線移動的對象,強制模式可能導致短暫鎖表
  • ?空間預留策略?ALTER TABLESPACE ... AUTOEXTEND OFF 可在收縮前禁用自動擴展
  • ?系統表空間支持?SYSAUX表空間可收縮,但SYSTEM表空間不支持
  • ?操作監控?通過?V$SESSION_LONGOPS 監控收縮進度:
SELECT sid, serial#, opname, sofar, totalwork 
FROM v$session_longops 
WHERE opname LIKE 'SHRINK%';
  • ?最佳操作時間?
  1. - 在業務低峰期執行
  2. - 收縮前進行完整備份
  3. - 優先使用分析模式評估收益

?Oracle 23ai的大文件表空間收縮技術徹底解決了傳統表空間空間回收需依賴操作系統的問題,結合OMF(Oracle Managed Files)特性,實現了端到端的自動化存儲管理。通過在線重組實現存儲空間的高效回收,顯著降低存儲成本。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/85031.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/85031.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/85031.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

我自己動手寫了一個MySQL自動化備份腳本,基于docker

MySQL自動化備份Docker方案 該方案僅需通過 Docker Compose 就能輕松完成部署。你可以自由配置數據庫連接信息&#xff0c;無論是遠程數據庫&#xff0c;還是本地數據庫&#xff0c;都能實現無縫對接。在備份頻率設置上&#xff0c;支持按固定秒數間隔執行備份任務&#xff0c…

leetcode23-合并K個升序鏈表

leetcode 23 思路 遍歷所有鏈表收集節點&#xff1a;將每個鏈表的節點斷開其 next 指針后存入數組對數組進行排序&#xff1a;使用 JavaScript 的內置 sort 方法對節點數組按值排序重新連接排序后的節點&#xff1a;遍歷排序后的數組&#xff0c;依次連接每個節點形成新鏈表…

(十六)GRU 與 LSTM 的門控奧秘:長期依賴捕捉中的遺忘 - 更新機制對比

1 長期依賴捕捉能力的核心差異 1.1 信息傳遞路徑&#xff1a;細胞狀態 vs 單一隱藏狀態 LSTM的“信息高速公路”機制 LSTM通過獨立的細胞狀態&#xff08;Cell State&#xff09; 傳遞長期信息&#xff0c;該狀態可視為“直接通路”&#xff0c;允許信息跨越多個時間步而不被中…

HTTP 請求報文 方法

在 HTTP 請求報文 中&#xff0c;方法&#xff08;Method&#xff09; 是用來說明客戶端希望對服務器資源執行的操作。它出現在 HTTP 報文的第一行&#xff0c;稱為 請求行&#xff0c;格式如下&#xff1a; METHOD Request-URI HTTP-Version例如&#xff1a; GET /index.h…

【深度解析】Java高級并發模式與實踐:從ThreadLocal到無鎖編程,全面避坑指南!

&#x1f50d; 一、ThreadLocal&#xff1a;線程隔離的利器與內存泄露陷阱 底層原理揭秘&#xff1a; 每個線程內部維護ThreadLocalMap&#xff0c;Key為弱引用的ThreadLocal對象&#xff0c;Value為存儲的值。這種設計導致了經典內存泄露場景&#xff1a; // 典型應用&#…

使用存儲型 XSS 竊取 cookie 并發送到你控制的服務器

&#x1f9ea; 第一步&#xff1a;準備監聽服務接收 cookie 在你的本機&#xff08;非容器&#xff09;或 DVWA 所在主機運行以下 Python 監聽代碼&#xff0c;用于接收竊取的 cookie&#xff1a; 啟動 HTTP 接收服務 # 在本機終端運行&#xff0c;監聽 8081 端口&#xff0…

WebDebugX和多工具組合的移動端調試流程構建:一個混合App項目的實踐案例

前段時間參與了一個跨平臺的醫療服務 App 項目&#xff0c;整體架構采用 Flutter 封裝原生模塊&#xff0c;部分功能模塊嵌套 WebView 加載 H5 頁面。開發過程中我們頻繁遇到 Web 頁面在移動端表現異常的問題&#xff0c;比如樣式錯亂、請求失敗、性能延遲等&#xff0c;而這些…

圖形編輯器基于Paper.js教程29:基于圖層的所有矢量圖元的填充規則實現

背景 在lightburn中&#xff0c;對于填充圖層&#xff0c;有這樣一個隱藏的邏輯&#xff0c;那就是&#xff0c;在加工時&#xff0c;填充規則是以填充圖層的所有元素進行計算的&#xff0c;什么意思那&#xff1f; 如果你在填充圖層中畫了兩個圖形&#xff0c;一個圓&#xf…

Python 函數實戰指南:提升編程效率的實用技巧

在 Python 編程的世界里&#xff0c;函數是構建高效代碼的基石。掌握實用的函數技巧不僅能讓代碼更加簡潔優雅&#xff0c;還能顯著提升開發效率。我們一起將結合實際案例&#xff0c;深入剖析 Python 函數的使用技巧&#xff0c;幫助開發者在日常開發中事半功倍。 一、基礎函數…

OPenCV CUDA模塊圖形變換----構建透視變換映射表函數buildWarpPerspectiveMaps()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 該函數用于構建一個透視變換&#xff08;Perspective Transform&#xff09;的映射表&#xff08;xmap / ymap&#xff09;&#xff0c;可用于后…

tcping工具使用指南

tcping是一個用于測試TCP端口連通性的工具&#xff0c;它類似于傳統的ping命令&#xff0c;但工作在傳輸層(TCP)而不是網絡層(ICMP)。 基本功能 tcping的主要功能包括&#xff1a; 測試目標主機特定TCP端口是否開放 測量TCP連接建立時間 統計丟包率和響應時間 安裝方法 …

CSP 2024 入門級第一輪(88.5)

4. 以下哪個序列對應數字 00 至 88 的 44 位二進制格雷碼&#xff08;Gray code&#xff09;&#xff1f;&#xff08; &#xff09; A. 0000, 0001, 0011, 0010, 0110, 0111, 0101, 1000 B. 0000, 0001, 0011, 0010, 0110, 0111, 0100, 0101 C. 0000, 0001, 0011, 0010, …

三菱FX-5U系列入門到精通

第2章 中間繼電器 繼電器工作模式:線圈得電,常開觸點閉合,常閉觸點斷開。總結:中間繼電器線圈電壓分為:24VDC 110VAC 220VAC 380VAC PLC控制柜中常用的是24VDC比較多,而動力電柜中或者控制風機水泵的電柜中220VAC比較多。大部分選擇24VDC,然后用觸點控制220或者380,說白…

簡歷模板1——王明 | 高級數據挖掘工程師 | 5年經驗

王明 | 高級數據挖掘工程師 | 5年經驗 &#x1f4f1; (86) 189-xxxx-xxxx | &#x1f4e7; wangmingemail.com | &#x1f4cd; 深圳市 &#x1f4bb; GitHub | &#x1f454; LinkedIn &#x1f4bc; 工作經歷 ?科技前沿集團 | 高級數據挖掘工程師 &#x1f4c5; 2021.06 …

【JVM】- 內存模式

Java內存模型&#xff1a;JMM&#xff08;Java Memory Model&#xff09;&#xff0c;定義了一套在多線程環境下&#xff0c;讀寫共享數據&#xff08;成員變量、數組&#xff09;時&#xff0c;對數據的可見性&#xff0c;有序性和原子性的規則和保障。 原子性 問題分析 【問…

AQS獨占模式——資源獲取和釋放源碼分析

AQS資源獲取&#xff08;獨占模式&#xff09; Node節點類 static final class Node {//標記當前節點的線程在共享模式下等待。static final Node SHARED new Node();//標記當前節點的線程在獨占模式下等待。static final Node EXCLUSIVE null;//waitStatus的值&#xff0c…

壓測過程中TPS上不去可能是什么原因

進行性能分析 接口沒有報錯或者錯誤率低于1%&#xff0c;繼續增加并發還是一樣&#xff0c;這個時候需要考慮幾點 1.是否觸發限流&#xff0c;比如waf、Nginx等情況&#xff0c;有沒有一些限流的情況&#xff0c;如果觸發了限流&#xff0c;請求是沒有達到后端的&#xff0c;所…

Golang 解大整數乘法

文章目錄 Golang 解大整數乘法問題描述&#xff1a;LeetCode 43. 字符串相乘思路Golang 代碼 Golang 解大整數乘法 在初學 C 語言的時候&#xff0c;我們一定接觸過“字符串相加”或“字符串相乘”之類的問題&#xff0c;對于初學者而言&#xff0c;這類問題的難度一般來說是比…

web3-區塊鏈的技術安全/經濟安全以及去杠桿螺旋(經濟穩定)

web3-區塊鏈的技術安全/經濟安全以及去杠桿螺旋&#xff08;經濟穩定&#xff09; 三個基本設計問題 技術安全 在技術結構中對其進行原子級的、瞬時利用&#xff08;無風險&#xff09; 無風險&#xff0c;因為攻擊者的結果還是二進制的&#xff1a; 只會是攻擊成功 獲利或…

Java多線程通信:wait/notify與sleep的深度剖析(時序圖詳解)

在Java多線程編程中&#xff0c;線程間的通信與協作是實現復雜并發邏輯的關鍵。wait()、notify()以及sleep()方法作為線程控制的重要工具&#xff0c;有著各自獨特的使用場景與規則。本文將深入探討wait()和notify()的協作機制&#xff0c;以及sleep()的阻塞特性&#xff0c;同…