Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1792327
  • 博文数量: 600
  • 博客积分: 10581
  • 博客等级: 上将
  • 技术积分: 6205
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-06 10:13
文章分类
文章存档

2016年(2)

2015年(9)

2014年(8)

2013年(5)

2012年(8)

2011年(36)

2010年(34)

2009年(451)

2008年(47)

分类: Oracle

2009-01-17 20:20:13

1.重命名原始表到目标表的存储过程rename_table:
create or replace procedure rename_table
       (source_name        in       varchar2,
        target_name        in       varchar2,
        times              in out   number)
       is
          query_str                 varchar2(4000);
          source_name1      varchar2(64);
          target_name1      varchar2(64);
          cursor c1 is select segment_name from user_segments where segment_name=upper(source_name);
          dummy c1%rowtype; 
          cursor c2 is select segment_name from user_segments where segment_name=upper(target_name);
          dummy2 c2%rowtype; 
       begin
          source_name1:=source_name;
          target_name1:=target_name;
       
          open c1;
          fetch  c1  into   dummy;
       --   if c1%found then
       --          dbms_output.put_line(source_name1||'exist!');
       --   end if;
       
          open c2;
          fetch  c2  into   dummy2;
       --   if c2%notfound then
       --        dbms_output.put_line(target_name1||'not exist!');
       --   end if;
 
          if c2%notfound  and c1%found then
            query_str :='alter table '||source_name1||' rename to '||target_name1;
            execute immediate query_str;
            dbms_output.put_line('rename success!');
          end if;
          close c1;
          close c2;
       exception
          WHEN OTHERS THEN  
               times:=times+1;
               if times<100 then
       --           dbms_output.put_line('times:'||times);
                            rename_table(source_name1,target_name1,times);
                   else
                             dbms_output.put_line(SQLERRM);
                             dbms_output.put_line('error over 100 times,exit');
                   end if;
       end;
2.截断分割log表的存储过程log_history:
       create or replace procedure log_history
       is
          query_str         varchar2(32767);
          year_month        varchar2(8);
          times    number;
       begin
          select to_char(sysdate-15,'YYYYMM') into year_month from dual;
          times:=0;
          query_str :='create table log_new pctfree 10 pctused 80 
                            as select * from log where 1=2';
          execute immediate query_str;
          query_str :='alter table log_new add constraints log_'||year_month||'_pk
                        primary key (id) tablespace indx nologging pctfree 10';
          execute immediate query_str;   
          query_str :='alter table log_his modify logtime default sysdate';
          execute immediate query_str;   
          query_str :='create index log_'||year_month||'_logtime on log(logtime)
                          tablespace indx nologging pctfree 10';
          execute immediate query_str;          
          rename_table('log','log'||year_month,times);
          query_str :='alter table log_new rename to log';
          execute immediate query_str;
       end;

3.用户需要有create any table系统权限

         因为在执行存储过程时,由角色赋予的权限会失效, 所以执行log_history的用户一定要有DBA单独赋予的
         create any table系统权限。
         最后在OS里定时每月一号凌晨0:00分执行log_history,让存储过程定期分割表。
         如果要分割的日志表很多,模仿log_history可以写很多类似的存储过程来分割不同项目里的日志表。
         然后让OS按月,按周或者不定期地执行这些存储过程, 管理员只要查看日志就可以了。
4. 下面SQL语句杀掉长期没有释放非正常的锁
alter system kill session 'sid,serial#';
 
阅读(1003) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~