亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > Oracle > 正文

在ORACLE里用存儲過程定期分割表

2024-08-29 13:47:40
字體:
來源:轉載
供稿:網友

         Oracle數據庫里存放著各種各樣的數據,其中有一些數據表會隨著時間的推移,越來越大。如交友聊天的日志、
    短信收發的日志、生產系統的日志、動態網站發布系統的日志等等。這樣的信息又和時間緊密相關,有沒有辦法
    讓這些日志表能到時間自動分割成歷史年月(如log200308,log200309)的表呢? 請看看我用存儲過程定期分割表的
    方法吧。
   
    一、問題的引出
   
      1.初學數據庫時只知道用delete來刪除表里的數據。但在Oracle數據庫里,大量delete記錄后,并不能釋放表
        所占用的物理空間,這里面有一個高水位的概念,所以我們不能用delete來分割表。
       
      2.用重命名(rename)表的方法
     
       (1).先建一個和原來日志表(假如是log)數據結構一模一樣的新表(如log_new),建約束、索引及指定字段的默
           認值;
       (2).重命名表log到log_YYYYMM; 
       要注重的問題是OLTP系統可能會因為DML操作阻礙重命名執行成功,出現ORA-00054資源正忙的錯誤提示,
       需要試多次才能成功。
       (3).重命名表log_new到log。
           這樣應用程序不用修改(受影響的時間僅幾秒鐘),日志表就被截斷分割了。
          
        上述步驟可以在Oracle里可以用存儲過程來實現它們。
       
    二、用存儲過程來分割表
       
        可以看到在重命名表的方法中,步驟(2)是個要害。
        下面這個rename_table過程會在有鎖阻礙的情況下用遞歸的方式重試100次。  

       重命名原始表到目標表的存儲過程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;
       /

       截斷分割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;
       /

當然您工作環境的日志表可能和我這個做例子的日志表結構上有所不同,約束條件、索引和默認值都不盡相同。

只要稍加修改就可以了。

    三、用戶需要有create any table系統權限(不是角色里包含的權限)
   
    因為在執行存儲過程時,由角色賦予的權限會失效, 所以執行log_history的用戶一定要有DBA單獨賦予的
    create any table系統權限。
   
    最后在OS里定時每月一號凌晨0:00分執行log_history,讓存儲過程定期分割表。
   
    假如要分割的日志表很多,模擬log_history可以寫很多類似的存儲過程來分割不同項目里的日志表。
    然后讓OS按月,按周或者不定期地執行這些存儲過程, 治理員只要查看日志就可以了。
   
   四、其它注重事項    

       假如應用程序有BUG,可能對在用原始日志表產生長期不能釋放的鎖,執行log_history重命名會不成功。
      
       這時DBA可以查看數據字典:
      
select object_id,session_id,locked_mode from v$locked_object;

select t2.username,t2.sid,t2.serial#,t2.logon_time
from v$locked_object t1,v$session t2
where t1.session_id=t2.sid order by t2.logon_time;

       假如有長期出現的一模一樣的列(包括登錄時間),可能是沒有釋放的鎖。

       我們要在執行分割日志表的存儲過程前,用下面SQL語句殺掉長期沒有釋放非正常的鎖:
      
alter system kill session 'sid,serial#';

   五、結束語
  
       用上面介紹的存儲過程定期分割日志表有很大的靈活性。歷史數據不僅查詢方便,轉移和備份起來也都很輕易。
       Unix和Windows平臺的都可以使用。對服務器硬盤空間較小的中小型公司意義尤其明顯。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
