# 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로 중단 ```