Rocky Linux 8.6 에서 MySQL 8.0.30 소스 설치하기 (with InnoDB 이노디비 설정)

리눅스/MySQL|2022. 8. 11. 13:09
반응형

1. 필수 패키지 설치

 

# dnf -y update
# dnf -y install cmake ncurses-devel gcc* openssl openssl-devel libtirpc-devel
# dnf -y install epel-release
# dnf config-manager --set-enabled powertools
# dnf -y install rpcgen

 

작업이 잘 수행 되도록 아래 명령 실행 하고, 서버 부팅시에도 selinux 비활성화를 위해 설정을 수정해 줍니다.

# setenforce 0

# vi /etc/selinux/config

SELINUX=disabled 

 

 

2. MySQL 계정 추가

 

# groupadd -g 400 mysql
# useradd -u 400 -g 400 -d /usr/local/mysql -s /bin/false mysql

 


3. MySQL 설치

 

# cd /usr/local/src
# wget https://ftp.kaist.ac.kr/mysql/Downloads/MySQL-8.0/mysql-8.0.30.tar.gz
# tar xvfz mysql-8.0.30.tar.gz
# cd mysql-8.0.30
# cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/usr/local/mysql/data -DENABLED_LOCAL_INFILE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DMYSQL_UNIX_ADDR=/tmp/mysql.sock -DSYSCONFDIR=/etc -DDEFAULT_CHARSET=utf8 -DWITH_SSL=system -DMYSQL_TCP_PORT=3306 -DWITH_EXTRA_CHARSETS=all -DDEFAULT_COLLATION=utf8_general_ci -DDOWNLOAD_BOOST=1 -DWITH_BOOST=/usr/local/include/boost -DFORCE_INSOURCE_BUILD=1
# make
# make install

 

 

4. MySQL 환경 설정

 

환경 설정 파일이 없어도 아래 '5번 항목' 에서 기본 DB 생성 후 MySQL 구동은 가능하지만

my.cnf 파일을 생성하면 서버 사양 및 운영 방식에 알맞게 환경을 조정할 수 있습니다.

아래는 InnoDB 구성을 위한 예 입니다.


# vi /etc/my.cnf

[client]
default-character-set = utf8


[mysqld]
#################### 일반 서버 설정 ####################
# 서버 순번
server-id = 1
# 기본 엔진 설정
default-storage-engine = InnoDB
# 역 DNS 검색 비활성
skip-name-resolve
# 최대 클라이언트 연결 개수
max_connections = 1024
# 다쓴 쓰레드를 스레드풀에 저장할 갯수
thread_cache_size = 50
# 커넥션 최대 대기시간(초)
wait_timeout = 28800
# 정렬에 필요한 버퍼의 크기 ORDER BY 또는 GROUP BY 연산 속도와 관련
sort_buffer_size = 512K
# 캐릭터셋
collation-server = utf8_unicode_ci
character-set-server = utf8
skip-character-set-client-handshake

############# InnoDB 설정 (메모리 8G 기준) #############
# 테이블 단위로 테이블스페이스 할당, 활성시 확장자 .ibd 파일이 생성됨
innodb_file_per_table = 1
# innodb 홈디렉터리 경로
innodb_data_home_dir = /usr/local/mysql/data
# 파일명 : 초기용량 : 자동증가 : 최대사이즈 (파일 재생성 할때 사용)
#innodb_data_file_path = ibdata1:1024M:autoextend
# 테이블 스페이스 자동 확장시 크기
innodb_autoextend_increment = 100
innodb_log_group_home_dir = /usr/local/mysql/data
# 데이터와 인덱스를 캐시하기 위해 사용하는 메모리 버퍼크기
# 서버에 MySQL만 실행한다면, 물리메모리의 50~80%를 지정
innodb_buffer_pool_size = 5G
# Redo 로그 버퍼크기
innodb_log_buffer_size = 16M

# 로그 파일 한 개의 크기로 보통 buffer_pool 사이즈의 10%를 지정
# 크기가 클 수록 체크포인트가 덜 발생해 디스크 I/O를 줄이지만,
# 디비가 크래시 났을 경우 복구 타임이 길어진다.
innodb_log_file_size = 512M

# 커밋 로그 옵션으로 성능 최적화에 사용
# 1 : 트랜젝션 실행할때마다 redo 로그 파일에 기록되고 디스크 플러시가 실행 (default 값)
# 2 : 트랜젝션의 양은 상관없이 flush 가 1초에 한번씩만 수행되기 때문에 매번 flush 되는 기본값보다 IO 성능이 월등히 좋아지지만
#     단점은 데이터를 유실할 가능성이 있다는 점 (예: flush 되기 전 1초 이내 셧다운)
# 0 : 2와 동일하나 OS buffer 를 거치는 부분이 제외되어 더 빠름. 데이터 유실 가능성은 동일.
# 설명 : 서버가 죽었을때 1~2초 정도의 데이터를 버릴수 있을 정도의 상황이라면 0 또는 2 를 선택
#        커밋된 데이터는 무조건 살려야만 한다면 반드시 1 을 선택
innodb_flush_log_at_trx_commit = 1

# InooDB내에 쓰레드 갯수, 변수 0은 쓰레드간 동시성 비활성화
innodb_thread_concurrency = 0
# 롤백이 진행되기 전에 LOCK을 대기하는 시간(초)
innodb_lock_wait_timeout = 20
# 크래시 복구 모드 설정
innodb_force_recovery = 0
# 성능을 위해 메모리에서 직접 액세스 하도록 설정
innodb_flush_method = O_DSYNC

