πŸš€ λΉ„μš© 절감 + μžλ™ν™”: MySQL ν…Œμ΄λΈ” S3둜 맀일 λ°±μ—…

SuperhanΒ·2025λ…„ 8μ›” 8일

μžλ™ν™” κ°€λŠ₯ν•œ λͺ¨λ“  업무λ₯Ό μžλ™ν™” ν•˜λΌ.

졜근 νšŒμ‚¬μ—μ„œ λΉ„μš© μ ˆκ°μ„ μœ„ν•΄ DB μŠ€λƒ…μƒ· 보관 기간을 ν•˜λ£¨λ‘œ μ€„μΈλ‹€λŠ” 방침이 λ‚΄λ €μ™”λ‹€.

κΈ°μ‘΄μ—λŠ” λ©°μΉ μ”© μœ μ§€λ˜λ˜ μžλ™ μŠ€λƒ…μƒ·μ΄ ν•˜λ£¨λ§Œ λ³΄κ΄€λ˜λ‹€ λ³΄λ‹ˆ, κ·Έ μ΄ν›„μ—λŠ” 데이터λ₯Ό λ³΅κ΅¬ν•˜κΈ° μ–΄λ €μš΄ 상황이 생길 수 μžˆμ—ˆλ‹€.

κ·Έλž˜μ„œ μŠ€λƒ…μƒ·μ΄ μ•„λ‹Œ λ‹€λ₯Έ λ°©λ²•μœΌλ‘œ 백업을 μœ μ§€ν•  ν•„μš”κ°€ μžˆμ—ˆκ³ ,

MySQL Dump + AWS S3 μ‘°ν•©μœΌλ‘œ 맀일 μžλ™μœΌλ‘œ 데이터 λ°±μ—…ν•˜λŠ” 슀크립트λ₯Ό μž‘μ„±ν–ˆλ‹€.

πŸ“œ μž‘μ„±ν•œ 슀크립트

#!/bin/bash

# crontab으둜 μ‹€ν–‰ν•  경우 μŠ€ν¬λ¦½νŠΈλŠ” μ‹€ν–‰ ν™˜κ²½μ˜ 경둜λ₯Ό μ°Έμ‘°ν•˜λ―€λ‘œ μ„€μΉ˜ νŒŒμΌλ“€μ˜ 경둜λ₯Ό λͺ¨λ₯Έλ‹€.
# λ”°λΌμ„œ mysqldump, aws λ“±μ˜ μ‹€ν–‰νŒŒμΌμ„ λ™μž‘μ‹œν‚€κΈ° μœ„ν•΄ λ‹€μŒκ³Ό 같이 경둜λ₯Ό λͺ…μ‹œν•΄ μ£Όμ–΄μ•Ό ν•œλ‹€.
PATH=/usr/local/bin:/usr/bin:/bin:/opt/homebrew/bin

# 1. 였늘 λ‚ μ§œλ₯Ό λ³€μˆ˜λ‘œ μ €μž₯
TODAY=$(date +%Y-%m-%d)

# 2. λ°±μ—… 폴더 생성
BACKUP_DIR=~/Workspace/backup/$TODAY
mkdir -p "$BACKUP_DIR"

# 3. ν…Œμ΄λΈ” λͺ©λ‘
TABLES=("cheer_message" "game_result" "reward_history" "sale_link_history" "share_link_history" "user")

LOG_DIR=/Users/shhan/Workspace/backup/log
mkdir -p "$LOG_DIR"

LOG_FILE="$LOG_DIR/my_bump_$TODAY.log"

echo "Dump start at $TODAY" >> "$LOG_FILE" 2>&1

# 4. DB 정보
HOST="prd-elypecs.cluster-cos1iw8cmzag.ap-northeast-2.rds.amazonaws.com"
PORT=3306
USER="my_table"
PASSWORD="password1234" # κ°€μ§œ λΉ„λ°€ 번호
DATABASE="hanul_bori_prd"

# 5. 각 ν…Œμ΄λΈ” 덀프
for TABLE in "${TABLES[@]}"; do
  echo "Dumping table: $TABLE"
  mysqldump \
    -h "$HOST" \
    -P "$PORT" \
    -u "$USER" \
    -p"$PASSWORD" \
    --no-create-info \
    --no-tablespaces \
    "$DATABASE" "$TABLE" \
    > "$BACKUP_DIR/$TABLE.sql" 2>> "$LOG_FILE"

  if [ $? -ne 0 ]; then
    echo "❌ Failed to dump table: $TABLE" >> "$LOG_FILE" 2>&1
  else
    echo "βœ… Dumped: $TABLE.sql" >> "$LOG_FILE" 2>&1
  fi
