CentOS8 - MySQL8 설치 - Source 컴파일 - dnf 패키지 설치 - CMake 소스 컴파일

Last Updated on 6월 12, 2021 by 태랑(정현호)

0. 설치 정보



• 설치 환경 정보
    - CentOS 8.3
    - MySQL 8.0.21 ~ 8.0.23

포스팅에서는 패키지 설치(dnf) , 소스 컴파일 , 바이너리 압축 해제 형식 3가지에 대해서 기술되어 있습니다 설치하는 방식에 따라 버전이 8.0.21 ~ 8.0.23 이 사용 하였습니다.


• 업데이트 일자 
   - 2021/03/03



[참고] CentOS 7.8 에서 MySQL 5.7 설치에 대한 정보는 아래 포스팅을 참조하시면 됩니다





1. 선행 작업 수행



1-1 유저 그룹 생성

[root]# groupadd mysql

[root]# useradd -M -s /sbin/nologin -g mysql mysql

[참고1] 포스팅에서는 3가지 방식으로 설치를 모두 설명하기 위해서 그룹과 유저를 생성하였지만 패키지 형태로 설치할 경우 mysql 유저를 생성 함으로 위 과정을 생략 하여도 됩니다.

[참고2] -M 옵션을 사용해서 홈디렉토리를 생성하지 않고, -s /bin/false 혹은 /sbin/nologin 옵션을 사용해서 유저의 로그인 쉘을 사용할 수 없게 하는 것입니다

즉 mysql이라는 유저는 mysql 데몬을 실행하기 위한 유저이고 서버의 보안강화 측면에서 외부에서 mysql 유저로 쉘 로그인은 필요가 없습니다.


1-2 EPEL 활성화

user$ sudo dnf -y install dnf-plugins-core
user$ sudo dnf -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
user$ sudo dnf config-manager --set-enabled powertools




1-3 사전 필요 패키지 설치

user$ sudo dnf -y install ncurses ncurses-devel \
ncurses-libs openssl openssl-devel glibc \
bison make cmake readline gcc gcc-c++ wget \
autoconf automake libtool* libmcrypt* git \
patchelf libtirpc* rpcgen numactl numactl-devel \
ncurses-compat-libs libaio libaio-devel




1-4 ulimit 설정

/etc/security/limits.conf 파일에 아래와 같이 입력 합니다

user$ sudo vi /etc/security/limits.conf

mysql    soft   memlock  unlimited
mysql    hard   memlock  unlimited
mysql    hard   nofile   65536
mysql    soft   nofile   65536
mysql    soft   nproc    16384
mysql    hard   nproc    16384




2. 패키지형 설치



패키지 형태로 설치할 때는 dnf로 설치 하시는게 가장 좋은 방법일것 같습니다.

1. 설치 

user$ sudo dnf -y install mysql-server mysql mysql-devel




2. 접속

user$ sudo mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.21 Source distribution

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>


[참조] 파라미터 관련해서는 아래 "5-2 파라미터 파일 생성" 를 참조하시면 됩니다.




3. Source Compile 설치



3-1 cmake boost 다운


user$ cd /usr/local/src/

user$ sudo wget https://boostorg.jfrog.io/artifactory/main/release/1.73.0/source/boost_1_73_0.tar.gz

user$ sudo tar zxvf boost_1_73_0.tar.gz


* MySQL 8.0.22 기준 Boost는 1.73.0 버전이 필요 합니다.
(Boost minor version found is 75 we need 73)



3-2 

user$ mkdir -p pkg
user$ cd pkg
user$ wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.22.tar.gz
user$ tar zxvf mysql-boost-8.0.22.tar.gz
user$ cd mysql-8.0.22


[참고] pkg 디렉토리 생성 및 pkg 디렉토리 사용은 포스팅에서의 예시입니다 다른 디렉토리를 사용하여도 됩니다.



3-3 CMake 수행

