一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

如何在Oracle里用存儲過程定期分割表

 fan_tao 2007-02-08

如何在Oracle里用存儲過程定期分割表

作者:MF 來源:GBUinx.com (2007-02-01 13:33:43)

 

Oracle數(shù)據(jù)庫里存放著各種各樣的數(shù)據(jù),其中有一些數(shù)據(jù)表會隨著時間的推移,越來越大。如交友聊天的日志、短信收發(fā)的日志、生產(chǎn)系統(tǒng)的日志、動態(tài)網(wǎng)站發(fā)布系統(tǒng)的日志等等。這樣的信息又和時間緊密相關(guān),有沒有辦法讓這些日志表能按時間自動分割成歷史年月( log200308,log200309)的表呢? 請看看我用存儲過程定期分割表的方法吧。   

一、問題的引出   

1.初學(xué)數(shù)據(jù)庫時只知道用delete來刪除表里的數(shù)據(jù)。但在Oracle數(shù)據(jù)庫里,大量delete記錄后,并不能釋放表所占用的物理空間,這里面有一個高水位的概念,所以我們不能用delete來分割表。   

2.用重命名(rename)表的方法   

(1) 先建一個和原來日志表(假如是log)數(shù)據(jù)結(jié)構(gòu)一模一樣的新表(log_new),建約束、索引及指定字段的默認值;   

(2) 重命名表loglog_YYYYMM

要注意的問題是OLTP系統(tǒng)可能會因為DML操作阻礙重命名執(zhí)行成功,出現(xiàn)ORA-00054資源正忙的錯誤提示,需要試多次才能成功。   

(3) 重命名表log_newlog   

這樣應(yīng)用程序不用修改(受影響的時間僅幾秒鐘),日志表就被截斷分割了。   

上述步驟可以在Oracle里用存儲過程來實現(xiàn)。   

二、用存儲過程來分割表      

可以看到在重命名表的方法中,步驟(2)是個關(guān)鍵。

下面這個rename_table過程會在有鎖阻礙的情況下用遞歸的方式重試100次。   

重命名原始表到目標(biāo)表的存儲過程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 :=‘a(chǎn)lter 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,‘YYYYMMDD‘) 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 :=‘a(chǎn)lter table log_new add constraints log_‘  

||year_month||‘_pk  

primary key (id) tablespace indx nologging pctfree 10‘;  

execute immediate query_str;   

query_str :=‘a(chǎn)lter 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 :=‘a(chǎn)lter table log_new rename to log‘;  

execute immediate query_str;  

end;  

/  

 

當(dāng)然您工作環(huán)境的日志表可能和我這個做例子的日志表結(jié)構(gòu)上有所不同,約束條件、索引和默認值都不盡相同。只要稍加修改就可以了。   

 

三、用戶需要有create any table系統(tǒng)權(quán)限(不是角色里包含的權(quán)限)   

因為在執(zhí)行存儲過程時,由角色賦予的權(quán)限會失效, 所以執(zhí)行log_history的用戶一定要有DBA單獨賦予的create any table系統(tǒng)權(quán)限。   

最后在OS里定時每月一號凌晨0:00分執(zhí)行log_history,讓存儲過程定期分割表。   如果要分割的日志表很多,模仿log_history可以寫很多類似的存儲過程來分割不同項目里的日志表。然后讓OS按月,按周或者不定期的執(zhí)行這些存儲過程, 管理員只要查看日志就可以了。   

 

四、其它注意事項   

如果應(yīng)用程序有BUG,可能對在用原始日志表產(chǎn)生長期不能釋放的鎖,執(zhí)行log_history重命名會不成功。   

這時DBA可以查看數(shù)據(jù)字典:   

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;  

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

我們要在執(zhí)行分割日志表的存儲過程前,用下面SQL語句殺掉長期沒有釋放非正常的鎖:   

alter system kill session ‘sid,serial#‘;   

 

五、結(jié)束語   

用上面介紹的存儲過程定期分割日志表有很大的靈活性。歷史數(shù)據(jù)不僅查詢方便,轉(zhuǎn)移和備份起來也都很容易。UnixWindows平臺的都可以使用。對服務(wù)器硬盤空間較小的中小  型公司意義尤其明顯。(http://www.)

 

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    黄片免费观看一区二区| 亚洲一区二区三区四区性色av| 九九热视频经典在线观看| 极品少妇嫩草视频在线观看| 精品欧美在线观看国产| 国产av乱了乱了一区二区三区| 国产成人人人97超碰熟女| 男女午夜在线免费观看视频| 黄色av尤物白丝在线播放网址| 日本欧美在线一区二区三区| 欧美日韩精品视频在线| 伊人久久青草地综合婷婷| 深夜视频在线观看免费你懂| 精品久久少妇激情视频| 国产精品午夜视频免费观看| 日本加勒比中文在线观看| 深夜视频在线观看免费你懂| 在线观看国产成人av天堂野外 | 精品精品国产自在久久高清| 色综合久久六月婷婷中文字幕 | 99热九九在线中文字幕| 视频一区二区黄色线观看| 日韩欧美国产亚洲一区| 樱井知香黑人一区二区| 免费黄片视频美女一区| 精品推荐久久久国产av| 国产级别精品一区二区视频| 手机在线观看亚洲中文字幕| 大香蕉再在线大香蕉再在线| 国产又粗又猛又长又黄视频| 免费观看成人免费视频| 日韩人妻免费视频一专区| 中字幕一区二区三区久久蜜桃 | 福利视频一区二区三区| 国产伦精品一一区二区三区高清版| 少妇熟女精品一区二区三区| 日韩在线一区中文字幕| 中日韩免费一区二区三区| 日本少妇中文字幕不卡视频| 久久re6热在线视频| 日本一品道在线免费观看|