我们的文章会在微信公众号IT民工的龙马人生博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢!

由于博客中有大量代码,通过页面浏览效果更佳。

Oracle 表空间自动扩容脚本 (Go)

这是一个使用 Go 语言编写的 Oracle 数据库表空间自动扩容工具,能够智能监控表空间使用情况,并根据历史增长趋势自动进行扩容操作。其实为什么会写这个脚本,原因是因为在19年时团队中有一位同事的工作记录中可以看到某个客户基本上每间隔几天就要做一次表空间扩容,每次都是手动扩容,当时是真的想不通,这种重复性的操作为什么每次都需要手动去做,完全是在浪费时间,所以当时就写了一个shell的脚本,基本上完成了下面这些功能。本脚本的初衷就是节约时间,考虑到最容易的使用脚本,所以本脚本是尽最大的能力来简化使用难度,同时也考虑到一些复杂的环境,所以也增加了很多可以控制的参数来满足一些特殊的情况,但是这些参数不用担心,基本上都会有默认值。

功能特性

  • 智能预测扩容: 基于 AWR 历史数据,预测未来 N 天的空间需求,提前进行扩容
  • 路径选择:数据文件路径以需要表空间中最后一个数据文件的路径为准(主要是用于多路径环境)
  • 多存储类型支持: 自动识别 ASM、文件系统存储类型,跳过裸设备
  • 阈值模式: 支持设置表空间剩余空间百分比阈值,低于阈值时自动扩容
  • 安全检查: 扩容前检查底层存储空间是否充足
  • 灵活配置: 支持指定特定表空间、排除表空间、预测天数等
  • 预览模式: 支持只打印扩容 SQL 而不执行,便于安全验证
  • 详细日志: 支持 INFO、ERROR、DEBUG 三种日志级别
  • 环境验证: 自动检查数据库状态和 ORACLE_HOME 配置

环境配置

必需环境变量

# 设置数据库 SID
export ORACLE_SID=yourdb # 设置 Oracle Home 路径
export ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1

权限要求

  • 运行脚本的用户需要具有 sysdbasysoper 权限
  • 确保 OS 认证已正确配置

使用方法

基本参数说明

参数 说明 默认值
-s 指定数据库 ORACLE_SID $ORACLE_SID
-m 指定数据库 ORACLE_HOME $ORACLE_HOME
-t 指定要检查的表空间,逗号分隔 ALL
-e 指定要排除的表空间,逗号分隔
-d 预测未来几天的增长需求 7
-l 表空间剩余空间阈值,格式:tbs1:10,tbs2:15
-p 仅打印扩容 SQL,不执行 false
-debug 启用 DEBUG 模式 false
-v 显示版本信息和联系方式 -
-h 显示帮助信息 -

使用场景示例

1. 检查所有表空间(预测模式)

# 检查所有表空间,预测未来7天的增长需求
./tbscale # 检查所有表空间,预测未来30天的增长需求
./tbscale -d 30 # 开启 DEBUG 模式,查看详细执行过程
./tbscale -debug

2. 检查特定表空间

# 只检查 USERS 和 DATA 表空间
./tbscale -t USERS,DATA # 检查所有表空间,但排除 UNDOTBS1
./tbscale -t ALL -e UNDOTBS1

3. 阈值模式(推荐用于生产环境)

