MySQL 5.7 소스 설치
이 문서는 MySQL 5.7 소스 설치 문서 입니다.
Boost 라이브러리
MySQL 5.7 로 넘어오면서 GIS관련해 기능과 InnoDB Engine 에서 R-tree indexes 가 포함되었다. geometry compute 위한 많은 native code 들로 작성이 되었는데 이를 위해서 Boost.Geometry 를 이용했다. 따라서 소스 설치시에 이 라이브러리를 필요로한다.
Boost 라이브러리를 컴파일 단계에서 다음의 옵션으로 알려줄 수 있다.
-DWITH_BOOST: Cmake 컴파일러에게 Boost 지점를 알려준다. Boost 지점은 다음의 셋중에 하나여야 한다.
- tarball/zip 파일
- tarball/zip 파일을 포함하는 디렉토리
- tarball/zip 파일을 압축해제한 디렉토리
-DDOWNLOAD_BOOST: boolean 값으로 Boost tarball/zip 파일을 자동으로 다운로드 받게 할지 말지를 결정한다.
두 옵션을 조합해서 사용하기도 한다. 우선순위는 DWITH_BOOST 이며 여기서 찾지 못할 경우에 DDOWNLOAD_BOOST 를 체크해 다운로드를 할지 말지를 결정한다.
하지만 최근의 MySQL 5.7 소스에는 boost 를 포함해서 배포한다. 따라서 DWITH_BOOST 옵션을 사용해서 포함된 boost 디렉토리를 지정해주면 된다.
준비
CentOS 가 최소설치되었다고 가정하고 시작했기 때문에 컴파일 환경을 구축해줘야 한다.
1 |
]$ yum install gcc.x86_64 gcc-c++.x86_64 wget.x86_64 bzip2-devel.x86_64 pkgconfig.x86_64 openssl-devel.x86_64 make.x86_64 man-db.x86_64 nasm.x86_64 readline-devel.x86_64 ncurses-devel.x86_64 automake* autoconf* pcre-devel.x86_64 cmake.x86_64 libaio-devel.x86_64 libevent-devel.x86_64 bison.x86_64 bison-devel.x86_64 pam-devel.x86_64 |
Ubuntu
1 |
apt install build-essential g++ bison libncurses5-dev libaio1 cmake libevent-2.0-5 |
Download and Unpack
1 2 3 4 |
cd /usr/src wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-boost-5.7.21.tar.gz tar xvzf mysql-boost-5.7.21.tar.gz cd mysql-5.7.21 |
Configure and Compile
cmake 를 사용하기 때문에 일반적인 configure 와는 다르다. cmake 대로 옵션을 제공한다. 다음과 같다. 보시면 무엇을 의미하는지 알수 있을 것이다.
- -CMAKE_INSTALL_PREFIX:PATH=/opt/mysql5.7.21
- DWITH_engine_STORAGE_ENGINE nor -WITHOUT_engine_STORAGE_ENGINE 사용하고자 하는 스토리지 엔진을 지정하는 옵션입니다. engine 에는 모두 대문자로 쓰며, MySQL에서 지원하는 엔진들을 적어주면 됩니다. ex) -WITH_INNOBASE_STORAGE_ENGINE:BOOL=ON -WITHOUT_PARTITION_STORAGE_ENGINE:BOOL=ON
- -ENABLED_LOCAL_INFILE:BOOL=boolean SQL파일을 로드하게 해주는 기능을 켭니다. -ENABLED_LOCAL_INFILE:BOOL=ON
- -WITH_EXTRA_CHARSETS:STRING=all 추가로 지원할 언어를 지정합니다. 기본값은 all 입니다. -WITH_EXTRA_CHARSETS:STRING=all
- -WITH_SSL:STRING=(no, yes, bundled, system) SSL 지원여부 입니다. system으로 할경우에 시스템에 설치된 SSL library를 이용하게 됩니다. SSL 관련 library가 설치되어 있어야 겠죠. -WITH_SSL:STRING=system
- -WITH_ZLIB:STRING=(bundled, system) system으로 할 경우에 시스템에 설치된 Library를 이용합니다. -WITH_ZLIB:STRING=system
- -WITH_READLINE:BOOL=boolean readline 지원여부입니다. -WITH_READLINE:BOOL=ON
이러한 옵션들은 다음과 같이 확인이 가능하다.
1 |
cmake -LAH |
이제 필요한 옵션들을 다음과 같이 해준다. 그리고 컴파일하고 설치해준다.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
cmake -DCMAKE_INSTALL_PREFIX=/opt/mysql-5.7.21 \ -DWITH_INNOBASE_STORAGE_ENGINE=1 \ -DWITH_PARTITION_STORAGE_ENGINE=1 \ -DDEFAULT_CHARSET=utf8 \ -DDEFAULT_COLLATION=utf8_general_ci \ -DWITH_EXTRA_CHARSETS=all \ -DENABLED_LOCAL_INFILE=1 \ -DWITH_READLINE=1 \ -DWITH_SYSTEMD=1 \ -DWITH_BOOST=/usr/src/mysql-5.7.21/boost/boost_1_59_0 \ -DDOWNLOAD_BOOST=1 make make install |
설치후 작업
설치가 끝난 후에는 수동으로 옮겨주어야할 파일들이 존재 한다. 그래서 설치 후 작업을 다음과 같이 진행 하면 된다.
계정을 추가
1 2 |
/usr/sbin/groupadd -g 27 -o -r mysql /usr/sbin/useradd -M -g mysql -o -r -d /opt/mysql/logs -s /bin/false -c "MySQL Server" -u 27 mysql |
심볼릭 링크를 다음과 같이 생성해 줍니다.
1 2 |
cd /opt ln -s mysql5.7.21 mysql |
디렉토리 설정과 관련된 my.cnf 내용은 다음과 같다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
basedir = /opt/mysql # 이 디렉토리의 소유권과 그룹은 user 에서 지정한 사용자와 그룹이어야 한다. datadir = /opt/dbstorage/mysql # 이 디렉토리는 Mysql 서버가 내부적 작업을 할때 임시로 사용하게 된다. # 예를들어 대량의 select 처리를 위해서 임시 테이블을 만들거나 할 경우에 여기에 임시로 파일이 생성될 수 있다. tmpdir = /opt/dbstorage/mysql/tmp socket = /opt/mysql/run/mysql.sock pid-file = /opt/mysql/run/mysqld.pid log_error = /opt/dbstorage/mysql/logs/mysql_error.log general_log_file = /opt/dbstorage/mysql/logs/general_query_all.log slow_query_log_file = /opt/dbstorage/mysql/logs/slow_query.log innodb_data_home_dir = /opt/dbstorage/InnoDB innodb_log_group_home_dir = /opt/dbstorage/InnoDB/redoLogs innodb_undo_directory = /opt/dbstorage/InnoDB/undoLogs |
다음과 같이 필요한 디렉토리를 생성하고 소유권을 바꿔 준다.
1 2 3 4 5 6 7 8 9 10 11 12 |
]# cd /opt/mysql ]# mkdir run ]# chown mysql: -R run ]# cd .. ]# chgrp mysql -R mysql* ]# mkdir -p /opt/dbstorage/InnoDB/redoLogs ]# mkdir -p /opt/dbstorage/InnoDB/undoLogs ]# mkdir -p /opt/dbstorage/mysql/tmp ]# mkdir -p /opt/dbstorage/mysql/data ]# mkdir -p /opt/dbstorage/mysql/binlog ]# mkdir -p /opt/dbstorage/mysql/logs ]# chown -R mysql: /opt/dbstorage |
MySQL 라이브러리 시스템 인식.
1 2 |
]# echo "/opt/mysql/lib" > /etc/ld.so.conf.d/mysql.conf ]# ldconfig |
시스템 데이터베이스 생성.
1 |
]# /opt/mysql/bin/mysqld --defaults-file=/etc/my.cnf --initialize --user=mysql |
정상적으로 끝났다면, /opt/dbstorage/mysql/logs/mysqld_error.log 파일에 임시 루트 패스워드가 기록된다. 이를 참조해서 초기 접속시에 활용해야 한다.
Systemd 스크립트 등록
Systemd 를 사용하기 위해서는 컴파일 옵션을 -DWITH_SYSTEMD=1 를 반드시 해줘야 한다. 그리고 다음과 같이 mysqld.service 파일을 작성한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
[Unit] Description=MySQL Server After=network.target After=syslog.target [Install] WantedBy=multi-user.target Alias=mysqld.service [Service] User=mysql Group=mysql Type=forking # Execute pre and post scripts as root PermissionsStartOnly=true # Use this to switch malloc implementation EnvironmentFile=-/etc/sysconfig/mysql # Needed to create system tables ExecStartPre=/opt/mysql/bin/mysqld_pre_systemd # Start main service ExecStart=/opt/mysql/bin/mysqld --daemonize $MYSQLD_OPTS PIDFile=/opt/mysql/run/mysqld.pid # Give up if ping don't get an answer TimeoutSec=600 Restart=on-failure RestartPreventExitStatus=1 PrivateTmp=false |
이것을 /usr/lib/systemd/system/mysqld.service 로 저장하고 systemd 에 등록해주고 시작해 준다.
1 2 3 4 |
]# systemctl enable mysqld.service Created symlink from /etc/systemd/system/mysqld.service to /usr/lib/systemd/system/mysqld.service. Created symlink from /etc/systemd/system/multi-user.target.wants/mysqld.service to /usr/lib/systemd/system/mysqld.service. ]# systemctl start mysqld.service |
이렇게하고 제대로 구동되었는지를 살펴보면 된다.
패스워드 초기화.
MySQL 5.7 은 설치할때에 root 에 대한 임시패스워드를 발급한다. 하지만 이것은 오직 root 접속을 위한 것으로 임시패스워드 대신 다른 패스워드로 변경하기 전에는 다음과 같이 명령어가 듣질 않는다.
1 2 3 4 |
root@localhost:(none) 23:07:21>show tables; ERROR 1046 (3D000): No database selected ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement. ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement. |
다음과 같이 패스워드를 변경해 준다.
1 2 3 4 5 6 7 8 9 |
root@localhost:(none) 23:07:22> ALTER USER 'root'@'localhost' IDENTIFIED BY '비밀번호'; root@localhost:(none) 23:07:22> ALTER USER 'root'@'127.0.0.1' IDENTIFIED BY '비밀번호'; root@localhost:(none) 23:07:22> ALTER USER 'root'@'%' IDENTIFIED BY '비밀번호'; root@localhost:(none) 23:07:22> FLUSH PRIVILEGES; 혹은 root@localhost:(none) 23:07:22> SET PASSWORD = '비밀번호'; root@localhost:(none) 23:07:22> FLUSH PRIVILEGES; |