CentOS 7에서 MySQL 5.6.15 버전을 컴파일하여 설치하는 방법에 대해 알아보겠습니다.

( yum으로 MySQL을 설치하는 방법에 대해서는 여기를 참고해주세요 ! )




컴파일 설치

1. 유저 생성

Root는 모든 권한이 있기 때문에 Root 계정으로 MySQL을 실행하는 것은 보안상 위험합니다.

그래서 mysql 계정을 nologin으로 만들어서 MySQL 디렉터리의 소유권이 mysql이 되도록 관리하는 것이 좋습니다.

# groupadd mysql # useradd -M -g mysql mysql # cat /etc/passwd

mysql 그룹을 생성한 뒤, mysql 그룹에 속하며 홈 디렉터리가 없는 mysql 계정을 생성합니다.

그리고 /etc/passwd 파일을 출력하여 유저가 생성되었는지 확인합니다.





2. 의존성 설치

MySQL을 컴파일 하기 위해서는 여러 라이브러리를 설치해야 합니다.

# yum -y install ncurses-devel # yum -y install perl # yum -y install perl-Data-Dumper

# yum -y install cmake

# yum -y install wget

# yum -y install gcc-c++

ncurses-devel은 Curses 라이브러리를 말합니다.

콘솔 애플리케이션 만들 때 커서( cursor )를 다뤄야 하는데, Curses 라이브러리가 이를 해결해줍니다.

curses 라이브러리는 터미널 유형과 관계 없이 터미널 표시 장치를 조작할 수 있는 일련의 함수를 제공합니다.

( curses 라이브러리가 궁금하시다면 여기를 참고해주세요. )





3. Mysql 설치
mysql 사이트( 링크 )에서 mysql 5.6.15 버전 tar.gz 파일을 받습니다. ( 우클릭하여 주소를 복사 )
그리고 압축을 해제합니다.

# wget https://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.15.tar.gz

# tar xvfz mysql-5.6.15.tar.gz

# cd mysql-5.6.15


그리고 설치에 대한 환경 설정을 하기 전에 /usr/local/victolee 디렉터리를 생성합니다.

이 디렉터리는 여러 라이브러리를 모아 놓기 위한 디렉터리인데, 이렇게 관리를 할 수 있다는 것이 컴파일 설치의 큰 장점이죠.

이어서 cmake 명령어를 통해 설치 옵션을 부여합니다.

그리고 make를 하여 빌드를 하고, make install하여 설치를 진행합니다.

# mkdir /usr/local/victolee

# cmake \

-DCMAKE_INSTALL_PREFIX=/usr/local/victolee/mysql \ -DMYSQL_UNIX_ADDR=/usr/local/victolee/mysql/tmp/mysql.sock \ -DDEFAULT_CHARSET=utf8 \ -DDEFAULT_COLLATION=utf8_general_ci \ -DWITH_EXTRA_CHARSETS=all \ -DMYSQL_DATADIR=/usr/local/victolee/mysql/data \ -DENABLED_LOCAL_INFILE=1 \ -DWITH_MYISAM_STORAGE_ENGINE=1 \ -DWITH_INNOBASE_STORAGE_ENGINE=1 \ -DWITH_ARCHIVE_STORAGE_ENGINE=1 \ -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \ -DWITH_MEMORY_STORAGE_ENGINE=1 \ -DWITH_READLINE=1 \ -DMYSQL_USER=mysql \ -DMYSQL_TCP_PORT=3306 \ -DENABLE_DOWNLOADS=1


# make

# make install

각 옵션에 대한 내용은 MySQL 공식 홈페이지에서 확인해볼 수 있습니다 ( 링크 )


make install을 하고 나면 /usr/local/victolee 디렉터리에 mysql 디렉터리가 생성된 것을 확인할 수 있습니다.

cmake를 명령할 때 INSTALL_PREFIX로 /usr/local/victolee/mysql 경로를 작성했기 때문이죠.





4. 디렉터리 소유자 변경

이어서 mysql.sock 파일이 저장될 tmp 디렉터리를 생성하고,

mysql 디렉터리의 소유권이 mysql 계정이 되도록 소유권을 변경하겠습니다.

# mkdir /usr/local/victolee/mysql/tmp


# chown -R mysql:mysql /usr/local/victolee/mysql # chown mysql:root /usr/local/victolee/mysql/tmp

mysql 데몬을 뛰우기 전에 소켓 만드는 것을 root가 하기 때문에 tmp 디렉터리의 group 소유권은 root로 변경합니다.





5. 기본 데이터 베이스 생성

다음으로 기본 데이터 베이스를 생성하도록 하겠습니다.

# /usr/local/victolee/mysql/scripts/mysql_install_db \

--defaults-file=/usr/local/victolee/mysql/my.cnf \

--user=mysql \

--basedir=/usr/local/victolee/mysql/ \

--datadir=/usr/local/victolee/mysql/data \

--explicit_defaults_for_timestamp=on





6. MySQL 환경 설정

다음으로 /etc/my.cnf 파일의 내용을 지우고, 아래와 같이 수정해서 mysql 환경 설정을 하도록 하겠습니다.