# 当 USERS 表空间剩余空间低于 10% 时扩容
./tbscale -l USERS:10 # 多个表空间设置不同阈值
./tbscale -l USERS:10,DATA:15,SYSTEM:20 # 阈值模式 + 预览模式(只打印 SQL,不执行)
[oracle@oracleadg tmp]$ ./tbscale -l test:100 -p
[INFO] 2025/07/01 20:59:05 This script will connect to the database using 'sqlplus / as sysdba'. Please ensure OS authentication is configured correctly.
[INFO] 2025/07/01 20:59:05 Database status: OPEN
[INFO] 2025/07/01 20:59:05 Threshold mode: Only checking tablespaces and thresholds specified by -l
[INFO] 2025/07/01 20:59:05 ========== Processing tablespace: TEST (threshold 100.00%) ==========
[INFO] 2025/07/01 20:59:05 Tablespace [TEST] free space 99.90% < threshold 100.00%, expansion required.
[INFO] 2025/07/01 20:59:05 Underlying storage has sufficient space for tablespace [TEST] (Available 21776.12 MB >= Needed 1024 MB)
[INFO] 2025/07/01 20:59:05 Expansion SQL: ALTER TABLESPACE TEST ADD DATAFILE '/oracle/app/oracle/oradata/HTZ19THR/datafile/TEST_12.dbf' SIZE 1G AUTOEXTEND ON NEXT 100M MAXSIZE 32767M;
[INFO] 2025/07/01 20:59:05 -p flag is set, not executing expansion SQL.
[INFO] 2025/07/01 20:59:05 Successfully added a new datafile to tablespace [TEST].
[INFO] 2025/07/01 20:59:05 Script execution finished.

4. 安全验证

# 预览模式:只打印扩容 SQL,不实际执行
./tbscale -t USERS -p # 检查版本和联系方式
./tbscale -v # 查看帮助信息
[oracle@oracleadg tmp]$ ./tbscale -help Oracle Tablespace Autoscaler (Go) v0.1
For the latest version, contact phone/WeChat: 18081072613 Usage:
tbscale [flags] Flags:
-s Specify the database ORACLE_SID (default: $ORACLE_SID)
-m Specify the database ORACLE_HOME (default: $ORACLE_HOME)
-t Tablespaces to check, comma-separated (default: ALL)
-e Tablespaces to exclude when -t=ALL, comma-separated
-d Number of days of future growth to ensure capacity for (default: 7)
-l Tablespace free space thresholds, e.g. tbs1:10,tbs2:15 (in percent). If set, -t, -e, -d are ignored.
-p Print expansion SQL only, do not execute (default: false)
-debug Enable DEBUG mode
-v Show script version and contact info
-h, --help, -help Show this help message and exit

工作原理

预测模式(默认)

  1. 获取表空间信息: 查询当前大小、剩余空间、自动扩展能力
  2. 分析历史增长: 从 AWR 视图获取过去7天的使用趋势
  3. 计算预测需求: 基于日均增长量预测未来N天的空间需求
  4. 判断扩容条件: 当前可用空间 < 预测需求时触发扩容
  5. 检查底层存储: 验证 ASM 磁盘组或文件系统空间是否充足
  6. 执行扩容: 添加新的数据文件(1GB,自动扩展,最大32GB)

阈值模式

  1. 获取表空间信息: 查询当前使用百分比
  2. 比较阈值: 剩余空间百分比 < 设定阈值时触发扩容
  3. 执行扩容: 直接添加数据文件(不依赖历史预测)

存储类型处理

  • ASM: 在对应磁盘组中创建数据文件,Oracle 自动命名
  • 文件系统: 在数据文件目录创建 TABLESPACE_NAME_N.dbf 格式文件
  • 裸设备: 跳过处理,输出提示信息

日志输出

日志级别

  • INFO: 默认级别,显示关键操作和结果
  • ERROR: 错误信息,脚本执行失败时显示
  • DEBUG: 详细调试信息,包含 SQL 语句和执行过程

日志示例

[INFO] Script starting. Target SID: orcl, Prediction days: 7
[INFO] Database status: OPEN
[INFO] ORACLE_HOME matches: /u01/app/oracle/product/19.0.0/dbhome_1
[INFO] ========== Processing tablespace: USERS ==========
[INFO] Tablespace [USERS] projected growth for the next 7 days is: 512.50 MB
[INFO] Tablespace [USERS] has insufficient capacity (Available 256.00 MB < Projected 512.50 MB), expansion required.
[INFO] Underlying storage has sufficient space for tablespace [USERS] (Available 2048.00 MB >= Needed 1024.00 MB)
[INFO] Expansion SQL: ALTER TABLESPACE USERS ADD DATAFILE '/u01/app/oracle/oradata/orcl/USERS_3.dbf' SIZE 1G AUTOEXTEND ON NEXT 100M MAXSIZE 32G;
[INFO] Successfully added a new datafile to tablespace [USERS].

