Worknot 20240301

2024-03-01 工作雜記 Oracle 18c Oracle RAC

今天在工作上遇到Oracle資料庫突然無法連線,突然想到前幾天在資料庫監控中發現Tablespace已經快滿了,於是著手處理。以下是處理的紀錄。

環境

  • OS: OracleLinux7
  • DataBase: Oracle 18c RAC

進入資料庫檢查 Tablespace 空間是否足夠 並著手處理

因為最近一次檢查是發現audit所在的 tablespace 空間快滿了,加上發生資料庫遠端連線無法正常連線,所以只能進入資料庫本機檢查。

  1. 進入資料庫主機
  2. 切換帳號到oracle 操作
su - oracle
  1. 執行 sqlplus
sqlplus / as sysdba
  1. 執行下列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 檢查 欄位: BLOCKSMAXBLOCKS 值是否相等判斷 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
  1. 新增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

參考資料