user$ sudo cmake \
'-DCMAKE_INSTALL_PREFIX=/usr/local/mysql-8.0.22' \
'-DINSTALL_SBINDIR=/usr/local/mysql-8.0.22/bin' \
'-DINSTALL_BINDIR=/usr/local/mysql-8.0.22/bin' \
'-DMYSQL_DATADIR=/usr/local/mysql-8.0.22/data' \
'-DINSTALL_SCRIPTDIR=/usr/local/mysql-8.0.22/bin' \
'-DSYSCONFDIR=/usr/local/mysql-8.0.22/etc' \
'-DWITH_INNOBASE_STORAGE_ENGINE=1' \
'-DWITH_PARTITION_STORAGE_ENGINE=1' \
'-DWITH_EXTRA_CHARSETS=all' \
'-DWITH_SSL=bundled' \
'-DWITH_SSL_PATH=/usr/include/openssl' \
'-DENABLED_LOCAL_INFILE=1' \
'-DMYSQL_TCP_PORT=3306' \
'-DMYSQL_UNIX_ADDR=/tmp/mysql.sock' \
'-DCURSES_LIBRARY=/usr/lib64/libncurses.so' \
'-DCURSES_INCLUDE_PATH=/usr/include' \
'-DWITH_ARCHIVE_STORAGE_ENGINE=1' \
'-DWITH_BLACKHOLE_STORAGE_ENGINE=1' \
'-DWITH_PERFSCHEMA_STORAGE_ENGINE=1' \
'-DWITH_FEDERATED_STORAGE_ENGINE=1' \
'-DDOWNLOAD_BOOST=1' \
'-DWITH_BOOST=/usr/local/src/boost_1_75_0' \
'-DFORCE_INSOURCE_BUILD=1'



[참고] Cmake Clean 하는 방법

- 해당 디렉터리의 캐시파일 삭제
user$ sudo rm -rf CMakeCache.txt
user$ sudo rm -rf CMakeFile


3-4 빌드 및 인스톨

user$ sudo make
user$ sudo make install


3-5 경로 단일화를 위해 심볼릭 링크 추가

user$ sudo ln -s /usr/local/mysql-8.0.22 /usr/local/mysql



여기 까지 완료 되었다면 아래 챕터 5 ~ 7 까지 보시면 됩니다.



4. 바이너리 압축 해제 방식



바이너리의 압축 해제 방식은 Linux - Generic 의 파일을 다운로드를 사용하시면 됩니다.


4.1 파일 다운 로드

다운 로드 경로


OS : Linux Generic
OS Version : Linux - Generic ( glibc 2.17)(x86, 64-bit) 을 선택해서 다운로드 받으시면 됩니다




또는 아래와 같이 서버에서 직접 다운로드를 받으시면 됩니다

user$ wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.23-linux-glibc2.17-x86_64-minimal.tar.xz


4.2 압축 해제 및 심볼릭 링크 생성

user$ sudo tar -xvf mysql-8.0.23-linux-glibc2.17-x86_64-minimal.tar.xz \
-C /usr/local/

user$ sudo ln -s /usr/local/mysql-8.0.23-linux-glibc2.17-x86_64-minimal \
/usr/local/mysql


여기 까지 완료 되었다면 아래 챕터 5~ 6 까지 보시면 됩니다.



5. Post Install Action



5-1 MySQL 라이브러리 경로 추가

user$ sudo echo "/usr/local/mysql/lib" | \

sudo tee -a /etc/ld.so.conf

user$ sudo ldconfig


5-2 파라미터 파일 생성

/etc/my.cnf 파일에 아래 내용을 입력 합니다.

user$ sudo vi /etc/my.cnf

[client]
port = 3306
socket = /tmp/mysql.sock

[mysql]
no-auto-rehash
show-warnings
prompt="\u@\h:\d_\R:\m:\\s> "
pager="less -n -i -F -X -E"

