Files
sam-docs/dev/deploys/ops-manual/06-database.md
권혁성 db63fcff85 refactor: [docs] 팀별 폴더 구조 재편 (공유/개발/프론트/기획)
- 개발팀 전용 폴더 dev/ 생성 (standards, guides, quickstart, changes, deploys, data, history, dev_plans 이동)
- 프론트엔드 전용 폴더 frontend/ 생성 (api/ → frontend/api-specs/)
- 기획팀 폴더 requests/ 생성
- plans/ → dev/dev_plans/ 이름 변경
- README.md 신규 (사람용 안내), INDEX.md 재작성 (Claude Code용)
- resources.md 신규 (노션 링크용, assets/brochure 이관 예정)
- CURRENT_WORKS.md 삭제, TODO.md → dev/ 이동
- 전체 참조 경로 업데이트

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 16:46:03 +09:00

4.4 KiB

6. 데이터베이스 관리

목차로 돌아가기


[운영] MySQL 접속

sudo mysql                          # root (auth_socket)
mysql -u hskwon                     # 관리자 (auth_socket, sudo 불필요)
mysql -u codebridge -p sam          # 앱 사용자

[CI/CD] MySQL 접속

mysql                    # hskwon (auth_socket)
sudo mysql               # root (auth_socket)

DB 백업

[운영] 수동 백업

# sam DB
mysqldump -u hskwon --single-transaction --routines --triggers sam | gzip > /tmp/sam_$(date +%Y%m%d_%H%M%S).sql.gz

# sam_stat DB
mysqldump -u hskwon --single-transaction --routines --triggers sam_stat | gzip > /tmp/sam_stat_$(date +%Y%m%d_%H%M%S).sql.gz

# codebridge DB (Sales)
mysqldump -u hskwon --single-transaction --routines --triggers codebridge | gzip > /tmp/codebridge_$(date +%Y%m%d_%H%M%S).sql.gz

# 전체 DB
mysqldump -u hskwon --single-transaction --routines --triggers --all-databases | gzip > /tmp/all_db_$(date +%Y%m%d_%H%M%S).sql.gz

# 특정 테이블만
mysqldump -u hskwon --single-transaction sam 테이블명 > /tmp/sam_테이블명_$(date +%Y%m%d_%H%M%S).sql

[CI/CD] 자동 백업 (운영 DB)

CI/CD 서버 crontab에서 매일 03:00에 원격 백업 수행. sam_backup 사용자로 운영 DB에 접속.

스크립트: /home/hskwon/scripts/backup-db.sh 저장소: /home/hskwon/backups/mysql/ 보존: 14일

# 수동 원격 백업
ssh sam-prod "mysqldump --single-transaction --routines sam" | gzip \
  > /home/hskwon/backups/mysql/sam_production_$(date +%Y%m%d).sql.gz

[CI/CD] Gitea DB 백업

mysqldump --single-transaction --routines --triggers gitea \
  | gzip > /home/hskwon/backups/mysql/gitea_$(date +%Y%m%d_%H%M%S).sql.gz

백업 파일 외부 전송

# 운영서버 -> CI/CD 서버
scp /tmp/sam_*.sql.gz sam-cicd:/home/hskwon/backups/mysql/

DB 복구

[운영]

# 전체 DB 복구
gunzip -c /path/to/sam_백업파일.sql.gz | sudo mysql sam

# 특정 테이블 복구
sudo mysql sam < /path/to/sam_테이블명_백업파일.sql

[CI/CD] Gitea DB 복구

gunzip -c /home/hskwon/backups/mysql/gitea_YYYYMMDD_HHMMSS.sql.gz | mysql gitea

Slow Query 분석 (운영)

# 로그 직접 확인
sudo tail -100 /var/log/mysql/slow.log

# 요약 분석 (상위 10개, 횟수 기준)
sudo mysqldumpslow -s c -t 10 /var/log/mysql/slow.log

# 요약 분석 (소요 시간 기준)
sudo mysqldumpslow -s t -t 10 /var/log/mysql/slow.log

자주 사용하는 MySQL 명령어

-- 현재 프로세스 목록
SHOW PROCESSLIST;

-- 현재 연결 수
SHOW STATUS LIKE 'Threads_connected';

-- 최대 연결 수
SHOW VARIABLES LIKE 'max_connections';

-- InnoDB 상태
SHOW ENGINE INNODB STATUS\G

-- 테이블 크기 확인 (sam DB)
SELECT table_name, ROUND(data_length/1024/1024, 2) AS data_mb,
       ROUND(index_length/1024/1024, 2) AS index_mb
FROM information_schema.tables
WHERE table_schema = 'sam'
ORDER BY data_length DESC
LIMIT 20;

-- 실행 중인 쿼리 확인
SELECT id, user, host, db, command, time, state, info
FROM information_schema.processlist
WHERE command != 'Sleep'
ORDER BY time DESC;

-- 느린 쿼리 kill
KILL 프로세스_ID;

DB 사용자 관리

-- 사용자 목록
SELECT user, host, plugin FROM mysql.user;

-- 사용자 권한 확인
SHOW GRANTS FOR 'codebridge'@'localhost';

-- 비밀번호 변경
ALTER USER 'codebridge'@'localhost' IDENTIFIED BY '새_비밀번호';
FLUSH PRIVILEGES;

Redis 관리 (운영서버)

기본 명령

redis-cli info memory           # 메모리 사용량
redis-cli dbsize                # 키 개수
redis-cli --bigkeys             # 가장 큰 키 확인
redis-cli info keyspace         # 키 통계
redis-cli info commandstats | head -20    # 명령어 실행 통계

캐시 정리

# Laravel 캐시 삭제 (artisan)
cd /home/webservice/api/current
php artisan cache:clear

# 특정 접두어 키 삭제
redis-cli keys "laravel_cache:*" | xargs redis-cli del

# 전체 초기화 (세션도 삭제됨 - 주의)
redis-cli flushall

설정 임시 변경

# maxmemory 임시 증가 (재시작 불필요)
redis-cli config set maxmemory 768mb

# maxmemory 확인
redis-cli config get maxmemory

실시간 모니터링

# 실시간 명령어 모니터링 (부하 주의)
redis-cli monitor
# Ctrl+C로 중단