Oracle CDB自动处理表空间不足脚本
之前我曾经发过一个自动处理表空间的脚本,可以通过定时任务自动处理表空间不足的问题;但是之前那个脚本没有涵盖CDB模式下的PDB,这里将脚本做了一下更新,可以处理CDB模式下多PDB的表空间问题。
传统模式的脚本请参考这个链接
Oracle自动处理表空间不足脚本 - 墨天轮
表空间问题引起的问题请看如下
Oracle 11G还有新BUG?ORACLE 表空间迷案! - 墨天轮
脚本如下
#!/bin/bash
# name: check_ts_usage.sh
# purpose: Check tablespace usage in CDB and auto-extend if needed, then send email notification if data files are added.
# updated by 潇湘秦
# /home/oracle/.bash_profil设置 ORACLE_S ORACLE_HOME
source /home/oracle/.bash_profile
HOST_NAME=$(uname -n)
export HOST_NAME
JOB_PWD=$HOME/jobs
export JOB_PWD
EMAIL_RECIPIENTS=xxxxxx@mail.com # 设置告警邮件mail
DATA_FILE_ADDED=false #设置是否加数据文件的flag
# 确认 ORACLE_SID 和 ORACLE_HOME 是否已设置
if [[ -z "$ORACLE_SID" || -z "$ORACLE_HOME" ]]; then
echo "ORACLE_SID 或 ORACLE_HOME 未设置,请检查 /home/oracle/.bash_profile 文件。"
exit 1
fi
# 临时文件用于存放邮件内容
EMAIL_CONTENT_FILE="/tmp/tablespace_alert_email.txt"
#clear history info
>$EMAIL_CONTENT_FILE
echo "Notice: Tablespace auto-extension triggered on $HOST_NAME" > "$EMAIL_CONTENT_FILE"
# Function to check tablespace usage and add datafiles if needed
check_and_add_datafiles() {
local PDB_NAME=$1
echo "Checking tablespace usage in PDB: $PDB_NAME" >> "$EMAIL_CONTENT_FILE"
CHECK_TS_USAGE=$($ORACLE_HOME/bin/sqlplus -s "/ as sysdba" <<EOF
SET HEADING OFF FEEDBACK OFF VERIFY OFF ECHO OFF
ALTER SESSION SET CONTAINER=$PDB_NAME;
SELECT COUNT(*)
FROM (SELECT t.tablespace_name
FROM (SELECT a.tablespace_name,
a.unalloc_size,
NVL(f.free_size, 0) free_size,
a.used_size - NVL(f.free_size, 0) used_size,
ROUND((a.used_size - NVL(f.free_size, 0)) / (a.unalloc_size + a.used_size), 2) capacity
FROM (SELECT tablespace_name, ROUND(SUM(bytes) / 1024 / 1024) free_size
FROM dba_free_space
GROUP BY tablespace_name) f,
(SELECT tablespace_name,
ROUND(SUM(user_bytes) / 1024 / 1024) used_size,
ROUND(SUM(DECODE(autoextensible, 'YES', DECODE(SIGN(maxbytes - user_bytes), -1, 0, maxbytes - user_bytes), 0)) / 1024 / 1024) unalloc_size
FROM dba_data_files
GROUP BY tablespace_name) a
WHERE a.tablespace_name = f.tablespace_name(+)) t
WHERE capacity >= 0.80 # 这里的阈值按自己的需求设定
AND (unalloc_size + free_size) < 10000
AND (unalloc_size + free_size) < used_size / 2
);
EOF
)
if [[ $CHECK_TS_USAGE -gt 0 ]]; then
echo "Threshold exceeded in PDB $PDB_NAME: initiating data file addition." >> "$EMAIL_CONTENT_FILE"
DATA_FILE_ADDED=true
$ORACLE_HOME/bin/sqlplus -s "/ as sysdba" <<EOF >> "$EMAIL_CONTENT_FILE"
SET SERVEROUTPUT ON;
SET LINESIZE 1000;
SET PAGESIZE 0
ALTER SESSION SET CONTAINER=$PDB_NAME;
DECLARE
ts_name VARCHAR2(50);
datafile_path VARCHAR2(500);
is_omf NUMBER;
BEGIN
-- Loop through tablespaces with low space
FOR ts IN (
SELECT t.tablespace_name
FROM (SELECT a.tablespace_name,
a.unalloc_size,
NVL(f.free_size, 0) free_size,
a.used_size - NVL(f.free_size, 0) used_size,
ROUND((a.used_size - NVL(f.free_size, 0)) / (a.unalloc_size + a.used_size), 2) capacity
FROM (SELECT tablespace_name, ROUND(SUM(bytes) / 1024 / 1024) free_size
FROM dba_free_space
GROUP BY tablespace_name) f,
(SELECT tablespace_name,
ROUND(SUM(user_bytes) / 1024 / 1024) used_size,
ROUND(SUM(DECODE(autoextensible, 'YES', DECODE(SIGN(maxbytes - user_bytes), -1, 0, maxbytes - user_bytes), 0)) / 1024 / 1024) unalloc_size
FROM dba_data_files
GROUP BY tablespace_name) a
WHERE a.tablespace_name = f.tablespace_name(+)) t
WHERE capacity >= 0.80
AND (unalloc_size + free_size) < 10000
AND (unalloc_size + free_size) < used_size / 2
) LOOP
ts_name := ts.tablespace_name;
-- Find the path of an existing datafile for this tablespace
SELECT SUBSTR(file_name, 1, INSTR(file_name, '/', -1))
INTO datafile_path
FROM dba_data_files
WHERE tablespace_name = ts_name
AND ROWNUM = 1;
-- Check if OMF is enabled
SELECT COUNT(*) INTO is_omf
FROM v\$parameter WHERE name = 'db_create_file_dest' AND value IS NOT NULL;
IF is_omf > 0 THEN
-- Add datafile with OMF
EXECUTE IMMEDIATE 'ALTER TABLESPACE ' || ts_name || ' ADD DATAFILE SIZE 100M AUTOEXTEND ON NEXT 100M MAXSIZE 30G';
DBMS_OUTPUT.PUT_LINE('OMF Enabled: Added datafile for tablespace ' || ts_name || ' in PDB ' || '$PDB_NAME');
ELSE
-- Add datafile with custom path based on existing path
EXECUTE IMMEDIATE 'ALTER TABLESPACE ' || ts_name ||
' ADD DATAFILE ''' || datafile_path || ts_name || '_' || TO_CHAR(SYSDATE, 'YYYYMMDD') || '.dbf'' SIZE 100M AUTOEXTEND ON NEXT 100M MAXSIZE 30G';
DBMS_OUTPUT.PUT_LINE('Non-OMF: Added datafile ' || datafile_path || ts_name || '_' || TO_CHAR(SYSDATE, 'YYYYMMDD') || '.dbf for tablespace ' || ts_name || ' in PDB ' || '$PDB_NAME');
END IF;
END LOOP;
END;
/
EOF
else
echo "No tablespaces are exceeding the threshold in PDB $PDB_NAME; no action required." >> "$EMAIL_CONTENT_FILE"
fi
}
# Get list of PDBs in the CDB
PDB_LIST=$($ORACLE_HOME/bin/sqlplus -s "/ as sysdba" <<EOF
SET HEADING OFF FEEDBACK OFF VERIFY OFF ECHO OFF
SELECT name FROM v\$pdbs WHERE open_mode = 'READ WRITE';
EOF
)
# Check and add datafiles for each PDB
for PDB in $PDB_LIST; do
check_and_add_datafiles $PDB
done
# Send email notification with the contents of EMAIL_CONTENT_FILE
if $DATA_FILE_ADDED; then
mailx -s "Notice: Tablespace Auto-Extension on $HOST_NAME" "$EMAIL_RECIPIENTS" < "$EMAIL_CONTENT_FILE"
fi
# Clean up temporary file
rm -f "$EMAIL_CONTENT_FILE"
比如有多个PDB可以一个脚本搞定,设置定时任务就可以自动处理表空间问题,无需人工介入。
[oracle@ssycmes01 jobs]$ cat /tmp/tablespace_alert_email.txt
Notice: Tablespace auto-extension triggered on ssycmes01
Checking tablespace usage in PDB: MES
No tablespaces are exceeding the threshold in PDB MES; no action required.
Checking tablespace usage in PDB: QMS
No tablespaces are exceeding the threshold in PDB QMS; no action required.
Checking tablespace usage in PDB: EAM
No tablespaces are exceeding the threshold in PDB EAM; no action required.
Checking tablespace usage in PDB: SPC
No tablespaces are exceeding the threshold in PDB SPC; no action required.
Checking tablespace usage in PDB: REPORT
No tablespaces are exceeding the threshold in PDB REPORT; no action required.
如果达到阈值添加了数据文件则发送邮件告警
相关文章:

