티스토리 뷰

개요

  • MariaDBMySQL 5.5(Oracle이 소유하기 전의 마지막 버전)의 포크 버전이다. 포크 버전이기 때문에 초기 설치 과정을 제외한 모든 환경이 MySQL과 유사하다.

  • MariaDB는 앞서 설명한 이유로 오라클이 본격적으로 기능 개선을 시작한 MySQL 5.6, 5.7과는 호환되지 않는다. MySQL 5.6부터 추가된 고가용성 관련 기능 때문에 MariaDB를 대용량 데이터베이스로 권장하지 않기도 한다. [관련 링크1] [관련 링크2]

  • 이번 글에서는 CentOS 7에서 MariaDB를 설치하는 과정을 설명하고자 한다.

MariaDB 패키지 저장소 생성

  • MariaDB 리파지터리 생성기에 접속하여 아래 절차대로 선택하면 운영체제에 맞는 yum 저장소 파일을 생성해준다. 생성된 내용을 복사해둔다.
1. Choose a Distro: CentOS
2. Choose a Release: CentOS 7 (x86_64)
3. Choose a Version: 10.4 [Stable]
  • 복사해둔 내용으로 아래와 같이 yum 저장소 파일을 생성한다.
$ sudo nano /etc/yum.repos.d/MariaDB.repo
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.4/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

MariaDB 설치 및 실행

  • 아래 명령을 실행하여 MariaDB를 설치한다.
# MariaDB 설치
$ sudo yum install MariaDB-server MariaDB-client MariaDB-backup socat -y

# MariaDB 설치된 패키지 확인
$ sudo yum list installed | grep -i mariadb
MariaDB-backup.x86_64              10.4.12-1.el7.centos       @mariadb
MariaDB-client.x86_64              10.4.12-1.el7.centos       @mariadb
MariaDB-common.x86_64              10.4.12-1.el7.centos       @mariadb
MariaDB-compat.x86_64              10.4.12-1.el7.centos       @mariadb
MariaDB-server.x86_64              10.4.12-1.el7.centos       @mariadb
galera-4.x86_64                    26.4.3-1.rhel7.el7.centos  @mariadb

# MariaDB 버전 확인
$ mysql -V
mysql  Ver 15.1 Distrib 10.4.12-MariaDB, for Linux (x86_64) using readline 5.1

# MariaDB 환경 설정
$ sudo nano /etc/my.cnf.d/server.cnf
[mariadb]
log_output=FILE
general_log
general_log_file=/var/log/mysql/mariadb.log
log_error=/var/log/mysql/mariadb.err

# MariaDB 로그 파일 생성
$ sudo mkdir /var/log/mysql
$ sudo chown mysql:mysql /var/log/mysql
$ sudo touch /var/log/mysql/mariadb.log
$ sudo chown mysql:mysql /var/log/mysql/mariadb.log
$ sudo touch /var/log/mysql/mariadb.err
$ sudo chown mysql:mysql /var/log/mysql/mariadb.err

# 시스템 부팅시 MariaDB 서비스 자동 실행 설정
$ sudo systemctl enable mariadb.service

# MariaDB 실행
$ sudo systemctl start mariadb
  • MariaDB 10.4부터는 설치시 Galera Cluster 4.0을 지원하는 Galera 플러그인이 같이 설치된다.

MariaDB 보안 설정

  • 설치된 MariaDB를 운영 환경에 걸맞는 보안 수준으로 변경하기 위해 아래와 같이 보안 설정을 실행한다.
# MariDB 보안 설정 실행
$ mysql_secure_installation
# 새로운 root 계정 비밀번호를 설정
Change the root password? [Y/n] y

# 익명 계정 접근을 불허
Remove anonymous users? [Y/n] y

# 원격 root 계정 접근을 불허, 오직 로컬 콘솔에서만 접근 허용
Disallow root login remotely? [Y/n] y

# 테스트 데이터베이스를 제거
Remove test database and access to it? [Y/n] y

# MariaDB 재시작
$ sudo service mysql restart

# MariaDB 클라이언트 실행
$ mysql -u root -p

