標籤:oracle datafile
今天臨下班時,同學發來一個,意思是說dba_data_files裡的bytes值大於maxbytes值。如下:
650) this.width=650;" src="/e/u261/themes/default/images/spacer.gif" style="background:url("/e/u261/lang/zh-cn/images/localimage.png") no-repeat center;border:1px solid #ddd;" alt="spacer.gif" />650) this.width=650;" src="http://s2.51cto.com/wyfs02/M00/8B/83/wKiom1hP4rSS04pVAACu3X-KHV4073.png" title="QQ圖片20161213195808.png" alt="wKiom1hP4rSS04pVAACu3X-KHV4073.png" />
立馬感覺就不好了,根據以往的Oracle營運經驗覺得這絕對是不可能的。但是資料查出來的事實就是這樣的。於是上百度搜相關問題,無耐搜出來的都是不太相關的資料。於是直接上MOS找資料,還真有一篇是介紹這個的Value in BYTES Column Greater than MAXBYTES Column in DBA_DATA_FILES (文檔 ID 197244.1) 其中有這麼一句The BYTES column in DBA_DATA_FILES has a value greater than MAXBYTES column when a datafile was manually resized to a value GREATER than MAXSIZE (MAXBYTES).那現在明白了,手動resize資料檔案會導致這一現象。
下面動手還原一下
本次測試的平台為11.2.0.3
--建立一個測試資料表空間SQL> create tablespace zx1 datafile ‘/opt/bboss/tst4/oracle/arch/zx1.dbf‘ size 10M;Tablespace created.--查看資料檔案的屬性SQL> col file_name for a100SQL> set linesize 200SQL> set num 20SQL> select file_name,tablespace_name,bytes,maxbytes,autoextensible from dba_data_files where tablespace_name=‘ZX1‘;FILE_NAME TABLESPACE_NAME BYTES MAXBYTES AUT---------------------------------------------------------------------------------------------------- ------------------------------ ---------- ---------- ---/opt/bboss/tst4/oracle/arch/zx1.dbf ZX1 10485760 0 NO--看到預設資料檔案的自動成長為NO,bytes也只有建立時指定的10M--把資料檔案轉為自動成長SQL> alter database datafile ‘/opt/bboss/tst4/oracle/arch/zx1.dbf‘ autoextend on;Database altered.SQL> select file_name,tablespace_name,bytes,maxbytes,autoextensible from dba_data_files where tablespace_name=‘ZX1‘;FILE_NAME TABLESPACE_NAME BYTES MAXBYTES AUT---------------------------------------------------------------------------------------------------- ------------------------------ -------------------- -------------------- ---/opt/bboss/tst4/oracle/arch/zx1.dbf ZX1 10485760 34359721984 YES--看到開啟自動成長後MAXBYTES預設為32G,也就是資料檔案擴充到32G後就不再擴充--測試是自動擴充--建立測試使用者及表SQL> create user zhaoxu identified by zhaoxu;User created.SQL> grant connect , resource to zhaoxu;Grant succeeded.SQL> create table zhaoxu.test1 tablespace zx1 as select * from dba_objects;Table created.--迴圈插入資料SQL> begin 2 for i in 1..100 3 loop 4 insert /* append */ into zhaoxu.test1 select * from zhaoxu.test1; 5 commit; 6 end loop; 7 end; 8 /begin*ERROR at line 1:ORA-01653: unable to extend table ZHAOXU.TEST1 by 8192 in tablespace ZX1ORA-06512: at line 4--執行一段時間後報錯,資料表空間無法擴充--查看資料檔案大小SQL> select file_name,tablespace_name,bytes,maxbytes,autoextensible from dba_data_files where tablespace_name=‘ZX1‘;FILE_NAME TABLESPACE_NAME BYTES MAXBYTES AUT---------------------------------------------------------------------------------------------------- ------------------------------ -------------------- -------------------- ---/opt/bboss/tst4/oracle/arch/zx1.dbf ZX1 34293743616 34359721984 YES--看作業系統上的資料檔案大小SQL> !du -sk /opt/bboss/tst4/oracle/arch/zx1.dbf33490016 /opt/bboss/tst4/oracle/arch/zx1.dbf--可以看到資料檔案增長沒有超過MAXBYTES指定的32G--此時resize資料檔案SQL> alter database datafile ‘/opt/bboss/tst4/oracle/arch/zx1.dbf‘ resize 33554424k; --由於作業系統限制最大隻能33554424k,不過足可以說明問題Database altered.SQL> select file_name,tablespace_name,bytes,maxbytes,bytes-maxbytes,autoextensible from dba_data_files where tablespace_name=‘ZX1‘;FILE_NAME TABLESPACE_NAME BYTES MAXBYTES BYTES-MAXBYTES AUT---------------------------------------------------------------------------------------------------- ------------------------------ -------------------- -------------------- -------------------- ---/opt/bboss/tst4/oracle/arch/zx1.dbf ZX1 34359730176 34359721984 8192 YES--現在看到資料檔案的bytes>maxbytes了
上面還原了BYTES>MAXBYTES的過程。
上面提到的資料表空間的資料檔案是自動擴充的,那對於不自動擴充的資料檔案又會怎麼樣呢?
下面繼續測試
--取消資料檔案的自動擴充SQL> alter database datafile ‘/opt/bboss/tst4/oracle/arch/zx1.dbf‘ autoextend off;Database altered.SQL> select file_name,tablespace_name,bytes,maxbytes,bytes-maxbytes,autoextensible from dba_data_files where tablespace_name=‘ZX1‘;FILE_NAME TABLESPACE_NAME BYTES MAXBYTES BYTES-MAXBYTES AUT---------------------------------------------------------------------------------------------------- ------------------------------ -------------------- -------------------- -------------------- ---/opt/bboss/tst4/oracle/arch/zx1.dbf ZX1 34359730176 0 34359730176 NO--可以看到MAXBYTES變為了0
如果再把資料檔案改為可自動擴充又會出現什麼情況呢
SQL> alter database datafile ‘/opt/bboss/tst4/oracle/arch/zx1.dbf‘ autoextend on;Database altered.SQL> select file_name,tablespace_name,bytes,maxbytes,bytes-maxbytes,autoextensible from dba_data_files where tablespace_name=‘ZX1‘;FILE_NAME TABLESPACE_NAME BYTES MAXBYTES BYTES-MAXBYTES AUT---------------------------------------------------------------------------------------------------- ------------------------------ -------------------- -------------------- -------------------- ---/opt/bboss/tst4/oracle/arch/zx1.dbf ZX1 34359730176 34359730176 0 YES--可以看到BYTES=MAXBYTES了
下面總結一下:
dba_data_files資料字典裡的bytes值和maxbytes沒有什麼必然的聯絡
資料檔案不可自動擴充時,MAXBYTES=0,BYTES的值既為該檔案已實際分配的大小,也為該為件最大大小
資料檔案可自動擴充時,預設的MAXBYTES=32G,BYTES為該檔案已實際分配的大小,預設情況下BYTES不會超過MAXBYTES,如果對該檔案進行resize操作,那麼BYTES就用可能大於MAXBYTES。
本文出自 “DBA Fighting!” 部落格,請務必保留此出處http://hbxztc.blog.51cto.com/1587495/1882495
Oracle dba_data_files資料字典裡的bytes大於maxbytes