您好,登錄后才能下訂單哦!
今天臨下班時,同學發來一個截圖,意思是說dba_data_files里的bytes值大于maxbytes值。截圖如下:
立馬感覺就不好了,根據以往的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 a100 SQL> set linesize 200 SQL> set num 20 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 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 ZX1 ORA-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.dbf 33490016 /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。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。