[mysqld]
server-id=1
port=3306
bind-address=127.0.0.1
#bind-address=0.0.0.0
basedir = /usr/local/mysql
datadir= /usr/local/mysql/data
tmpdir = /usr/local/mysql/data
# Exception InnoDB,ex) MyISAM,csv,arhive
socket=/tmp/mysql.sock
user=mysql
skip_name_resolve
event-scheduler=OFF
sysdate-is-now
federated
# expire_logs_days=7 # deprecated
binlog_expire_logs_seconds=604800
# default = 2592000 sec = 30 Days
# 604800 sec = 7 Days
max_allowed_packet=1073741824
secure-file-priv=""

#timestamp
explicit_defaults_for_timestamp = TRUE

### MyISAM Spectific options
key_buffer_size = 40M
bulk_insert_buffer_size = 16M
myisam_sort_buffer_size = 16M
#myisam_sort_buffer_size = 32M
myisam_max_sort_file_size = 10G
myisam_repair_threads = 1

### INNODB Spectific options
default-storage-engine = InnoDB
## 16MB is under to table 1000EA
##innodb_additional_mem_pool_size = 16M
innodb_buffer_pool_size = 384M
innodb_buffer_pool_dump_pct=100
#User Table Datafile
innodb_data_home_dir = /usr/local/mysql/data/
#System Datafile
innodb_data_file_path = ib_system:100M:autoextend
innodb_flush_method = O_DIRECT
innodb_file_per_table=TRUE
innodb_log_buffer_size = 16M
innodb_fast_shutdown=0
innodb_buffer_pool_load_at_startup = ON
innodb_buffer_pool_dump_at_shutdown = ON
innodb_log_file_size=200M
innodb_log_files_in_group=4
# innodb_undo_tablespaces = 2 #Depreacted

### Connection
back_log = 100
max_connections = 1000
max_connect_errors = 1000
#wait_timeout= 60

### log
# Error Log
log_error=/usr/local/mysql/logs/mysqld.err
log_output=TABLE,FILE
general_log_file = /usr/local/mysql/logs/general_query.log
# disable - 0, enable - 1
general_log=0
slow-query-log=1
long_query_time = 1 # Second 
slow_query_log_file = /usr/local/mysql/logs/slow_query.log
log_queries_not_using_indexes = OFF
pid-file=/usr/local/mysql/tmp/mysqld.pid
log_timestamps=SYSTEM

### Replication
log-bin=/usr/local/mysql/data/binlog
sync_binlog=1
binlog_cache_size=2M
max_binlog_size=512M
# expire_logs_days=7 # deprecated
binlog_expire_logs_seconds=604800
# default = 2592000 sec = 30 Days
# 604800 sec = 7 Days
log_bin_trust_function_creators=ON

###character
character-set-client-handshake=FALSE
skip-character-set-client-handshake
character-set-server = utf8mb4
collation-server = utf8mb4_0900_ai_ci
init-connect=SET NAMES 'utf8mb4' COLLATE 'utf8mb4_0900_ai_ci'

[mysqld_safe]
pid-file=/usr/local/mysql/tmp/mysqld.pid
open-files-limit = 16384




6. DB 생성 및 비밀번호 변경



6-1 디렉토리 생성

user$ cd /usr/local/mysql

user$ sudo mkdir -p logs tmp data
user$ sudo chown mysql:mysql logs tmp data


6-2 DB 생성

user$ cd /usr/local/mysql/bin
user$ sudo ./mysqld \
--defaults-file=/etc/my.cnf \
--initialize \
--user=mysql \
--basedir=/usr/local/mysql \
--datadir=/usr/local/mysql/data


6-3 root password 변경

6-3-1 먼저 mysql 의 환경변수를 설정 합니다

echo "export MYSQL_HOME=/usr/local/mysql" >> ~/.bash_profile
echo "export PATH=\$PATH:\$MYSQL_HOME/bin" >> ~/.bash_profile
source ~/.bash_profile


6-3-2 패스워드 변경을 위한 최초 기동

$user sudo mysqld_safe &


6-3-3 초기 패스워드 확인

user$ sudo cat $MYSQL_HOME/logs/mysqld.err | grep password
[Server] A temporary password is generated for root@localhost: sYlVlTrLh4/g

