CentOS 7에 MySQL 5.6 데이터베이스 설치 개요
이 문서는 CentOS 7 운영체제에 MySQL 5.6 커뮤니티 서버를 설치하고 기본적인 설정을 완료하는 과정을 안내합니다. CentOS 7은 기본적으로 MariaDB를 MySQL의 대안으로 포함하고 있으므로, Oracle 공식 MySQL Yum 저장소를 추가하여 MySQL을 설치해야 합니다. Yum 패키지 관리자를 사용하면 필요한 의존성 패키지들을 자동으로 처리하여 설치 과정을 간소화할 수 있습니다.
환경 구성
- 운영체제: CentOS 7 (64비트)
- 데이터베이스: MySQL 5.6.24
필수 의존성 패키지 설치
MySQL 설치를 위해서는 libaio 라이브러리가 필요합니다. 다음 명령어를 사용하여 libaio를 설치합니다.
sudo yum install libaio -y
설치 후, 시스템에 이미 MySQL 또는 MariaDB 관련 패키지가 설치되어 있는지 확인하는 것이 좋습니다. 기존 패키지가 있다면, 잠재적인 충돌을 방지하기 위해 제거하는 것이 권장됩니다.
sudo yum list installed | grep -i "mysql\|mariadb"
만약 검색 결과에 불필요한 패키지가 나타난다면, 예를 들어 mariadb-libs가 설치되어 있다면 다음 명령어로 제거합니다.
sudo yum remove mariadb-libs -y
MySQL Yum 저장소 추가
MySQL 5.6 커뮤니티 버전을 설치하려면, 먼저 MySQL 공식 Yum 저장소를 시스템에 등록해야 합니다. 다음 URL에서 해당 CentOS 버전에 맞는 RPM 패키지를 다운로드합니다.
wget https://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm
만약 wget 명령어를 사용할 수 없다면, sudo yum install wget -y 명령어로 먼저 설치합니다.
다운로드한 RPM 패키지를 사용하여 MySQL Yum 저장소를 시스템에 추가합니다.
sudo yum localinstall mysql-community-release-el7-5.noarch.rpm -y
저장소가 성공적으로 추가되었는지 확인합니다.
sudo yum repolist enabled | grep "mysql.*-community.*"
이 명령어를 실행했을 때, MySQL 5.6 커뮤니티 저장소가 활성화되어 있는지 확인해야 합니다.
MySQL 서버 설치
저장소가 추가되면, Yum을 통해 MySQL 5.6 커뮤니티 서버를 설치할 수 있습니다. 이 과정에서 필요한 모든 의존성 패키지들이 자동으로 설치됩니다.
sudo yum install mysql-community-server -y
설치 과정 중 GPG 키 가져오기 여부를 묻는 메시지가 나타날 수 있습니다. 'y'를 입력하여 계속 진행합니다.
설치가 완료되면, MySQL 실행 파일의 위치를 확인할 수 있습니다.
whereis mysql
일반적으로 MySQL 클라이언트 실행 파일은 /usr/bin/mysql에 위치합니다.
MySQL 서비스 관리
CentOS 7에서는 systemctl 명령어를 사용하여 MySQL 서비스를 관리합니다.
MySQL 서비스 시작
sudo systemctl start mysqld
MySQL 서비스 상태 확인
sudo systemctl status mysqld
MySQL 서비스 중지
sudo systemctl stop mysqld
부팅 시 자동 시작 설정
시스템 부팅 시 MySQL 서비스가 자동으로 시작되도록 설정합니다.
sudo systemctl enable mysqld
자동 시작 설정 여부를 확인하려면:
systemctl is-enabled mysqld
MySQL 설치 확인
MySQL 서버가 제대로 설치되고 실행 중인지 확인하기 위해 MySQL 클라이언트에 접속해 봅니다.
mysql -u root -p
초기 설치 후 root 사용자의 비밀번호는 설정되어 있지 않을 수 있습니다. 비밀번호 입력 프롬프트에서 Enter를 누르면 접속됩니다.
다음과 같이 MySQL 프롬프트(mysql>)가 나타나면 성공적으로 설치된 것입니다.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is ...
Server version: 5.6.24 MySQL Community Server (GPL)
...
mysql>
접속을 종료하려면 exit;를 입력합니다.
방화벽 설정
원격에서 MySQL 서버에 접속하려면 기본 포트인 3306을 방화벽에서 열어주어야 합니다. CentOS 7에서는 firewalld 서비스를 사용하는 것이 권장됩니다.
TCP/UDP 3306 포트 허용
sudo firewall-cmd --permanent --zone=public --add-port=3306/tcp
sudo firewall-cmd --permanent --zone=public --add-port=3306/udp
방화벽 규칙 적용
변경 사항을 적용하려면 방화벽을 다시 로드합니다.
sudo firewall-cmd --reload
MySQL 보안 설정
MySQL 설치 후에는 mysql_secure_installation 스크립트를 실행하여 보안을 강화하는 것이 필수적입니다.
sudo mysql_secure_installation
스크립트는 다음과 같은 단계들을 안내합니다. 각 단계에서 'y'를 입력하여 권장되는 보안 설정을 적용합니다.
- 현재
root비밀번호 입력 (초기에는 비어있으므로 Enter) - 새
root비밀번호 설정 - 익명 사용자 계정 제거
root원격 접속 비활성화test데이터베이스 제거- 권한 테이블 다시 로드
원격 접속 사용자 계정 설정
원격 접속을 허용하려면 새로운 사용자를 생성하고 적절한 권한을 부여해야 합니다. MySQL 클라이언트에 root 사용자로 접속합니다.
mysql -u root -p
애플리케이션 사용자 계정 생성 및 권한 부여
애플리케이션에서 사용할 일반 사용자 app_user를 생성하고, 모든 데이터베이스에 대한 SELECT, INSERT, UPDATE, DELETE 권한을 부여합니다.
CREATE USER 'app_user'@'%' IDENTIFIED BY 'your_secure_password_1';
GRANT SELECT, INSERT, UPDATE, DELETE ON *.* TO 'app_user'@'%';
데이터베이스 관리자 계정 생성 및 권한 부여
데이터베이스 관리(백업, 복원 등)를 위한 관리자 사용자 db_admin을 생성하고, 모든 데이터베이스에 대한 모든 권한을 부여합니다.
CREATE USER 'db_admin'@'%' IDENTIFIED BY 'your_secure_password_2';
GRANT ALL PRIVILEGES ON *.* TO 'db_admin'@'%' WITH GRANT OPTION;
권한 변경 사항 적용
새로운 권한 설정을 즉시 적용합니다.
FLUSH PRIVILEGES;
MySQL 클라이언트에서 exit;를 입력하여 나옵니다.
MySQL 데이터 저장 경로 변경 (선택 사항)
기본 데이터 저장 경로(/var/lib/mysql)를 다른 디렉터리로 변경할 수 있습니다. 예를 들어, /opt/mysql_data로 변경합니다.
새 데이터 디렉터리 생성
sudo mkdir -p /opt/mysql_data
MySQL 서비스 중지
sudo systemctl stop mysqld
기존 데이터 이동
기존 MySQL 데이터를 새로 생성한 디렉터리로 이동합니다.
sudo mv /var/lib/mysql /opt/mysql_data/
my.cnf 파일 수정
MySQL 설정 파일 /etc/my.cnf를 편집하여 데이터 경로를 업데이트합니다.
sudo vi /etc/my.cnf
다음 내용을 [mysqld] 섹션과 [mysql] 섹션에 추가하거나 수정합니다.
[mysqld]
datadir=/opt/mysql_data/mysql
socket=/opt/mysql_data/mysql/mysql.sock
[mysql]
socket=/opt/mysql_data/mysql/mysql.sock
새 데이터 디렉터리 권한 설정
이동한 데이터 디렉터리에 MySQL 프로세스가 접근할 수 있도록 권한을 설정합니다.
sudo chown -R mysql:mysql /opt/mysql_data/mysql
SELinux 설정 조정 (필요시)
SELinux가 Enforcing 모드일 경우, 새로운 데이터 경로 접근을 차단할 수 있습니다. 가장 안전한 방법은 SELinux 정책을 변경하여 새로운 경로를 허용하는 것입니다. semanage 명령어를 사용하여 MySQL 데이터베이스 유형 컨텍스트를 추가합니다.
sudo semanage fcontext -a -t mysqld_db_t "/opt/mysql_data/mysql(/.*)?"
sudo restorecon -Rv /opt/mysql_data/mysql
만약 semanage 명령어를 찾을 수 없다면 sudo yum install policycoreutils-python -y를 실행합니다.
임시 방편으로 SELinux를 Permissive 모드로 변경할 수도 있으나, 이는 시스템 보안에 영향을 미치므로 운영 환경에서는 권장되지 않습니다.
sudo vi /etc/selinux/config
SELINUX=enforcing 부분을 찾아 SELINUX=permissive로 변경합니다. 변경 사항을 적용하려면 시스템을 재부팅해야 합니다.
sudo reboot
MySQL 서비스 재시작
모든 설정 변경 후 MySQL 서비스를 재시작합니다.
sudo systemctl start mysqld
MySQL 문자 집합 (Character Set) 설정
한글 등 다국어 데이터를 올바르게 처리하기 위해 MySQL의 기본 문자 집합을 UTF-8로 설정하는 것이 좋습니다.
현재 문자 집합 확인
MySQL 클라이언트에 접속하여 현재 문자 집합 설정을 확인합니다.
SHOW VARIABLES LIKE 'character%';
character_set_server와 character_set_database가 latin1 등으로 되어 있다면 변경이 필요합니다.
my.cnf 파일 수정
/etc/my.cnf 파일을 편집하여 다음 내용을 추가합니다.
[mysqld]
character-set-server = utf8
collation-server = utf8_general_ci
[mysql]
default-character-set = utf8
[client]
default-character-set = utf8
MySQL 서비스 재시작 및 확인
설정 변경 후 MySQL 서비스를 재시작합니다.
sudo systemctl restart mysqld
다시 MySQL 클라이언트에 접속하여 문자 집합이 utf8로 변경되었는지 확인합니다.
SHOW VARIABLES LIKE 'character%';
주요 MySQL 서버 설정 파라미터
/etc/my.cnf 파일을 수정하여 MySQL 서버의 성능을 최적화할 수 있습니다. 몇 가지 중요한 파라미터는 다음과 같습니다.
[mysqld]
# MySQL이 설치된 기본 디렉토리
basedir = /usr
# 데이터 파일이 저장될 디렉토리
datadir = /opt/mysql_data/mysql
# 프로세스 ID 파일 경로 (유닉스/리눅스 전용)
pid-file = /var/run/mysqld/mysqld.pid
# MySQL 클라이언트와 서버 간 로컬 통신을 위한 소켓 파일 경로
socket = /opt/mysql_data/mysql/mysql.sock
# MySQL 서버가 요청을 수신할 포트 번호
port = 3306
# 인덱스 블록을 위한 버퍼 크기. 읽기 및 다중 쓰기 성능 향상에 기여 (메모리 크기에 비례하여 설정).
key_buffer_size = 128M
# 모든 스레드가 열 수 있는 테이블의 수. 빈번한 테이블 열기/닫기 오버헤드 감소.
table_open_cache = 2000
# 정렬 작업이 필요한 스레드에 할당되는 버퍼 크기. ORDER BY 또는 GROUP BY 작업 속도 향상 (연결당 할당).
sort_buffer_size = 2M
# 순차 스캔 작업에 사용되는 버퍼 크기 (연결당 할당).
read_buffer_size = 2M
# MySQL 쿼리 결과 캐시 크기. 동일한 쿼리가 반복될 때 성능 향상.
query_cache_size = 32M
# 랜덤 읽기 작업에 사용되는 버퍼 크기.
read_rnd_buffer_size = 512K
# 최대 동시 연결 수.
max_connections = 200
# MySQL의 외부 잠금 사용을 비활성화하여 안정성 향상.
skip-locking
# DNS 이름 역확인 비활성화. 연결 속도 향상 (원격 접속 시 IP 주소만 사용 가능).
skip-name-resolve
# 느린 쿼리 로깅 활성화 및 파일 경로 설정.
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
# 2초 이상 걸리는 쿼리를 느린 쿼리로 기록.
long_query_time = 2
[mysql]
socket = /opt/mysql_data/mysql/mysql.sock
default-character-set = utf8
[client]
default-character-set = utf8
[mysqldump]
# 서버와 클라이언트 간에 전송될 수 있는 최대 패킷 크기.
max_allowed_packet = 16M
설정 변경 후에는 MySQL 서비스를 반드시 재시작해야 적용됩니다.
데이터베이스 백업 및 복원
백업 (mysqldump)
mysqldump 유틸리티를 사용하여 특정 데이터베이스를 백업합니다. 예를 들어, production_db 데이터베이스를 백업하는 경우:
sudo mysqldump -u db_admin -p production_db > production_db_backup.sql
InnoDB 테이블의 경우, 일관된 백업을 위해 --single-transaction 옵션을 사용하는 것이 좋습니다.
sudo mysqldump --single-transaction -u db_admin -p production_db > production_db_backup.sql
복원 (mysql)
백업된 SQL 파일을 사용하여 데이터베이스를 복원합니다. 복원 전에 대상 데이터베이스가 존재해야 합니다.
mysql -u db_admin -p production_db < production_db_backup.sql
또는, 데이터베이스를 새로 생성하면서 복원할 수도 있습니다.
mysql -u db_admin -p -e "CREATE DATABASE IF NOT EXISTS production_db;"
mysql -u db_admin -p production_db < production_db_backup.sql