[MySQL] MySQL 8.0.25 Rocky Linux 8.5

아시다시피 CentOS 8이 Redhat 정책에 의해서 더이상 엔터프라이즈 리눅스로서 위치가 이상해지기 시작했습니다. 역시 IBM으로 편입되면서 애매한 위치를 만들어 버리는군요.

이에 RHEL을 Fork하여 CentOS와 비슷한 엔터프라이즈 커뮤니티를 다시 만든것이 Rokcy 리눅스인것으로 알고 있습니다. 조만간 리눅스가 안정화되기 시작하면 본격적으로 CentOS를 대체할것이라 생각합니다. 특히 8.5는 정식으로 Rocky Linux에서 릴리즈한 버전으로 도전정신이 있으신분은 쓰셔도 무방할 듯 합니다. 저도 빨리 정식 서비스에 사용해보고 싶습니다.

지금부터  MySQL 8.0을 Rocky Linux에 설치하는 방법을 알아보도록 하겠습니다.

 

■ MySQL 계정 만들기

먼저 mysql에서 사용할 계정을 만들어 줍니다. mysql 내부적으로 mysql이라는 계정을 이용해서 엔진을 컨트롤합니다.

shell> groupadd mysql
shell> useradd -r -g mysql -s /bin/false mysql

 

■ OS빌드 환경 만들기

아래와 같은 OS 필수 패키지를 설치합니다.

shell> yum install automake \
binutils bison \
gcc gcc-c++ \
gettext libtool \
make openssl \
openssl openssl-devel \
zlib zlib-devel \
cmake \
gcc-toolset-10-gcc gcc-toolset-10-gcc-c++ gcc-toolset-10-binutils gcc-toolset-10-annobin \
libaio libaio-devel \
perl ncurses-devel \
git redhat-rpm-config rpm-build rpm-sign \
cyrus-sasl cyrus-sasl-devel \
curl curl-devel \
libtirpc-devel \
libudev-devel

 

또한 rpcgen 패키지가 필요합니다.

shell> dnf install epel-release
shell> dnf config-manager --set-enabled powertools
shell> dnf install rpcgen libtirpc-devel

 

■ MySQL 다운로드

먼저 mysql 소스를 받아야 합니다.

https://dev.mysql.com/download

이곳으로 가면 아래 download archive라는곳이 있습니다. 이곳에서 8.0버전을 다운로드 받을 있습니다.

직접적으로 url 가셔도 됩니다.

https://downloads.mysql.com/archives/community/

 

페이지에 가서 아래 product version 8.0.25 버전으로 설치합니다. 기준으로는 8.0.26 가장 최신 버전입니다.

그리고 Operating System Source 선택합니다.

아래 2가지 버전이 있는데 첫번째는 boost library 없는 압축 파일입니다.

Generic Linux (Architecture Independent), Compressed TAR Archive

 

아래는 boost library 포함된 파일입니다.

Generic Linux (Architecture Independent), Compressed TAR Archive

Includes Boost Headers

 

빌드 디렉토리 생성

mysql 소스를 받은 디렉토리로 이동합니다.

디렉토리로 이동해 소스를 풀어주고 압축을 디렉토리로 이동합니다.

shell> tar zxvf mysql-8.0.25.tar.gz
shell> cd mysql-8.0.25

 

디렉토리 이동후 반드시 디렉토리를 하나 만들어야 합니다.

shell mysql-8.0.x> mkdir build1
shell build1> cd build1

 

압축을 풀고 본격적으로 빌드환경에 필요한 cmake 실행합니다. 이때 어떤 옵션들을 설정할지 또는 활성화시키고 중지시킬지 결정해야 합니다. cmake 대한 옵션들의 자세한 설명은 mysql 홈페이지의 기술문서에 나와 있습니다. 또한 터미널에서도 명령을 통해 확인이 가능합니다. 어떤 옵션들이 있는지 확인해 보고 싶으시면 다음과 같은 명령어를 입력하시면 확인해 보실 있습니다.

