4 minute read

AIX 서버의 오라클 RAC 환경에서 테이블 스페이스 용량 추가하기

배경

얼마 전 시스템 운영팀에서 연락이 왔다.

ABCD3 DB의 TB_BEM 테이블 스페이스 용량이 97% 정도 되니까 조치해주세요

지난 3월, 우리 파트의 서버와 DB를 담당하시던 과장님이자 나의 사수가 갑자기 다른 팀으로 옮겨져버렸다. 파트 인원이 7명이었는데 그 중 한 명이 사라졌고, 누군가는 과장님이 하던 일을 맡아서 해야하는 상황이었다. 다른 사람들이 이 일을 맡고 싶어하지 않았고, 내가 맡고 있던 서비스의 업무 강도가 높지 않아 새로운 업무 추가하기가 쉬웠던 관계로 내가 서버 관리와 DB 관리 업무를 갑자기 맡게 되었다. 입사 6개월 만에.

나는 여신 안에서도 정책자금 업무를 수행하고 있다. 서브시스템이어서 자체적으로 서버와 DB를 보유, 운영하고 있다. 정책자금의 종류에 따라 다섯가지 정도로 서비스가 분류되어있고, 그 서비스들이 각각 자체 서버 위에서 돌아가고 있다. 그리고 우리 특이하게 우리 업무만 서버에 올라가있는게 아니라, 다른 서비스 두 가지도 함께 올라가있어서 같이 관리해주고 있다. 이번에 테이블 스페이스 용량 관련해서 조치해달라고 했던 테이블 스페이스는 우리 쪽 서비스가 아니라 다른 쪽 서비스 중 한 가지였다. 매일 또는 매월 DB용량 점검을 수행하고 있는데, 다른 두 가지 서비스와 관련된 DB는 점검 대상에서 제외되고 있어서 용량이 저렇게 많이 찬 줄 모르고 있었다. 어쨌든 그쪽 서비스 담당자와 이야기 끝에 용량 증설을 하기로 하였다.

그런데 테이블 스페이스 용량 증설? 테이블 스페이스도 솔직히 제대로 모르겠는데 용량 추가는 어떻게 하는건가? DB도 이중화되어있는데 각각 추가해줘야하나? 아니면 알아서 복사가 되는건가? 도무지 알 수가 없었다. 그래서 시스템 운영팀 쪽에 상황 설명을 하고 용량 추가를 어떻게 할 수 있는지 문의를 하였다.

RAW DEVICE의 등장

- 테이블 스페이스 용량 추가요? 붙일 수 있는 로디바이스는 있어요?
- 네? 로 뭐요..? 
- 후... 전임자 분한테 인수인계를 제대로 못받으신 것 같은데 제가 로디바이스가 뭔지 이런걸 설명드리기는 좀 그런 것 같고 전임자 분한테 절차 같은 것들을 확인해보시고 오는게 순서인 것 같습니다.

전임자한테 물어볼 수 있는 상황은 아니어서 서버 관련 인수인계 자료들을 뒤져보았다. 그랬더니 DB용량 추가 관련 명령어가 한 줄 써있었다.

ALTER TABLESPACE TB_BEM ADD DATAFILE '/dev/rora_bem_01' size 3000m;

아하 /dev/rora_bem01이 RAW DEVICE이고 이걸 테이블 스페이스에 추가해줘서 테이블 스페이스 용량을 증설하는거구나! RAW DEVICE는 대체 뭐지?

RAW DEVICE의 정의

RAW DEVICE는 File System이 Setup되지 않은 disk drive이다. 커널을 거치지 않고 바로 유저 버퍼 캐시에 접근을 하는 디스크 방식이어서 파일시스템 디스크보다 속도에서 이점을 갖는다. 따라서 데이터베이스와 같이 주로 자신들의 캐싱 시스템을 갖고 있는 경우에 서비스 프로그램에서 많이 사용한다.

위의 테이블 스페이스 용량 추가 명령어를 보면 데이터 파일이 /dev 디렉토리에 있었는데 해당 디렉토리로 이동하여 ls -al명령어로 파일 목록을 살펴보면 일반적인 파일은 용량이 나오지만, RAW DEVICE는 파일 시스템에 마운트(표현이 맞는지 모르겠다)도 되어있지 않기 때문에 용량이 보이지가 않는다. 그저 블럭들로 이루어진 뭉텅이랄까? ls -al명령어로 살펴보면 타입이 c로 나오는데, 이는 character타입이라고 한다.

crw-r--r--    1 root     root     162,   1 Dec  6 06:54 raw1
crw-r--r--    1 root     root     162,   2 Dec  6 06:54 raw2
crw-r--r--    1 root     root     162,   3 Dec  6 06:54 raw3
crw-r--r--    1 root     root     162,   4 Dec  6 06:54 raw4

RAW DEVICE 추가하기

오호.. RAW DEVICE란 이런거구나.

하지만 나는 root 권한이 없기 때문에 RAW DEVICE를 추가할 수 없어서 시스템 운영팀의 AIX 서버 담당자에게 DB용량 증설이 필요해서 RAW DEVICE 용량을 10G만큼 추가하고 싶다고 요청하였다.

- RAW DEVICE 추가요? 아 그러면 어떤 볼륨 그룹에 추가해드리면 되죠? 스페이스에 여유는 있는거죠?
- ????????

