태그 보관물: mariadb

MySQL Operation, Maintenance

개요

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 계정 관리 문법

MariaDB 10.3 설치

개요

MariaDB는 MySQL의 오픈소스 포크로, MySQL과 거의 동일한 SQL 문법과 드라이버를 지원하면서 성능 개선과 추가 기능을 제공합니다. CentOS 7 기본 yum 저장소에는 MariaDB 5.5가 포함되어 있어, 10.3 이상의 버전을 설치하려면 공식 MariaDB 저장소를 추가해야 합니다. MariaDB 10.3은 장기 지원(LTS) 버전으로 안정성이 검증되어 있으며 WordPress, Zabbix, rsyslog 등 다양한 애플리케이션과 호환됩니다.

이 글에서는 CentOS 7 환경에 MariaDB 10.3을 설치하는 방법을 정리합니다. MariaDB 공식 yum 리포지토리를 등록한 후 패키지를 설치하고, 초기 보안 설정(mysql_secure_installation)을 진행하여 운영 환경에서 사용할 수 있는 상태로 구성하는 절차를 다룹니다.

1. yum repository 경로 설정

# vi /etc/yum.repos.d/MariaDB.repo

[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.3/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

2. 패키지 설치 및 서비스 실행

# yum install MariaDB-client MariaDB-server -y

# systemctl enable mariadb
# systemctl start mariadb

3. mariadb 접속 확인 및 비밀번호 설정

# mysql -u root

> use mysql;

> update user set password = password('새비밀번호') where user='root';
// 비밀번호 설정('') 넣어야 됨
> flush privileges;

mysql_secure_installation 보안 설정

MariaDB 설치 후 초기 상태에서는 root 계정에 비밀번호가 없고 익명 사용자 계정이 존재하는 등 보안이 취약합니다. mysql_secure_installation을 실행하면 대화형으로 보안 강화 설정을 진행할 수 있습니다.

# mysql_secure_installation

# 주요 질문과 권장 답변:
# Set root password? → Y, 강력한 비밀번호 입력
# Remove anonymous users? → Y (익명 사용자 제거)
# Disallow root login remotely? → Y (root 원격 접속 차단)
# Remove test database? → Y (테스트 DB 제거)
# Reload privilege tables? → Y (권한 테이블 즉시 반영)

보안 설정 완료 후 root 비밀번호로 로그인되는지 확인합니다. 애플리케이션 전용 계정은 root 대신 별도 계정을 생성하고 필요한 DB에만 권한을 부여하는 최소 권한 원칙을 따르는 것이 권장됩니다.

캐릭터셋 및 시간대 설정

한국어 데이터와 이모지를 올바르게 저장하려면 캐릭터셋을 utf8mb4로 설정합니다. /etc/my.cnf.d/mariadb-server.cnf(또는 /etc/my.cnf)에 아래 설정을 추가합니다.

[mysqld]
character-set-server = utf8mb4
collation-server     = utf8mb4_unicode_ci
default-time-zone    = '+09:00'

[client]
default-character-set = utf8mb4

설정 변경 후 systemctl restart mariadb로 서비스를 재시작하고, SHOW VARIABLES LIKE 'character%'로 적용 여부를 확인합니다.

초기 데이터베이스 및 계정 생성

MariaDB 설치 후 애플리케이션 전용 데이터베이스와 계정을 생성하는 것이 기본 설정 마무리 단계입니다. root 계정을 직접 사용하는 것보다 애플리케이션별 전용 계정을 만들고 필요한 데이터베이스에만 권한을 부여하는 최소 권한 원칙을 따릅니다. 아래는 WordPress용 DB와 계정 생성 예시입니다.

-- MariaDB root로 접속
$ mysql -u root -p

-- 데이터베이스 생성 (utf8mb4 charset 지정)
CREATE DATABASE wordpress CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 전용 계정 생성 및 권한 부여
CREATE USER 'wp_user'@'localhost' IDENTIFIED BY '<REDACTED>';
GRANT ALL PRIVILEGES ON wordpress.* TO 'wp_user'@'localhost';
FLUSH PRIVILEGES;

-- 계정 및 권한 확인
SELECT user, host FROM mysql.user;
SHOW GRANTS FOR 'wp_user'@'localhost';

원격 접속이 필요한 경우 'wp_user'@'%'로 생성하되, 방화벽에서 3306 포트를 신뢰하는 IP 대역으로만 제한하는 것이 권장됩니다. MariaDB의 bind-address 설정을 통해 특정 인터페이스에서만 리스닝하도록 제한하면 추가적인 보안 레이어를 확보할 수 있습니다. 계정 생성 후 mysql -u wp_user -p wordpress로 접속이 정상적으로 되는지 반드시 검증합니다.

참고

참고 문서: MariaDB yum 리포지토리 설정 공식 문서 · mysql_secure_installation 가이드