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 명령어를 실행하면 확인할 수 있다.

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 이 오작동하거나 설정 오류로 구동되지 않을 경우 먼저 로그 파일을 확인해야 한다.

그러면 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

 

MySQL 백업과 복구

DBMS 의 백업과 복구는 매우 중요한 작업이며 전문적이고 복잡한 분야이다. MySQL 에는 mysqldump 라는 간단한 백업 프로그램이 내장되어 있다.

프로덕션 환경의 서비스를 백업하기에는 속도고 느리고 기능도 미비하지만 사용량과 데이타가 많지 않은 시스템이라면 이것을 사용해서 백업을 수행하는 것도 좋다.

 

그러면 mysqldump 의 간단한 사용법을 알아 보자. 실행 명령어는 mysqldump 이며 옵션과 백업할 데이타베이스와 테이블 명을 주면 된다.

mysqldump [OPTIONS] database [tables]

옵션의미기본값비고
-A, --all-databases모든 데이타베이스를 덤프한다.  

--databases db1,db2

db1 데이타베이스만 덤프한다. 여러 개를 적을 경우 콤마를 구분자로 적는다.  
--add-drop-databaseCREATE DATABASE 구문 전에 DROP DATABASE 구문을 추가한다.No기존 데이타가 삭제되니 주의
--add-drop-tableCREATE TABLE 구문 전에 DROP TABLE 구문을 추가하여 기존 테이블을 삭제한다.YesDROP TABLE 구문 생성을 피하려면 --skip-add-drop-table 옵션을 사용한다.
-l, --lock-tables덤프하기전 모든 테이블에 락을 건다.Yes--skip-lock-tables 로 제외 가능하다.. 이 옵션보다는 아래의 --single-transaction 사용 추천한다.
--single-transactionlock 을 걸지 않고도 덤프 파일의 정합성 보장하는 옵션이다.NoInnoDB 일때만 사용 가능하다.
--ignore-table덤프에서 제외할 테이블을 지정한다.No콤마 구분자가 동작하지 않으므로 여러개의 테이블을 제외할 경우 테이블명마다 앞에 --ignore-table 옵션을 주어야 한다.
--no-create-db덤프시 CREATE DATABASE 구문 제외한다.No덤프한 파일을 로드 하려는 환경의 데이타베이스 명이 다를 경우 유용할 수 있다.
--max_allowed_packet 서버와 주고 받을 최대 패킷 사이즈를 설정한다. LOB 데이타 등이 DB 에 있을 경우 이 값을 크게 해야 덤프시 2020 max_allowed_packet 에러를 만나지 않는다.
--triggers트리거(trigger) 도 덤프한다. --skip-triggers 로 제외할 수 있음
--routinesstored procedure 와 function 도 dump MySQL 5 는 trigger는 기본적으로 덤프하나 function, procedure는 덤프하지 않음
mysqldump 의 주요 옵션

 

이제 MySQL 에서 덤프하는 방법을 알아 보자. 다음 명령어는 db1 만 포함하며 db1. 의 table은 이관에서 저장하는 법다.

mysqldump  --single-transaction ---max_allowed_packet=64M -databases db1 --ignore-table=db1.table1  --ignore-table=db1.table2 -h localhost -u root -pmypwd > mydump.sql

 

정상적으로 동작하면 mydump.sql 이라는 파일이 생성되나 이 파일을