我们的文章会在微信公众号IT民工的龙马人生和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢!
由于博客中有大量代码,通过页面浏览效果更佳。
Oracle 表空间自动扩容脚本 (Go)
这是一个使用 Go 语言编写的 Oracle 数据库表空间自动扩容工具,能够智能监控表空间使用情况,并根据历史增长趋势自动进行扩容操作。其实为什么会写这个脚本,原因是因为在19年时团队中有一位同事的工作记录中可以看到某个客户基本上每间隔几天就要做一次表空间扩容,每次都是手动扩容,当时是真的想不通,这种重复性的操作为什么每次都需要手动去做,完全是在浪费时间,所以当时就写了一个shell的脚本,基本上完成了下面这些功能。本脚本的初衷就是节约时间,考虑到最容易的使用脚本,所以本脚本是尽最大的能力来简化使用难度,同时也考虑到一些复杂的环境,所以也增加了很多可以控制的参数来满足一些特殊的情况,但是这些参数不用担心,基本上都会有默认值。
需要注意:
脚本目前只编译Linux X86环境。
功能特性
- 智能预测扩容: 基于 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
权限要求
- 运行脚本的用户需要具有
sysdba
或sysoper
权限 - 确保 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
工作原理
预测模式(默认)
- 获取表空间信息: 查询当前大小、剩余空间、自动扩展能力
- 分析历史增长: 从 AWR 视图获取过去7天的使用趋势
- 计算预测需求: 基于日均增长量预测未来N天的空间需求
- 判断扩容条件: 当前可用空间 < 预测需求时触发扩容
- 检查底层存储: 验证 ASM 磁盘组或文件系统空间是否充足
- 执行扩容: 添加新的数据文件(1GB,自动扩展,最大32GB)
阈值模式
- 获取表空间信息: 查询当前使用百分比
- 比较阈值: 剩余空间百分比 < 设定阈值时触发扩容
- 执行扩容: 直接添加数据文件(不依赖历史预测)
存储类型处理
- 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].
错误处理
常见错误及解决方案
-
ORACLE_HOME 不存在
[ERROR] ORACLE_HOME directory does not exist: /invalid/path
解决: 检查环境变量
ORACLE_HOME
设置是否正确 -
数据库未启动
[ERROR] Database is not started or not accessible: failed to query database status
解决: 启动数据库实例,检查监听器状态
-
权限不足
[ERROR] sqlplus execution failed: ORA-01031: insufficient privileges
解决: 确保运行用户具有
sysdba
权限,OS 认证配置正确 -
AWR 数据不足
[INFO] No AWR history found for tablespace [USERS] or growth is zero, assuming 0 MB daily growth.
解决: 等待 AWR 数据收集,或使用阈值模式
-l
最佳实践
生产环境建议
- 使用阈值模式:
-l
参数更适合生产环境,不依赖历史数据 - 预览模式验证: 首次使用前用
-p
参数预览扩容 SQL - 合理设置阈值: 建议剩余空间阈值设置为 10-20%
- 监控日志: 定期检查脚本执行日志,确保扩容正常
定时任务配置
# 添加到 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
- 支持范围: 脚本使用咨询、功能定制、问题排查
获得脚本
公众号发送tbscale
——————作者介绍———————–
姓名:黄廷忠
现就职:Oracle中国高级服务团队
曾就职:OceanBase、云和恩墨、东方龙马等
电话、微信、QQ:18081072613
个人博客: (http://www.htz.pw)
CSDN地址: (https://blog.csdn.net/wwwhtzpw)
博客园地址: (https://www.cnblogs.com/www-htz-pw)
DBA必备工具:Oracle环境中表空间全自动扩容:等您坐沙发呢!