shell> cmake .. -L   # 옵션에 대해 간략히 보기

shell> cmake .. -LH  # 옵션에 대한 도움말

shell> cmake .. -LAH # 모든 파라미터에 대한 설명 도움말

shell> cmake ..      # interactive display

 

참고) MySQL 공식 홈페이지의 옵션 상세 설명 페이지.

https://dev.mysql.com/doc/mysql-sourcebuild-excerpt/8.0/en/source-configuration-options.html

 

일단 어느정도 다양한 기능이 지원되는 빌드 환경으로 만들어 보겠습니다.

여기에서 빌드되어 생성된 기능들은 따로 차차 설명드리겠습니다.

 

아래 내용은 제가 주로 사용하는 cmake 빌드 환경 구성시 사용하는 옵션입니다. 생각에는 이정도면 필요한 왠만한 기능들은 지원되지 않을까 생각합니다. 이외 필요하신 옵션이 있다면 사용하시면 됩니다.

<컴파일 옵션 설명 예제>

-DCMAKE_INSTALL_PREFIX : 설치 디렉토리

-DWITH_BOOST=directory : 다운로드한 boost 위치시킬 디렉토리 위치

-DDOWNLOAD_BOOST=1 : boost library 없을시 자동으로 다운로드

-DSYSCONFDIR : my.cnf 파일 기본 위치

-DWITH_ARCHIVE_STORAGE_ENGINE=1 : archive storage engine 사용

-DWITH_BLACKHOLE_STORAGE_ENGINE=1 : 블랙홀 엔진 사용여부

-DWITH_EXAMPLE_STORAGE_ENGINE=1 : 예제 생성 엔진 사용여부

-DWITH_FEDERATED_STORAGE_ENGINE=1 : 이기종 DB 연결 엔진

-DWITH_PARTITION_STORAGE_ENGINE=1 : 파티션(파티셔닝) 엔진 사용여부

-DENABLED_PROFILING : 프로파일링 기능 사용 여부

-DWITH_CURL=system or curl directory : CURL 외부 CURL사용할지 System CURL사용할지 여부

-DOPTIMIZER_TRACE=1 : 옵티미아저 트레이스 사용 여부

-DWITH_UNIXODBC=1 : ODBC 사용여부

-DWITH_INNODB_MEMCACHED=1 : 멤캐쉬 스토리지 사용여부

-DWITH_NUMA=on : Linux Numa 시스템 사용여부

-DWITH_SSL=system or directory : ssl 사용여부

-DWITH_ZLIB : 압축기능을 사용하는 위치. 시스템 혹은 번들

-DMYSQL_TCP_PORT : 3306 이외에 다른 포트를 지정하고 싶을때 사용

-DMYSQL_UNIX_ADDR : Unix Socket File 위치를 지정하고 싶을때 사용. 기본은 /tmp/mysql.sock

-DWITH_LIBWRAP=1 : 시스템 관리자의 요청으로 Tcp Wrapper 사용해야 할시 사용합니다(호스트서버의 hosts.allow hosts.deny 파일을 이용해서 클라이언트 접속 허용 여부를 설정함.).

-DWITH_SYSTEMD=1 : centos 7이상부터 지원됩니다. systemd라는 시스템 관리툴을 이용해서 MySQL 제어합니다. systemctl 툴을 이용하지 않고 mysqld_safe 서버를 제어하고 싶다면 옵션은 제거합니다. 또한 옵션 활성화시 mysqld_safe, mysqld_multi 같은 스크립트가 설치되지 않고 대신 mysqld_pre_systemd 설치됩니다.

여기서 NUMA 기능과 libwrap기능은 시스템 환경설정이 별도로 필요한 기능들입니다. 포스트의 범위를 벗어남으로 별도로 기회가 설명드리겠습니다.

