[ALTIBASE] Memory Tablespace의 테이블을 Disk로 이관

2023. 5. 23. 00:54

Altibase Memory Tablespace Table을 Disk Tablespace로 이관

1.  왜 이관해야 했는가?

내가 참여하고 있는 프로젝트에선 Altibase의 Memory Tablespace만을 사용하고 있다. 비교적 적은 양의 Data만을 Altibase에 넣고 있었다고 생각하여 가끔 상태확인과 서버리소스 모니터링만 하고 DBMS에 대한 주기적인 모니터링을 하지 않았었다. 이런 오만함에 결국 Memory Tablespace의 사용률이 95퍼센트 근처에 도달해 있었다.(SWAP을 비정상적으로 많이 사용하고 있을 때라도 확인했어야 했다)

 

몇 번의 회의를 거듭하여 Altibase의 Memory Tablespace의 사용률을 줄이기 위해 몇 가지 방안이 나왔고 처리방법을 정했다.

  • 서버들의 Scale Up(Memory 추가 장착 또는 Memory 교체)
  • 미사용 테이블 백업 후 정리
  • 사용빈도가 적은 테이블 DISK Tablespace로 이관

이 중 첫 번째 방법은 당장은 불가능하다고 답변을 받아 두 번째 방법과 세 번째 방법을 사용하기로 했다.

그중 세 번째, Memory Tablespace의 테이블을 Disk Tablespace로 이관하는 방법을 기록하고자 한다.

2. 주의사항

Altibase 벤더사 직원분에게 Memory Tablespace의 테이블을 Disk Tablespace로 이관할 때의 매뉴얼을 받았고 몇 가지 주의사항이 있었다.

1. Move 명령어 사용 시 PK, Index 등은 자동생성되지 않으니 별도로 생성이 필요

2. Move 명령어 사용 시 기존 테이블의 데이터는 사라지니 반드시 이전에 확인 필요

3. Move 명령어 사용 시 해당 테이블들에 쿼리 중지(CRUD)

4. Disk로 테이블을 이관했을 시 Memory의 할당은 자동으로 반환되지 않고 DBMS를 재시작해야만 반환됨, 하지만 DBMS 서비스 중에는 반환되지 않은 공간들을 재활용

 

3. 이관 작업

해당하는 모든 작업은 sys계정을 사용하였다.

※ 해당 글은 이관에 대한 대략적인 절차를 기술했습니다. 주어진 상황에 맞게 순서를 바꾸거나 추가적인 작업, 성능검증, 테스트, 백업 등이 반드시 필요합니다.

1. Disk Tablespace 생성

CREATE DISK TABLESPCAE {테이블스페이스명}
DATAFILE 
'{데이터파일명, /xxx/xxx_001.dbf}' SIZE {데이터파일사이즈, 10G}, 
'{데이터파일명, /xxx/xxx_002.dbf}' SIZE {데이터파일사이즈, 10G},
...
(autoextend on next 1G maxsize 32G); -- 옵션, 1M씩 자동확장하며 최대 100M

다음과 같은 명령어로 Disk Tablespace를 생성한다.

벤더사 직원분의 말씀으론 데이터파일의 크기는 최대 32G 정도가 적당하다고 말씀해주셨다. (32G가 넘어가면 파일 시스템에 따라 변형이 있을 수 있다고 하셨다)

 

2. Disk Tablespace에 접근권한 설정

alter user {유저명} access {테이블스페이스명} on;

3. Disk Table 생성

디스크 테이블을 생성할 땐 반드시 이관할 테이블(Memory Tablespace)과 동일한 구조로 생성하되 테이블명은 기존 테이블과는 다르게(_DISK를 붙이거나 ..) 생성한다.

CREATE TABLE {테이블}(
...
) TABLESPACE {DISK테이블스페이스명};

4. 기존 테이블의 속성 및 카운트 등 확인

데이터를 이관했을 때 성공적으로 이관됐는지 확인할 수 있게 속성 및 카운트 등을 확인한다.

desc {테이블명};
select count(1) from {테이블명};
...

5. PK, Index 등 자동생성되지 않는 항목들의 스크립트 생성

Move 명령어를 통해 데이터를 이관할 때 이관되지 않는 항목들(PK, Index 등)을 다시 생성해줘야 하니 반드시 스크립트를 DISK 테이블에 맞게 만들어둔다.

CREATE INDEX ...;
ALTER TABLE ...;

6. 데이터 이관

이제 데이터들을 이관한다.

이때 해당 테이블을 향한 SQL들을 사전에 막아놔야 한다.

데이터 이관은 Move 명령어를 사용한다.

Move 명령어 사용 시 기존 테이블의 데이터는 전부 없어지므로 반드시 여러 번의 테스트 및 확인이 필요하다.

MOVE INTO {DISK테이블명} FROM {MEMORY테이블명};

 

7. 신규 테이블의 이관 확인

데이터가 정상적으로 이관됐는지 확인한다.

select count(1) FROM {테이블명};
desc {테이블명};
...

8. 스크립트 실행

5에서 생성했던 스크립트들을 적용한다.

9. 테이블 Rename

이제 기존 테이블들 drop 또는 rename 후 임시로 만든 Disk테이블을 기존 테이블명으로 변경한다.

drop table ...;
rename {기존테이블명} to {임시테이블명};
rename {DISK테이블명} to {기존테이블명};

10. 이관이 끝난 Disk Table에 대한 확인 및 검증

이관이 끝난 테이블이 기존 테이블과 같은지 여러가지 검증을 한다.

 

4. 마무리

이번 일이 있고 왜 확인하지 않았는지, 왜 SWAP을 그렇게 많이 사용하는데 의심하지 않았는지 등 많은 생각이 들었다.

아직 이관작업중이지만 어느정도 이관이 되면 모든 DB들의 사용량을 모니터링 및 알람 등을 만들것이다.

너무 안일했고, 앞으로는 이런 실수는 없도록 할 것이다.

 

'DataBase > RDBMS' 카테고리의 다른 글

[MariaDB] 리눅스에 MariaDB 설치  (0) 2020.06.24
오라클(Oracle) Database 11g 설치 과정  (0) 2020.06.14

BELATED ARTICLES

more