CentOS 8 - MySQL 8 설치 - Source 컴파일 - dnf 패키지 설치 - CMake 소스 컴파일

Share

Last Updated on 6월 18, 2023 by Jade(정현호)

안녕하세요 
이번 포스팅에서는 CentOS 8 또는 유사 포크 버전의 리눅스인 Oracle Linux8 or Rocky Linux 8 에서 MySQL 8 버전의 설치에 대해서 확인 해보려고 합니다.

설치 정보

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

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

• 업데이트 일자 
   - 2022/09/10


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

           

선행 작업 수행

유저 와 그룹 생성

[root]# groupadd mysql

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

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

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

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


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



사전 필요 패키지 설치

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

* rsyslog 가 설치 되었다면 데몬 재기동을 한번 수행 합니다.
   sudo systemctl restart rsyslog


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



Kernel 파라미터 조정

sysctl.conf 파일에서 아래 내용을 추가 합니다.

## sysctl.conf 파일 설정
user$ sudo vi /etc/sysctl.conf


vm.swappiness = 1
net.core.rmem_default = 16777216
net.core.rmem_max = 56777216
net.core.wmem_default = 16777216
net.core.wmem_max = 56777216
net.ipv4.tcp_rmem = 4096 131072 5809920
net.ipv4.tcp_wmem = 4096 16384  4194304
net.nf_conntrack_max = 131072
net.core.netdev_max_backlog = 65535
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.ip_local_port_range = 9000 65000


## 적용
user$ sudo sysctl -p

                 

패키지로 설치

패키지 형태로 설치할 때는 dnf (이전의 yum) 명령어로 설치 하시는게 가장 좋은 방법일것 같습니다.


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>


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

Source Compile 설치  


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)


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. 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


4. 빌드 및 인스톨

user$ sudo make
user$ sudo make install


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

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


6. 소유권 변경

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


여기 까지 완료 되었다면 아래 "Post Install Action" 부터 보시면 됩니다.
                           

바이너리 압축 해제 방식

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


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.12-x86_64.tar.xz 


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

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

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


3. 소유권 변경

user$ sudo chown -R mysql:mysql /usr/local/mysql-8.0.23-linux-glibc2.12-x86_64


여기 까지 완료 되었다면 아래 "Post Install Action" 부터 보시면 됩니다.
              

Post Install Action

1. MySQL 라이브러리 경로 추가

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

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

user$ sudo ldconfig


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
default_authentication_plugin=mysql_native_password
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/log/mysqld.err
log_output=TABLE,FILE
general_log_file = /usr/local/mysql/log/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/log/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


테이블의 대소문자를 구분하지 않고 사용하기 위해서는 lower_case_table_names 을 ON(또는 1) 으로 설정이 필요 합니다. 다만 MySQL 8.0 버전에서는 서버 인스턴스 데이터베이스가 생성된 이후에는 변경이 불가능 합니다. (5.7 버전은 가능)

my.cnf 을 수정후 재시작 하면 에러가 발생하면서 MySQL 8.0 서버는 기동이 되지 않습니다. 그래서 해당 값을 기본값(0) 이 아닌 1(또는 ON) 으로 변경 하려면 데이터베이스가 초기화(생성) 되기 전에 미리 설정 과 생성시 명시적으로 옵션을 지정하여 생성 해야 합니다.

dnf(또는 yum) 이나 rpm 과 같은 패키지로 MySQL 서버를 설치하면 MySQL 엔진(파일)이 설치 된 후 Database 도 생성을 자동으로 하게 됩니다. 그래서 이러한 패키지 형태로 설치 하였고 대소문자 구분을 하지 않게 설정 하려면 어쩔 수 없이 데이터베이스를 새로 생성 해야 합니다.

컴파일로 설치 또는 바이너리 압축 해제로 설치로 진행 과정에서 테이블의 대소문자 구분을 하지 않게 설정 생성 하려면 my.cnf 파일의 [mysqld] 섹션에 다음의 시스템 변수를 추가로 설정을 하면 됩니다.

lower_case_table_names=1

                

DB 생성 및 비밀번호 변경

[참고] 패키지 또는 dnf(yum) 으로 설치한 경우 이미 디렉토리 와 DB가 생성되어 있으므로 해당 과정을 생략 합니다.

1. 디렉토리 생성


user$ cd /usr/local/mysql

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

[참고] datadir 를 포함한 여러 디렉토리의 이름과 경로는 예시로, 설치 및 사용하는 환경에 맞춰서 변경 하시면 되며, 그에 따라서 /etc/my.cnf 파일의 내용도 같이 수정하시면 됩니다.


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


여기서도 대소문자 구분 없이 데이터베이스 초기화(생성) 하려면 아래와 같이 하나 더 추가 옵션을 더해서 진행하시면 됩니다.

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



3. root password 변경

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

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


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

user$  sudo /usr/local/mysql/bin/mysqld_safe &


3-3 초기 패스워드 확인

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

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


3-4 접속

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


3-5 비밀번호 변경

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

mysql> flush privileges;
mysql> exit

* 위에서 패스워드는 예시 입니다.


4. MySQL 종료

user$ mysqladmin -u root -p shutdown
Enter password:   <-- 위에서 변경한 root 의 패스워드 를 입력
                

서비스 등록 및 기동

[참고] 패키지 또는 dnf(yum) 으로 설치한 경우 이미 서비스가 생성되어 있으므로 생략 합니다.

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



2. systemctl 등록 및 시작

user$ sudo systemctl daemon-reload

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


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



관련된 다른 글

 

 

 

 

 

 

 

 

                             

10
0
글에 대한 당신의 생각을 기다립니다. 댓글 의견 주세요!x