RHEL 과 CentOS 6 에는 MySQL 5.1 이 기본 탑재되어 있다. 5.1 은 출시된지 꽤 시간이 흘렀으므로 서비스용 DBMS 라면 사용시 고민을 할 여지가 있겠지만 redmine 이나 gitlab 의 데이타 저장소로 사용할 경우 큰 불편이 없다.

또 기본 패키지이므로 외부 yum 저장소에서 별도의 설치 파일을 구할 필요없이 기본 저장소에서 손쉽게 설치할 수 있으므로 5.1을 사용하도록 하자.

 

설치

전 절에서 배운 yum 명령어로 mysql 을 손쉽게 설치할 수 있다. yum search mysql 을 실행하면 많은 패키지가 표시되는데 그 중에 꼭 설치해야 할 패키지 및 용도는 다음과 같다.

  • mysql - MySQL 클라이언트 패키지로 mysql 커맨드 클라이언트와,  mysqldump, mysqlimport 등의 유틸리티가 포함되어 있다.
  • mysql-libs - mysql 의 필수 라이브러리와 관련 파일이 있다. mysql 패키지가 의존하고 있으므로 mysql 패키지 설치가 자동으로 같이 설치된다.
  • mysql-server - MySQL 서버 데몬과 프로그램, 관련 파일들이 있는 패키지이다. 
  • mysql-devel - MySQL 어플리케이션을 개발할 때 필요한 헤더 파일과 라이브러리를 포함하고 있다. redmine 이나 gitlab 은 ruby 로 개발되어 있고 ruby 의 DB 커넥터는 C 언어로 개발되어 있으므로 mysql-devel 패키지가 있어야 redmine 이나 gitlab 을 설치할 수 있다.

 

이제 사용할 패키지를 알았으니 yum 으로 설치해 보자.

# yum install mysql mysql-devel mysql-server mysql-libs

 

설정

런레벨 조정

시스템이 부팅되면 MySQL DBMS 도 자동 구동되게 설정해 보자. 중요 명령어와 유틸리티 장에서 학습한 servicechkconfig 명령어를 사용하면 가능하다.

MySQL DBMS 의 서비스명은 mysqld 이다. 먼저 현재 mysql 의 런레벨을 확인해 보자.

# chkconfig --list mysqld mysqld 0:해제 1:해제 2:해제 3:해제 4:해제 5:해제 6:해제

기본 설정은 자동으로 구동되지 않는 다는 것을 알았다. 이제 부팅시 같이 구동되게 설정해 보자.

# chkconfig mysqld on # chkconfig --list mysqld mysqld 0:해제 1:해제 2:활성 3:활성 4:활성 5:활성 6:해제

 

서비스 구동

service 명령어로 구동해 보자. 처음 구동이므로 여러 가지 안내 메시지를 출력한다. 그중에 유심히 봐야 할 부분은 다음과 같이 암호를 변경하라는 부분이다.