Oracle CDB自动处理表空间不足脚本
之前我曾经发过一个自动处理表空间的脚本,可以通过定时任务自动处理表空间不足的问题;但是之前那个脚本没有涵盖CDB模式下的PDB,这里将脚本做了一下更新,可以处理CDB模式下多PDB的表空间问题。 传统模式的脚本请参考这个链接 Or…...
java-list深入理解(流程图)
List源码学习: 此篇文章使用流程图和源码方式,理解List的源码,方便记忆 核心逻辑流程图: #mermaid-svg-BBrPrDuqUdLMtHvj {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-BBrPrDuqUdLMtHvj .error-icon{fill:#…...
Vue 中的 keep-alive 组件是什么?
Vue 中的 keep-alive 组件 keep-alive 是 Vue.js 提供的一个内置组件,用于在组件切换时缓存组件的状态。它可以有效提高用户体验,特别是在需要频繁切换视图的场景中,例如在 SPA(单页面应用)中。 目录 什么是 keep-alive如何使用 keep-alive属性介绍实际示例注意事项总结…...
单元测试的入门实践与应用
单元测试的目的是验证代码中最小的可测试单元(通常为函数或方法)是否按预期运行。它应当独立于系统的其他部分,并专注于特定的功能。 在软件开发中,单元测试是确保代码质量与可维护性的核心环节。优秀的单元测试不仅能帮助开发者…...

