识别表空间(非扩展)使用率并自动生成添加数据文件脚本

Posted 特立独行

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了识别表空间(非扩展)使用率并自动生成添加数据文件脚本相关的知识,希望对你有一定的参考价值。

规则
可以根据以下规则调整为适合自己使用的脚本。

识别表空间(非扩展)使用率>=90%,且剩余可用空间<=100000M;
识别数据文件名中\\或/之前部分,作为数据文件路径(区分Windows及Linux);
识别了后缀名,但是添加使用使用了\'.dbf\',规范;
识别表空间对应数据文件序号的最大号,并以"数据文件路径"+"表空间名字"+"已有数据文件名字数值最大号+1"+".dbf"命名添加新文件;按公司要求,新加数据文件1g递增扩展到24g;
SET LINES 120 PAGESIZE 1000
col commend for a200;
WITH SUB_FILE AS
 (SELECT distinct TABLESPACE_NAME AS TBS_NAME,
         FILE_NAME,
         regexp_substr(FILE_NAME,\'^.*[\\\\|\\/]\') AS PREFIX,
         -- 获取最后1个\'.\'及以后字符作为后缀名SUFFIX
         SUBSTR(FILE_NAME, INSTR(FILE_NAME, \'.\', -1)) AS SUFFIX,
         -- 识别最后一个\'.\'(没有则从最后一位开始)前面3位为数字的部分,没有则指定默认值\'01\',有则截取数值部分作为数据文件编号FN
         TO_NUMBER(NVL(REGEXP_SUBSTR(FILE_NAME, \'[0-9]+\', DECODE(INSTR(FILE_NAME, \'.\', -1), 0, LENGTH(FILE_NAME) - 3, INSTR(FILE_NAME, \'.\', -1)) - 3, 1), 01)) AS FN
    FROM (SELECT TABLESPACE_NAME,
         -- FILE_NAME 如果没有\'.\'标识的后缀,查询时添加00.dbf作为文件名,否则原样输出
                 DECODE(INSTR(FILE_NAME, \'.\', -1), 0, FILE_NAME || \'00.dbf\', FILE_NAME) AS FILE_NAME
            FROM DBA_DATA_FILES DDF
           WHERE TABLESPACE_NAME IN
          -- 过滤掉大文件表空间,它只能有一个数据文件
                 (SELECT TABLESPACE_NAME FROM DBA_TABLESPACES WHERE BIGFILE = \'NO\')))
SELECT \'ALTER TABLESPACE \'||SFL.TBS_NAME||\' ADD DATAFILE \'\'\'||SFL.PREFIX||SFL.TBS_NAME||(TO_CHAR(SFL.FN + 1,\'FM9900\'))||\'.dbf\'\' SIZE 1M AUTOEXTEND ON;\'||chr(10)||
       \'ALTER DATABASE DATAFILE \'\'\' || SFL.PREFIX || SFL.TBS_NAME||(TO_CHAR(SFL.FN + 1, \'FM9900\'))|| \'.dbf\'\' RESIZE 1G;\'  ||chr(10)||
       \'ALTER DATABASE DATAFILE \'\'\' || SFL.PREFIX || SFL.TBS_NAME||(TO_CHAR(SFL.FN + 1, \'FM9900\'))|| \'.dbf\'\' RESIZE 2G;\'  ||chr(10)||
       \'ALTER DATABASE DATAFILE \'\'\' || SFL.PREFIX || SFL.TBS_NAME||(TO_CHAR(SFL.FN + 1, \'FM9900\'))|| \'.dbf\'\' RESIZE 3G;\'  ||chr(10)||
       \'ALTER DATABASE DATAFILE \'\'\' || SFL.PREFIX || SFL.TBS_NAME||(TO_CHAR(SFL.FN + 1, \'FM9900\'))|| \'.dbf\'\' RESIZE 4G;\'  ||chr(10)||
       \'ALTER DATABASE DATAFILE \'\'\' || SFL.PREFIX || SFL.TBS_NAME||(TO_CHAR(SFL.FN + 1, \'FM9900\'))|| \'.dbf\'\' RESIZE 5G;\'  ||chr(10)||
       \'ALTER DATABASE DATAFILE \'\'\' || SFL.PREFIX || SFL.TBS_NAME||(TO_CHAR(SFL.FN + 1, \'FM9900\'))|| \'.dbf\'\' RESIZE 6G;\'  ||chr(10)||
       \'ALTER DATABASE DATAFILE \'\'\' || SFL.PREFIX || SFL.TBS_NAME||(TO_CHAR(SFL.FN + 1, \'FM9900\'))|| \'.dbf\'\' RESIZE 7G;\'  ||chr(10)||
       \'ALTER DATABASE DATAFILE \'\'\' || SFL.PREFIX || SFL.TBS_NAME||(TO_CHAR(SFL.FN + 1, \'FM9900\'))|| \'.dbf\'\' RESIZE 8G;\'  ||chr(10)||
       \'ALTER DATABASE DATAFILE \'\'\' || SFL.PREFIX || SFL.TBS_NAME||(TO_CHAR(SFL.FN + 1, \'FM9900\'))|| \'.dbf\'\' RESIZE 9G;\'  ||chr(10)||
       \'ALTER DATABASE DATAFILE \'\'\' || SFL.PREFIX || SFL.TBS_NAME||(TO_CHAR(SFL.FN + 1, \'FM9900\'))|| \'.dbf\'\' RESIZE 10G;\' ||chr(10)||
       \'ALTER DATABASE DATAFILE \'\'\' || SFL.PREFIX || SFL.TBS_NAME||(TO_CHAR(SFL.FN + 1, \'FM9900\'))|| \'.dbf\'\' RESIZE 11G;\' ||chr(10)||
       \'ALTER DATABASE DATAFILE \'\'\' || SFL.PREFIX || SFL.TBS_NAME||(TO_CHAR(SFL.FN + 1, \'FM9900\'))|| \'.dbf\'\' RESIZE 12G;\' ||chr(10)||
       \'ALTER DATABASE DATAFILE \'\'\' || SFL.PREFIX || SFL.TBS_NAME||(TO_CHAR(SFL.FN + 1, \'FM9900\'))|| \'.dbf\'\' RESIZE 13G;\' ||chr(10)||
       \'ALTER DATABASE DATAFILE \'\'\' || SFL.PREFIX || SFL.TBS_NAME||(TO_CHAR(SFL.FN + 1, \'FM9900\'))|| \'.dbf\'\' RESIZE 14G;\' ||chr(10)||
       \'ALTER DATABASE DATAFILE \'\'\' || SFL.PREFIX || SFL.TBS_NAME||(TO_CHAR(SFL.FN + 1, \'FM9900\'))|| \'.dbf\'\' RESIZE 15G;\' ||chr(10)||
       \'ALTER DATABASE DATAFILE \'\'\' || SFL.PREFIX || SFL.TBS_NAME||(TO_CHAR(SFL.FN + 1, \'FM9900\'))|| \'.dbf\'\' RESIZE 16G;\' ||chr(10)||
       \'ALTER DATABASE DATAFILE \'\'\' || SFL.PREFIX || SFL.TBS_NAME||(TO_CHAR(SFL.FN + 1, \'FM9900\'))|| \'.dbf\'\' RESIZE 17G;\' ||chr(10)||
       \'ALTER DATABASE DATAFILE \'\'\' || SFL.PREFIX || SFL.TBS_NAME||(TO_CHAR(SFL.FN + 1, \'FM9900\'))|| \'.dbf\'\' RESIZE 18G;\' ||chr(10)||
       \'ALTER DATABASE DATAFILE \'\'\' || SFL.PREFIX || SFL.TBS_NAME||(TO_CHAR(SFL.FN + 1, \'FM9900\'))|| \'.dbf\'\' RESIZE 19G;\' ||chr(10)||
       \'ALTER DATABASE DATAFILE \'\'\' || SFL.PREFIX || SFL.TBS_NAME||(TO_CHAR(SFL.FN + 1, \'FM9900\'))|| \'.dbf\'\' RESIZE 20G;\' ||chr(10)||
       \'ALTER DATABASE DATAFILE \'\'\' || SFL.PREFIX || SFL.TBS_NAME||(TO_CHAR(SFL.FN + 1, \'FM9900\'))|| \'.dbf\'\' RESIZE 21G;\' ||chr(10)||
       \'ALTER DATABASE DATAFILE \'\'\' || SFL.PREFIX || SFL.TBS_NAME||(TO_CHAR(SFL.FN + 1, \'FM9900\'))|| \'.dbf\'\' RESIZE 22G;\' ||chr(10)||
       \'ALTER DATABASE DATAFILE \'\'\' || SFL.PREFIX || SFL.TBS_NAME||(TO_CHAR(SFL.FN + 1, \'FM9900\'))|| \'.dbf\'\' RESIZE 23G;\' ||chr(10)||
       \'ALTER DATABASE DATAFILE \'\'\' || SFL.PREFIX || SFL.TBS_NAME||(TO_CHAR(SFL.FN + 1, \'FM9900\'))|| \'.dbf\'\' RESIZE 24G;\' AS COMMEND
  FROM SUB_FILE SFL
 WHERE (SFL.TBS_NAME, SFL.FN) IN
       (SELECT SF1.TBS_NAME, MAX(SF1.FN) FROM SUB_FILE SF1 GROUP BY SF1.TBS_NAME)
   AND SFL.TBS_NAME IN
       (SELECT D.TABLESPACE_NAME FROM 
       (SELECT TABLESPACE_NAME, ROUND(SUM(BYTES) / (1024 * 1024), 2) SPACE FROM DBA_DATA_FILES GROUP BY TABLESPACE_NAME) D,
       (SELECT TABLESPACE_NAME, ROUND(SUM(BYTES) / (1024 * 1024), 2) FREE_SPACE FROM DBA_FREE_SPACE GROUP BY TABLESPACE_NAME) F
 WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME(+) 
 AND ROUND((1 - NVL(F.FREE_SPACE, 0) / D.SPACE) * 100, 2) >= 90 
 AND F.FREE_SPACE <= 100000);

2021.07.07 更新

以上是关于识别表空间(非扩展)使用率并自动生成添加数据文件脚本的主要内容,如果未能解决你的问题,请参考以下文章

更新说明

oracle表空间也就是数据文件设置为自动扩展,为啥没进行自动扩展

Oracle 如何扩展表空间

Oracle 如何扩展表空间

zabbix自动发现oracle表空间并监控其使用率

Oracle实验六—表空间与数据文件管理