我们的文章会在微信公众号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. CSS那些事读书笔记-2

    背景 作为一个后端开发,曾经尝试过学习前端,但是总觉不得要领,照猫画虎,而公司里又有专业的前端开发,工作中几乎接触不到实际的前端任务,所以前端的技能田野一直是一片荒芜.但是笔者深知前端的技能对找工作和 ...

  2. deepseek+dify工作流实现代码审计

    一.登录dify,设置deepseek apikey 登录dify(https://cloud.dify.ai/signin) 设置deepseek apikey 二.创建dify工作流 添加工作流应 ...

  3. 多态的引入--java进阶day02

    1.多态的介绍 总的来说就是一句话,使用多态,所有的子类都可以根据父类这个桥梁来连接它们各自的成员方法,从而调用方法,减少多次的代码重写,使代码更加简单便捷 我们以之前说的公司写业务为例子来理解多态, ...

  4. 《机器人SLAM导航核心技术与实战》前言

    <机器人SLAM导航核心技术与实战>前言 温馨提示: 本篇文章是我最新出版的书籍<机器人SLAM导航核心技术与实战>的前言部分,感兴趣的读者可以购买纸质书籍来进行更加深入和系统 ...

  5. study Rust-6【使用结构体组织相关联的数据】

    struc(structure) 定义并且实例化结构体: struct User { username: String, email: String, sign_in_count: u64, acti ...

  6. Mybatis-Plus中的@TableName 和 table-prefix

    简介 本文介绍Mybatis-Plus中的@TableName 和 table-prefix的使用. 介绍 在 MyBatis-Plus 中,@TableName 注解和 table-prefix 配 ...

  7. python开发箱号批量查询关联SN号码的程序

    # 需要导入的包 import tkinter as tk from tkinter import ttk, messagebox, filedialog import pyodbc import p ...

  8. File类使用详解

    File类是java io包下代表与平台无关的文件和目录,也就是说,在程序中操作文件和目录都可以通过File类来完成.但是File不能访问文件内容本身,访问文件内容需要使用输入/输出流. File类的 ...

  9. 在IIS发布.net9 api程序踩坑总结

    参照:.NET 9.0 WebApi 发布到 IIS 详细步骤_webapi发布到iis-CSDN博客 环境搭建: 注意安装与程序版本对应的Windows Server Hosting,安装完成之后, ...

  10. MySQL的基本语法(增,删,改,查)

    MySQL的基本语法(增,删,改,查) MySQL中的(增)操作 创建数据库 CREATE DATABASE 库名; 例如: CREATE DATABASE db; 创建一个名为db的数据库. 创建列 ...