본문 바로가기
프로그래밍/DB

[DB]효율적인 저장소 관리: 데이터 압축과 아카이빙 기술 💾

by 다다면체 2025. 1. 20.
728x90
반응형

데이터가 홍수처럼 쏟아지는 요즘, 저장소 비용은 점점 부담스러워지고 성능 관리는 더 어려워지고 있죠. 그래서 오늘은 MySQL과 Oracle에서 제공하는 데이터 압축과 저장소 최적화 방법을 쉽고 재미있게 풀어보려고 합니다. 실제 개발에 바로 써먹을 수 있는 꿀팁들을 가득 담았으니, 함께 살펴보시죠! 🚀


1. 데이터 압축의 필요성 🌟

데이터 압축은 저장 공간 활용률을 극대화하고 I/O 성능을 개선하는 데 필수적인 요소입니다. 특히 대규모 데이터베이스 환경에서 압축은 다음과 같은 이점을 제공합니다.

  • 저장 공간 효율성 증대: 물리적 저장 공간 사용량을 최소화하여 스토리지 비용을 절감합니다. 이는 클라우드 환경에서 특히 중요한 고려 사항입니다.
  • I/O 성능 향상: 디스크 I/O 부하를 줄여 데이터 접근 속도를 향상시키고, 전반적인 쿼리 성능을 개선합니다.
  • 총 소유 비용(TCO) 절감: 스토리지 인프라 투자 및 운영 비용을 절감하여 장기적인 비용 효율성을 확보합니다.

2. MySQL에서 데이터 압축 사용하기 🔍

MySQL은 InnoDB 스토리지 엔진에서 테이블 압축을 기본적으로 지원합니다.

  • 테이블 생성 시 압축 설정: ROW_FORMAT=COMPRESSED 옵션을 사용하여 테이블을 생성합니다. 이는 테이블 생성 시 가장 간단하게 압축을 적용하는 방법입니다.
CREATE TABLE Orders (
    OrderID INT PRIMARY KEY,
    OrderDate DATETIME,
    TotalAmount DECIMAL(10, 2),
    OrderDetails TEXT
) ROW_FORMAT=COMPRESSED;
  • 기존 테이블 압축: ALTER TABLE 명령어를 사용하여 기존 테이블에 압축을 적용할 수 있습니다. 운영 중인 테이블에 적용 시에는 서비스 영향도를 최소화하기 위한 점검이 필요합니다.
ALTER TABLE Orders ROW_FORMAT=COMPRESSED;
  • 압축 알고리즘 및 블록 크기 조정: MySQL은 다양한 압축 알고리즘을 지원하며, KEY_BLOCK_SIZE 옵션을 통해 압축률과 성능 간의 균형을 조절할 수 있습니다. 블록 크기가 클수록 압축률은 높아지지만, CPU 부하 또한 증가할 수 있습니다.
CREATE TABLE Orders (
    -- ...
) ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=16; -- 16KB 블록 단위 압축

🚩압축 적용 시 고려 사항:

  • CPU 오버헤드: 압축 및 해제 과정에서 발생하는 CPU 부하를 고려해야 합니다. CPU 바운드 워크로드의 경우, 압축이 오히려 성능 저하를 초래할 수 있으므로 신중한 판단이 필요합니다.
  • 압축률 변화: 데이터 유형에 따라 압축률이 달라질 수 있습니다. 텍스트 데이터의 경우 높은 압축률을 보이지만, 이미 압축된 데이터(예: 이미지, 비디오)는 압축 효과가 미미할 수 있습니다.

반응형

3. Oracle에서 데이터 압축 사용하기 💡

Oracle은 다양한 압축 기능을 제공하며, OLTP 및 데이터 웨어하우징 환경에 특화된 옵션을 제공합니다.

  • 기본 테이블 압축(Basic Table Compression): COMPRESS 또는 COMPRESS BASIC 옵션을 사용하여 기본적인 압축을 적용합니다.
CREATE TABLE Sales (
    SaleID NUMBER PRIMARY KEY,
    SaleDate DATE,
    Amount NUMBER
) COMPRESS BASIC;

ALTER TABLE Sales COMPRESS BASIC;
  • OLTP 압축(OLTP Compression): 온라인 트랜잭션 처리 성능을 유지하면서 높은 압축률을 제공합니다. COMPRESS FOR OLTP 옵션을 사용하며, 특히 DML 작업이 빈번한 환경에서 유용합니다.