또한 위의 환경설정은 기본 위치를 정할 , 추후 환경설정파일에서 다시 위치를 지정할 있습니다.

 

<컴파일 옵션 예제>

shell build1> cmake .. \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DSYSCONFDIR=/etc \
-DDOWNLOAD_BOOST=1 \
-DWITH_BOOST=/usr/local/src/boost \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_EXAMPLE_STORAGE_ENGINE=1 \
-DWITH_FEDERATED_STORAGE_ENGINE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DENABLED_PROFILING=1 \
-DWITH_CURL=system \
-DOPTIMIZER_TRACE=1 \
-DWITH_INNODB_MEMCACHED=1 \
-DWITH_SSL=system \
-DWITH_ZLIB=bundled

 

systemd 이용하여 MySQL시작 종료를 하고 싶다면 아래 옵션을 추가해 줍니다.

-DWITH_SYSTEMD=1

 

조금 기다리시면 터미널에 아래 메세지가 떨어지는데 특별한 에러가 보이지 않는다면 빌드환경 구성이 성공한겁니다. 만약 에러가 떨어지면 이유를 분석해 필수 필요패키지를 추가로 설치하거나, 해당 패키지에 대한 환경 구성을 다시 해주거나, 옵션 변경을 통해 해결해 주어야 합니다.

 

이제 컴파일을 해보도록 하겠습니다.

shell> make

오래 시간이 걸립니다. 40 이상 될수도 있습니다. 서버 사양에 따라 다릅니다. 컴파일이 진행되다가 멈추는 경우도 가끔 있는데 이때는 원인을 찾아서 해결을 해주어야 합니다.

 

컴파일된 프로그램을 전체적으로 테스트를 합니다.

shell> make test
Running tests...
Test project /usr/local/src/mysql-8.0.25/build1
      Start  1: hp_test1
 1/19 Test  #1: hp_test1 .........................   Passed    0.02 sec
      Start  2: hp_test2
 2/19 Test  #2: hp_test2 .........................   Passed    0.15 sec
      Start  3: pfs_instr_class
 3/19 Test  #3: pfs_instr_class ..................   Passed    0.03 sec
      Start  4: pfs_instr_class-oom
 4/19 Test  #4: pfs_instr_class-oom ..............   Passed    0.01 sec
      Start  5: pfs_instr
 5/19 Test  #5: pfs_instr ........................   Passed    0.01 sec
      Start  6: pfs_instr-oom
 6/19 Test  #6: pfs_instr-oom ....................   Passed    0.02 sec
      Start  7: pfs_account-oom
 7/19 Test  #7: pfs_account-oom ..................   Passed    0.02 sec
      Start  8: pfs_host-oom
 8/19 Test  #8: pfs_host-oom .....................   Passed    0.21 sec
      Start  9: pfs_user-oom
 9/19 Test  #9: pfs_user-oom .....................   Passed    0.19 sec
      Start 10: pfs_noop
10/19 Test #10: pfs_noop .........................   Passed    0.01 sec
      Start 11: pfs
11/19 Test #11: pfs ..............................   Passed    1.13 sec
      Start 12: pfs_misc
12/19 Test #12: pfs_misc .........................   Passed    0.01 sec
      Start 13: pfs_connect_attr
13/19 Test #13: pfs_connect_attr .................   Passed    1.99 sec
      Start 14: simple
14/19 Test #14: simple ...........................   Passed    0.19 sec
      Start 15: skip
15/19 Test #15: skip .............................   Passed    0.00 sec
      Start 16: todo
16/19 Test #16: todo .............................   Passed    0.00 sec
      Start 17: skip_all
17/19 Test #17: skip_all .........................   Passed    0.00 sec
      Start 18: no_plan
18/19 Test #18: no_plan ..........................   Passed    0.00 sec
      Start 19: basic
19/19 Test #19: basic ............................   Passed    0.00 sec

100% tests passed, 0 tests failed out of 19