错误处理

常见错误及解决方案

  1. ORACLE_HOME 不存在

    [ERROR] ORACLE_HOME directory does not exist: /invalid/path

    解决: 检查环境变量 ORACLE_HOME 设置是否正确

  2. 数据库未启动

    [ERROR] Database is not started or not accessible: failed to query database status

    解决: 启动数据库实例,检查监听器状态

  3. 权限不足

    [ERROR] sqlplus execution failed: ORA-01031: insufficient privileges

    解决: 确保运行用户具有 sysdba 权限,OS 认证配置正确

  4. AWR 数据不足

    [INFO] No AWR history found for tablespace [USERS] or growth is zero, assuming 0 MB daily growth.

    解决: 等待 AWR 数据收集,或使用阈值模式 -l

最佳实践

生产环境建议

  1. 使用阈值模式: -l 参数更适合生产环境,不依赖历史数据
  2. 预览模式验证: 首次使用前用 -p 参数预览扩容 SQL
  3. 合理设置阈值: 建议剩余空间阈值设置为 10-20%
  4. 监控日志: 定期检查脚本执行日志,确保扩容正常

定时任务配置

# 添加到 crontab,每天凌晨2点执行
0 2 * * * /path/to/tbscale -l USERS:10,DATA:15 >> /var/log/tbscale.log 2>&1 # 每周检查所有表空间
0 3 * * 0 /path/to/tbscale -debug >> /var/log/tbscale_weekly.log 2>&1

版本信息

  • 当前版本: 0.1
  • 最新版本请联系: 电话、微信:18081072613
  • 支持功能: Oracle 11g/12c/19c

技术支持

如有问题或需要最新版本,请联系:

  • 电话/微信: 18081072613
  • 支持范围: 脚本使用咨询、功能定制、问题排查

------------------作者介绍-----------------------

姓名:黄廷忠

现就职:Oracle中国高级服务团队

曾就职:OceanBase、云和恩墨、东方龙马等

电话、微信、QQ:18081072613

