分區(qū)表或分區(qū)索引的BLOCK_ID很大導(dǎo)致DATAFILE無(wú)法RESIZE的解決方法

一 前言

創(chuàng)新互聯(lián)建站專注于企業(yè)網(wǎng)絡(luò)營(yíng)銷推廣、網(wǎng)站重做改版、雨山網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、HTML5、商城系統(tǒng)網(wǎng)站開發(fā)、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為雨山等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。

最近發(fā)現(xiàn)磁盤空間有3T的性能機(jī)器出現(xiàn)了磁盤空間不足的現(xiàn)象,該機(jī)器主要部署ORACLE數(shù)據(jù)庫(kù),所以,猜測(cè)很可能是表空間數(shù)據(jù)文件變更導(dǎo)致的。接下來(lái),就需要一步步的排查問(wèn)題了,最終確認(rèn)是ORACLE BLOCK_ID惹的禍。

二 定位磁盤空間占用情況

首先需要確定是哪些文件占用空間,使用du -sh * ,果不其然,有個(gè)表空間增加了20個(gè)數(shù)據(jù)文件,而且每個(gè)數(shù)據(jù)文件設(shè)置30G,Word天,誰(shuí)這么狠,居然找不到元兇,好吧,那我就任意處置了,不能影響后面的性能測(cè)試。

三 刪除數(shù)據(jù)文件

既然發(fā)現(xiàn)這么多數(shù)據(jù)文件,當(dāng)然想直接drop掉,于是,不以為然的執(zhí)行alter tablespace TEST drop datafile '/oradata/dat20.dbf';先把最后一個(gè)干掉,結(jié)果執(zhí)行報(bào)錯(cuò)“ORA-03262: THE FILE IS NON-EMPTY”,呵,居然有數(shù)據(jù),直接刪不掉。于是,就想查詢這個(gè)表空間的表,把數(shù)據(jù)TRUNCATE掉,但又考慮到該表空間TABLE就有上千張,而且不能確定哪張表可刪,不能太魯莽,事實(shí)證明,真和數(shù)據(jù)無(wú)關(guān)。

四 退而求其次-RESIZE 數(shù)據(jù)文件釋放空間

既然不能drop 數(shù)據(jù)文件,那就resize它,就不信拿不回空間。于是,先查下可以釋放多少空間出來(lái),先執(zhí)行如下命令:

select d.file_name,d.file_id,d.bytes/1024/1024 as d_byte,sum(f.bytes/1024/1024) as free_byte 

from dba_data_files d,dba_free_space f 

where d.file_id=f.file_id and d.file_id=67 

group by d.file_name,d.file_id,d.bytes/1024/1024;

輸出顯示67號(hào)數(shù)據(jù)文件可用空間29.9G,看到這里,心里暗罵,是誰(shuí)這么不靠譜,亂加亂設(shè)數(shù)據(jù)文件。不過(guò),都是小問(wèn)題,resize成1G就行了。于是,又興沖沖的趕緊執(zhí)行ALTER DATABASE DATAFILE '/oradata/hisdat20.dbf' RESIZE 1G; 居然又報(bào)錯(cuò)了,

“ORA-03297:file contains used data beyond requested RESIZE value”,看到這個(gè)報(bào)錯(cuò),開始意識(shí)到可能問(wèn)題沒有這么簡(jiǎn)單。

五 shrink space降低高水位

既然實(shí)際數(shù)據(jù)很少,resize卻不能成功,就表明是某些數(shù)據(jù)塊位于數(shù)據(jù)文件的末端,那就先降降HWM高水位,對(duì)表空間的表進(jìn)行操作,主要命令如下:

alter table test_table enable row movement;

alter table test_table shrink space; ---降低高水位,釋放空間

alter table test_table disable row movement;

當(dāng)然,這樣一個(gè)個(gè)的執(zhí)行不顯示,需要批量執(zhí)行,命令如下:

SELECT DISTINCT 'alter table ' || segment_name || ' enable row movement;'||

                'alter table ' || segment_name || ' shrink space;'||

                'alter table ' || segment_name || ' disable row movement;'

 FROM dba_extents

 WHERE tablespace_name = 'TEST'

 AND segment_type = 'TABLE'

降低HWM后,再次執(zhí)行RESIZE操作,報(bào)錯(cuò)依舊,好吧,既然這樣都沒搞定,需要認(rèn)真研究下了。

六 找到真兇和解決方法

通過(guò)上述嘗試,發(fā)現(xiàn)數(shù)據(jù)文件可用空間充足,但對(duì)ORACLE而言,數(shù)據(jù)文件使用了30G,所以RESIZE到1G會(huì)報(bào)錯(cuò)失敗,盡快進(jìn)行了降高水位或TRUNCATE操作都無(wú)濟(jì)于事。于是,排查和解決思路是這樣的:

1)查詢數(shù)據(jù)文件的最大BLOCK_ID

select max(block_id) from dba_extents where file_id=67;

2)確定該BLOCK_ID與哪個(gè)表或索引有關(guān)

SELECT OWNER, SEGMENT_NAME, SEGMENT_TYPE, TABLESPACE_NAME, A.PARTITION_NAME FROM DBA_EXTENTS A WHERE FILE_ID = 67 AND block_id = 3839929;

查詢后,發(fā)現(xiàn)最大的BLOCK_ID都是與分區(qū)表或分區(qū)索引有關(guān)的。

3)針對(duì)最大BLOCK_ID出現(xiàn)在分區(qū)表的處理方法

對(duì)分區(qū)表出現(xiàn)最大BLOCK_ID的情況,采用先降分區(qū)表高水位,然后MOVE表空間,命令如下:

alter table TEST_TABLE MODIFY PARTITION P101101 shrink space;---注意降低高水位并不能降低數(shù)據(jù)文件中block_id大小

alter table TEST_TABLE move partition P101101 tablespace TEST;---move操作數(shù)據(jù)移動(dòng)表空間最前面的空閑block,注意需要重建索引

4)針對(duì)最大BLOCK_ID出現(xiàn)在索引分區(qū)的處理方法

對(duì)索引分區(qū)出現(xiàn)最大BLOCK_ID的情況,重建分區(qū)索引即可,命令如下:

ALTER INDEX IDX_TEST_TABLE REBUILD PARTITION P201201

5)處理完后,再次執(zhí)行RESIZE操作,數(shù)據(jù)文件大小修改成功。

最后,因?yàn)橥瑐€(gè)文件號(hào)上可能出現(xiàn)多個(gè)分區(qū)表,分區(qū)索引需要處理的情況,建議像第五步寫成批量執(zhí)行,提高效率。

關(guān)于shrink space降低高水位,可以參考博文Oracle delete操作隱藏著你可能不知道的秘密

網(wǎng)站標(biāo)題:分區(qū)表或分區(qū)索引的BLOCK_ID很大導(dǎo)致DATAFILE無(wú)法RESIZE的解決方法
本文地址:http://muchs.cn/article48/iheohp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)、標(biāo)簽優(yōu)化、App開發(fā)、網(wǎng)站維護(hù)、品牌網(wǎng)站制作、網(wǎng)站改版

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司