MariaDB 튜닝

  • MySQLTuner를 설치하면 현재 데이터베이스 서버 환경을 분석하여 개선점을 제안해준다. 아래와 같이 설치한다.
# MySQLTuner 설치
$ mkdir /opt/mysqltuner
$ cd /opt/mysqltuner
$ wget http://mysqltuner.pl/ -O mysqltuner.pl
$ wget https://raw.githubusercontent.com/major/MySQLTuner-perl/master/basic_passwords.txt -O basic_passwords.txt
$ wget https://raw.githubusercontent.com/major/MySQLTuner-perl/master/vulnerabilities.csv -O vulnerabilities.csv

# MySQLTuner 실행
$ perl mysqltuner.pl

UTF-8 인코딩 설정

  • 레거시 데이터베이스의 경우 기본 인코딩이 euckr로 설정된 경우가 많은데, 이 경우 Java에서 한글 문자열을 VARCHAR 타입에 읽어오고 저장할 때 아래와 같이 예외가 발생한다.
java.sql.SQLException: Incorrect string value: '\xED\x85\x8C\xEC\x8A\xA4...' for column 'some_column' at row 1
  • 위 문제는 클라이언트에서 쿼리를 전송하기 전에 각각 자신의 인코딩에 해당하는 명령을 실행해주면 해결된다.
// EUC-KR 클라이언트의 경우
SET NAMES euckr

// UTF-8 클라이언의 경우
SET NAMES utf8mb4
  • SET NAMES {charset_name} 명령은 서버에 저장된 테이블과 컬럼의 캐릭터셋이 무엇이든지 간에 내가 원하는 캐릭터셋으로 변환해서 달라는 요청과도 같다. 이를 위해 구체적으로 아래 3가지 세션 시스템 변수를 일괄 설정한다. [관련 링크]
    • character_set_client: 클라이언트가 서버와 통신할 때 주고 받는 정보에 대한 캐릭터셋이다.
    • character_set_connection: 클라이언트로부터 전달 받은 문자 정보에 대한 연산 또는 비교가 필요할 경우 사용되는 캐릭터셋이다.
    • character_set_results: 클라이언트가 서버에게 SELECT 문을 실행하여 반환 받는 정보에 대한 캐릭터셋이다.
  • 근본적으로는 아래와 같이 utf8mb4 인코딩으로 변경하여 해결할 수 있다. (MariaDB를 처음 설치하면, 기본 인코딩인 latin1로 설정되기 때문에 아래 설정은 중요하다.)
# my.cnf 파일 로드 우선순위 확인
$ mysqladmin --help | grep my.cnf
/etc/my.cnf /etc/mysql/my.cnf ~/.my.cnf

# my.cnf 파일 편집
$ sudo nano /etc/my.cnf
[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld]
# character-set-client-handshake = FALSE
# init_connect = "SET collation_connection = utf8mb4_unicode_ci"
# init_connect = "SET NAMES utf8mb4"
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

# MySQL/MariaDB 서비스 상태 확인
$ sudo service mysql status
SUCCESS! MySQL running (3325)

# MySQL/MariaDB 서비스 재시작
$ sudo service mysql restart

# 설정된 인코딩 확인
$ mysql
> STATUS
Server characterset:    utf8mb4
Db     characterset:    utf8mb4
Client characterset:    utf8mb4
Conn.  characterset:    utf8mb4

> SHOW VARIABLES LIKE 'c%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8mb4                    |
| character_set_connection | utf8mb4                    |
| character_set_database   | utf8mb4                    |
| character_set_filesystem | binary                     |
| character_set_results    | utf8mb4                    |
| character_set_server     | utf8mb4                    |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
| collation_connection     | utf8mb4_general_ci         |
| collation_database       | utf8mb4_unicode_ci         |
| collation_server         | utf8mb4_unicode_ci         |
| completion_type          | NO_CHAIN                   |
| concurrent_insert        | AUTO                       |
| connect_timeout          | 10                         |
+--------------------------+----------------------------+
14 rows in set (0.00 sec)

다음 단계로 읽을만한 글

참고 글


댓글
댓글쓰기 폼