大家好,这里是 DBA 学习之路,专注于提升数据库运维效率。

@TOC

前言

最近有客户反馈了一个困扰已久的问题:频繁收到表空间使用率超过 90% 的告警邮件,每次都需要手动添加数据文件来解决。客户询问:Oracle 数据库难道不能自动增加数据文件吗?

很遗憾,Oracle 数据库原生确实不支持自动添加数据文件功能。想要实现自动化扩容,需要 DBA 自行编写 Shell 脚本。

今天就来分享一个我在实际工作中常用的 Oracle 表空间自动扩展脚本。

关注公众号:DBA学习之路,聊天框回复:tbs_autoext 下载脚本。

脚本演示

我在测试环境演示一下这个脚本如何使用。

测试环境准备

首先,在测试环境创建一个 90% 以上使用率的表空间:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
-- 创建测试表空间(注意:会删除已存在的同名表空间)
DROP TABLESPACE test_auto_ts INCLUDING CONTENTS AND DATAFILES;
CREATE TABLESPACE test_auto_ts
DATAFILE '/oradata/orcl/test_auto_ts01.dbf'
SIZE 1M
AUTOEXTEND ON
NEXT 1M
MAXSIZE 10M; -- 设置较小的MAXSIZE,便于快速达到测试效果

-- 创建测试用户并分配权限
CREATE USER test_auto_user IDENTIFIED BY "Password123"
DEFAULT TABLESPACE test_auto_ts
QUOTA UNLIMITED ON test_auto_ts;

-- 创建测试表
CREATE TABLE test_auto_user.test_data (
id NUMBER,
data VARCHAR2(4000)
) TABLESPACE test_auto_ts;

-- 批量插入数据快速填充表空间
BEGIN
FOR i IN 1..2000 LOOP
INSERT INTO test_auto_user.test_data
VALUES (i, RPAD('X', 4000, 'X')); -- 每条记录约4K
END LOOP;
COMMIT;
END;
/

-- 检查表空间当前使用率
SELECT tablespace_name, ROUND(used_percent, 2) AS usage_pct
FROM dba_tablespace_usage_metrics
WHERE tablespace_name = 'TEST_AUTO_TS';

执行结果示意

表空间使用率接近100%

部署并执行自动扩展脚本

1、上传脚本:将 tbs_autoext.sh 脚本上传到服务器指定目录(例如 /home/oracle/tbs_check/

脚本上传示意

2、执行脚本

1
./tbs_autoext.sh -t 80 -v

脚本执行输出示意

3、查看执行日志:脚本运行完成后,可通过日志文件查看详细的操作记录

日志文件内容示意

配置定时任务 (crontab)

为了实现完全自动化运维,可以将脚本加入系统定时任务:

1
2
3
crontab -e
# 添加以下配置,设置每天凌晨2点自动执行检查
0 2 * * * export ORACLE_SID=orcl; /home/oracle/tbs_check/tbs_autoext.sh -m luciferliu@163.com

每天 2 点自动运行脚本并且将日志内容发送到邮箱。

写在最后

通过这个自动化脚本,我们可以彻底解决 Oracle 表空间手动扩容的烦恼,大幅减少告警干扰,显著提升 DBA 的工作效率。

生产环境部署建议

  • 务必在测试环境充分验证后再上线
  • 根据实际业务需求调整触发扩容的使用率阈值
  • 合理设置新增数据文件的大小,避免频繁扩容或单次扩容过大

希望这个脚本能为大家的日常运维工作带来便利!