Last Updated on 6월 18, 2023 by Jade(정현호)
안녕하세요
이번 포스팅에서는 CentOS 8 또는 유사 포크 버전의 리눅스인 Oracle Linux8 or Rocky Linux 8 에서 MySQL 8 버전의 설치에 대해서 확인 해보려고 합니다.
Contents
설치 정보
• 설치 환경 정보
- 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
관련된 다른 글
Principal DBA(MySQL, AWS Aurora, Oracle)
핀테크 서비스인 핀다에서 데이터베이스를 운영하고 있어요(at finda.co.kr)
Previous - 당근마켓, 위메프, Oracle Korea ACS / Fedora Kor UserGroup 운영중
Database 외에도 NoSQL , Linux , Python, Cloud, Http/PHP CGI 등에도 관심이 있습니다
purityboy83@gmail.com / admin@hoing.io
4번과정보고 따라했는데요
6번에서 mysql_safe & 한 후에 비밀번호 확인하는 명령어입력하면 아무것도안나와요
그리고 mysql에 접속하려고하면 mysql.sock(2)에러가 뜹니다
혹시 어떻게해야할까요? ㅠㅠ
안녕하세요
log 파일에서 처음 기동시 임시 패스워드가 기록되고 그것을 확인 하게 되는데요
임시 패스워드가 확인이 안된다는 것은 DB 생성이나 기동 단계에서 문제가 있었거나 제대로 안된것으로 보입니다.
ps -ef| grep mysql
명령어로 mysql 이 기동되어 있는 먼저 살펴보시고
vi /usr/local/mysql/logs/mysqld.err
를 통해서 구글링 해볼만한 에러 메세지 내역이 있는지 확인이 필요해 보입니다.
감사합니다.
./mysqld --defaults-file=/etc/my.cnf
를 입력했을때
Failed to find valid data directory.
data dictionary initialization failed.
이 두 메시지가 뜨는데 my.cnf 파일이 잘못된건가요?
안녕하세요
my.cnf 가 잘못되었거나 datadir 파라미터가 잘못되었거나
datadir 에 해당하는 디렉토리가 없을 것 같습니다
이 부분을 한번 다시 체크해보시면 좋을것 같네요
감사합니다.
안녕하세요
mysqld --defaults-file = /etc/my.cnf 명령어를 입력하니 에러 로그에
unkown option '--defaults-file'이 기록됩니다
버전때문에 저 옵션이 없는건가요?
안녕하세요
기동 하실때는
mysqld 나 mysqld_safe 에서 --defaults-extra-file 를 사용해보세요
--defaults-extra-file=/etc/my.cnf
mysqld --defaults-extra-file=/etc/my.cnf &
감사합니다.
도움이 되었다니 다행입니다.
좋은 하루되세요
좋은 내용 보고 갑니당 ㅎㅎㅎ
위 내용중에서 압축 해제 해서 설치하는게 적당한거 같네요
정리한 내용 감사합니다. ㅎㅎㅎ
코멘트 감사합니다.
좋은 하루 되세요
감사합니다.!