今天在工作上遇到Oracle資料庫突然無法連線,突然想到前幾天在資料庫監控中發現Tablespace已經快滿了,於是著手處理。以下是處理的紀錄。
環境
- OS: OracleLinux7
- DataBase: Oracle 18c RAC
進入資料庫檢查 Tablespace 空間是否足夠 並著手處理
因為最近一次檢查是發現audit所在的 tablespace 空間快滿了,加上發生資料庫遠端連線無法正常連線,所以只能進入資料庫本機檢查。
- 進入資料庫主機
- 切換帳號到oracle 操作
su - oracle
- 執行 sqlplus
sqlplus / as sysdba
- 執行下列SQL檢查
select a.TABLESPACE_NAME, to_char(a.BYTES/(1024*1024),'999,999') "Size(MB)", to_char(round((a.BYTES-b.BYTES)/(1024*1024),0),'999,999') "Used(MB)", to_char(b.BYTES/(1024*1024),'999,999') "Avail(MB)" from (select TABLESPACE_NAME, sum(BYTES) "BYTES" from dba_data_files group by tablespace_name) a, (select TABLESPACE_NAME,sum(BYTES) "BYTES" from dba_free_space group by tablespace_name) b where a.TABLESPACE_NAME=b.TABLESPACE_NAME;
經過檢查確定發現AUD_TBS
確定已經滿了。經詢問過DBA協助判斷確認需要增加新的 datafile ,因為一個datafile預設最大只能到32GB
。
TABLESPACE_NAME Size(MB) Used(MB) Avail(MB
------------------------------ -------- -------- --------
AUD_TBS 32,768 32,740 28
TBS_1 258,048 160,335 97,713
TBS_2 25,600 24,241 1,359
事後我也發現可以從 dba_data_files
檢查 欄位: BLOCKS
與 MAXBLOCKS
值是否相等判斷 datafile 是否滿。
select * from dba_data_files where TABLESPACE_NAME = 'AUD_TBS';
FILE_NAME FILE_ID TABLESPACE_NAME BYTES BLOCKS STATUS RELATIVE_FNO AUT MAXBYTES MAXBLOCKS INCREMENT_BY USER_BYTES USER_BLOCKS ONLINE_ LOST_WR
------------------------------------------------------------------------------------------ ------------------------------ ---------- ----------
+DATA/SOCDB/DATAFILE/aud_tbs.0000.0000000000 39 AUD_TBS 3.4360E+10 4194302 AVAILABLE 39 YES 3.4360E+10 4194302 12800 3.4359E+10 4194168 ONLINE OFF
- 新增datafile
因為這次處理的Oracle是使用Oracle RAC處理指令如下
SQL> ALTER TABLESPACE AUD_TBS ADD DATAFILE '+DATA' SIZE 20480M AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED;
Tablespace altered.
如果是單機板處理
--先查詢 tbs1 目前擁有的 datafile
SELECT tablespace_name, file_name FROM dba_data_files WHERE tablespace_name IN ('tbs1');
--新增tablespace
alter tablespace tbs1 add datafile '/[select path]/[tbs1_1].dbf' size 100M AUTOEXTEND ON MAXSIZE UNLIMITED;
我很好奇
在這幾次的處理經驗中,我一直很好奇為什麼只能單一個tabespace只能開到32G,後來在MAXIMUM DATAFILE SIZE IN AN ORACLE DATABASE有提到 一個 datafile 裡可以允許存放 4,194,303 Block。 Block Size 如果是 8k 則最大的限制是 32GB,大致上如下表。
Block Size | Maximum Datafile Size
— — — — — — — — — — — — — — —
2k 4194303 * 2k = 8 GB
4k 4194303 * 4k = 16 GB
8k 4194303 * 8k = 32 GB
16k 4194303 * 16k = 64 GB
32k 4194303 * 32k = 128 GB
在Oracle 10g 中有介紹 BIGFILE tablespace,而 BIGFILE tablespace 只能存在單一個 datafile。然而一個datafile可以存放 4,294,967,295 Block。容量設計上如下表:
Block Size | Maximum Datafile Size
— — — — — — — — — — — — — — —
2k 4294967295 * 2k = 8 TB
4k 4294967295 * 4k = 16 TB
8k 4294967295 * 8k = 32 TB
16k 4294967295 * 16k = 64 TB
32k 4294967295 * 32k = 128 TB