个人博客: (http://www.htz.pw)

CSDN地址: (https://blog.csdn.net/wwwhtzpw)

博客园地址: (https://www.cnblogs.com/www-htz-pw)


DBA备库工具:Oracle环境中表空间全自动扩容的更多相关文章

  1. 模拟主库创建数据文件,dg备库空间不足时问题处理

    本篇文档测试目的: 模拟实际环境中,主库对表空间添加数据文件,备库空间不足,最终导致MRP进程自动断开,处理方式. 1.问题环境模拟 1)正常情况下的dg 主库创建数据文件,备库接受日志,自动创建表空 ...

  2. Oracle 11.2.4.0 ACTIVE DATAGUARD 单实例安装(COPY创建备库)

    Oracle 11.2.4.0 ADG 单实例安装(COPY创建备库) 规划: 主: OS: Linux Centos 6.5 X64 hostname:ORA11G-DG1 ipaddress:19 ...

  3. ORACLE 11g 用Duplicate恢复Data Guard 备库详细过程

    1.先查找备库控制文件路径 先在备库上找出控制文件的路径,通过和主库一样,不过为了以防万一,还是check为好. SQL>  select name from v$controlfile; NA ...

  4. DG备库无法接受主库归档日志之密码文件

    DG备库无法接受主库归档日志之密码文件 实验目的:还原某个客户案例,客户审计需要,对主库sys用户进行锁定,一小时后对sys用户进行解锁后,发现备库无法接受主库的归档日志 本篇文章,测试sys用户与D ...

  5. linux下oracle11G DG搭建(三):环绕备库搭建操作

    linux下oracle11G DG搭建(三):环绕备库搭建操作 环境 名称 主库 备库 主机名 bjsrv shsrv 软件版本号 RedHat Enterprise5.5.Oracle 11g 1 ...

  6. 使用DUPLICATE 方式创建ORACLE 11G DG备库环境

    我的最佳实践 ① 手动创建好初始化参数文件: *.audit_file_dest='E:\APP\XJXU\ADMIN\ORASTAND\ADUMP'*.control_files='E:\APP\X ...

  7. OGG 从Oracle备库同步数据至kafka

    OGG 从Oracle备库同步数据至kafka Table of Contents 1. 目的 2. 环境及规划 3. 安装配置JDK 3.1. 安装jdk 3.2. 配置环境变量 4. 安装Data ...

  8. Oracle主库归档丢失,备库日志有gap,在不重建备库的情况下,恢复备库

    本文主要描述Oracle备库日志与主库日志之间有gap,切主库这部分gap的归档日志已经删除或丢失,如何在不重建备库的情况下,恢复备库. 欢迎转载,请注明作者.出处. 作者:张正 blog:http: ...

  9. oracle 利用flashback将备库激活为read wirte(10g 及上)

    oracle 利用flashback将备库激活为read wirte(10g 及上) 环境: OS: CENTOS 6.5 X64 DB: ORACLE 10.2.0.5 主库操作: SQL> ...

  10. oracle中表空间的相关操作

    Oracle 创建表空间 注意点: 1.如果在PL/SQL 等工具里打开的话,直接修改下面的代码中[斜体加粗部分]执行 2.确保路径存在,比如[E:\app\Quentin\oradata\orcl] ...

随机推荐

  1. 包装类面试题--java进阶day05

    1.面试题 如下两个输出,请问分别是true还是false呢? 答案: 当范围在-128~127时,对象相同就会返回true 在讲解这个问题之前,先了解自动装箱的原理 2.自动装箱的原理 自动装箱,就 ...

  2. Python 潮流周刊#95:像人类一样使用计算机(摘要)

    本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...

  3. 【保姆级教程】windows 安装 docker 全流程

    一.背景 许多小伙伴在安装 Dify 或是 RagFlow 这些工具的时候,往往会遇到一个难题,那就是 Docker 的安装. 首先,我们的PC安装的绝大部分是 Windows,但众所周知的原因,Wi ...

  4. Google发布A2A开源协议:“MCP+A2A”成未来标配?

    就在刚刚Google Cloud Next 25大会上,谷歌重磅开源Agent2Agent(A2A)协议,这项被类比为"AI界的HTTP协议"的技术标准,彻底打破了智能体间的信息孤 ...

  5. centos firewall防火墙操作指令记录

    1. 查看防火墙状态 systemctl status firewalld.service 2. 关闭防火墙 systemctl stop firewalld.service 3. 开机自动关闭防火墙 ...

  6. Canvas、客户端、表单

    Canvas var canvas = document.querySelector('.myCanvas'); var width = canvas.width = window.innerWidt ...

  7. heapdump敏感信息提取工具-JDumpSpider(一) ,附下载链接

    ​ 介绍 HeapDump敏感信息提取工具 在日常得渗透测试工作中,经常遇到spring actuator未授权漏洞,而且在实际过程中也常常会下载到heapdump这个文件.了解过这个文件的人知道,H ...

  8. 【BUG】PHP Warning: ‘C:\\WINDOWS\\SYSTEM32\\VCRUNTIME140.dll‘ 14.0 is not compatible with this PHP bu

      当使用PHP8.0时,你可能会遇到这个报错: PHP Warning: 'C:\\WINDOWS\\SYSTEM32\\VCRUNTIME140.dll' 14.0 is not compatib ...

  9. [随记]-SpringMVC中的handler到底是什么东西

    HandlerMapping 初始化时候的 HandlerMapping 有,按顺序排列: requestMappingHandlerMapping beanNameHandlerMapping -& ...

  10. 基于ThinkPHP5知识付费系统AntPayCMS

    历时6个月开发基于ThinkPHP5.1知识付费系统AntPayCMS,自己作IT开发已经10年,一直想自己开发自己的系统,虽然看网上也有很多知识付费类的网站的,但基于TP基本很少,而且自己也一直想做 ...