# O_DIRECT=운영체제의 버퍼를 사용 않고 IO 실행, RAID 컨트롤러(캐시메모리 장착된)가 없거나 SAN 사용시 O_DIRECT를 사용 하지 않음
# 이중 쓰기 버퍼 비활성
innodb_doublewrite = 0
# 쓰레드가 지연되기 전에 (suspended) 풀어 주기 위해 InnoDB 뮤텍스 (mutex) 를 기다리는 쓰레드의 대기 시간
innodb_sync_spin_loops = 20
# LOCK TABLES 은 AUTOCOMMIT=0 경우에, InnoDB로 하여금 내부적으로 테이블을 잠금
innodb_table_locks = 1
# InnoDB 큐를 조이닝 (joining) 하기 전에 InnoDB 쓰레드가 일시 정지 (sleep) 하는 시간
innodb_thread_sleep_delay = 1000
# 퍼지 연산 (purge operation)이 래깅 (lagging) 될 때 INSERT, UPDATE 및 DELETE 연산을 지연 시키는 방법을 제어
# 디폴트값 0 일시 지연 없음
innodb_max_purge_lag = 0
# 동시에 실행되는 쓰레드의 숫자. 이 값이 0이 되면 동시성 제어 (concurrency control) 가 비활성화
innodb_commit_concurrency = 0
# InnoDB에 동시에 들어갈 수 있는 쓰레드의 숫자는 innodb_thread_concurrency 변수로 알아볼 수가 있다.
# 여러 개의 쓰레드가 이미 컨커런시 한계에 도달하였다면, 하나의 쓰레드만이 큐에 들어갈 수 있다.
# 하나의 쓰레드가 InnoDB에 들어가게 되면, innodb_concurrency_tickets의 값과 일치하는 "자유 티켓"의 숫자가 주어지고
# 쓰레드가 자신의 티켓을 사용하기 전 까지는 자유롭게 InnoDB에 들어가고 나올 수가 있다.
# 이런 후에는, 쓰레드는 다시금 일관성 검사를 하고 InnoDB에 다시 들어가려고 시도하게 된다
innodb_concurrency_tickets = 500
# 개발 방식에 따라 sql_mode 적용. MySQL 8 기본값 : ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
#sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION


#################### 바이너리 로그 #####################
# 바이너리 로그 파일 (binlog.xxxx 형태의 파일 생성. 경로 추가 가능)
#skip-log-bin
log-bin = binlog
# 파일당 최대 사이즈
max_binlog_size = 1G

##################### 제네럴 로그 ######################
# 제네럴 로그 사용 여부 (0: 비활성, 1: 활성)
general_log = 1
# 제네럴 로그 파일
general_log_file = /usr/local/mysql/data/general_query.log


################### 슬로우 쿼리 로그 ###################
# 슬로우 로그 사용 여부 (0: 비활성, 1: 활성)
slow-query-log = 1
# 슬로우 쿼리를 구분하는 소요 시간 (초)
long_query_time = 10
# 슬로우 로그 파일
slow_query_log_file = /usr/local/mysql/data/slow_query.log


[mysqldump]
default-character-set = utf8


[mysql]
default-character-set = utf8

* 옵션 설명은 아래 URL 참고

https://yakolla.tistory.com/61

https://bae9086.tistory.com/175 

https://systemv.tistory.com/48

 

 

5. MySQL 초기 데이터 베이스 생성 및 권한 설정

 

생성해두었던 my.cnf 파일을 읽어 환경에 맞게 기본 DB 를 생성합니다.

 

# /usr/local/mysql/bin/mysqld --initialize-insecure --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql
# chown -R mysql.mysql /usr/local/mysql/
# chmod 711 /usr/local/mysql
# chmod 700 /usr/local/mysql/data
# chmod 751 /usr/local/mysql/bin/
# chmod 750 /usr/local/mysql/bin/*
# chmod 755 /usr/local/mysql/bin/mysql
# chmod 755 /usr/local/mysql/bin/mysqldump

 


6. MySQL 구동

 

데몬 구동을 쉽게 하기 위해 명령어를 복사하고, 서버 부팅시 자동으로 데몬이 구동 되도록 설정합니다.

# cp -arp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
# chkconfig --add mysqld
# chkconfig mysqld on

# /etc/init.d/mysqld start

 


* 이후 작업 (필요에 따라 설정)

 

1) mysql 명령을 경로에 상관없이 사용하도록 설정 추가

# vi /etc/profile

PATH="$PATH:/usr/local/mysql/bin"

# source /etc/profile

 

2) firewalld 방화벽 설정 (서버 외부에서 DB 바로 접근 필요시)

# firewall-cmd --zone=public --add-port=3306/tcp

 

3) MySQL root 패스워드 업데이트

mysql> use mysql;

mysql> alter user root@localhost identified by 'NEWPASSWD';

mysql> flush privileges; 

 

4) 새 계정 추가

mysql> create database sysdocudb;

mysql> create user 'sysdocu'@'localhost' identified by '12345678';
mysql> grant all privileges on sysdocudb.* to 'cc'@'localhost';
mysql> flush privileges;

 

반응형

댓글()