204 lines
4.4 KiB
Markdown
204 lines
4.4 KiB
Markdown
|
|
# 6. 데이터베이스 관리
|
||
|
|
|
||
|
|
[목차로 돌아가기](./README.md)
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## [운영] MySQL 접속
|
||
|
|
|
||
|
|
```bash
|
||
|
|
sudo mysql # root (auth_socket)
|
||
|
|
mysql -u hskwon # 관리자 (auth_socket, sudo 불필요)
|
||
|
|
mysql -u codebridge -p sam # 앱 사용자
|
||
|
|
```
|
||
|
|
|
||
|
|
## [CI/CD] MySQL 접속
|
||
|
|
|
||
|
|
```bash
|
||
|
|
mysql # hskwon (auth_socket)
|
||
|
|
sudo mysql # root (auth_socket)
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## DB 백업
|
||
|
|
|
||
|
|
### [운영] 수동 백업
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# 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일
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# 수동 원격 백업
|
||
|
|
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 백업
|
||
|
|
|
||
|
|
```bash
|
||
|
|
mysqldump --single-transaction --routines --triggers gitea \
|
||
|
|
| gzip > /home/hskwon/backups/mysql/gitea_$(date +%Y%m%d_%H%M%S).sql.gz
|
||
|
|
```
|
||
|
|
|
||
|
|
### 백업 파일 외부 전송
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# 운영서버 -> CI/CD 서버
|
||
|
|
scp /tmp/sam_*.sql.gz sam-cicd:/home/hskwon/backups/mysql/
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## DB 복구
|
||
|
|
|
||
|
|
### [운영]
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# 전체 DB 복구
|
||
|
|
gunzip -c /path/to/sam_백업파일.sql.gz | sudo mysql sam
|
||
|
|
|
||
|
|
# 특정 테이블 복구
|
||
|
|
sudo mysql sam < /path/to/sam_테이블명_백업파일.sql
|
||
|
|
```
|
||
|
|
|
||
|
|
### [CI/CD] Gitea DB 복구
|
||
|
|
|
||
|
|
```bash
|
||
|
|
gunzip -c /home/hskwon/backups/mysql/gitea_YYYYMMDD_HHMMSS.sql.gz | mysql gitea
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Slow Query 분석 (운영)
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# 로그 직접 확인
|
||
|
|
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 명령어
|
||
|
|
|
||
|
|
```sql
|
||
|
|
-- 현재 프로세스 목록
|
||
|
|
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 사용자 관리
|
||
|
|
|
||
|
|
```sql
|
||
|
|
-- 사용자 목록
|
||
|
|
SELECT user, host, plugin FROM mysql.user;
|
||
|
|
|
||
|
|
-- 사용자 권한 확인
|
||
|
|
SHOW GRANTS FOR 'codebridge'@'localhost';
|
||
|
|
|
||
|
|
-- 비밀번호 변경
|
||
|
|
ALTER USER 'codebridge'@'localhost' IDENTIFIED BY '새_비밀번호';
|
||
|
|
FLUSH PRIVILEGES;
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Redis 관리 (운영서버)
|
||
|
|
|
||
|
|
### 기본 명령
|
||
|
|
|
||
|
|
```bash
|
||
|
|
redis-cli info memory # 메모리 사용량
|
||
|
|
redis-cli dbsize # 키 개수
|
||
|
|
redis-cli --bigkeys # 가장 큰 키 확인
|
||
|
|
redis-cli info keyspace # 키 통계
|
||
|
|
redis-cli info commandstats | head -20 # 명령어 실행 통계
|
||
|
|
```
|
||
|
|
|
||
|
|
### 캐시 정리
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Laravel 캐시 삭제 (artisan)
|
||
|
|
cd /home/webservice/api/current
|
||
|
|
php artisan cache:clear
|
||
|
|
|
||
|
|
# 특정 접두어 키 삭제
|
||
|
|
redis-cli keys "laravel_cache:*" | xargs redis-cli del
|
||
|
|
|
||
|
|
# 전체 초기화 (세션도 삭제됨 - 주의)
|
||
|
|
redis-cli flushall
|
||
|
|
```
|
||
|
|
|
||
|
|
### 설정 임시 변경
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# maxmemory 임시 증가 (재시작 불필요)
|
||
|
|
redis-cli config set maxmemory 768mb
|
||
|
|
|
||
|
|
# maxmemory 확인
|
||
|
|
redis-cli config get maxmemory
|
||
|
|
```
|
||
|
|
|
||
|
|
### 실시간 모니터링
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# 실시간 명령어 모니터링 (부하 주의)
|
||
|
|
redis-cli monitor
|
||
|
|
# Ctrl+C로 중단
|
||
|
|
```
|