처음 설치하면 root 암호가 없으므로 암호부터 설정해야 한다. 안내 메시지대로 mysqladmin -u root password 'new-password' 를 실행하여 암호를 변경하자. 새로운 암호는 'new-password' 가 된다.  (암호 입력시에 ' 문자는 넣어도 되고 생략해도 된다.)

service mysqld start

service mysqld start
MySQL 데이타베이스 초기화 중: Installing MySQL system tables...
OK
Filling help tables...
OK

To start mysqld at boot time you have to copy
support-files/mysql.server to the right place for your system

PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !
To do so, start the server, then issue the following commands:

/usr/bin/mysqladmin -u root password 'new-password'
/usr/bin/mysqladmin -u root -h centos password 'new-password'

 

이제 mysql 클라이언트로 연결하여 정상적으로 구동되었는지 확인해 보자. mysql>  프롬프트가 보이면 정상 설치된 것이다.

# mysql -u root -p'new-password'

 

설정

정상 설치 및 동작을 확인했지만 아쉽게도 이 상태로는 redmine 과 gitlab 을 사용하지 못한다. 가장 문제가 되는 부분은 문자열 설정이다.  5.1은 기본 문자 집합이 latin1 이므로 이 설정대로 사용하면 한글이 모두 깨지는 문제가 있다. 현재 설정은 mysql 클라이언트로 연결후에 status 명령어를 실행하면 확인할 수 있다.

문자열 설정을 utf-8 로 변경하여 이 문제를 수정해 보자.

MySQL 의 설정 파일인 /etc/my.cnf 를 에디터로 열어서 까만 색으로 표시된 내용을 추가하자.

[mysqld]
datadir=/var/lib/mysql
character-set-server=utf8
max_allowed_packet = 32M

socket=/var/lib/mysql/mysql.sock
user=mysql

# 여러 보안 위험을 예방하기 위해서는 심볼릭 링크를 끄는 것을 권장
symbolic-links=0

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

 

[mysql]

default-character-set=utf8
port = 3306
socket = /var/lib/mysql/mysql.sock

MySQL 5.5 부터는 default-character-set 설정이 제거되었으니 혹시 5.5 를 사용하는 독자들은 mysql 섹션에서 default-character-set 를 제거하면 된다.

이제 service mysqld restart 로 mysql 을 재구동해 보자.

 

확인

마찬가지로 mysql 클라이언트로 연결후에 status 명령어로 정상 설정 여부를 확인할 수 있다. 첨부처럼 모든 characterset 항목에 utf8 이 표시되야 한다.

MySQL 문제 해결

 

로그 파일 위치

데몬 프로세스에서 문제가 발생했을 때 가장 먼저 해야할 일은 무엇일까? 바로 로그 파일을 보고 원인을 분석하는 일이다. MySQL 이 오작동하거나 설정 오류로 구동되지 않을 경우 먼저 로그 파일을 확인해야 한다.

그러면 MySQL 은 어디에 로그 파일을 남기는지 확인해 보자.

먼저 설정 파일에 log-error 항목이 있을 경우 지정된 경로에 로그 파일이 만들어 진다. 위 설정은 /var/log/mysqld.log 이므로 여기에 로그 내용이 남게 된다.

log-error 가 명시적으로 지정되지 않았을 경우 /var/lib/mysql 디렉터리에 hostname.err 라는 이름의 파일에 로그를 남기게 된다. 여기서 hostname 은 MySQL 이 구동되는 서버의 호스트명으로 치환된다. 호스트명이 devel  인 서버에서 MySQL 을 구동하면 /var/lib/mysql/devel.err 파일에 로그를 기록하게 된다.

이제 RHEL 기반의 리눅스에서 MySQL 이 구동되지 않게 하는 주요 설정 실수를 살펴 보자.

log-error 로 로그 파일을 지정할 경우 임의의 경로를 지정하면 SELinux 의 보안 정책에 차단당하여 로그가 남지 않으므로 주의해야 한다.

가능한 경로는 /var/log 나 /var/lib/mysql 이며 그외의 경로에 로그를 남기려면 semanage 를 사용하여 fcontext 를 추가해야 한다.

 

data file 경로 변경

MySQL 이 사용하는 데이타 베이스의 경로는 설정 파일의 datadir 항목에 지정되어 있다. 데이타가 많아져서 해당 파티션이 부족해져서 다른 디렉터리로 옮길 경우 mysqld_db_t 보안 컨텍스트를 설정하지 않으면 MySQL 이 읽을 수 없다.

파티션이 부족해질 경우 다른 디렉터리로 옮기는 거 보다는 새로운 디스크를 추가하고 볼륨 관리자에 디스크를 추가하여 볼륨을 늘리는 방법이 변경 작업을 최소화하는 좋은 선택이다.


기본 Port 변경

MySQL 이  사용하는 기본 TCP 포트는 3306 이다. 이 포트를 변경할 경우 /etc/my.cnf 에 port 항목만 변경하고 재구동하는 경우가 있는데 SELinux 가 차단하므로 제대로 구동되지 않는다. port 를 3307 로 변경하고 재구동했을 경우 에러 상황을 로그 파일을 통해 확인해 보자.

포트 변경시 에러 메시지

140707 0:43:45 [ERROR] Can't start server: Bind on TCP/IP port: Permission denied
140707 0:43:45 [ERROR] Do you already have another mysqld server running on port: 3307 ?
140707 0:43:45 [ERROR] Aborting

위와 같이 권한이 없다는 에러가 발생하므로 SELinux 의 보안 정책중 port 항목을 추가해 주어야 한다. semanage port 명령어를 사용하여 현재 사용이 허가된 포트를 확인해 보자.

semanage port -l |grep mysqld

mysqld_port_t tcp 1186, 3306, 63132-63164

3307 포트는 사용이 가능하지 않으므로 추가해 주어야 한다. 

semanage port -a -p tcp  -t mysqld_port_t 3307

이제 service mysqld restart  로 재구동하면 정상 동작함을 확인할 수 있다.

 

관리자 암호 분실

여러 대의 MySQL 를 운영하고 각각 암호를 달리할 경우 관리자 암호를 잃어버려서 root 로 로그인 할 수가 없는 경우가 있다. 다음과 같은 절차로 관리자 암호를 복구해 보자

 

  1. MySQL 서버를 중지한다. 

    service mysql stop

  2. 에디터에서 다음 내용의 text 파일을 만들고 /etc/pwd-init.sql 으로 저장한다. MyNewPass 는 변경할 관리자 암호이다.

    UPDATE mysql.user SET Password=PASSWORD('MyNewPass'WHERE User='root';

    FLUSH PRIVILEGES;
  3. mysql 이 구동시에 읽을 수 있게 SELinux 보안 컨텍스트를 부여한다. 

    # chcon -t mysqld_etc_t /etc/pwd-init.sql 

  4. mysqld 을--init-file 옵션과 함께 구동하면 시작하면서 지정된 SQL 파일을 읽게 되므로 관리자 암호를 새로운 암호로 변경할 수 있다.

    # mysqld_safe --init-file=/etc/pwd-init.sql

  5. mysql 클라이언트로 변경된 암호로 연결하여 정상 동작 여부를 확인한다.

    # mysql -u root -pMyNewPass

  6. 정상 동작이 확인되었으면 /etc/pwd-init.sql  을 삭제한다.
  7. mysqld 를 재구동한다.

    # service mysqld restart