当前位置: 首页 > news >正文

故障处理:Oracle表空间异常增长后又恢复正常的故障模拟与分析

我们的文章会在微信公众号IT民工的龙马人生和博客网站 ( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢!
由于博客中有大量代码,通过页面浏览效果更佳。

今天谈谈很早之前朋友问到的一个案例,表空间使用率异常增加,新增对象都是临时字段,并且段名是很奇怪,由数字和.构成,如(11.123)这种方式。这个案例相对来说比较极端,客户采用的文件系统,并且数据文件为自动扩张,最后出现空间耗尽,数据文件无法收缩的现象。今天就好大家一起来模拟一下这种现象:

环境准备

由于是自己的环境,也为了保证后续的操作不报错,所以这里看起了归档日志强制删除的脚本。

[oracle@oracleadg sql]$ sh ./arch_delete_force_all.sh 
2025-08-23 21:46:09: Using ORACLE_SID=htz191, interval=10 seconds.
2025-08-23 21:46:09: Press Ctrl+C to stop the script.
2025-08-23 21:46:09: Starting RMAN archived log cleanup.
2025-08-23 21:46:14: Cleanup finished. Sleeping for 10 seconds.
2025-08-23 21:46:24: Starting RMAN archived log cleanup.
2025-08-23 21:46:28: Cleanup finished. Sleeping for 10 seconds.
2025-08-23 21:46:38: Starting RMAN archived log cleanup.

创建测试表

create table htz as select * from dba_objects;
多次执行下面语句
insert into htz as select * from htz;
commit;

确保测试表足够的大,下面是我环境中的htz表的大小。

SQL> @segment_size.sql
Enter Search owner Name (i.e. SCOTT|ALL) : 
Enter Search Segment Name (i.e. DEPT|ALL) : 
Enter Search Tablespace Name (i.e. DEPT|ALL) : system
Enter Display rows Name (i.e. 20) : Name                                    Total
OWNER                SEGMENT_NAME                        SEGMENT_TYPE    Partition                             size(M)
-------------------- ----------------------------------- --------------- ----------------------------------- ---------
SYS                  HTZ                                 TABLE                                                   11518
SYS                  IDL_UB1$                            TABLE                                                     398
SYS                  SYS_LOB0000022516C00008$$           LOBSEGMENT                                                192
SYS                  C_TOID_VERSION#                     CLUSTER                                                    49
SYS                  SOURCE$                             TABLE                                                      40

我这里是11G左右的大小。

确认数据库状态

SQL> @db_status.sqlflashback  Switchover           Database                                  Force
OPEN_MODE            LOG_MODE                 On         Status               Role                 PROTECTION_MODE      Loggin
-------------------- ------------------------ ---------- -------------------- -------------------- -------------------- ------
READ WRITE           ARCHIVELOG               YES        NOT ALLOWED          LOGICAL STANDBY      MAXIMUM PERFORMANCE  YES

确认表空间的容量


SQL> @db_size.sql
*******************tablespace size**************************Tablespace                                                    Size (MB)  Free (MB)     % Free     % Used
------------------------------------------------------------ ---------- ---------- ---------- ----------
TEST                                                               1024       1023        100         .1
TEMP                                                                224        190         85      15.18
UNDOTBS1                                                            995     542.75         55      45.45
UNDOTBS2                                                             25    13.1875         53      47.25
USERS                                                             18.75     2.0625         11         89
SYSAUX                                                             1140     59.625          5      94.77
SYSTEM                                                            12688    15.1875          0      99.88

取消归档日志自动删除

将前面的归档日志自动删除脚本取消执行,因为后面我们要用到归档日志文件去解析,查看logmnr中的SQL语句。

开启表空间自动扩容脚本

因为后续的操作要生成11G的表,可能出现表空间容灾不够,所以开启表空间自动扩容脚本。

[oracle@oracleadg sql]$ watch -n 2 ./tbscale -l TEST:50Every 2.0s: ./tbscale -l TEST:50                                                                                                                                                                                                        Sat Aug 23 22:13:44 2025[INFO] 2025/08/23 22:13:44 This script will connect to the database using 'sqlplus / as sysdba'. Please ensure OS authentication is configured correctly.
[INFO] 2025/08/23 22:13:44 Database status: OPEN
[INFO] 2025/08/23 22:13:44 Threshold mode: Only checking tablespaces and thresholds specified by -l
[INFO] 2025/08/23 22:13:44 ========== Processing tablespace: TEST (threshold 50.00%) ==========
[INFO] 2025/08/23 22:13:44 Tablespace [TEST] free space 48.34% < threshold 50.00%, expansion required.
[INFO] 2025/08/23 22:13:44 Underlying storage has sufficient space for tablespace [TEST] (Available 99065.52 MB >= Needed 1024 MB)
[INFO] 2025/08/23 22:13:44 Expansion SQL: ALTER TABLESPACE TEST ADD DATAFILE '/oracle/app/oracle/oradata/HTZ19TWO/datafile/TEST_14.dbf' SIZE 1G AUTOEXTEND ON NEXT 100M MAXSIZE 32767M;
[INFO] 2025/08/23 22:14:02 Successfully added a new datafile to tablespace [TEST].
[INFO] 2025/08/23 22:14:02 Script execution finished.

创建新表

这里要保证htz表足够的大,这样才方便后续的实验和观察,否者还没有观察到,SQL语句就执行完了。

SQL> create table htz1 tablespace test as select /*+ parallel(a 5) */ * from htz a;

确认对象大小

SQL> @segment_size.sql
Enter Search owner Name (i.e. SCOTT|ALL) :
Enter Search Segment Name (i.e. DEPT|ALL) :
Enter Search Tablespace Name (i.e. DEPT|ALL) : TEST
Enter Display rows Name (i.e. 20) :Name                                    Total
OWNER                SEGMENT_NAME                        SEGMENT_TYPE    Partition                             size(M)
-------------------- ----------------------------------- --------------- ----------------------------------- ---------
SYS                  11.130                              TEMPORARY                                                5760

这里看到生成一个临时段,对应段名为:11.130,现象跟之前朋友说的案例一模一样。

取消创建表语句

取消创建表语句的执行。

SQL> create table htz1 tablespace test as select /*+ parallel(a 5) */ * from htz a;^Ccreate table htz1 tablespace test as select /*+ parallel(a 5) */ * from htz a*
ERROR at line 1:
ORA-01013: user requested cancel of current operation

这里直接终止命令的运行。

查看表空间对象

已经没有任何对象了

SQL> @segment_size.sql
Enter Search owner Name (i.e. SCOTT|ALL) :
Enter Search Segment Name (i.e. DEPT|ALL) :
Enter Search Tablespace Name (i.e. DEPT|ALL) : TEST
Enter Display rows Name (i.e. 20) :no rows selected

表空间的使用率也降下来了。

SQL> @db_size.sql
*******************tablespace size**************************Tablespace                                                    Size (MB)  Free (MB)     % Free     % Used
------------------------------------------------------------ ---------- ---------- ---------- ----------
TEST                                                              11264      11253        100         .1
TEMP                                                                224        190         85      15.18
UNDOTBS1                                                            995     542.75         55      45.45
UNDOTBS2                                                             25    13.1875         53      47.25
USERS                                                             18.75     2.0625         11         89
SYSTEM                                                            13618   945.1875          7      93.06
SYSAUX                                                             1140    51.5625          5      95.48

上面的现象跟朋友说的一模一样了,临时段,表空间使用率增加后又恢复正常。

解析归档日志

SQL> @logmnr_arch.sql '2025-08-23 23:03:57' '2025-08-23 23:04:53' 'Y'
Starting LogMiner...
LogMiner started successfully.

这里通过脚本来解析归档日志,查询解析记录,可以得到下面这条唯一的SQL语句。

SQL_REDO
--------------------------------------------------------------------------------
update "SYS"."SEG$" set "TYPE#" = '3', "BLOCKS" = '8', "EXTENTS" = '1', "INIEXTS
" = '8', "MINEXTS" = '1', "MAXEXTS" = '2147483645', "EXTSIZE" = '128', "EXTPCT"
= '0', "USER#" = '0', "LISTS" = '0', "GROUPS" = '0', "BITMAPRANGES" = '214748364
5', "CACHEHINT" = '0', "SCANHINT" = '0', "HWMINCR" = '77446', "SPARE1" = '419456
1' where "FILE#" = '13' and "BLOCK#" = '130' and "TYPE#" = '3' and "TS#" = '6' a
nd "BLOCKS" = '8' and "EXTENTS" = '1' and "INIEXTS" = '8' and "MINEXTS" = '1' an
d "MAXEXTS" = '2147483645' and "EXTSIZE" = '128' and "EXTPCT" = '0' and "USER#"
= '0' and "LISTS" = '0' and "GROUPS" = '0' and "BITMAPRANGES" = '2147483645' and"CACHEHINT" = '0' and "SCANHINT" = '0' and "HWMINCR" = '77446' and "SPARE1" = '
4325633' and "SPARE2" IS NULL and ROWID = 'AAAAAIAABAAAMgSAAj';

前面的13.130这个名字就是由FILE#.BLOCK#构成的。

结束

到这里面我们基本演示朋友说到这个案例的现象,在这个现象背后其实有一个Oracle的基础知识就是create table as select 这种方式创建表时,Oracle是先创建临时段,临时段创建成功后,Oracle才会去做rename的操作和表定义的信息,这里可以通过去解析归档日志可以获得更多详细的信息。

------------------作者介绍-----------------------
姓名:黄廷忠
现就职:Oracle中国高级服务团队
曾就职:OceanBase、云和恩墨、东方龙马等
电话、微信、QQ:18081072613
个人博客: (http://www.htz.pw)
CSDN地址: (https://blog.csdn.net/wwwhtzpw)
博客园地址: (https://www.cnblogs.com/www-htz-pw)


http://www.zskr.cn/news/13460.html

相关文章:

  • ​​万用表与电流探头测量电流信号的技术对比分析​​
  • flink运行时架构 - --
  • WPF Canvas mark triangle, circle, and retangle, then save the whole canvas as jpg file
  • wifi亮灭屏机制--系统修改
  • 得帆云ETL全新版本升级驱动数据高效流转
  • 地图商业授权共享 - no
  • 【Array】数组:多个值的集合
  • 第一次算法分析作业
  • 2025 年过滤器品牌权威推荐排行榜:TOP5 企业技术实力测评,覆盖化工 / 环保 / 空气净化等多场景最新选型指南
  • [Golang] golang安装
  • web3实战工程 - hardhat框架
  • 重组蛋白表达中包涵体的形成与优化策略
  • 【MySQL】性能优化与核心机制深度解析 - 详解
  • B4375 [蓝桥杯青少年组省赛 2025] 庆典队列B4376 [蓝桥杯青少年组省赛 2025] 茶具套装B4377 [蓝桥杯青少年组省赛 2025] 平衡奇偶位置的字符交换
  • 神经网络常见的40多种激活函数(应用场景+数学公式+代码实现+函数图象)
  • 详细介绍:C++基础(22)——模板的进阶
  • 题解:[GESP202509 五级] T1
  • US$39.9 Scorpio-LK Emulators SLK-06 for Tango Key Programmer
  • 2025无人机在低空应急救援中的应用实践
  • 记录,结构,枚举,ref,in和out 元组
  • Flutter - dart 语言从入门到精通 - 教程
  • 哈夫曼编码例题
  • Win11共享打印0x0000bc4,三步解决共享难题
  • Atlas Mapper 教程系列 (7/10):单元测试与集成测试 - 教程
  • 【WCH蓝牙系列芯片】-基于CH585开发板—IO口(GPIO)外部中断唤醒蓝牙睡眠模式
  • DevExpress WinForms v25.2新功能预览 - 即将升级富文本编辑器控件功能
  • redis-事务操作
  • 【Linux基础知识系列:第一百四十篇】理解SELinux与系统安全 - 教程
  • 关于修改 linux 系统中优先使用中文结构
  • 中国DevOps平台竞品分析:安全合规与技术生态的双重较量