[참조] 초기 패스워드는 로그에 위와 같이 기록되어 있습니다.


6-3-4 접속

user$ mysql -u root -p
Enter password: sYlVlTrLh4/g


6-3-5 비밀번호 변경

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'root';

mysql> commit;
mysql> flush privileges;
mysql> exit


6-4 MySQL 종료

user$ mysqladmin -u root -p shutdown




7. MySQL 서비스 등록 및 기동



7-1 MySQL 서비스 생성


user$ cd /usr/lib/systemd/system/
user$ sudo vi mysqld.service

[Unit]
Description=MySQL Community Server
After=network.target
After=syslog.target

[Service]
Type=forking
LimitNOFILE=infinity
ExecStart=/usr/local/mysql/support-files/mysql.server start
ExecStop=/usr/local/mysql/support-files/mysql.server stop

[Install]
WantedBy=multi-user.target



7-2 systemctl 등록 및 시작

user$ sudo systemctl daemon-reload

user$ sudo systemctl enable mysqld.service
user$ sudo systemctl start mysqld


7-3 MySQL 정상 여부 확인

user$ mysql -u root -p
Enter password: [패스워드]

mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.22 |
+-----------+


mysql> status;
--------------
mysql Ver 8.0.22 for Linux on x86_64 (Source distribution)

Connection id: 7
Current database:
Current user: root@localhost
SSL: Not in use
Current pager: less -n -i -F -X -E
Using outfile: "
Using delimiter: ;
Server version: 8.0.22 Source distribution
Protocol version: 10
Connection: Localhost via UNIX socket
Server characterset: utf8mb4
Db characterset: utf8mb4
Client characterset: utf8mb4
Conn. characterset: utf8mb4
UNIX socket: /tmp/mysql.sock
Binary data as: Hexadecimal
Uptime: 51 sec



관련된 다른 글

 

 

 

 

 

 

 

 

 

“CentOS8 - MySQL8 설치 - Source 컴파일 - dnf 패키지 설치 - CMake 소스 컴파일” 에 대한 6 댓글

  1. 4번과정보고 따라했는데요
    6번에서 mysql_safe & 한 후에 비밀번호 확인하는 명령어입력하면 아무것도안나와요
    그리고 mysql에 접속하려고하면 mysql.sock(2)에러가 뜹니다
    혹시 어떻게해야할까요? ㅠㅠ

    1. 안녕하세요

      log 파일에서 처음 기동시 임시 패스워드가 기록되고 그것을 확인 하게 되는데요
      임시 패스워드가 확인이 안된다는 것은 DB 생성이나 기동 단계에서 문제가 있었거나 제대로 안된것으로 보입니다.

      ps -ef| grep mysql

      명령어로 mysql 이 기동되어 있는 먼저 살펴보시고

      vi /usr/local/mysql/logs/mysqld.err
      를 통해서 구글링 해볼만한 에러 메세지 내역이 있는지 확인이 필요해 보입니다.

      감사합니다.

      1. ./mysqld --defaults-file=/etc/my.cnf
        를 입력했을때
        Failed to find valid data directory.
        data dictionary initialization failed.
        이 두 메시지가 뜨는데 my.cnf 파일이 잘못된건가요?

        1. 안녕하세요
          my.cnf 가 잘못되었거나 datadir 파라미터가 잘못되었거나
          datadir 에 해당하는 디렉토리가 없을 것 같습니다

          이 부분을 한번 다시 체크해보시면 좋을것 같네요

          감사합니다.

          1. 안녕하세요
            mysqld --defaults-file = /etc/my.cnf 명령어를 입력하니 에러 로그에
            unkown option '--defaults-file'이 기록됩니다
            버전때문에 저 옵션이 없는건가요?

          2. 안녕하세요

            기동 하실때는
            mysqld 나 mysqld_safe 에서 --defaults-extra-file 를 사용해보세요
            --defaults-extra-file=/etc/my.cnf

            mysqld --defaults-extra-file=/etc/my.cnf &

            감사합니다.

답글 남기기