개요
MySQL Operation 및 유지관리에 자주 사용하는 명령어를 정리합니다. 데이터베이스/테이블 조회, 사용자 권한 관리, 프로세스 모니터링, 서비스 시작/중지 방법을 빠르게 참조할 수 있는 운영 레퍼런스입니다.
MySQL Operation
- DB 구성 상태 확인
> show databases;
// 데이터베이스 목록 보기
> show tables;
// 테이블 목록 보기
> show columns from 'table name';
// 테이블 칼럼 목록 보기
> SHOW VARIABLES LIKE 'c%';
// 캐릭터셋 보기
MySQL Maintenance
- DBMS 상태 확인
> show status;
// MySQL 데이타베이스의 현재 상황
> show Processlist;
// MySQL 프로세스 목록
> show variables
// 설정 가능한 모든 변수 목록
> SELECT table_schema "Database Name", SUM(data_length + index_length) / 1024 / 1024 "Size(MB)" FROM information_schema.TABLES GROUP BY table_schema;
// DB별 사용량 확인
SELECT table_name, table_rows, round(data_length/(1024*1024),2) as 'DATA_SIZE(MB)', round(index_length/(1024*1024),2) as 'INDEX_SIZE(MB)' FROM information_schema.TABLES where table_schema = '데이터베이스이름' GROUP BY table_name ORDER BY data_length DESC LIMIT 20;
// 해당 DB의 테이블 사이즈 상위 20개 정렬
- Connection 및 Client 상태 확인
> show variables like '%max_connection%';
// 최대 커넥션 가능 수량 확인
> show status like '%connect%';
// 커넥션 연결 상태 확인
> show status like '%clients%';
// 클라이언트 연결 상태 확인
> show status like '%thread%';
// 쓰레드 상태 확인
| Topic | Desc |
| Aborted_clients | 클라이언트 프로그램이 비 정상적으로 종료된 수 |
| Aborted_connects | MySQL 서버에 접속이 실패된 수 |
| Max_used_connections | 최대로 동시에 접속한 수 |
| Threads_cached | Thread Cache의 Thread 수 |
| Threads_connected | 현재 연결된 Thread 수 |
| Threads_created | 접속을 위해 생성된 Thread 수 |
| Threads_running | Sleeping 되어 있지 않은 Thread 수 |
| wait_timeout | 종료전까지 요청이 없이 기다리는 시간 (TCP/IP 연결, Shell 상의 접속이 아닌 경우) |
| thread_cache_size | thread 재 사용을 위한 Thread Cache 수로써, Cache 에 있는 Thread 수보다 접속이 많으면 새롭게 Thread를 생성한다. |
| max_connections | 최대 동시 접속 가능 수 |
사용자 및 권한 관리
MySQL/MariaDB 운영에서 계정 관리는 보안의 핵심입니다. 애플리케이션별로 전용 계정을 만들고 필요한 권한만 부여하는 최소 권한 원칙(Principle of Least Privilege)을 따르는 것이 중요합니다. 아래는 자주 사용하는 사용자 생성, 권한 부여, 확인 명령어입니다.
-- 사용자 생성 (특정 호스트에서만 접속 허용) CREATE USER 'app_user'@'x.x.x.x' IDENTIFIED BY '<REDACTED>'; -- DB 전체 권한 부여 GRANT ALL PRIVILEGES ON mydb.* TO 'app_user'@'x.x.x.x'; -- 특정 권한만 부여 (읽기 전용 계정) GRANT SELECT ON mydb.* TO 'readonly_user'@'%'; -- 모니터링 계정 권한 부여 GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'localhost'; -- 권한 목록 확인 SHOW GRANTS FOR 'app_user'@'x.x.x.x'; -- 권한 즉시 반영 FLUSH PRIVILEGES; -- 사용자 삭제 DROP USER 'old_user'@'%';
계정의 접속 호스트를 '%'(모든 호스트)로 지정하면 편리하지만 보안 위협이 증가합니다. 내부 서비스 계정은 가능하면 특정 IP 또는 서브넷으로 제한하고, 외부에서의 직접 DB 접근은 방화벽으로 차단하는 것이 권장됩니다.
서비스 관리
MySQL/MariaDB 서비스의 시작, 중지, 재시작, 상태 확인은 운영 중 가장 자주 실행하는 명령입니다. 서비스 재시작 전에는 반드시 현재 접속된 세션 수(SHOW STATUS LIKE '%connect%')를 확인하여 영향을 최소화해야 합니다.
# systemd 기반 (RHEL 7+, Ubuntu 16.04+) systemctl start mariadb # 시작 systemctl stop mariadb # 중지 systemctl restart mariadb # 재시작 systemctl status mariadb # 상태 확인 systemctl enable mariadb # 부팅 시 자동 시작 등록 # 설정 파일 변경 후 재시작 없이 일부 변수 반영 mysql -u root -p -e "SET GLOBAL max_connections = 500;"
데이터 디렉토리 기본 경로는 /var/lib/mysql이며, 용량이 부족하면 서비스가 비정상 종료될 수 있습니다. df -h /var/lib/mysql로 주기적으로 용량을 확인하고, slow query log(slow_query_log = 1)를 활성화하면 성능 병목 쿼리를 사전에 파악할 수 있습니다.
Slow Query 및 성능 모니터링
MySQL/MariaDB에서 성능 문제를 진단할 때 가장 먼저 확인하는 것이 Slow Query Log입니다. 설정된 임계값(long_query_time, 기본 10초)을 초과하는 쿼리를 자동으로 기록합니다. 운영 서버에서는 1~2초로 설정하여 느린 쿼리를 사전에 파악합니다. 설정 파일(my.cnf)에서 활성화하거나 서비스 재시작 없이 동적으로 설정할 수 있습니다.
-- Slow Query 설정 확인 SHOW VARIABLES LIKE 'slow_query%'; SHOW VARIABLES LIKE 'long_query_time'; -- 동적으로 Slow Query Log 활성화 (재시작 불필요) SET GLOBAL slow_query_log = 'ON'; SET GLOBAL long_query_time = 2; SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log'; -- 현재 실행 중인 쿼리 중 오래 걸리는 것 확인 SELECT * FROM information_schema.PROCESSLIST WHERE TIME > 5 ORDER BY TIME DESC;
Slow Query 로그는 mysqldumpslow 도구로 분석하면 가장 오래 걸린 쿼리, 가장 많이 호출된 쿼리를 빠르게 파악할 수 있습니다. 식별된 쿼리에 인덱스를 추가하거나 쿼리를 개선하여 성능을 향상시킵니다.
참고
참고 문서: MySQL SQL 문법 공식 문서 · MySQL 계정 관리 문법