表空间检测异常的问题诊断
??? 不知道大家在工作中的表空間管理情況如何,大體會(huì)分為兩派。以前的公司我們更喜歡直接把空間都分配好,比如500G的容量規(guī)劃,那就提前準(zhǔn)備500G,另外一類是我先給定200G,后續(xù)的空間就自動(dòng)增長(zhǎng),反正容量還是500G。這個(gè)其實(shí)很大程度上就是個(gè)人習(xí)慣和公司流程規(guī)范的差別了。
?? 為什么這么說(shuō)呢,因?yàn)槲以谝惶篆h(huán)境上收到了一個(gè)奇怪的報(bào)警。
DBA: ?????? IP: xxxx ????? Tablespace: PERFSTAT: 122.5%??????? [Critical!!]
??? 關(guān)鍵就在這個(gè)122.5%。看起來(lái)很不正常,如果這樣一個(gè)報(bào)警找不到問(wèn)題的癥結(jié),那么這個(gè)檢測(cè)表空間的腳本感覺(jué)還是有潛在的問(wèn)題,或者說(shuō)檢測(cè)的結(jié)果是會(huì)讓人質(zhì)疑的。
?? 從我的了解,這個(gè)腳本用了很多年,之前還真沒(méi)碰到過(guò)問(wèn)題。現(xiàn)在的這套環(huán)境就偏偏拋出了錯(cuò)誤,我們來(lái)挖掘一下。
??? 首先這個(gè)表空間檢測(cè)的腳本是使用我上面所說(shuō)的第二種情況,即不斷的增大數(shù)據(jù)文件,給定一個(gè)最大值。其實(shí)這樣算出來(lái)不是實(shí)際的文件大小情況,和實(shí)際結(jié)果還是有出入的。
?? 如果要讓你檢測(cè)一下表孔家使用率該怎么做,很顯然我們可以根據(jù)數(shù)據(jù)文件的數(shù)據(jù)字典來(lái)得到一個(gè)當(dāng)前值和文件最大值。
select tablespace_name,
?????????????? round(sum(bytes) / (1024 * 1024)) b,
?????????????? round(sum(decode(maxbytes, 0, bytes, maxbytes))/(1024 * 1024)) mb
????????? from dba_data_files
???????? group by tablespace_name;
另外還有一個(gè)視圖需要用,是dba_free_space,這個(gè)視圖的結(jié)果得到的是表空間的可用情況,這個(gè)視圖非常重要。內(nèi)部會(huì)迭代調(diào)用一些數(shù)據(jù)字典來(lái)綜合得到一個(gè)表空間可用率的數(shù)據(jù)。
select tablespace_name, round(sum(bytes) / (1024 * 1024)) b
????????? from dba_free_space
???????? group by tablespace_name;
兩者結(jié)合起來(lái),最大值減去可用值就是使用率了。我們看看dba_data_files的數(shù)值。
SQL> select file_name,bytes/1024/1024 size_MB ,maxbytes/1024/1024 max_MB from dba_data_files where? tablespace_name='PERFSTAT';
FILE_NAME???????????????????????????????????????????? SIZE_MB???? MAX_MB
-------------------------------------------------- ---------- ----
/U02/app/oracle/oradata/xxxx/perfstat01.dbf????????????? 3100?????? 2000
/U02/app/oracle/oradata/xxxx/perfstat02.dbf???????????? 10240?????? 2000
?? 看到這里感覺(jué)很奇怪。最大值maxsize竟然比當(dāng)前值bytes還要低很多。
?? 看到這里感覺(jué)離bug不遠(yuǎn)了。但是不管如何這個(gè)問(wèn)題現(xiàn)在來(lái)看還不夠嚴(yán)重,我們先想辦法解決。
??? 一種思路就是修復(fù)一下,我們制定表空間最大值
SQL> alter tablespace perfstat autoextend on maxsize 14G;
alter tablespace perfstat autoextend on maxsize 14G
*
ERROR at line 1:
ORA-32773: operation not supported for smallfile tablespace PERFSTAT
沒(méi)想到這種模式不支持,oerr的幫助信息提示,我們可以使用alter database datafile的方式來(lái)改進(jìn)。
? 所以修復(fù)方式就是找到那個(gè)數(shù)據(jù)字典不一致的數(shù)據(jù)文件,重新做一下設(shè)置一下maxsize值。
SQL> alter database datafile '/U02/app/oracle/oradata/xxxx/perfstat02.dbf' autoextend on maxsize 12G;
Database altered.
這樣操作之后,再次查看表空間檢測(cè)腳本,就沒(méi)有問(wèn)題了。
我在MOS上看了下,這個(gè)問(wèn)題原來(lái)很常見(jiàn)。
Value in BYTES Column Greater than MAXBYTES Column in DBA_DATA_FILES (文檔 ID 197244.1)
文檔還寫(xiě)出了樣例來(lái)模擬這個(gè)問(wèn)題。
create tablespace tst
?????? datafile 'd:\oracle\tst01.dbf' size 5m autoextend on;
alter database datafile 'd:\oracle\tst01.dbf' autoextend on maxsize 10m;
alter database datafile 'd:\oracle\tst01.dbf' resize 20m;
select file_name, bytes, maxbytes, autoextensible from dba_data_files;
FILE_NAME???????????????????????????????????? BYTES?? MAXBYTES AUT
---------------------------------------- ---------- ---------- ---
D:\ORACLE\TST01.DBF??????????????????????? 20971520?? 10485760 YES
?? 看來(lái)問(wèn)題的癥結(jié)就在于之前做了resize的操作導(dǎo)致。我的處理方式介于兩者之間,我喜歡創(chuàng)建一個(gè)初始大小的文件,然后resize到一個(gè)最大值。看來(lái)還是使用方式和習(xí)慣的不同在一些場(chǎng)景中會(huì)出現(xiàn)較大的偏差。
總結(jié)
以上是生活随笔為你收集整理的表空间检测异常的问题诊断的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 云安全:云访问安全代理(CASB)系统的
- 下一篇: 条款20:为指针的关联容器指定比较类型