done

# 6. S3 μ—…λ‘œλ“œ
echo "Uploading to S3..." >> "$LOG_FILE" 2>&1

aws s3 sync "$BACKUP_DIR" "s3://prd-data-backup-hanul-bori/$TODAY" >> "$LOG_FILE" 2>&1

if [ $? -eq 0 ]; then
  echo "βœ… S3 upload complete!" >> "$LOG_FILE" 2>&1
else
  echo "❌ S3 upload failed." >> "$LOG_FILE" 2>&1
fi

πŸ’‘ μ΄λ ‡κ²Œ κ΅¬μ„±ν–ˆλ‹€

  1. λ‚ μ§œλ³„ λ°±μ—… 폴더 생성
    • $(date +%Y-%m-%d)λ₯Ό μ‚¬μš©ν•΄ YYYY-MM-DD ν˜•μ‹μ˜ 폴더λ₯Ό λ§Œλ“€μ—ˆλ‹€.
    • λ‚ μ§œλ³„λ‘œ λ°±μ—… 데이터가 μ •λ¦¬λ˜λ‹ˆ 관리가 훨씬 νŽΈν•΄μ‘Œλ‹€.
  2. νŠΉμ • ν…Œμ΄λΈ”λ§Œ 선택 λ°±μ—…
    • TABLES=("...") 배열에 μ›ν•˜λŠ” ν…Œμ΄λΈ”λͺ…을 λ„£μ–΄ ν•„μš”ν•œ λ°μ΄ν„°λ§Œ λ°±μ—…ν•˜λ„λ‘ ν–ˆλ‹€.
    • λΆˆν•„μš”ν•œ λŒ€μš©λŸ‰ ν…Œμ΄λΈ”μ€ μ œμ™Έν•΄μ„œ 속도λ₯Ό μ€„μ˜€λ‹€.
  3. 둜그 파일 뢄리
    • SQL λ€ν”„λŠ” .sql νŒŒμΌμ— μ €μž₯ν•˜κ³ , mysqldump μ‹€ν–‰ λ‘œκ·Έμ™€ μ—λŸ¬λŠ” λ³„λ„μ˜ log 폴더에 μ €μž₯ν–ˆλ‹€.
  4. S3 μ—…λ‘œλ“œ μžλ™ν™”
    • aws s3 sync λͺ…λ Ήμ–΄λ‘œ λ°±μ—… 폴더 전체λ₯Ό ν•΄λ‹Ή λ‚ μ§œ κ²½λ‘œμ— μ—…λ‘œλ“œν–ˆλ‹€.

μ‹€ν–‰ κ²°κ³Ό

슀크립트λ₯Ό μ‹€ν–‰ν•˜λ‹ˆ λ‚ μ§œλ³„ 폴더 μ•ˆμ— SQL 덀프 파일이 생성됐닀.

둜컬 생성 κ²°κ³Ό

backup/
 β”œβ”€β”€ 2025-08-08/
 β”‚   β”œβ”€β”€ cheer_message.sql
 β”‚   β”œβ”€β”€ game_result.sql
 β”‚   β”œβ”€β”€ reward_history.sql
 β”‚   β”œβ”€β”€ sale_link_history.sql
 β”‚   β”œβ”€β”€ share_link_history.sql
 β”‚   └── user.sql
 └── log/
     └── my_dump_2025-08-08.log

s3 버킷 생성 κ²°κ³Ό

이와 같이 폴더가 μƒμ„±λ˜μ—ˆκ³  λ‹€μŒκ³Ό 같이 파일이 μ •μƒμ μœΌλ‘œ μ—…λ‘œλ“œ λœκ²ƒμ„ 확인할 수 μžˆμ—ˆλ‹€.

crontab 등둝

