自动扩展表空间大小

2025-11-22 20:26:48

1、CREATE OR REPLACE PROCEDURE PRO_ADD_DATAFILE

IS

V_TABLESPACE_NAME VARCHAR2(20);

V_TABLESPACE_USE NUMBER;

V_DATA_FILE_NUM NUMBER;

V_ADD_DATA_FILE_SQL VARCHAR2(400);

BEGIN

  V_TABLESPACE_NAME :='TS_320';

  --获取表空间使用率

  SELECT  round((TOTAL_M-FREE_M)/TOTAL_M,3) INTO V_TABLESPACE_USE FROM

(

SELECT A.TABLESPACE_NAME,B.TOTAL/1024/1024 TOTAL_M,(B.TOTAL-A.USE)/1024/1024 FREE_M FROM

(

select c.tablespace_name,(c.p_use-d.p_free) as use from

(

select tablespace_name,sum(bytes) as p_use from dba_data_files

where tablespace_name NOT IN ('USERS','SYSAUX','UNDOTBS1','SYSTEM','UNDOTBS2')

group by tablespace_name

) C,

(

select tablespace_name,sum(bytes) as  p_free from dba_free_space

where tablespace_name NOT IN ('USERS','SYSAUX','UNDOTBS1','SYSTEM','UNDOTBS2')

group by tablespace_name

) D

where C.tablespace_name=D.tablespace_name

) A ,

(

WITH TABLESPACE_TOTAL AS

(

SELECT tablespace_name,sum(MAXBYTES) TOTAL FROM DBA_DATA_FILES T

WHERE T.TABLESPACE_NAME NOT IN ('USERS','SYSAUX','UNDOTBS1','SYSTEM','UNDOTBS2')

AND T.AUTOEXTENSIBLE='YES' group by tablespace_name

UNION ALL

SELECT tablespace_name,sum(bytes) TOTAL FROM DBA_DATA_FILES T

WHERE T.TABLESPACE_NAME NOT IN ('USERS','SYSAUX','UNDOTBS1','SYSTEM','UNDOTBS2')

AND T.AUTOEXTENSIBLE='NO' group by tablespace_name

)

SELECT TABLESPACE_NAME,SUM(TOTAL) TOTAL FROM TABLESPACE_TOTAL GROUP BY TABLESPACE_NAME

) B

WHERE A.TABLESPACE_NAME=B.TABLESPACE_NAME

) S WHERE S.TABLESPACE_NAME=V_TABLESPACE_NAME;

--获取最大数据文件号

SELECT MAX(TO_NUMBER(SUBSTR(FILE_NAME,28,2))) INTO V_DATA_FILE_NUM FROM DBA_DATA_FILES

WHERE TABLESPACE_NAME=V_TABLESPACE_NAME and file_name like '%zxx%';

  if V_TABLESPACE_USE > 0.75  then

    V_DATA_FILE_NUM :=V_DATA_FILE_NUM+1;

    if V_DATA_FILE_NUM >= 10 then

      V_ADD_DATA_FILE_SQL := 'alter tablespace '||V_TABLESPACE_NAME||' add datafile '||''''||'+DATADG/orcl/datafile/zxx_0'||V_DATA_FILE_NUM||'.dbf '||''''||'

size 30G';

    else

      V_ADD_DATA_FILE_SQL := 'alter tablespace '||V_TABLESPACE_NAME||' add datafile '||''''||'+DATADG/orcl/datafile/zxx_00'||V_DATA_FILE_NUM||'.dbf '||''''||'

size 30G ';

    end if;

    execute immediate V_ADD_DATA_FILE_SQL;

  end if;

END;

如果需要使用该脚本在你库中需要修改的地方(用粗体标记):

1.V_TABLESPACE_NAME的初始化值

2.获取最大数据文件号

3.更改使用率的阈值

4.修改拼接字符串

如果需要对多个表空间大小自动扩展需要编写cursor循环判断!

1、单引号转义

拼接字符串中出现单引号需要转义

select'''' from dual;

结果为:'

select ''''||'name'||'''' from dual;

结果为:'name'

自动扩展表空间大小

2、拼接字符串引起的ORA-00911: invalid character

正确拼接

 V_ADD_DATA_FILE_SQL := 'alter tablespace '||V_TABLESPACE_NAME||' add datafile '||''''||'+DATADG/orcl/datafile/zxx_0'||V_DATA_FILE_NUM||'.dbf '||''''||'

size 30G';

错误拼接:最后多了一个分号 “;”

 V_ADD_DATA_FILE_SQL := 'alter tablespace '||V_TABLESPACE_NAME||' add datafile '||''''||'+DATADG/orcl/datafile/zxx_0'||V_DATA_FILE_NUM||'.dbf '||''''||'

size 30G;';

自动扩展表空间大小

3、执行存储过程引起的ORA-01031: insufficient privileges

尽管该用户已经有dba权限,但是还需要针对赋予对应权限

grant select on  dba_data_files  to zxx;

grant select on  dba_free_space  to zxx;

grant alter tablespace to zxx;

zxx是只用用户

自动扩展表空间大小

4、添加表空间引起的ORA-15124:ASM file name包含无效字符

正确脚本:

V_ADD_DATA_FILE_SQL := 'alter tablespace '||V_TABLESPACE_NAME||' add datafile '||''''||'+DATADG/orcl/datafile/zxx_00'||V_DATA_FILE_NUM||'.dbf'||''''||'

size 30G ';

错误脚本:dbf和单引号之间存在空格

V_ADD_DATA_FILE_SQL := 'alter tablespace '||V_TABLESPACE_NAME||' add datafile '||''''||'+DATADG/orcl/datafile/zxx_00'||V_DATA_FILE_NUM||'.dbf '||''''||'

size 30G ';

自动扩展表空间大小

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