• 扩展表空间(PDB数据库):add_tbs.sh


    #!/bin/bash

    source ~/.bash_profile

    export pdb_name=pdb      #PDB名称
    export ts_name=default_tbs       #表空间
    export inc_size_gb=1   #需要增加的GB数,单位G

    #单次增长上限
    inc_size_mb_threshold=$((32 * 1024))
    inc_size_mb=$((${inc_size_gb} * 1024))

    pdb_name=$(echo $pdb_name | tr 'a-z' 'A-Z')
    ts_name=$(echo $ts_name | tr 'a-z' 'A-Z')
    echo PDB名:${pdb_name}
    echo 表空间名: ${ts_name}

    #该函数执行SQL
    function exec_select(){
    sqlplus -s '/as sysdba' <    set head off feedback off serveroutput on lines 1000
       $1
       quit;
    EOF
    }

    function exec_ddl(){
    sqlplus -s '/as sysdba' <    set head off feedback off serveroutput on
       alter session set container=$1;
       $2
       quit;
    EOF
    }

    db_role=$(exec_select "select database_role from v\$database;")
    echo 主备库角色:${db_role}
    if [ ${db_role} != 'PRIMARY' ]; then
        echo 表空间扩容需要在主库执行
        exit 1
    fi

    pdb_exist=$(exec_select "select count(*) from CDB_PDBS where pdb_name = '${pdb_name}';")
    if [ $pdb_exist -ne 1 ]; then
       echo 目标PDB不存在
       exit 1
    fi

    bigfile_ts=$(exec_select "SELECT bigfile FROM CDB_PDBS d join cdb_tablespaces t on d.con_id = t.con_id WHERE d.pdb_name = '${pdb_name}' and t.tablespace_name = '${ts_name}';")
    if [ ! $bigfile_ts ]; then
       echo PDB${pdb_name}下${ts_name}表空间不存在
       exit 1
    fi

    # 文件尺寸上限
    file_size_mb_limit=$((32 * 1024 - 100))
    if [ $bigfile_ts = 'YES' ]; then
       echo "big file tablespace"
       file_size_mb_limit=$((32 * 1024 * 1024 - 512))
    else
       echo "normal tablespace"
    fi

    data_file_info=$(exec_select "SELECT * FROM (SELECT f.file_name, ROUND(f.bytes/1024/1024,5) size_mb, ROUND(f.maxbytes/1024/1024,5) max_size_mb,f.autoextensible FROM CDB_DATA_FILES f join CDB_PDBS d on f.con_id = d.con_id WHERE d.pdb_name ='${pdb_name}' and f.tablespace_name = '${ts_name}' order by max_size_mb) where rownum = 1;")
    file_name=$(echo ${data_file_info} | awk '{ print $1 }')
    file_size_mb=$(echo ${data_file_info} | awk '{ print $2 }' | tr '.' '0.')
    file_max_size_mb=$(echo ${data_file_info} | awk '{ print $3 }' | tr '.' '0.' )
    file_autoextensible=$(echo ${data_file_info} awk '{ print $4 }')

    echo 数据文件${file_name}
    echo 文件当前尺寸${file_size_mb}MB
    echo 文件可扩展:$file_autoextensible
    echo 文件自增最大尺寸:${file_max_size_mb}MB

    # 增长后的新文件尺寸
    new_file_size_mb=$( echo ${file_size_mb} + ${inc_size_mb} | bc)

    if [ ${new_file_size_mb} -gt ${file_size_mb_limit} ]; then
       echo 超出数据文件最大限制${file_size_mb_limit}MB
       exit 1
    fi

    # 所属ASM磁盘组组名
    asm_disk_group=$(echo $file_name | awk -F '/' '{ print $1 }')
    asm_disk_group=${asm_disk_group/+/}

    # 统计ASM磁盘空间
    asm_dg_info=$(exec_select "SELECT free_mb,total_mb FROM V\$asm_diskgroup_stat WHERE name = '${asm_disk_group}';")
    asm_dg_free_mb=$(echo ${asm_dg_info} | awk '{ print $1 }')
    asm_dg_total_mb=$(echo ${asm_dg_info} | awk '{ print $2 }')
    fix_asm_dg_free_mb=$(echo "${asm_dg_total_mb} * 0.95 - (${asm_dg_total_mb} - ${asm_dg_free_mb})" | bc | awk -F "." '{ print $1 }')

    if [ ${inc_size_mb} -gt ${fix_asm_dg_free_mb} ]; then
       echo ${asm_disk_group}磁盘组剩余${asm_dg_free_mb}MB. 要预留5%的空间,最多能扩展${fix_asm_dg_free_mb}MB
       exit 1
    fi

    # 新文件尺寸超过文件自增最多尺寸的话,先调整文件最大尺寸
    if [ ${new_file_size_mb} -gt ${file_max_size_mb} ]; then
       echo "ALTER DATABASE DATAFILE '${file_name}' AUTOEXTEND on MAXSIZE ${new_file_size_mb}M;"
       exec_ddl ${pdb_name} "ALTER DATABASE DATAFILE '${file_name}' AUTOEXTEND on MAXSIZE ${new_file_size_mb}M;"
    fi

    echo "ALTER DATABASE DATAFILE '${file_name}' resize ${new_file_size_mb}M;"
    exec_ddl ${pdb_name} "ALTER DATABASE DATAFILE '${file_name}' RESIZE ${new_file_size_mb}M;"

    echo 操作完成
    new_ts_size_mb=$(exec_select "SELECT ROUND(sum(f.bytes)/1024/1024) size_mb FROM CDB_DATA_FILES f join CDB_PDBS d on f.con_id = d.con_id WHERE d.pdb_name = '${pdb_name}' and f.tablespace_name = '${ts_name}';")

    segment_total_mb=$(exec_select "SELECT ROUND(sum(s.bytes)/1024/1024) size_mb FROM cdb_segments s join CDB_PDBS d on s.con_id = d.con_id WHERE d.pdb_name = '${pdb_name}' and s.tablespace_name = '${ts_name}';")

    new_ts_free_size_mb=$(echo ${new_ts_size_mb} - ${segment_total_mb} | bc)
    echo 新表空间尺寸${new_ts_size_mb}MB,空闲空间${new_ts_free_size_mb}MB

    new_asm_dg_free_mb=$(exec_select "SELECT free_mb FROM V\$asm_diskgroup_stat WHERE name = '${asm_disk_group}';")
    echo ${asm_disk_group}磁盘组最新剩余${new_asm_dg_free_mb}MB


    =========================打印正常内容如下=============================

    oracle@racdb1:/home/oracle>sh add_tbs.sh 
    PDB名:PDB
    表空间名: DEFAULT_TBS
    主备库角色: PRIMARY
    normal tablespace
    数据文件+DATADG/YQBDB/FA8C41145AA66161E0530AC5A8C04C82/DATAFILE/default_tbs.286.1148745207
    文件当前尺寸100MB
    文件可扩展:+DATADG/YQBDB/FA8C41145AA66161E0530AC5A8C04C82/DATAFILE/default_tbs.286.1148745207 100 3072 YES awk { print $4 }
    文件自增最大尺寸:3072MB
    ALTER DATABASE DATAFILE '+DATADG/YQBDB/FA8C41145AA66161E0530AC5A8C04C82/DATAFILE/default_tbs.286.1148745207' resize 1124M;
    操作完成
    新表空间尺寸 1124MB,空闲空间330MB
    DATADG磁盘组最新剩余 688MB

    oracle@racdb1:/home/oracle>

  • 相关阅读:
    【毕业设计】基于单片机的心率血氧健康监测手表 - 物联网 嵌入式
    Ubuntu基于Docker快速配置GDAL的Python、C++环境
    Linux修改ssh端口
    基础选择器汇总——标签选择器,类选择器、id选择器、通配符选择器
    低代码,助力中小企业快速实现信息化
    mybatis小记
    基于Java毕业设计中文网络小说平台系统源码+系统+mysql+lw文档+部署软件
    Spring初始(相关基础知识和概述)
    【LeetCode刷题(数据结构)】:给定一个链表 每个节点包含一个额外增加的随机指针 该指针可以指向链表中的任何节点或空节点 要求返回这个链表的深度拷贝
    神经网络物联网平台搭建(物联网平台搭建实战教程)
  • 原文地址:https://blog.csdn.net/weixin_49889731/article/details/133747659