【大模型】硅基流动对接DeepSeek使用详解
目录 一、前言 二、硅基流动介绍 2.1 硅基流动平台介绍 2.1.1 平台是做什么的 2.2 主要特点与功能 2.2.1 适用场景 三、硅基流动快速使用 3.1 账户注册 3.2 token获取 3.2.1 获取token技巧 四、Cherry-Studio对接DeepSeek 4.1 获取 Cherry-Studio 4.2 Cherry-Stud…...

[Windows] PDF补丁丁v1.1.0.4627绿色版
[Windows] PDF补丁丁 链接:https://pan.xunlei.com/s/VOIdp50MV2BkOrFott_SCev1A1?pwdvbw4# PDFPatcher 是一款专门用于编辑 PDF 文件的软件,其主要功能包括添加、删除、修改、替换和提取 PDF 文件中的文本、图像、页面等内容,以及支持密码…...
Oracle 变更redo log文件位置
更改Oracle数据库的Redo log文件位置,可以按照以下步骤操作。 1.查询当前Redo log文件信息 select * from v$log; select * from v$logfile;通过查询结果可知Redo log文件放在/oradata/redofile 目录下。 2.拷贝redo log文件到新的位置/Data/redolog $cd /orada…...
使用Redis实现业务信息缓存(缓存详解,缓存更新策略,缓存三大问题)
一、什么是缓存? 缓存是一种高效的数据存储方式,它通过将数据保存在内存中来提供快速的读写访问。这种机制特别适用于需要高速数据访问的应用场景,如网站、应用程序和服务。在处理大量数据和高并发请求时, 缓存能显著提高性能和用户体验。 Redis就是一款常用的缓存中间件。…...
已验证正常,Java输入字符串生成PDF文件
Java输入字符串生成PDF文件过程: 在Java开发中,如何将字符串转换为 PDF 是一个常见的需求。网上找了很多例子都无法生成,经过多次尝试,终于实现了,特此记录一下。 1、引入pom.xml 添加所需的依赖 <dependency>&…...