CREATE TABLE Sales (
    -- ...
) COMPRESS FOR OLTP;

ALTER TABLE Sales MOVE COMPRESS FOR OLTP;
  • 고급 압축(Advanced Compression): Oracle Advanced Compression 옵션 라이선스가 필요하며, 훨씬 더 높은 압축률과 다양한 압축 알고리즘을 제공합니다. 데이터 웨어하우징 환경 등에서 효과적입니다.
  • 압축의 투명성 유지: 압축이 적용된 데이터에 대한 접근은 기존 SQL 쿼리와 동일하게 작동하므로, 애플리케이션 코드 변경 없이 압축을 적용할 수 있습니다.

4. 아카이빙 전략 🗂️

오래된 데이터나 사용 빈도가 낮은 데이터를 아카이빙하여 활성 데이터베이스의 규모를 줄이고 성능을 향상시킬 수 있습니다.

 

아카이빙 대상 데이터 선정: 데이터 보존 정책, 감사 요구 사항, 비즈니스 분석 필요성 등을 고려하여 아카이빙 대상을 결정합니다.

아카이빙 방법:

  • 별도 테이블 또는 테이블스페이스 이동: 아카이브 테이블을 생성하여 데이터를 이동하거나, 별도의 테이블스페이스에 저장합니다.
  • 테이블 파티셔닝: 테이블 파티셔닝을 활용하여 데이터를 논리적으로 분리하고, 오래된 파티션을 별도의 저장소로 이동하거나 압축합니다.
  • 외부 저장소 활용: 객체 스토리지(예: AWS S3, Azure Blob Storage)와 같은 외부 저장소를 활용하여 장기 보관 비용을 절감할 수 있습니다.

MySQL 아카이빙 예제:

CREATE TABLE ArchivedOrders LIKE Orders;

INSERT INTO ArchivedOrders
SELECT * FROM Orders WHERE OrderDate < DATE_SUB(CURDATE(), INTERVAL 1 YEAR);

DELETE FROM Orders WHERE OrderDate < DATE_SUB(CURDATE(), INTERVAL 1 YEAR);

 

Oracle 파티셔닝을 이용한 아카이빙 예제:

CREATE TABLE Orders (
    OrderID NUMBER PRIMARY KEY,
    OrderDate DATE,
    Amount NUMBER
)
PARTITION BY RANGE (OrderDate) (
    PARTITION p2022 VALUES LESS THAN (TO_DATE('2023-01-01', 'YYYY-MM-DD')),
    PARTITION p2023 VALUES LESS THAN (TO_DATE('2024-01-01', 'YYYY-MM-DD')),
    PARTITION p_future VALUES LESS THAN (MAXVALUE)
);

ALTER TABLE Orders MOVE PARTITION p2022 TABLESPACE archive_ts;

CREATE TABLE ArchivedOrders TABLESPACE archive_ts AS SELECT * FROM Orders PARTITION (p2022);
ALTER TABLE Orders DROP PARTITION p2022;

5. 데이터 압축과 아카이빙의 장점 🌐

압축과 아카이빙을 함께 적용하면 저장소 비용을 최소화하고 데이터베이스 성능을 극대화하는 시너지 효과를 얻을 수 있습니다.

  • 비용 효율성 극대화: 저장 공간 사용량을 줄여 스토리지 비용을 획기적으로 절감합니다.
  • 성능 최적화: 활성 데이터의 규모를 줄여 쿼리 성능을 향상시키고, 백업 및 복구 시간을 단축합니다.
  • 데이터 관리 효율성 증대: 데이터 라이프사이클 관리를 단순화하고, 데이터베이스 유지보수 작업을 효율적으로 수행할 수 있도록 지원합니다.

6. 실습: 전자상거래 데이터베이스 최적화 🛒

온라인 쇼핑몰 데이터베이스에서 오래된 주문 데이터를 아카이빙하고, 활성 주문 데이터는 압축하여 저장소를 최적화하는 시나리오를 구체적으로 살펴보겠습니다.

  • MySQL:
-- 활성 주문 테이블 생성 (압축 적용)
CREATE TABLE ActiveOrders (
    OrderID INT PRIMARY KEY,
    OrderDate DATETIME,
    TotalAmount DECIMAL(10, 2),
    OrderDetails TEXT
) ROW_FORMAT=COMPRESSED;