# vi /etc/my.cnf


# Example MySQL config file for large systems. # # This is for a large system with memory = 512M where the system runs mainly # MySQL. # # MySQL programs look for option files in a set of # locations which depend on the deployment platform. # You can copy this option file to one of those # locations. For information about these locations, see: # http://dev.mysql.com/doc/mysql/en/option-files.html # # In this file, you can use all long options that a program supports. # If you want to know which options a program supports, run the program # with the "--help" option. # The following options will be passed to all MySQL clients [client] port = 3306 socket         = /usr/local/victolee/mysql/tmp/mysql.sock character-set = utf8 # Here follows entries for some specific programs # The MySQL server [mysqld] port = 3306 socket         = /usr/local/victolee/mysql/tmp/mysql.sock key_buffer_size = 256M max_allowed_packet = 1M table_open_cache = 256 sort_buffer_size = 1M read_buffer_size = 1M read_rnd_buffer_size = 4M myisam_sort_buffer_size = 64M thread_cache_size = 8 query_cache_size= 16M # Try number of CPU's*2 for thread_concurrency thread_concurrency = 8 character-set-server=utf8 collation-server=utf8_general_ci init_connect=SET collation_connection=utf8_general_ci init_connect=SET NAMES utf8 [mysqldump] quick max_allowed_packet = 16M [mysql] no-auto-rehash default-character-set = utf8 # Remove the next comment character if you are not familiar with SQL #safe-updates [myisamchk] key_buffer_size = 128M sort_buffer_size = 128M read_buffer = 2M write_buffer = 2M [mysqlhotcopy] interactive-timeout





7. Mysql 데몬 실행

mysql을 실행하기 위해서는 mysqld_safe를 데몬으로 실행해야 합니다.

mysqld_safe는 mysql 데몬을 띄어주는 스크립트 파일 입니다.

# /usr/local/victolee/mysql/bin/mysqld_safe & # ps -ef | grep mysql


mysqld_safe가 실행되는지 확인합니다.





8. mysql 환경 변수 설정

이제 어느 디렉터리에서나 mysql을 실행 할 수 있도록 환경 변수를 설정하겠습니다.

그리고 이 설정이 반영 될 수 있도록 source 명령어를 수행합니다.

# vi /etc/profile

( 파일 맨 끝에 아래의 내용을 추가 )

#mysql export PATH=$PATH:/usr/local/victolee/mysql/bin


# source /etc/profile





9. mysql 실행

mysql을 실행하여 비밀번호를 설정합니다.

# mysql

비밀번호 설정




10. mysql.service 등록

이번에는 서버가 실행되면 mysql이 자동으로 실행되도록 서비스를 등록하겠습니다. ( 서비스에 대해서는 여기를 참고해주세요 )

서비스를 등록하지 않으면 매 번 /usr/local/victolee/mysql/bin/mysqld_safe & 명령으로 mysql을 실행해야 합니다.

서비스를 등록하기 전에 실행되고 잇는 mysql 프로세스를 종료 하고 진행합니다.

# ps -ef | grep mysql

# kill -9 mysql프로세스번호


# vi /usr/lib/systemd/system/mysql.service

[Unit] Description=MySQL Community Server After=network.target After=syslog.target [Install] WantedBy=multi-user.target Alias=mysql.service [Service] User=mysql Group=mysql # Execute pre and post scripts as root PermissionsStartOnly=true # Needed to create system tables etc. #ExecStartPre= # Start main service ExecStart=/usr/local/victolee/mysql/bin/mysqld_safe # Don't signal startup success before a ping works #ExecStartPost= # Give up if ping don't get an answer TimeoutSec=300 Restart=always PrivateTmp=false




11. 서비스 관리

마지막으로 서비스를 활성화 시킵니다.

서비스가 등록이 되었는지 확인하기 위해 재부팅을 한 후, 프로세스를 확인하는 것으로 테스트를 마칩니다.

# systemctl enable mysql.service

# systemctl start mysql.service

# ps -ef | grep mysql


# reboot

# ps -ef | grep mysql




이상으로 CentOS 7에서 MySQL 5.6.15 버전을 설치해보았습니다.

댓글 펼치기 👇
  1. dd 2020.09.02 16:21

    항상 궁금했던 건데
    왜 mysql 디렉토리 소유자를 mysql 사용자로 변경해주는거져...??
    항상 하라니까 해서 아무생각 없이 하긴 했는데
    왜 하는지는 모르겠습니다 ㅜㅜ

    • Favicon of https://victorydntmd.tistory.com victolee 우르르응 2020.11.14 15:30 신고

      MySQL 서비스를 담당하는 계정은 mysql처럼 별도로 두는 것이 보안상 좋습니다.
      딱 MySQL과 관련된 일만 할 수 있도록 제한을 두는 목적이죠.
      root 계정은 MySQL 외에도 모든 서비스의 실행권한이 있기 때문에 적합하지 않습니다.

      즉, MySQL은 mysql 계정으로만 실행하도록 service를 등록했기 때문에,
      mysql 디렉토리는 mysql 계정으로만 접근할수 있도록 소유자를 mysql 계정으로 변경해주는 것입니다.