這篇文章主要介紹“怎么解決Oracle臨時(shí)表過(guò)多導(dǎo)致exp速度慢問題”,在日常操作中,相信很多人在怎么解決Oracle臨時(shí)表過(guò)多導(dǎo)致exp速度慢問題問題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”怎么解決Oracle臨時(shí)表過(guò)多導(dǎo)致exp速度慢問題”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!
專注于為中小企業(yè)提供成都做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)繁峙免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了千余家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
問題現(xiàn)象:
客戶反饋數(shù)據(jù)庫(kù)日常備份速度越來(lái)越慢。
問題原因:
遠(yuǎn)程查看數(shù)據(jù)庫(kù)大小只有5G,備份卻需要5小時(shí)以上。
---5G
SQL> Select sum(bytes)/1024/1024/1024 from dba_segments where owner=’CJC’;
在進(jìn)行exp備份時(shí),先導(dǎo)出創(chuàng)建表的語(yǔ)句,在導(dǎo)出表數(shù)據(jù),查看備份日志,還沒有導(dǎo)出表數(shù)據(jù)就開始卡住了,猜測(cè)表數(shù)據(jù)量不大,但是表數(shù)量很大,導(dǎo)致在exp一開始導(dǎo)出創(chuàng)建表語(yǔ)句時(shí)卡住。
最終查看到CJC用戶下存在67萬(wàn)張臨時(shí)表;
SQL> select count(*) from user_tables where temporary='Y';
COUNT(*)
----------
673165
其中以TEM_開頭的臨時(shí)表有62萬(wàn)張,以TMPTABSUBJ%開頭的有4萬(wàn)多張;
SQL> select count(*) from user_tables where temporary='Y' and table_name like'TEM_%';
COUNT(*)
----------
623866
SQL> select count(*) from user_tables where temporary='Y' and table_name like'TMPTABSUBJ%';
COUNT(*)
----------
47899
其中TEM_開頭臨時(shí)表都是在09-14年產(chǎn)生的,平均每天產(chǎn)生1萬(wàn)張臨時(shí)表,15-16年沒有這種類型的臨時(shí)表;
SQL> select * from (select to_char(created,'yyyymmdd'),count(*)
2 from user_tables a,user_objects b
3 where a.table_name=b.object_name
4 and a.temporary='Y'
5 and a.table_name like'TEM_%'
6 group by to_char(created,'yyyymmdd')
7 order by 1 desc
8 )
9 where rownum<=1000;
TO_CHAR(CREATED,'YYYYMMDD') COUNT(*)
--------------------------- ----------
20140920 122
20140919 12207
20140918 11449
20140917 10951
20140916 15047
20140915 18865
......
69 rows selected
其中TMPTABSUBJ開頭臨時(shí)表都是在09-13年產(chǎn)生的, 14-16年沒有這種類型的臨時(shí)表;
SQL> select * from (
2 select to_char(created,'yyyymmdd'),count(*)
3 from user_tables a,user_objects b
4 where a.table_name=b.object_name
5 and a.temporary='Y'
6 and a.table_name like'TMPTABSUBJ%'
7 group by to_char(created,'yyyymmdd')
8 order by 1 desc
9 )
10 where rownum<=1000;
TO_CHAR(CREATED,'YYYYMMDD') COUNT(*)
--------------------------- ----------
20130930 109
20130929 133
20130928 13
......
30 rows selected
估計(jì)是應(yīng)用程序使用完臨時(shí)后沒有及時(shí)自動(dòng)刪除,導(dǎo)致臨時(shí)表數(shù)據(jù)量越來(lái)越多,在研發(fā)出補(bǔ)丁清理臨時(shí)表之前,可以先通過(guò)存儲(chǔ)過(guò)程,自動(dòng)刪除幾天前的臨時(shí)表。
先備份用戶下所有表,然后通過(guò)下面的存儲(chǔ)過(guò)程刪除5天前產(chǎn)生的TEM_開頭和TMPTABSUBJ%開頭的臨時(shí)表;
---創(chuàng)建刪除臨時(shí)表的存儲(chǔ)過(guò)程
CREATE OR REPLACE PROCEDURE DROP_TEMPTAB AS
CURSOR a IS
select table_name
from user_tables c, user_objects d
where c.table_name = d.object_name
and c.temporary = 'Y'
and (c.table_name like 'TEM_%' or c.table_name like 'TMPTABSUBJ%')
and d.object_type = 'TABLE'
and d.temporary = 'Y'
and d.CREATED < sysdate - 5;
BEGIN
FOR i IN a LOOP
EXECUTE IMMEDIATE 'drop table ' || i.table_name;
END LOOP;
END;
添加JOB,定期執(zhí)行該存儲(chǔ)過(guò)程,自動(dòng)刪除臨時(shí)表, 每天3點(diǎn)執(zhí)行JOB,每2天執(zhí)行一次;
SQL> VARIABLE JOBNO NUMBER;
SQL> VARIABLE INSTNO NUMBER;
SQL>
SQL> BEGIN
2 SELECT INSTANCE_NUMBER INTO :INSTNO FROM V$INSTANCE;
3 DBMS_JOB.SUBMIT(:JOBNO,
4 'DROP_TEMPTAB; ',
5 TRUNC(SYSDATE) + 1 + 3 / 24,
6 'TRUNC(SYSDATE)+2+3/24',
7 TRUE,
8 :INSTNO);
9 COMMIT;
10 END;
11 /
PL/SQL procedure successfully completed
查看JOB是否創(chuàng)建成功
SQL> select * from dba_jobs
到此,關(guān)于“怎么解決Oracle臨時(shí)表過(guò)多導(dǎo)致exp速度慢問題”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!