Total Test time (real) =   5.16 sec

 

위에 install prefix 지정된 디렉토리에 설치를 진행합니다.

shell> make install

 

후속작업

설치가 끝났으니 후속작업을 진행해야 합니다.

먼저 mysql data들이 설치될 있는 디렉토리를 만들어주어야 합니다. 보통 설치경로 밑에 ‘data’ directory 만들고 여기다 설치를 합니다.

우리가 설치한 디렉토리는 /usr/local/mysql 입니다. 이곳으로 디렉토리를 옮겨서 data directory 생성합니다.

그리고 디렉토리의 권한을 바꾸어 줍니다.

shell> cd /usr/local/mysql
shell> mkdir data
shell> chown mysql:mysql data
shell> chmod 750 data

 

 

 

 

초기 MySQL 환경 설정

mysql install 완료하게 되면 /etc/my.cnf /etc/my.cnf.d 라는 파일들이 생깁니다.

my.cnf 몇가지 파라미터 설정이 필요한데 다음과 같이 파라미터를 초기화 해줍니다.

shell > vi /etc/my.cnf
[mysqld]
datadir=/usr/local/mysql/data
socket=/tmp/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd

[mysqld_safe]
log-error=/usr/local/mysql/data/mysqld.err
pid-file=/usr/local/mysql/data/mysqld.pid

 

이제부터 2가지 관리방식으로 나뉘게 됩니다.위의 컴파일 옵션중 -DWITH_SYSTEMD 옵션에 따라 나뉘게 됩니다.

위에서 설명드렸듯이 -DWITH_SYSTEMD옵션을 1 주었다면 시스템에서 관리되는 방법(systemctl 이용하는) 이용하는것이고 옵션을 주지 않았다면 직접 관리하는 방법이 됩니다.

 

직접 관리하는 방법[systemctl 이용하지 않는 방법. -DWITH_SYSTEMD 옵션을 주지 않음]

암호를 초기화하는 방법은 다음 두가지 방법이 있는데 하나는 일반 초기화입니다. root password 자동으로 부여해 줍니다. 하나는 추후 root패스워드를 생성하는 방법입니다.

 

* 초기 root 암호 생성 초기화방법

shell > cd /usr/local/mysql
shell > bin/mysqld --initialize --user=mysql

 

* 초기 root암호 생성 초기화

shell > cd /usr/local/mysql
shell > bin/mysqld --initialize-insecure --user=mysql

 

우리는 root암호 생성 초기화 방법으로 수행합니다. 그런데 조금더 옵션을 붙여서 수행합니다.

shell> bin/mysqld --defaults-file=/etc/my.cnf --initialize --user=mysql

수행 마지막에 보면 root password 생성이 됩니다. 적어둡니다.

 

이렇게 하면 data디렉토리에 mysql 관련 파일들이 설치되어 있는걸 확인해 보실 있습니다.

shell > cd /usr/local/mysql/data
shell > ls -al

 

ssl 관련 환경도 구성합니다.

shell > bin/mysql_ssl_rsa_setup

 

이제 MySQL 실행해보겠습니다.

shell > bin/mysqld_safe --defaults-file=/etc/my.cnf --user=mysql &
Starting MySQL. SUCCESS!

 

반드시 뒤에 & 붙입니다. 백그라운드로 실행하겠다는 옵션입니다.

엔진이 실행되었으니 mysql 접속해 보겠습니다.

 

shell> mysql -u root -p
password
암호를 입력합니다.
mysql > show databases;
performance_schema
mysql
tmp
information_schema
mysql>

 

mysql 접속 테스트가 이상없이 실행되었습니다.

 

로그인 반드시 root 암호를 변경해 줍니다. 처음에 제공된 암호는 만료가 되는 암호이므로 반드시 변경하셔야 합니다.

참고로 강력한 암호(숫자.영문.영문대문자.특수문자등이) 설정되지 않으면 다음과 같은 에러가 발생합니다. 

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY ‘admin1234'; 
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements

 

