上一篇
"小李,快来看!生产库的临时表空间爆满了,应用直接卡死了!" 凌晨2点,运维同事一个电话把刚躺下的小李炸了起来,登录服务器一看,临时表空间文件已经撑到了32GB上限,大量排序操作堆积,这种时候,单纯清理临时文件可能无济于事,直接重建临时表空间反而是更彻底的解决方案,今天我们就来聊聊Oracle临时表空间那些"救命"操作——如何安全删除和重建临时表空间。
临时表空间(Temporary Tablespace)是Oracle专门用于处理排序、哈希连接等临时数据的特殊空间,与普通表空间不同:
常见问题症状:
ORA-1652: unable to extend temp segment
temp file write
-- 查看当前临时表空间使用情况 SELECT tablespace_name, file_name, bytes/1024/1024 "SIZE(MB)" FROM dba_temp_files; -- 检查是否有活跃会话正在使用 SELECT s.sid, s.serial#, s.username, s.sql_id, t.blocks FROM v$session s, v$tempseg_usage t WHERE s.sess_addr = t.session_addr;
情况1:存在其他可用临时表空间
-- 1. 创建替代临时表空间(如果尚未存在) CREATE TEMPORARY TABLESPACE temp_new TEMPFILE '/oracle/oradata/DB1/temp_new01.dbf' SIZE 1G AUTOEXTEND ON; -- 2. 修改数据库默认临时表空间 ALTER DATABASE DEFAULT TEMPORARY TABLESPACE temp_new; -- 3. 确认无会话使用后删除旧表空间 DROP TABLESPACE temp_old INCLUDING CONTENTS AND DATAFILES;
情况2:单临时表空间环境
-- 必须确保没有活跃事务(建议在维护窗口操作) ALTER SYSTEM CHECKPOINT; -- 强制检查点 ALTER SYSTEM SWITCH LOGFILE; -- 切换日志文件 -- 强制中断所有会话(生产环境慎用) SELECT 'ALTER SYSTEM KILL SESSION '''||sid||','||serial#||''' IMMEDIATE;' FROM v$session WHERE username IS NOT NULL; -- 执行删除 DROP TABLESPACE temp_old INCLUDING CONTENTS AND DATAFILES;
-- 1. 创建新临时表空间(建议多个小文件代替单个大文件) CREATE TEMPORARY TABLESPACE temp_prod TEMPFILE '/oracle/oradata/DB1/temp01.dbf' SIZE 4G AUTOEXTEND ON NEXT 1G MAXSIZE 32G, '/oracle/oradata/DB1/temp02.dbf' SIZE 4G AUTOEXTEND ON NEXT 1G MAXSIZE 32G; -- 2. 设置为默认临时表空间 ALTER DATABASE DEFAULT TEMPORARY TABLESPACE temp_prod; -- 3. 用户级临时表空间修改(如需要) ALTER USER app_user TEMPORARY TABLESPACE temp_prod;
-- 查看当前内存配置 SHOW PARAMETER memory_target; -- 创建使用大页的临时表空间 CREATE TEMPORARY TABLESPACE temp_big TEMPFILE '/oracle/oradata/DB1/temp_big.dbf' SIZE 16G EXTENT MANAGEMENT LOCAL UNIFORM SIZE 256M;
文件权限问题
# 确保Oracle用户有读写权限 chown oracle:oinstall /oracle/oradata/DB1/temp*.dbf chmod 660 /oracle/oradata/DB1/temp*.dbf
空间不足处理
-- 临时添加文件应急 ALTER TABLESPACE temp ADD TEMPFILE '/oracle/oradata/DB1/temp03.dbf' SIZE 10G;
RAC环境特别注意
-- 在所有节点执行操作 ALTER TABLESPACE temp ADD TEMPFILE '+DATA' SIZE 2G THREAD 2; -- 指定节点2
日常监控脚本
SELECT tablespace_name, ROUND(SUM(bytes_used)/1024/1024) "USED(MB)", ROUND(SUM(bytes_free)/1024/1024) "FREE(MB)" FROM v$temp_space_header GROUP BY tablespace_name;
自动清理策略
-- 设置临时表空间自动收缩(11g+) ALTER TABLESPACE temp SHRINK SPACE KEEP 2G;
最佳实践
凌晨3点15分,小李按照上述步骤完成了临时表空间的重建,应用逐渐恢复正常,他默默把这篇操作指南保存到知识库,心想:"下次值班的新人,应该不用再经历这种惊魂夜了吧。"
(本文操作验证环境:Oracle 19c,Linux 7.9,更新于2025年8月)
本文由 奉桂华 于2025-08-05发表在【云服务器提供商】,文中图片由(奉桂华)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://up.7tqx.com/wenda/538864.html
发表评论