-- 오래된 주문 데이터를 아카이브 테이블로 이동
CREATE TABLE ArchivedOrders LIKE ActiveOrders;
INSERT INTO ArchivedOrders SELECT * FROM Orders WHERE OrderDate < DATE_SUB(CURDATE(), INTERVAL 1 YEAR);
DELETE FROM Orders WHERE OrderDate < DATE_SUB(CURDATE(), INTERVAL 1 YEAR);

-- 필요에 따라 Orders 테이블을 ActiveOrders로 이름 바꾸기
RENAME TABLE Orders TO OldOrders, ActiveOrders TO Orders;
DROP TABLE OldOrders;

-- 또는, 파티셔닝을 활용하여 아카이빙과 관리를 더욱 효율적으로 수행할 수 있습니다.
CREATE TABLE Orders (
    OrderID INT PRIMARY KEY,
    OrderDate DATETIME,
    TotalAmount DECIMAL(10, 2),
    OrderDetails TEXT
)
PARTITION BY RANGE(YEAR(OrderDate)) (
    PARTITION p2022 VALUES LESS THAN (2023),
    PARTITION p2023 VALUES LESS THAN (2024),
    PARTITION p_future VALUES LESS THAN MAXVALUE
);

-- 오래된 파티션을 아카이브 테이블로 이동
CREATE TABLE ArchivedOrders LIKE Orders;
INSERT INTO ArchivedOrders SELECT * FROM Orders PARTITION (p2022);
ALTER TABLE Orders DROP PARTITION p2022;
  • Oracle:
-- 주문 테이블 생성 (파티셔닝 적용)
CREATE TABLE Orders (
    OrderID NUMBER PRIMARY KEY,
    OrderDate DATE,
    Amount NUMBER,
    OrderDetails CLOB
)
PARTITION BY RANGE (OrderDate) (
    PARTITION p2022 VALUES LESS THAN (TO_DATE('2023-01-01', 'YYYY-MM-DD')),
    PARTITION p2023 VALUES LESS THAN (TO_DATE('2024-01-01', 'YYYY-MM-DD')),
    PARTITION p_future VALUES LESS THAN (MAXVALUE)
);

-- 오래된 파티션을 아카이브 테이블스페이스로 이동
ALTER TABLE Orders MOVE PARTITION p2022 TABLESPACE archive_ts;

-- 필요에 따라 아카이브된 파티션을 별도 테이블로 분리할 수 있습니다.
CREATE TABLE ArchivedOrders TABLESPACE archive_ts AS SELECT * FROM Orders PARTITION (p2022);
ALTER TABLE Orders DROP PARTITION p2022;

-- 활성 파티션에 OLTP 압축 적용
ALTER TABLE Orders MODIFY PARTITION p2023 COMPRESS FOR OLTP;

 


7. 마무리 🌟

데이터 압축과 아카이빙은 데이터베이스 성능 향상과 비용 절감을 위한 효과적인 전략입니다. MySQL과 Oracle은 각기 다른 기능을 제공하므로, 프로젝트의 특성과 요구 사항, 데이터의 특성 (예: 데이터 변경 빈도, 쿼리 패턴 등), 그리고 시스템 리소스 (CPU, I/O 등)를 종합적으로 고려하여 적절한 방법을 선택해야 합니다.

  • 압축: 저장 공간 절약 및 I/O 성능 향상에 효과적이지만, CPU 오버헤드를 고려해야 합니다. 특히, OLTP 환경에서는 OLTP 압축과 같이 트랜잭션 성능을 유지하는 압축 방식을 선택하는 것이 중요합니다.
  • 아카이빙: 활성 데이터의 규모를 줄여 쿼리 성능을 향상시키고, 백업 및 복구 시간을 단축하는 데 효과적입니다. 파티셔닝을 함께 사용하면 아카이빙 관리를 더욱 효율적으로 수행할 수 있습니다.

이 가이드가 개발자 여러분들이 데이터베이스를 효율적으로 관리하고 최적화하는 데 실질적인 도움이 되기를 바랍니다. 추가적인 질문이나 궁금한 점이 있다면 언제든지 문의해 주세요! 😊

728x90
반응형