mysql> alter user 'root'@'localhost' identified by '!MyNewPass4'; 

초기 암호 정책에 따라 대소문자,특수문자,숫자가 반드시 석여야 합니다.

이렇게 하면 root 암호가 변경됩니다. 

 

엔진의 종료 방법은 다음과 같습니다.

shell > bin/mysqladmin -uroot -p shutdown
Enter password:

암호를 입력하면 mysql server 종료됩니다.

 

시작 종료 스크립트 설정

위에 있는 mysql 서버 시작 방법으로 시작하면 명령를 기억하기도 까다롭고 수행하기도 어렵습니다. 그래서 mysql 서버 시작 스크립트를 제공하고 있습니다.

shell> cp support-files/mysql.server /etc/init.d/mysqld

 

이렇게 복사를 해주신다음 mysql서버를시작할때는 다음과 같이 해줍니다.

shell > /etc/init.d/mysqld start
Starting MySQL. SUCCESS!

 

중지할때는 다음과 같이 해줍니다.

shell > /etc/init.d/mysqld stop
Shutting down MySQL.. SUCCESS!

 

시스템 관리를 통하여[systemctl 이용하는 방법. -DWITH_SYSTEMD 옵션을 1 지정]관리하는 방법.

옵션을 설정하였다면 위에 설명했던 mysqld_safe라는 시작 스크립트가 없습니다. 대신 별도의 스크립트를 만들어 수행해야 합니다.

만약 -DWITH_SYSTEMD를 컴파일 옵션에 입력하지 않았다면 맨아래 방화벽 설정만 하시면 됩니다.

 

다음의 위치에 다음 파일을 만듭니다.

위치 : /usr/lib/systemd/system/mysqld.service

mysqld.service 파일에 다음의 내용을 입력합니다.

 