이제 잘 μž‘μ„±ν•œ 슀크립트λ₯Ό crontab -e λͺ…λ Ήμ–΄ μ‹€ν–‰ ν›„ μ›ν•˜λŠ” μ‹œκ°„μ— 맞좰 λ“±λ‘ν•œλ‹€.
μ—…λ¬΄μ‹œκ°„μ— PCλ₯Ό μΌœλ‘˜ κ²ƒμ΄λ―€λ‘œ μ˜€ν›„ 3μ‹œμ— ν•œλ²ˆ 그리고 μ €λ…μ—λŠ” 주둜 곡뢀λ₯Ό ν•˜λ‹ˆκΉŒ 9μ‹œμ— ν•œλ²ˆ 등둝해 λ‘μ—ˆλ‹€.
μ˜€μ „μ‹œκ°„μ„ ν”Όν•œ μ΄μœ λŠ” 당일에 μŒ“μΈ 둜그λ₯Ό 당일에 λ°±μ—…ν•˜κΈ° μœ„ν•¨μ΄λ‹€.

0 17 * * * /Users/shhan/Workspace/backup/sql/hanul_bori_dump.sh
53 21 * * * /Users/shhan/Workspace/backup/sql/hanul_bori_dump.sh

πŸ€” crontab λ™μž‘ μ‹€νŒ¨

crontab λ™μž‘μ΄ μ‹€νŒ¨ν•œ μ΄μœ λŠ” PATH λ•Œλ¬Έμ΄μ—ˆλ‹€. μŠ€ν¬λ¦½νŠΈκ°€ μ‹€ν–‰λ λ•Œ crontab에 μ˜ν•΄ 싀행이 되면 ν™˜κ²½μ΄ usr/local/bin 정도 μ΅œμ†Œν•œμ˜ 경둜만 κΈ°λ³Έκ°’μœΌλ‘œ μ‹€ν–‰λ˜κΈ° λ•Œλ¬Έμ— 슀크립트 μ•ˆμ— μžˆλŠ” mysqldump와 awsλͺ…λ Ήμ–΄λ₯Ό μ‹€ν–‰ν•  수 μ—†κΈ° λ•Œλ¬Έμ— λ°œμƒν•œ μ—λŸ¬μ˜€λ‹€.

Dumping table: cheer_message
❌ Failed to dump table: cheer_message
Dumping table: game_result
❌ Failed to dump table: game_result
Dumping table: reward_history
❌ Failed to dump table: reward_history
Dumping table: sale_link_history
❌ Failed to dump table: sale_link_history
Dumping table: share_link_history
❌ Failed to dump table: share_link_history
Dumping table: user
❌ Failed to dump table: user
Uploading to S3...
❌ S3 upload failed.

✍️ 슀크립트 μˆ˜μ •

#!/bin/bash

# μŠ€ν¬λ¦½νŠΈμ— PATH μΆ”κ°€
PATH=/usr/local/bin:/usr/bin:/bin:/opt/homebrew/bin

배운점

맀일 μˆ˜λ™μœΌλ‘œ μž‘μ—…ν•  λ»”ν•œ 업무λ₯Ό μžλ™ν™” ν•˜λŠ” μŠ΅κ΄€μ€ 맀우 μ€‘μš”ν•˜λ‹€. μˆ˜λ™μœΌλ‘œ μž‘μ—…μ„ ν•˜λŠ”κ²Œ 비둝 μž‘μ€ μž‘μ—…μΌμ§€λΌλ„ μŒ“μ΄κ²Œ 되면 이 λ˜ν•œ λΉ„μš©μœΌλ‘œ μž‘μš©ν•˜λ©° λΆˆν•„μš”ν•œ μ‹œκ°„μ„ λ‚­λΉ„ν•˜κ²Œ λ˜λŠ” 것이닀.

개발과 κΈ°μˆ μ„ ν™œμš©ν•œλ‹€λŠ” 것은 μ΄λ ‡κ²Œ νŒŒμ›Œν’€ν•œ 일이며 κ°€λŠ₯ν•œ λͺ¨λ“  업무λ₯Ό μžλ™μœΌλ‘œ μ²˜λ¦¬ν•˜μ—¬ μ‚Άμ˜ μ§ˆμ„ ν–₯μƒμ‹œν‚¬ 수 μžˆλ„λ‘ μ°½μ˜μ„±μ„ κ°€μ§€κ³  ν™œμš©ν•΄ 보아야 함을 λŠκΌˆλ‹€.

profile
μ–΄λ””κΉŒμ§€ μ•Œκ³ , μ–΄λ””κΉŒμ§€ λͺ¨λ₯ΌκΉŒ?

0개의 λŒ“κΈ€