ORACLE自动扩展表空间添加数据文件
2017-09-17 11:41
671 查看
以下均在sys用户以sysdba登录后执行,否则会因为权限问题报错
1.建wifi.dba_data_files_log记录表
先判断这张表是否已经存在,如果不存在,则建表(原dba_data_files的字段加上time,sql两个字段)
2.备份以前的数据文件信息
先判断WIFI.DBA_DATA_FILES_LOG表是否没有记录,如果没有记录则证明刚建立还未备份以前数据,先备份
3.显示授权给WIFI用户
4.创建扩展表空间的存储过程
5.创建JOB
1.建wifi.dba_data_files_log记录表
先判断这张表是否已经存在,如果不存在,则建表(原dba_data_files的字段加上time,sql两个字段)
DECLARE STR VARCHAR2(200); BEGIN SELECT COUNT(1) INTO STR FROM DBA_TAB_COLUMNS WHERE TABLE_NAME = 'DBA_DATA_FILES_LOG' AND OWNER = 'WIFI'; IF STR = 0 THEN execute immediate 'create table WIFI.DBA_DATA_FILES_LOG ( file_name VARCHAR2(513), file_id NUMBER, tablespace_name VARCHAR2(30), bytes NUMBER, blocks NUMBER, status VARCHAR2(9), relative_fno NUMBER, autoextensible VARCHAR2(3), maxbytes NUMBER, maxblocks NUMBER, increment_by NUMBER, user_bytes NUMBER, user_blocks NUMBER, online_status VARCHAR2(7), time DATE default sysdate, sql VARCHAR2(4000) ) tablespace TBS_WIFI pctfree 10 initrans 1 maxtrans 255 storage ( initial 64K next 1M minextents 1 maxextents unlimited ) '; END IF; END; /
2.备份以前的数据文件信息
先判断WIFI.DBA_DATA_FILES_LOG表是否没有记录,如果没有记录则证明刚建立还未备份以前数据,先备份
DECLARE num number(20); BEGIN SELECT COUNT(1) INTO num FROM WIFI.DBA_DATA_FILES_LOG; IF num = 0 THEN insert into wifi.dba_data_files_log (file_name, file_id, tablespace_name, bytes, blocks, status, relative_fno, autoextensible, maxbytes, maxblocks, increment_by, user_bytes, user_blocks, online_status, time, sql) select file_name, file_id, tablespace_name, bytes, blocks, status, relative_fno, autoextensible, maxbytes, maxblocks, increment_by, user_bytes, user_blocks, online_status, sysdate, '' from dba_data_files; commit; END IF; END; /
3.显示授权给WIFI用户
grant alter database to WIFI; grant alter tablespace to WIFI; grant select on dba_data_files to WIFI; grant select on dba_free_space to WIFI;
4.创建扩展表空间的存储过程
create or replace procedure wifi.DBA_ADD_TABLESPACE is begin declare v_maxbytes number(20); --v_flag number(10); v_sql varchar2(4000); v_filename varchar2(512); v_tablespacename varchar2(200); v_autoextensible varchar2(10); cursor c_job is select a.tablespace_name tsname --,round((a.bytes_alloc - nvl(b.bytes_free, 0)) / maxbytes * 100) pct --使用百分比 from (select f.tablespace_name, sum(f.bytes) bytes_alloc, sum(decode(f.autoextensible, 'YES', f.maxbytes, 'NO', f.bytes)) maxbytes from dba_data_files f group by tablespace_name) a, (select f.tablespace_name, sum(f.bytes) bytes_free from dba_free_space f group by tablespace_name) b where a.tablespace_name = b.tablespace_name(+) and round((a.bytes_alloc - nvl(b.bytes_free, 0)) / maxbytes * 100) > 85 and (a.tablespace_name in ('TBSIDX_WIFI_TERMINAL_TRACE_LOG', 'TBS_IDX', 'TBS_WIFI', 'TBSIDX_WIFI_HOTSPOT_TRACE_LOG', 'TBSIDX_TERMINAL_NETLOG') or a.tablespace_name like 'TBS_TERMINAL_TRACE_LOG%' or a.tablespace_name like 'TBS_TERMINAL_INFO%' or a.tablespace_name like 'TBS_HOTSPOT_TRACE_LOG%' or a.tablespace_name like 'TBS_TERMINAL_NETLOG%' or a.tablespace_name like 'TBS_WIFI_TERMINAL%'); begin open c_job; loop fetch c_job into v_tablespacename; exit when c_job%notfound; select file_name, tablespace_name, autoextensible, maxbytes into v_filename, v_tablespacename, v_autoextensible, v_maxbytes from (select rownum num, file_name, tablespace_name, autoextensible, maxbytes from dba_data_files where tablespace_name = v_tablespacename and instr(UPPER(file_name), '_ADDTIME.DBF') = 0 order by file_id) where num = 1; if v_maxbytes < 29205763686 then v_sql := 'alter database datafile ''' || v_filename || '''autoextend on next 500m maxsize unlimited'; execute immediate v_sql; else v_sql := 'alter database datafile ''' || v_filename || '''autoextend on next 500m maxsize unlimited'; execute immediate v_sql; --插入日志表中,此处会修改两次,一次修改数据文件,一次添加数据文件 insert into wifi.dba_data_files_log (file_name, tablespace_name, autoextensible, sql) values (v_filename, v_tablespacename, v_autoextensible, v_sql); v_sql := 'alter tablespace ' || v_tablespacename || ' add datafile ''' || replace(v_filename, '.dbf', '_' || round((sysdate - to_date('19700101080000', 'yyyymmddhh24miss')) * 24 * 3600) || '_addtime.dbf') || ''' size 1G autoextend on next 500m maxsize unlimited'; execute immediate v_sql; end if; --插入日志表中 insert into wifi.dba_data_files_log (file_name, tablespace_name, autoextensible, sql) values (v_filename, v_tablespacename, v_autoextensible, v_sql); commit; end loop; close c_job; end; end; /
5.创建JOB
DECLARE num number(20); job number; BEGIN select count(1) into num from dba_jobs where what = 'wifi.dba_add_tablespace;'; IF num = 0 THEN sys.dbms_job.submit(job => job, what => 'wifi.dba_add_tablespace;', next_date => to_date('31-05-2016 01:00:00', 'dd-mm-yyyy hh24:mi:ss'), interval => 'TRUNC(sysdate) + 1 +1/ (24)'); commit; END IF; END; /
相关文章推荐
- 第二天2-1,2,3,4】【自动扩展】【添加数据文件】【创建表空间】【undo表空间】【修改用户默认表空间】【释放没用的空间|移动表到新的表空间】
- 手工建库后表空间数据文件非自动扩展引起的错误:ORA-01653: unable to extend* in tablespace*
- oracle 10g数据文件的表空间简单扩展
- Oracle添加数据文件创建表空间,创建用户代码
- Oracle可不可以自动添加数据文件
- Oracle Data Guard_ 主库添加数据文件或创建表空间
- oracle数据文件自动扩展与表收缩
- oracle-AIX裸设备环境给表空间添加数据文件
- oracle自动添加数据文件
- Oracle监视表空间,并自动增加数据文件脚本
- Oracle(表空间) 数据文件自动增加
- oracle自动添加数据文件
- ORACLE 数据库、表空间、SCHEMA、数据文件的概念
- oracle存储结构: 表空间/数据文件/段/分区/块
- 表空间、数据文件和控制文件——oracle概念
- oracle管理表空间和数据文件
- Oracle教程 误添加数据文件删除方法
- 我的Oracle 9i学习日志(12)-- 表空间和数据文件
- ORACLE回滚段表空间数据文件丢失或损坏处理方法(转)
- oracle中USERS表空间数据文件损坏修复一例