[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target

[Install]
WantedBy=multi-user.target

[Service]
User=mysql
Group=mysql

Type=notify

# Disable service start and stop timeout logic of systemd for mysqld service.
TimeoutSec=0

# Execute pre and post scripts as root
PermissionsStartOnly=true

# Needed to create system tables
ExecStartPre=/usr/local/mysql/bin/mysqld_pre_systemd

# Start main service
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf $MYSQLD_OPTS

# Use this to switch malloc implementation
EnvironmentFile=-/etc/sysconfig/mysql

# Sets open_files_limit
LimitNOFILE = 10000

Restart=on-failure

RestartPreventExitStatus=1

# Set enviroment variable MYSQLD_PARENT_PID. This is required for restart.
Environment=MYSQLD_PARENT_PID=1

PrivateTmp=false

 

그리고 터미널에 다음과 같이 입력해 줍니다.

shell > systemctl enable mysqld.service
Created symlink from /etc/systemd/system/multi-user.target.wants/mysqld.service to /usr/lib/systemd/system/mysqld.service.

위와 같은 결과가 나옵니다.

 

MySQL서버를 시작합니다.

shell> systemctl daemon-reload
shell> systemctl start mysqld.service

 

상태를 확인합니다.

shell > systemctl status mysqld.service
● mysqld.service - MySQL Server
   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
   Active: active (running) since Tue 2019-12-31 21:39:21 KST; 10s ago
     Docs: man:mysqld(8)
           http://dev.mysql.com/doc/refman/en/using-systemd.html
  Process: 1649 ExecStartPre=/usr/local/mysql/bin/mysqld_pre_systemd (code=exited, status=0/SUCCESS)
 Main PID: 1727 (mysqld)
   Status: "Server is operational"
   CGroup: /system.slice/mysqld.service
           └─1727 /usr/local/mysql/bin/mysqld

Dec 31 21:39:20 my80src mysqld_pre_systemd[1649]: '.
Dec 31 21:39:20 my80src mysqld_pre_systemd[1649]: 2019-12-31T12:39:20.843083Z 0 [ERROR] [MY-013455] [Server] The newly created data directory /usr/local/mysql/data/ by --initialize is unusable. You can remove it.
Dec 31 21:39:20 my80src mysqld_pre_systemd[1649]: 2019-12-31T12:39:20.843113Z 0 [ERROR] [MY-010119] [Server] Aborting
Dec 31 21:39:21 my80src mysqld_pre_systemd[1649]: 2019-12-31T12:39:21.225808Z 0 [System] [MY-010910] [Server] /usr/local/mysql/bin/mysqld: Shutdown complete (mysqld 8.0.17)  Source distribution.
Dec 31 21:39:21 my80src mysqld[1727]: 2019-12-31T12:39:21.477681Z 0 [Warning] [MY-011070] [Server] 'Disabling symbolic links using --skip-symbolic-links (or equivalent) is the default. Consider not using this option as it' is ... a future release.
Dec 31 21:39:21 my80src mysqld[1727]: 2019-12-31T12:39:21.477759Z 0 [System] [MY-010116] [Server] /usr/local/mysql/bin/mysqld (mysqld 8.0.17) starting as process 1727
Dec 31 21:39:21 my80src systemd[1]: Started MySQL Server.
Dec 31 21:39:21 my80src mysqld[1727]: 2019-12-31T12:39:21.872366Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
Dec 31 21:39:21 my80src mysqld[1727]: 2019-12-31T12:39:21.901234Z 0 [System] [MY-010931] [Server] /usr/local/mysql/bin/mysqld: ready for connections. Version: '8.0.17'  socket: '/tmp/mysql.sock'  port: 3306  Source distribution.
Dec 31 21:39:22 my80src mysqld[1727]: 2019-12-31T12:39:22.013422Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Socket: '/tmp/mysqlx.sock' bind-address: '::' port: 33060
Hint: Some lines were ellipsized, use -l to show in full.

위와 같은 결과가 나옵니다.

 

mysql 에러로그(정보로그) 시스템과 통합되어 /var/log/message 쌓이게 됩니다. 파일을 열어보면 초기 root암호가 나옵니다. 아래와 같은 내용과 비슷하게 출력이 됩니다.

[Note] A temporary password is generated for root@localhost: ioPDPo%<8,;H

 

로그인을 시도합니다.

shell> mysql -u root -p
password

 

암호를 입력합니다.

 

로그인 반드시 root 암호를 변경해 줍니다. 처음에 제공된 암호는 만료가 되는 암호이므로 반드시 변경하셔야 합니다.

참고로 강력한 암호(숫자.영문.영문대문자.특수문자등이) 설정되지 않으면 다음과 같은 에러가 발생합니다. 

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY ‘admin1234'; 
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements

 

초기 암호 정책에 따라 대소문자,특수문자,숫자가 반드시 석여야 합니다.

 

mysql> alter user 'root'@'localhost' identified by '!MyNewPass4';

 이렇게 하면 root 암호가 변경됩니다.

 

MySQL테스트를 해봅니다.

mysql> show databases;
performance_schema
mysql
tmp
information_schema
mysql>

 

MySQL 서버 중지방법은 다음과 같습니다.

shell > systemctl stop mysqld.service

 

원격 설정

Rocky Linux RHEL 기본적으로 방화벽이 설정되어 있습니다. 그래서 Mysql 접속할 있도록 port 오픈해 주어야 접속이 가능합니다. 기본 포트는 3306입니다. 

 

다음과 같이 방화벽 포트를 오픈해 줍니다. 

shell> firewall-cmd --permanent --zone=dmz --add-service=mysql
shell> firewall-cmd --permanent --zone=public --add-port=3306/tcp
shell> firewall-cmd --reload
shell> firewall-cmd --list-ports

 

※도움이 되셨다면 광고클릭 한번 부탁드립니다.※

Designed by JB FACTORY