72-Oralce Temporay tablespace(单实例和多租户下的管理)

小伙伴们,生产库是不是已经慢慢都升级到12c+以上的19c这样的多租户场景了,那么临时表空间做了规划了么,有针对性能的提升么

官方推荐为CDB和每个PDB分别创建独立的临时表空间

为了多租户下,资源隔离与独立性,​每个PDB应有专属临时表空间​:防止某个PDB的临时空间操作(如大型排序、哈希连接)影响其他PDB或CDB根容器。

​CDB根容器也需要独立临时表空间,用于系统级操作(如元数据管理)和连接到根容器的会话。

​默认行为支持分离,创建PDB时,若未显式指定临时表空间,PDB会自动继承CDB的临时表空间,但这个官方不推荐。

官方手册建议在PDB创建后立即显式指定其专属临时表空间,避免跨容器资源争用

临时表空间组(Temporary Tablespace Group)的增强应用​

为提升并发性能和负载均衡,Oracle推荐使用临时表空间组​(由多个临时表空间组成),

尤其适用于高并发场景:

​​并发性提升​:不同会话可并行使用组内不同临时表空间,减少I/O竞争。

​故障隔离​:单个临时文件损坏不影响整体可用性。

​动态扩展​:可在线添加/移除临时表空间,无需停机

另外在有些极端的开发场景需要大量插入数据后又删除,

优先选择临时表空间+全局临时表(GTT)​,避免普通表空间的手动管理开销和性能损耗。

一、临时表空间核心功能与技术原理

1. 功能定义
  • 核心作用:存储会话级临时数据(排序、哈希连接、全局临时表、并行查询中间结果),事务结束或会话终止后自动释放。
  • 关键特性
    • 使用临时文件(Tempfile)​,不生成Redo日志,空间按需分配(稀疏文件),无需预初始化。
    • 数据以临时段(Temporary Segments)​ 管理,同一实例的所有SQL操作共享排序段,实例关闭时释放。
2. 技术原理
  • SEP管理机制(Sort Extent Pool)​
    • 自Oracle 7.3引入,通过共享池中的位图管理临时段扩展分配,减少频繁空间分配开销。
    • 排序操作优先使用PGA内存,溢出时从SEP分配空闲扩展区(Extent),完成后标记为空闲而非释放。
  • 与永久表空间对比

|------------|--------------------|-------------|
| ​特性​ | ​临时表空间​ | ​永久表空间​ |
| ​存储内容​ | 中间结果(排序/连接/临时表) | 永久对象(表/索引) |
| ​持久性​ | 会话结束自动清理 | 数据永久保存 |
| ​空间分配​ | 按需动态分配(稀疏文件) | 预分配且初始化 |
| ​日志机制​ | 无Redo,UNDO变化产生Redo | 完整Redo日志 |

|------------|--------------------------------|---------------------|
| ​特性​ | ​临时表空间(临时表)​ | ​普通表空间​ |
| ​存储位置​ | 临时存储(TEMP表空间) | 永久存储(如USERS表空间) |
| ​生命周期​ | ​自动清理​(会话结束或事务提交) | 需手动删除表,否则持久存在 |
| ​I/O性能 | ​无Redo日志,仅少量Undo,写入速度快30%~50% | 产生Redo/Undo日志,写入开销大 |
| ​锁与碎片​ | 无表级锁竞争,空间自动回收 | 频繁删表导致元数据锁争用、碎片 |
| ​适用场景​ | ​临时测试数据的首选​ | 需跨会话共享的持久数据 |

二、版本演进与关键特性

1. Oracle 7.3
  • SEP算法引入:统一管理临时段扩展,减少碎片和闩锁竞争。
2. Oracle 8i
  • 专用临时表空间:禁止永久对象存储,隔离临时数据,解决SYSTEM表空间碎片问题。
3. Oracle 9i
  • 默认临时表空间:全局配置DEFAULT TEMPORARY TABLESPACE,避免用户未指定时占用SYSTEM空间。
  • 本地化管理:默认采用位图管理空间分配,提升效率。
4. Oracle 10g
  • 临时表空间组(Tablespace Groups)​
    • 允许单操作跨多个临时表空间,提升并行排序能力。
    • 创建语法:
bash 复制代码
CREATE TEMPORARY TABLESPACE temp2 TEMPFILE '/opt/oracle/oradata/FREE/FREEPDB1/temp02.dbf' SIZE 100M 
  TABLESPACE GROUP group1;
ALTER USER HR TEMPORARY TABLESPACE group1;
5. Oracle 11g-12c
  • PGA自动管理:PGA_AGGREGATE_TARGET优化,减少磁盘排序。
  • 临时Undo(12c):全局临时表的Undo写入临时表空间,减少Redo生成。
6. Oracle 19c/23ai(多租户增强)​
  • PDB级隔离:每个PDB拥有独立默认临时表空间,支持资源管理器限制PDB临时空间配额:
  • CDB级共享:支持创建全局临时表空间供所有PDB共享。

三、单实例和多租户下的管理实践

1. 创建与分配
  • 单实例
bash 复制代码
CREATE TEMPORARY TABLESPACE temp_tbs TEMPFILE '+DATA' SIZE 1G 
  AUTOEXTEND ON NEXT 100M MAXSIZE 30G;
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE temp_tbs;
  • 多租户​:
bash 复制代码
ALTER SESSION SET CONTAINER=PDB1;
CREATE TEMPORARY TABLESPACE pdb_temp TEMPFILE '+DATA' SIZE 2G;
ALTER PLUGGABLE DATABASE DEFAULT TEMPORARY TABLESPACE pdb_temp;
  • 碎片清理:
bash 复制代码
ALTER TABLESPACE temp_tbs SHRINK SPACE KEEP 1G;  -- 在线收缩
3. 性能调优
  • 减少磁盘排序

    bash 复制代码
    ALTER SYSTEM SET PGA_AGGREGATE_TARGET=4G;  -- 增大PGA内存

SQL优化​:避免无索引的大表GROUP BY,使用分区过滤减少排序数据量。

四、监控与验证脚本

​1. 基础信息查询​
bash 复制代码
-- 查看所有临时文件
SELECT file_name, bytes/1024/1024 AS size_mb, autoextensible 
FROM dba_temp_files;
--
FILE_NAME                                                   SIZE_MB AUTOEXTENSIBLE
________________________________________________________ __________ _________________
/opt/oracle/oradata/FREE/FREEPDB1/temp01.dbf                     84 YES
/opt/oracle/product/23ai/dbhomeFree/dbs/hr_temp01.dbf            50 NO
/opt/oracle/product/23ai/dbhomeFree/dbs/OE_temp01.dbf            50 NO
/opt/oracle/product/23ai/dbhomeFree/dbs/SH_temp01.dbf            50 NO
/opt/oracle/product/23ai/dbhomeFree/dbs/PM_temp01.dbf            50 NO
/opt/oracle/product/23ai/dbhomeFree/dbs/CO_temp01.dbf            50 NO

-- 默认临时表空间
SELECT property_value FROM database_properties 
WHERE property_name = 'DEFAULT_TEMP_TABLESPACE';
--
PROPERTY_VALUE
_________________
TEMP
2. 空间使用分析包含PDB和CDB整体视角​
bash 复制代码
-- 单实例使用率
SELECT tablespace_name, 
       (tablespace_size - free_space)/tablespace_size * 100 AS "使用率%"
FROM dba_temp_free_space;
--
TABLESPACE_NAME                                           使用率%
__________________ ___________________________________________
TEMP                  2.38095238095238095238095238095238095238
-- 多租户环境(CDB级别)
SELECT 
    c.con_id AS container_id,
    c.name AS pdb_name,
    t.tablespace_name,
    t.status,
    f.tablespace_size * ts.block_size / 1024 / 1024 AS total_mb,
    f.free_space * ts.block_size / 1024 / 1024 AS free_mb,
    ROUND((f.tablespace_size - f.free_space) * 100 / f.tablespace_size, 2) AS used_pct
FROM 
    cdb_tablespaces t
JOIN 
    cdb_temp_free_space f ON t.con_id = f.con_id AND t.tablespace_name = f.tablespace_name
JOIN 
    (SELECT con_id, tablespace_name, block_size FROM cdb_tablespaces WHERE contents = 'TEMPORARY') ts 
    ON t.con_id = ts.con_id AND t.tablespace_name = ts.tablespace_name
JOIN 
    v$containers c ON t.con_id = c.con_id
WHERE 
    t.contents = 'TEMPORARY'
