Claude에 mysql을 연결해보자
mcp는 llm과 서비스 간의 상호작용을 가능하게 합니다.
안전성만 보장이 된다면 dba업무에서 ai 사용 패턴을 아래와 같이 단순화 할 수 있습니다.
기존 : [ 문제 발생 -> 상태 파악 -> ai에 현상 전달, 피드백 -> 적용 ]
변화 : [ 문제 발생 -> ai가 상태 파악, 조치]
로컬에 테스트 db를 설치하고 mysql mcp를 클로드와 연결해 사용해봤습니다.
소스 : https://github.com/benborla/mcp-server-mysql
# config
claude mcp add mcp_server_mysql \
-e MYSQL_HOST="127.0.0.1" \
-e MYSQL_PORT="3306" \
-e MYSQL_USER="root" \
-e MYSQL_PASS="root" \
-e MYSQL_DB="test" \
-e ALLOW_INSERT_OPERATION="true" \
-e ALLOW_UPDATE_OPERATION="true" \
-e ALLOW_DELETE_OPERATION="true" \
-e ALLOW_DDL_OPERATION='true' \
-- npx @benborla29/mcp-server-mysql
# delete
claude mcp remove mcp_server_mysql
설정을 마친 뒤 테스트를 진행했습니다.
❯ 내 mysql db에서 회원 테이블에 맞게 접속 로그 테이블을 만들어 줘
● test.member_login_logs 테이블이 정상 생성됐습니다.
---
테이블 설계 요약
┌──────────────┬────────────────────────┬────────────────────────────────────────────────────────────────┐
│ 컬럼 │ 타입 │ 설명 │
├──────────────┼────────────────────────┼────────────────────────────────────────────────────────────────┤
│ log_id │ BIGINT UNSIGNED (PK) │ 로그 고유 ID (로그는 대용량 예상이라 BIGINT) │
├──────────────┼────────────────────────┼────────────────────────────────────────────────────────────────┤
│ member_id │ INT UNSIGNED (FK) │ members.id 참조, 탈퇴 시 CASCADE 삭제 │
├──────────────┼────────────────────────┼────────────────────────────────────────────────────────────────┤
│ email │ VARCHAR(100) │ 로그인 시도 이메일 (FK 삭제 후에도 기록 남기기 위해 별도 저장) │
├──────────────┼────────────────────────┼────────────────────────────────────────────────────────────────┤
│ login_at │ DATETIME │ 접속 시각 (DEFAULT: 현재 시각) │
...
인덱스: member_id, email, login_at 조회 성능을 위해 인덱스 추가
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
❯ 테스트 데이터 몇 개 넣어줘
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
● 총 14건 삽입 완료했습니다. 다양한 시나리오로 구성했습니다.
삽입된 테스트 데이터 시나리오
┌───────────────────────┬───────────────────────────────────────────────────────────────────────────────┐
│ 시나리오 │ 내용 │
├───────────────────────┼───────────────────────────────────────────────────────────────────────────────┤
│ 정상 로그인 │ 여러 회원의 PC·모바일·태블릿 등 다양한 기기에서 성공 │
├───────────────────────┼───────────────────────────────────────────────────────────────────────────────┤
│ 비밀번호 오류 후 성공 │ 오준혁(user7091) — 2회 실패 후 3번째 성공 │
├───────────────────────┼───────────────────────────────────────────────────────────────────────────────┤
│ 계정 비활성화 │ 오시우(user6091) — 비활성 계정 접근 시도 │
├───────────────────────┼───────────────────────────────────────────────────────────────────────────────┤
│ 의심스러운 연속 실패 │ 오준혁(user3091) — python-requests로 2초 간격 3회 연속 실패 (브루트포스 패턴) │
├───────────────────────┼───────────────────────────────────────────────────────────────────────────────┤
│ 다기기 접속 │ PC(Chrome/Edge/Firefox), iPhone, Android, iPad, Mac 등 다양한 User-Agent │
└───────────────────────┴───────────────────────────────────────────────────────────────────────────────┘
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
❯ 브루트포스 시도 회원 조회 쿼리 짜줘
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
...
❯ 운영에 적용시킬 변경사항 DDL을 .sql 파일로 추출해줘
파일 구성 내용
- 테스트 데이터(INSERT)는 제외하고 CREATE TABLE DDL만 포함
- 운영 DB에 바로 적용 가능하도록 DB명(test) 제거 — 운영 DB 선택 후 실행하는 방식
- IF NOT EXISTS는 의도적으로 제외 — 운영 적용 시 중복 실행 방지를 위해 명시적 오류가 더 안전
운영 적용 시 아래 순서로 실행하시면 됩니다.
USE 운영DB명;
SOURCE member_login_logs_ddl.sql;
역시나 만족스러운 결과가 나왔고 잘만 활용한다면 업무의 상당 부분을 자연어로 처리 가능할 것 같습니다.