当前位置: 首页 > news >正文

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_HOMEsource /home/oracle/.bash_profileHOST_NAME=$(uname -n)export HOST_NAMEJOB_PWD=$HOME/jobsexport JOB_PWDEMAIL_RECIPIENTS=xxxxxx@mail.com  # 设置告警邮件mailDATA_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 1fi# 临时文件用于存放邮件内容EMAIL_CONTENT_FILE="/tmp/tablespace_alert_email.txt"#clear history info>$EMAIL_CONTENT_FILEecho "Notice: Tablespace auto-extension triggered on $HOST_NAME" > "$EMAIL_CONTENT_FILE"# Function to check tablespace usage and add datafiles if neededcheck_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 CDBPDB_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 PDBfor PDB in $PDB_LIST; do    check_and_add_datafiles $PDBdone# Send email notification with the contents of EMAIL_CONTENT_FILEif $DATA_FILE_ADDED; then    mailx -s "Notice: Tablespace Auto-Extension on $HOST_NAME"  "$EMAIL_RECIPIENTS" < "$EMAIL_CONTENT_FILE"fi# Clean up temporary filerm -f "$EMAIL_CONTENT_FILE"

比如有多个PDB可以一个脚本搞定,设置定时任务就可以自动处理表空间问题,无需人工介入。

[oracle@ssycmes01 jobs]$ cat /tmp/tablespace_alert_email.txtNotice: Tablespace auto-extension triggered on ssycmes01Checking tablespace usage in PDB: MESNo tablespaces are exceeding the threshold in PDB MES; no action required.Checking tablespace usage in PDB: QMSNo tablespaces are exceeding the threshold in PDB QMS; no action required.Checking tablespace usage in PDB: EAMNo tablespaces are exceeding the threshold in PDB EAM; no action required.Checking tablespace usage in PDB: SPCNo tablespaces are exceeding the threshold in PDB SPC; no action required.Checking tablespace usage in PDB: REPORTNo tablespaces are exceeding the threshold in PDB REPORT; no action required.

如果达到阈值添加了数据文件则发送邮件告警

相关文章:

Oracle CDB自动处理表空间不足脚本

之前我曾经发过一个自动处理表空间的脚本&#xff0c;可以通过定时任务自动处理表空间不足的问题&#xff1b;但是之前那个脚本没有涵盖CDB模式下的PDB&#xff0c;这里将脚本做了一下更新&#xff0c;可以处理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属性介绍实际示例注意事项总结…...

单元测试的入门实践与应用

单元测试的目的是验证代码中最小的可测试单元&#xff08;通常为函数或方法&#xff09;是否按预期运行。它应当独立于系统的其他部分&#xff0c;并专注于特定的功能。 在软件开发中&#xff0c;单元测试是确保代码质量与可维护性的核心环节。优秀的单元测试不仅能帮助开发者…...

【大模型】硅基流动对接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补丁丁 链接&#xff1a;https://pan.xunlei.com/s/VOIdp50MV2BkOrFott_SCev1A1?pwdvbw4# PDFPatcher 是一款专门用于编辑 PDF 文件的软件&#xff0c;其主要功能包括添加、删除、修改、替换和提取 PDF 文件中的文本、图像、页面等内容&#xff0c;以及支持密码…...

Oracle 变更redo log文件位置

更改Oracle数据库的Redo log文件位置&#xff0c;可以按照以下步骤操作。 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文件过程&#xff1a; 在Java开发中&#xff0c;如何将字符串转换为 PDF 是一个常见的需求。网上找了很多例子都无法生成&#xff0c;经过多次尝试&#xff0c;终于实现了&#xff0c;特此记录一下。 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单片机俄罗斯方块清屏函数

/************************************************************************************************************** * 名称&#xff1a;LED_Clr * 功能&#xff1a;清屏 * 参数&#xff1a;NULL * 返回&#xff1a;NULL * 备注&#xff1a;temp数组为动态显示数据&#xff…...

PLSQL: 存储过程,用户自定义函数[oracle]

注意: raise notice是高斯的输出语句; DBMS_OUT_PUT.PUT_LINE是oracle的输出语句 存储过程 Stored Procedure 存储过程可以封装数据访问逻辑&#xff0c;使得应用程序可以通过调用存储过程来执行这些逻辑&#xff0c;而不是直接执行SQL语句。这有助于提高代码的可重用性、可…...

深度学习-医学影像诊断

以下以使用深度学习进行医学影像&#xff08;如 X 光片&#xff09;的肺炎诊断为例&#xff0c;为你展示基于 PyTorch 框架的代码实现。我们将构建一个简单的卷积神经网络&#xff08;CNN&#xff09;模型&#xff0c;使用公开的肺炎 X 光影像数据集进行训练和评估。 1. 安装必…...

备战蓝桥杯:双指针(滑动窗口)算法之逛花展

P1638 逛画展 - 洛谷 | 计算机科学教育新生态 这道题我们只要用一个kind和一个mp[N]的数组就能解决了 我们的解法1就是暴力枚举&#xff0c;先固定2&#xff0c;从2开始找连续的满足所有种类的最短的子数组&#xff0c;然后固定5&#xff0c;3&#xff0c;1&#xff0c;3&…...

Linux如何设置软件开机启动呢?

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

Vue(3)

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

11vue3实战-----封装缓存工具

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

第16章 Single Thread Execution设计模式(Java高并发编程详解:多线程与系统设计)

简单来说&#xff0c; Single Thread Execution就是采用排他式的操作保证在同一时刻只能有一个线程访问共享资源。 1.机场过安检 1.1非线程安全 先模拟一个非线程安全的安检口类&#xff0c;旅客(线程)分别手持登机牌和身份证接受工作人员的检查&#xff0c;示例代码如所示。…...

MySQL 8.0.41 终端修改root密码

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

微信小程序案例2——天气微信小程序(学会绑定数据)

文章目录 一、项目步骤1 创建一个weather项目2 进入index.wxml、index.js、index.wxss文件,清空所有内容,进入App.json,修改导航栏标题为“中国天气网”。3进入index.wxml,进行当天天气情况的界面布局,包括温度、最低温、最高温、天气情况、城市、星期、风行情况,代码如下…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计&#xff1a;let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性&#xff0c;这种设计体现了语言的核心哲学。以下是深度解析&#xff1a; 1.1 设计理念剖析 安全优先原则&#xff1a;默认不可变强制开发者明确声明意图 let x 5; …...

零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

一、核心优势&#xff1a;专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发&#xff0c;是一款收费低廉但功能全面的Windows NAS工具&#xff0c;主打“无学习成本部署” 。与其他NAS软件相比&#xff0c;其优势在于&#xff1a; 无需硬件改造&#xff1a;将任意W…...

超短脉冲激光自聚焦效应

前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应&#xff0c;这是一种非线性光学现象&#xff0c;主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场&#xff0c;对材料产生非线性响应&#xff0c;可能…...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能&#xff0c;我们需要对它的功能特点进行分析&#xff1a; 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具&#xff1a; mysql&#xff1a;关系型数据库&am…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...