반응형

개요

  • AWS Cloud 내 Dump 하는 방법
  • MYSQL Dump 방법
  • PostgreSQL Dump 방법
  • PostgreSQL Vector DB Dump 방법

최근 아래와 같은 요청이 많이 들어온다.

"A 테이블에 있는 데이터 스테이징환경에 Dump 해주세요"

"A RDS에 인덱스 테스트 해야되니까 test DB 하나 만들어주세요"

...

 

해야지... 이슈 없다면 해야ㅈ....

 

 


AWS Cloud 내 Dump 하는 방법

사실 이건 굉장히 쉽다. 

그냥 Snapshot 하면된다.


RDS Snapshot 을 활용하여 Database 복원하기

1. 스냅샷 생성

 

2. 생성된 스냅샷 복원



3. 복원 시 알맞은 Config 값 수정하기


교차계정 내 RDS Snpshot 공유하기

1. 완성된 스냅샷을 공유

 

2. 스냅샷 공유하기 위해 계정 ID 추가
3. 나와 공유됨에서 공유된 스냅샷 확인


다른 리전으로 보내야 한다면?

1. 스냅샷 복사

 

2. 복사할 리전을 선택한 후 진행

만약, 다른 계정에 다른 리전에 해당 스냅샷이 존재해야 한다면?

스냅샷 공유 -> 스냅샷 복사를 하면된다. 좀 귀찮긴 하지만 스냅샷이 가장 편함스


KMS가 AWS Managed Key로 되어있다면?

이 경우가 은근 화나는 경우인데,

AWS KMS 키로 암호화가 되어있는 경우, KMS 정책을 수정할 수 없기에 ( 타계정 Access )

다른 KMS로 스냅샷을 복사 한 후 스냅샷을 공유 해야 한다. -> KMS로 다시 암호화를 하는것이니 시간이 오래걸림...

 

1. KMS 변경

{
  "Version": "2012-10-17",
  "Id": "key-consolepolicy-3",
  "Statement": [
    {
      "Sid": "Enable IAM User Permissions",
      "Effect": "Allow",
      "Principal": {
        "AWS": [
          "arn:aws:iam::[기존계정]:root",
          "arn:aws:iam::[공유될 계정]:root"
        ]
      },
      "Action": "kms:*",
      "Resource": "*"
    },
   	....

 


MYSQL Dump 방법

근데, 스냅샷을 사용할 수 있다면 아주 양반이다.

최근 특정 Table 만 Dump 해달라....

OnPremise에 있는 데이터를 떠달라... 

 


MYSQL Dump 명령어

mysqldump -h [DB_HOST_NAME] \
-u [USER] -p \
--databases [DATABASE] \
--set-gtid-purged=OFF \
--single-transaction \
--routines \
--triggers \
--events \
--compress \
--add-drop-database \
--quick \
--hex-blob > output.sql

 

  • --single-transaction
    • InnoDB 테이블의 대한 일관성 보장, 읽기잠금 최소화 -> 대용량 DB Dump 할때 필요
  • --routines
    • Stored Procedure 함수 포함
  • --triggers
    • 테이블내 트리거 포함
  • --events
    • 이벤트 스케쥴러 포함
  • --compress
    • 전송 압축 (필요)
  • --add-drop-database
    • 데이터 복구전에 기존 DB 삭제
  • --quick
    • 메모리 사용량 줄이고 성능향상
  • --hex-blob
    • 바이너리 데티러를 16진수로 덤프 -> 이미지 및 BLOB 데이터 복구 시 필요
  • --set-gtid-purged=OFF
    • 안하면 Restore 할때, Access Denied 에러가 발생한다.

MYSQL Restore 명령어

mysql -h [DB_HOST_NAME] -u [USER] -p [DATABASE] < output.sql

mysql -h [DB_HOST_NAME] -u [USER] -p --force [DATABASE] < output.sql > /dev/null

PostgreSQL Dump 방법


PostgreSQL Dump 명령어

pg_dump -h 호스트네임 -U 유저네임 -p 포트번호 -d 데이터베이스 -f ./test.dump

pg_dump -h 호스트네임 \
-U 유저네임 \
-p 포트번호 -d 데이터베이스 -F c -b -v -f ./test.dump

 

첫번째 방법은 기본적인 Text 형식 (SQL Script)로 덤프된다. (다른 옵션 존재하지않음)

두번째 방법은 아래와 같은 옵션을 사용한다.

  • -F c 
    • 백업파일을 커스텀 형식으로 구성
    • pg_restore를 활용하여 복원
    • 바이너리 형식으로 저장
  • -b
    • large objects의 데이터를 포함하여 백업
    • 대규모 객체가 있는 경우 사용
  • -v
    • verbose 모드로 백업상태를 출력
    • 디버깅 용

PostgreSQL 복구 명령어

psql -h 호스트이름 -U 유저이름 -p 포트번호 -d 데이터베이스 -f test.dump

pg_restore -h 호스트네임 \
-U 유저네임 -p 포트번호 -d 데이터베이스 \
-F c -v ./test.dump

 

psql은 위의 기본옵션으로 데이터를 Dump 하였을때 사용한다.

pg_restore은 커스텀형식으로 Dump 했을 경우 사용한다.

 


PostgreSQL Vector DB Dump 방법

사실 이게 문제다.

회사 내에서 AI 프로젝트를 AWS로 내재화하는 작업에서 

기존 OnPremise 로 구성된 PG를 RDS로 마이그레션 해야했다.

 

결국 pgVector 문제였다.

pgVector의 버전을 동일하게 했을때 문제는 없었다.

 

vector extension 설치

 

vector 0.7.0 설치 (pg 16.3)

 

데이터도 너무 커서 테이블 단위로 Dump / Restore 하였다.

## dump
pg_dump -h 호스트네임 -U 유저네임 -p 포트번호 -d 데이터베이스 -t public.테이블이름 -f ./test.dump

## restore
psql -h 호스트네임 -U 유저네임 -p 포트번호 -d 데이터베이스 -f test.dump

 

반응형

+ Recent posts