多语言展示
当前在线:1954今日阅读:39今日分享:10

自动扩展表空间大小

自动扩展表空间大小    一般情况下,数据库一般是不对外开放的,如果每次数据库表空间不足都需要远程协助解决的话,可能有点麻烦,可以通过编写存储过程,制定定时oracle job 来增加表空间大小!(1)增加表空间脚本(2)存储编写过程中的细节注意1:单引号转义2:拼接字符串引起的ORA-00911: invalid character3:执行存储过程引起的ORA-01031: insufficient privileges4:添加表空间引起的ORA-15124:ASM file name包含无效字符详细查询表空间大小参考经验:http://jingyan.baidu.com/article/3c48dd3467b269e10be35819.html详细创建oracle job参考经验:http://jingyan.baidu.com/article/a3761b2bbbdd2f1577f9aa75.html
(1)增加表空间脚本

CREATE OR REPLACE PROCEDURE PRO_ADD_DATAFILEISV_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_fileswhere 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_spacewhere tablespace_name NOT IN ('USERS','SYSAUX','UNDOTBS1','SYSTEM','UNDOTBS2')group by tablespace_name) Dwhere C.tablespace_name=D.tablespace_name) A ,(WITH TABLESPACE_TOTAL AS(SELECT tablespace_name,sum(MAXBYTES) TOTAL FROM DBA_DATA_FILES TWHERE T.TABLESPACE_NAME NOT IN ('USERS','SYSAUX','UNDOTBS1','SYSTEM','UNDOTBS2')AND T.AUTOEXTENSIBLE='YES' group by tablespace_nameUNION ALLSELECT tablespace_name,sum(bytes) TOTAL FROM DBA_DATA_FILES TWHERE 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) BWHERE 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_FILESWHERE 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循环判断!

(2)存储编写过程中的细节注意
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 ';

推荐信息