扩展表空间(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' <<EOF

set head off feedback off serveroutput on lines 1000

$1

quit;

EOF

}

function exec_ddl(){

sqlplus -s '/as sysdba' <<EOF

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>

相关推荐
KIDULT°8 小时前
MySQL系列 (1):数据库原理
运维·数据库·mysql·云计算
我不是程序员三三8 小时前
透明加密软件偶发解密异常排错实录:文件时能打开时乱码
数据库·域智盾
snhna9 小时前
向量数据库深度实战:从 HNSW 到 pgvector、Milvus 选型与 RAG 落地
数据库·人工智能·python·postgresql·milvus
天行健,君子而铎9 小时前
数据分类分级的范式转换:从规则匹配到场景化高准确率一键部署
网络·数据库·安全
牛战士coding9 小时前
MySQL 读写分离完整链路:主从复制、多数据源与 @DS 路由
数据库·mysql
goehou10 小时前
MCP 查数实战:让 LLM 安全地查数据库(只读账号、SQL 校验、参数漂移)
数据库·ai·llm·教程·mcp·function calling
我不会插花弄玉11 小时前
7.函数【由浅入深-MySQL】
android·数据库·mysql
周小董11 小时前
[1369]Windows上安装PostgreSQL
数据库·windows·postgresql
一只积极向上的小咸鱼13 小时前
第一性原理思考:从拆解问题到用实验检验答案
数据库
这个DBA有点耶13 小时前
时序数据库InfluxDB高基数问题深度拆解:内存索引膨胀机制与OOM完整链路
数据库·架构·dba