ORDER BY 
    c.con_id, t.tablespace_name;
--
   CONTAINER_ID PDB_NAME    TABLESPACE_NAME    STATUS       TOTAL_MB    FREE_MB    USED_PCT
_______________ ___________ __________________ _________ ___________ __________ ___________
              1 CDB$ROOT    TEMP               ONLINE         688128     671744        2.38
              3 FREEPDB1    CO_TEMP            ONLINE         409600     401408           2
              3 FREEPDB1    HR_TEMP            ONLINE         409600     401408           2
              3 FREEPDB1    OE_TEMP            ONLINE         409600     401408           2
              3 FREEPDB1    PM_TEMP            ONLINE         409600     401408           2
              3 FREEPDB1    SH_TEMP            ONLINE         409600     401408           2
              3 FREEPDB1    TEMP               ONLINE         688128     655360        4.76
              3 FREEPDB1    TEMP1              ONLINE         819200     811008           1

8 rows selected.
3. 高消耗会话追踪​
bash 复制代码
-- 定位排序操作TOP会话
SELECT s.username, s.sid, su.blocks * p.value/1024/1024 AS used_mb, sql.sql_text
FROM v$session s, v$sort_usage su, v$sql sql, v$parameter p
WHERE s.saddr = su.session_addr
AND sql.sql_id = s.sql_id
AND p.name = 'db_block_size'
ORDER BY used_mb DESC;
4. 临时表空间组状态​
bash 复制代码
SELECT group_name, tablespace_name FROM dba_tablespace_groups;

五、常见问题解决方案​

|----------------------|----------------|-------------------------------------------------------------------|
| ​问题​ | ​原因​ | ​解决方案​ |
| ​ ORA-01652(空间不足)​ ​ | 临时文件未自动扩展或空间耗尽 | ALTER TABLESPACE temp ADD TEMPFILE '+DATA' SIZE 5G AUTOEXTEND ON; |
| ​临时文件碎片化严重​ | 频繁分配/释放临时段 | 重建表空间:新建临时表空间 → 设为默认 → 删除旧空间 |
| ​ PDB临时空间占用过高​ | 未限制资源或SQL低效 | 通过Resource Manager设置 TEMP_SPACE_LIMIT |

六、规划​建议:

空间规划 ​:
  • 启用临时文件自动扩展(AUTOEXTEND ON),但设置MAXSIZE防止磁盘耗尽。(AUTOEXTEND ON),但设置MAXSIZE防止磁盘耗尽。使用临时表空间组(至少2个)提升并行查询性能。
多租户隔离 ​:
  • 为每个PDB配置独立临时表空间,通过RESOURCE_MANAGER_PLAN限制配额。
备份与恢复 ​:
  • 无需备份临时文件,但需记录创建脚本(dba_temp_files结构)。
性能调优 ​:
  • 定期监控v$sort_usage识别高消耗SQL,优化索引与分区策略。
  • 每年1-2次重建碎片化严重的临时表空间。
相关推荐
belldeep2 分钟前
java:如何用 JDBC 连接 TDSQL 数据库
java·数据库·jdbc·tdsql
大数据CLUB2 小时前
基于spark的航班价格分析预测及可视化
大数据·hadoop·分布式·数据分析·spark·数据可视化
格调UI成品2 小时前
预警系统安全体系构建:数据加密、权限分级与误报过滤方案
大数据·运维·网络·数据库·安全·预警
reddingtons5 小时前
Adobe Firefly AI驱动设计:实用技巧与创新思维路径
大数据·人工智能·adobe·illustrator·photoshop·premiere·indesign
G皮T6 小时前
【Elasticsearch】全文检索 & 组合检索
大数据·elasticsearch·搜索引擎·全文检索·match·query·组合检索
心平愈三千疾6 小时前
通俗理解JVM细节-面试篇
java·jvm·数据库·面试
Lx3527 小时前
排序缓冲区调优:sort_buffer_size的合理配置
sql·mysql·性能优化
我科绝伦(Huanhuan Zhou)9 天前
Oracle|Oracle SQL*Plus 配置上下翻页功能
数据库·sql·oracle
Cachel wood9 天前
Spark教程6:Spark 底层执行原理详解
大数据·数据库·分布式·计算机网络·spark
Sally璐璐9 天前
数据标注工具详解
大数据·ai