android手机安装deepseek-r1:1.5b
序 本文主要展示一下如何在android手机上安装deepseek-r1:1.5b 步骤 安装termux 到https://termux.dev/cn/index.html去下载 然后执行termux-setup-storage以获取手机存储权限 安装构建依赖 pkg install git cmake golang下载ollama git clone --depth 1 https://gitee.…...
51单片机俄罗斯方块清屏函数
/************************************************************************************************************** * 名称:LED_Clr * 功能:清屏 * 参数:NULL * 返回:NULL * 备注:temp数组为动态显示数据ÿ…...

PLSQL: 存储过程,用户自定义函数[oracle]
注意: raise notice是高斯的输出语句; DBMS_OUT_PUT.PUT_LINE是oracle的输出语句 存储过程 Stored Procedure 存储过程可以封装数据访问逻辑,使得应用程序可以通过调用存储过程来执行这些逻辑,而不是直接执行SQL语句。这有助于提高代码的可重用性、可…...
深度学习-医学影像诊断
以下以使用深度学习进行医学影像(如 X 光片)的肺炎诊断为例,为你展示基于 PyTorch 框架的代码实现。我们将构建一个简单的卷积神经网络(CNN)模型,使用公开的肺炎 X 光影像数据集进行训练和评估。 1. 安装必…...

备战蓝桥杯:双指针(滑动窗口)算法之逛花展
P1638 逛画展 - 洛谷 | 计算机科学教育新生态 这道题我们只要用一个kind和一个mp[N]的数组就能解决了 我们的解法1就是暴力枚举,先固定2,从2开始找连续的满足所有种类的最短的子数组,然后固定5,3,1,3&…...

Linux如何设置软件开机启动呢?
有很多软件,我们安装完之后,服务器一旦重启,软件也需要我们手动再次启动,有很多的软件我们不想手动重启,例如Redis、Mysql、MQ等,那我们怎么配置软件跟着服务器也一起启动呢,今天就给大家带来软…...

Vue(3)
一.生命周期及其四个阶段 Vue生命周期:一个Vue实例从创建到销毁的整个过程 生命周期四个阶段:①创建②挂载③更新④销毁 <body><div id"app"><h3>{{ title }}</h3><div><button click"count--"&…...

11vue3实战-----封装缓存工具
11vue3实战-----封装缓存工具 1.背景2.pinia的持久化思路3.以localStorage为例解决问题4.封装缓存工具 1.背景 在上一章节,实现登录功能时候,当账号密码正确,身份验证成功之后,把用户信息保存起来,是用的pinia。然而p…...

第16章 Single Thread Execution设计模式(Java高并发编程详解:多线程与系统设计)
简单来说, Single Thread Execution就是采用排他式的操作保证在同一时刻只能有一个线程访问共享资源。 1.机场过安检 1.1非线程安全 先模拟一个非线程安全的安检口类,旅客(线程)分别手持登机牌和身份证接受工作人员的检查,示例代码如所示。…...

MySQL 8.0.41 终端修改root密码
1.在 MySQL 命令行中,运行以下命令修改密码 ALTER USER rootlocalhost IDENTIFIED BY new_password; 其中,new_password替换为你想要设置的新密码 2.退出 MySQL终端,重新打开,使用新密码进入,修改成功...

微信小程序案例2——天气微信小程序(学会绑定数据)
文章目录 一、项目步骤1 创建一个weather项目2 进入index.wxml、index.js、index.wxss文件,清空所有内容,进入App.json,修改导航栏标题为“中国天气网”。3进入index.wxml,进行当天天气情况的界面布局,包括温度、最低温、最高温、天气情况、城市、星期、风行情况,代码如下…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...

2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...

招商蛇口 | 执笔CID,启幕低密生活新境
作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...