이것이야말로 뭘 모르는지 모르는 상태였다. 이게 다 뭐란 말인가? 제가 인수인계를 받은지 얼마 안되어서 모르는 것 투성이니 알려달라고 바짓가랑이를 붙잡듯 대화를 나눴다. 잠깐의 대화를 나누고 내가 완전 똥멍청이 상태라는 것을 파악한 담당자는 알아서 현황 파악을 해주고 이런 식으로 작업 요청서를 올려달라고 하였다. 그래서 일단 작업 요청서를 올렸고, RAW DEVICE가 /dev 디렉토리에 생성이 되었다.

그리고 RAW DEVICE와 같이 물리적 볼륨을 추가하고 나면, 논리적으로 이 볼륨을 어떤 그룹에 속하게 할 것인지 분류할 수 있었는데, 시스템 운영팀 담당자가 말했던 볼륨 그룹이란 이러한 그룹핑을 뜻하는 것이었다.

  • lsvg -o : 현재 온라인 상태의 볼륨 그룹을 확인할 수 있다
  • lsvg racvg : racvg 볼륨 그룹에 대한 여러 정보가 나온다.
    • VOLUME GROUP : 볼륨 그룹의 이름
    • MAX LVs : 볼륨 그룹에 허용된 최대 논리적 볼륨 수
    • LVs : 볼륨 그룹에 현재 있는 논리적 볼륨의 수
    • TOTAL PVs : 볼륨 그룹 내의 총 물리적 볼륨 수
    • PP size : 각 물리적 파티션의 크기
    • TOTAL PPs : TOTAL PPs
    • FREE PPs : 할당되지 않은 물리적 파티션의 수입니다.
      • PP size * FREE PPs => 해당 볼륨 그룹에 추가할 수 있는 RAW DEVICE 여유 공간
  • lsvg -l racvg : racvg 볼륨 그룹에 속해있는 RAW DEVICE 등의 파일 목록을 확인할 수 있다

우리 DB서버는 racvg 볼륨 그룹에 DB에 붙이는 RAW DEVICE들이 존재하고 있었다.

RAW DEVICE를 테이블 스페이스에 붙이기

자 이제 RAW DEVICE도 뭔지 알았고, 볼륨 그룹도 뭔지 알았고, 테이블 스페이스에 데이터 파일 붙이는 쿼리도 알고 있으니 붙이기만 하면 된다.

ALTER TABLESPACE TB_BEM ADD DATAFILE '/dev/rora_bem03' size 10000M;

서버에서 SQL PLUS를 들어가 해당 명령어를 수행하려고 노려보는데 뭔가 이상한 느낌이 들었다. 데이터 파일을 ADD할 때 사이즈를 지정할 수 있다..? 그러면 데이터 파일이 20G짜리인데 10G만 ADD할 수 있다는건가? 그러면 나머지 10G는 버려지는건가? 내가 가진 RAW DEVICE의 크기는 몇이라는거지? 아니 그중에서 안쓰고 남아있는 용량이 있을 수 있다는건가?

RAW DEVICE의 크기 확인해보기

getconf DISK_SIZE /dev/rora_bem02

해당 명령어를 통해 RAW DEVICE의 용량을 확인할 수 있고, 출력값은 Megabyte(MB) 단위이다.

데이터 파일 사용현황 확인하기

select df.tablespace_name, df.file_name, round(df.bytes/1024/1024) totalSizeMB, nvl(round(usedBytes/1024/1024), 0) usedMB, nvl(round(freeBytes/1024/1024), 0) freeMB,
    nvl(round(freeBytes/df.bytes * 100), 0) freePerc, df.autoextensible
from dba_data_files df
    left join (
        select file_id, sum(bytes) usedBytes
        from dba_extents
        group by file_id
    ) ext on df.file_id = ext.file_id
    left join (
        select file_id, sum(bytes) freeBytes
        from dba_free_space
        group by file_id
    ) free on df.file_id = free.file_id
order by df.tablespace_name, df.file_name
;

// 쿼리 출처
// https://dba-presents.com/databases/oracle/19-datafiles-space-usage

위 쿼리를 날려보면 각 테이블 스페이스에 연결된 데이터 파일의 목록과 총 용량, 여유 용량 등을 확인할 수 있다. 서버에서 rora_bem02라는 RAW DEVICE가 10G였는데 저 쿼리를 날려서보니 해당 파일의 totalSizeMB가 10000MB라면 240M만큼은 사용하지 않았다고 보면 된다.

진짜 RAW DEVICE 붙여보기

ALTER TABLESPACE TB_BEM ADD DATAFILE '/dev/rora_bem03' size 10000M;

여러 인터넷 자료를 살펴보니 rora_bem03의 RAW DEVICE 크기가 10G라고 해도 그것보다는 조금 모자라게 테이블 스페이스에 붙이는게 좋다고 하였다. 헤더라든지 여러 메타데이터가 차지할 공간을 남겨두는게 좋다라나.. 솔직히 이게 팩트인까지는 확인하지 못하였으나 보수적으로 접근하는 것이 좋기 때문에 50MB 정도 모자라게 해당 테이블스페이스에 추가해주는 것으로 테이블 스페이스 용량 증설 작업을 잘 마무리하였고, 현재까지 해당 서비스는 용량이 잘 늘어서 문제없이 운영되고 있다.