97国产suv精品一区二区62| 国产精品99一区| 久久91精品国产91久久久| 一区二区日韩精品| 日韩中文在线中文网在线观看| 精品无人国产偷自产在线| 国内精品久久久久影院 日本资源| 欧美性高跟鞋xxxxhd| 欧美黑人xxxⅹ高潮交| 欧美成人黑人xx视频免费观看| 国产精品久久久久久久久久新婚| 亚洲欧美国产一区二区三区| 欧美中文在线观看| 国产综合久久久久| 久久精品中文字幕电影| 一区二区三区国产在线观看| 伦理中文字幕亚洲| 欧美福利视频网站| 97久久伊人激情网| 欧美日韩亚洲高清| 另类少妇人与禽zozz0性伦| 伊人伊成久久人综合网站| 久久久久久久久久久久av| 欧美视频在线观看免费网址| 国产女人18毛片水18精品| 精品视频久久久| 国产精品久久97| 91亚洲精品在线观看| 亚洲男人的天堂在线播放| 欧美激情小视频| 欧洲亚洲妇女av| 成人福利视频在线观看| 青草热久免费精品视频| 一区二区三区视频免费在线观看| 亚洲精品成人网| 欧美精品18videos性欧| 91香蕉国产在线观看| 亚洲天堂网在线观看| 午夜精品三级视频福利| 国产成+人+综合+亚洲欧洲| 日本一区二三区好的精华液| 亚洲免费中文字幕| 亚洲精品小视频在线观看| 国产精品户外野外| 日本午夜在线亚洲.国产| 久久精视频免费在线久久完整在线看| 久久精品91久久香蕉加勒比| 欧美一级高清免费播放| 国产成人精品免高潮费视频| 97视频com| 成人精品视频久久久久| 久久夜色精品亚洲噜噜国产mv| 亚洲字幕一区二区| 欧美理论电影网| 日韩视频永久免费观看| 国产99在线|中文| 久久久99久久精品女同性| 精品久久久久久中文字幕一区奶水| 97国产精品人人爽人人做| 黑人巨大精品欧美一区二区| 亚洲精品999| 日韩欧美在线视频| 日韩中文字幕第一页| 国产一区二区三区毛片| 热久久视久久精品18亚洲精品| 日韩精品亚洲元码| 国产精品久久av| 久久成年人视频| 国产日产久久高清欧美一区| 精品久久久久久久中文字幕| 精品国产老师黑色丝袜高跟鞋| 亚洲二区中文字幕| 国产日产欧美a一级在线| 亚洲欧美中文在线视频| 中日韩美女免费视频网站在线观看| 久久国产精品久久久久久| 欧美中文字幕在线播放| 久久这里只有精品视频首页| 日韩欧美精品中文字幕| 一道本无吗dⅴd在线播放一区| 日韩美女在线观看| 亚洲欧美日韩精品久久| 欧美视频免费在线观看| 欧美午夜激情小视频| 九九热视频这里只有精品| 亚洲欧美制服中文字幕| 亚洲男人的天堂网站| 欧美一二三视频| 日韩久久免费电影| 精品视频在线播放色网色视频| 国产美女久久精品香蕉69| 欧美精品激情在线| 91久久久久久久久久久久久| 精品夜色国产国偷在线| 欧美一区视频在线| 色婷婷**av毛片一区| 日韩有码在线视频| 91视频免费网站| 欧美放荡办公室videos4k| 久久精品成人欧美大片| 久热精品在线视频| 久久视频国产精品免费视频在线| 97视频人免费观看| 国产mv久久久| 欧美成人午夜剧场免费观看| 国产精品成人av在线| 国产欧美va欧美va香蕉在线| 国产精品极品美女粉嫩高清在线| 久久久久国产精品免费网站| 久久视频这里只有精品| 国产精品爽爽爽| 欧美视频在线观看免费网址| 久久久久日韩精品久久久男男| 成人综合网网址| 亚洲高清在线观看| 亚洲大胆美女视频| 98精品国产自产在线观看| 亚洲免费伊人电影在线观看av| 亚洲bt天天射| 欧美黑人一级爽快片淫片高清| 国产99久久精品一区二区永久免费| 欧美大片免费观看在线观看网站推荐| 欧美成人激情视频| 国产成人精品久久亚洲高清不卡| 日韩欧美精品网址| 日韩欧美在线视频观看| 久久久久久久国产精品视频| 成人午夜小视频| www高清在线视频日韩欧美| 欧美一级视频免费在线观看| 色综合色综合久久综合频道88| www.亚洲免费视频| 亚洲国模精品一区| 亚洲欧美国产日韩中文字幕| 国产精品日日摸夜夜添夜夜av| 日韩在线不卡视频| 国产91成人video| 亚洲一区二区三区xxx视频| 久久久女人电视剧免费播放下载| 国产在线观看一区二区三区| 亚洲欧美综合精品久久成人| 狠狠综合久久av一区二区小说| 97视频免费观看| 日韩理论片久久| 国内伊人久久久久久网站视频| 欧美激情精品久久久久久大尺度| 一本一道久久a久久精品逆3p| 精品久久久一区| 久久亚洲精品小早川怜子66| 国产精品白嫩美女在线观看| 欧美自拍大量在线观看| 亚洲级视频在线观看免费1级| 久久成人综合视频| 国产视频精品一区二区三区| 久久理论片午夜琪琪电影网| 亚洲美女av网站| 久久影视电视剧凤归四时歌| 亚洲一区二区三区毛片| 亚洲欧美另类自拍| 亚洲精选一区二区| 国产精品私拍pans大尺度在线| 精品久久国产精品| 永久免费毛片在线播放不卡| 亚洲国产成人精品久久久国产成人一区|