[SQL] Ubuntu22.04 MySQL Source compile 설치

DeMar_Beom·2024년 3월 5일
0

SQL

목록 보기
16/17

MySQL Source compile설치

Mysql은 binary 방식으로만 설치를 진행했어가지고 Source Complie방식으로 설치하는 방법은 아에 모르고 있었다... 하지만 실무에서는 회사 내 정책, 서비스에 맞게 DB를 운영해야하기 때문에 Source Compile방식을 채택하는 경우가 많다..
지금 작성하는 부분은 다른 뛰어나신 분들이 작성한 내용을 바탕으로 어떻게 설치하는지를 따라하면서 공부했을 뿐이니 더 자세한 내용을 원하는 분들은 바로 아래 링크를 통해 보시면 좋겠다.

https://hoing.io/archives/359
https://shine-yeolmae.tistory.com/39

1. 배경지식

Source Compile 설치

  • 소스 패키지는 여러 파일이 포함되어 패키지 및 압축(tar.gz)
  • RPM파일 없이 소스 코드로 직접 설치하여 세밀한 설정이 가능하며 기능을 자유롭게 선택 가능
  • 시스템에 보다 적합하고 안정적이며 효율적
  • 초보자가 해결하기 어려운 문제가 많음

Binary (rpm, yum) 설치

  • 프로그램 설치와 관리가 용이하게 되어 있어 소스 패키지가 성공적으로 컴파일 된 후에 생성된 패키지
  • YUM으로 설치 시 RPM의 의존성 문제를 repository에서 가져와서 해결 가능
  • 컴파일 후에는 소스 코드를 볼 수 없으며 소스패키지만큼 자유롭지 않음

2.필요 패키지 설치

apt install build-essential bison
apt install gcc g++ libncurses5-dev libxml2-dev openssl
apt install libssl-dev curl libcurl4-openssl-dev libjpeg-dev
apt install libpng-dev libfreetype6-dev libsasl2-dev
apt install autoconf libncurses5 libtirpc-dev
apt install ncurses* cmake-gui cmake 

build-essential : C/C++ 소소코드를 빌드하는데 필요한 기본도구, gcc, g++ 등의 컴파일러와 make 등이 포함
bison : 파서 생성 도구로 mysql sql 문법 파싱하는데 필요한 파서 기능
libncurses5-dev, libncurses5, ncurses* : CLI인터페이스 지원 라이브러리, mysql-client에서 사용
openssl, libssl-dev : 보안 및 암호화 기능을 제공하기 위한 라이브러리, mysql에서는 SSL/TLS연결을 지원하고, 이를 위한 openssl라이브러리를 사용
curl, libcurl4-openssl-dev : 원격 URL에 대한 데이터 전송에 사용되는 라이브러리로 원격 데이터를 통신할 떄 사용되는 라이브러리
libjpeg-dev, libpng-dev, libfreetype6-dev : 이미지 처리 관련 라이브러리
libsasl2-dev : 클라이언트와 서버간의 인증에 사용되는 라이브러리
autoconf : 소프트웨어를 빌드하기 위해 소스코드 빌드 과정 자동화
libtirpc-dev : RPC(원격 프로시저 호출)을 지원하기 위한 라이브러리
cmake-gui, cmake : C/C++언어의 소스코드 빌드 시스템 라이브러리

그룹 및 유저 생성

groupadd mysql
useradd -g mysql mysql 
  • mysql이라는 그룹을 생성한 뒤에 해당 그룹에 대한 user로 mysql을 추가해줍니다.

tar파일 다운 및 압축해제

  • 이제 mysql의 tar파일을 다운받은 후 압축을 해제하시면 됩니다.
  • 진행 전에 우선 경로를 지정한 다음에 하는 것이 좋은데 저는 /mnt/d에 폴더를 만들어서 진행하도록 하겠습니다.
mkdir /mnt/d/dbbox && cd /mnt/d/dbbox
wget https://downloads.mysql.com/archives/get/p/23/file/mysql-boost-5.7.31.tar.gz
tar zxvf mysql-boost-5.7.31.tar.gz
cd mysql-5.7.31

cmake mysql 빌드

cmake \
'-DCMAKE_INSTALL_PREFIX=/mnt/d/dbbox' \ # mysql 설치경로 prefix
'-DINSTALL_SBINDIR=/mnt/d/dbbox/bin' \ # 실행파일 설치 경로
'-DINSTALL_BINDIR=/mnt/d/dbbox/bin' \ 
'-DMYSQL_DATADIR=/mnt/d/dbbox/data' \ # mysql 데이터 디렉토리 경로
'-DINSTALL_SCRIPTDIR=/mnt/d/dbbox/bin' \ # mysql 스크립트 파일 설치 경로 
'-DWITH_INNOBASE_STORAGE_ENGINE=1' \ #innodb엔진 사용 영부
'-DWITH_PARTITION_STORAGE_ENGINE=1' \ # 파티션 엔진 사용여부 
'-DSYSCONFDIR=/mnt/d/dbbox/etc' \ #  # 시스템 구성 파일 디렉토리 설정
'-DDEFAULT_CHARSET=utf8mb4' \ # # 기본 문자집합
'-DDEFAULT_COLLATION=utf8mb4_general_ci' \ # 기본 콜레이션 utf8mb4설정
'-DWITH_EXTRA_CHARSETS=all' \ # 추가 문자집합 설정
'-DENABLED_LOCAL_INFILE=1' \ # 로컬 읽기 설정
'-DMYSQL_TCP_PORT=3306' \ # tcp 포트 번호 설정
'-DMYSQL_UNIX_ADDR=/tmp/mysql.sock' \ # mysql unix 소켓 파일 위치
'-DCURSES_LIBRARY=/usr/lib/x86_64-linux-gnu/libncurses.so' \ # curses 라이브러 위치 설정
'-DCURSES_INCLUDE_PATH=/usr/include' \ # curses 헤더 파일 위치 
'-DDOWNLOAD_BOOST=1' \ # boost라이러리 사용여부 
'-DWITH_BOOST=./boost' \ # boost라이브러리 위치
'-DWITH_ARCHIVE_STORAGE_ENGINE=1' \ # Archive 스토리지 엔진
'-DWITH_BLACKHOLE_STORAGE_ENGINE=1' \ # Blackhole 스토리지 엔진
'-DWITH_PERFSCHEMA_STORAGE_ENGINE=1' \ # performance schema 엔진
'-DWITH_FEDERATED_STORAGE_ENGINE=1' # federated 엔진

  • 저는 이렇게 빌드를 하려고 하다가 계속 openssl오류가 발생했었습니다. openssl은 위에서 필요한 패키지들을 설치하는데 설치했었고 openssl version한 결과 설치가 되있더 것도 확인했었습니다.
  • 계속 생각하던 와중 mysql 5.7버전에서 지원하는 openssl하는 버전과 현재 설치한 ubuntu22.04에 최신 openssl이 버전이 맞지 않는건가라고 생각을 하게되어 다른 분들의 블로그를 참고해서 mysql 5.7버전의 openssl버전을 찾은 결과 1.1.1버전을 사용하고 있어 삭제 후 다시 설치하였습니다.
# 기존 openssl 삭제
apt-get --purge autoremove openssl

# 1.1.1버전 설치 후 빌드
cd /usr/local/src
wget https://www.openssl.org/source/old/1.1.1/index.html --no-check-certificate
tar -xvzf openssl-1.0.1f.tar.gz
cd openssl-1.0.1f
./config 
make
make install

  • openssl의 버전을 바꾼 후 다시 위에 cmake파일을 적용하였더니 오류 없이 진행된 것을 확인할 수 있었습니다.

  • 이후 make를 하면 꽤나 오랜시간동안 빌드가 이루어집니다.

  • 이제 make install 을 하면 됩니다.

디렉토리 생성 및 권한 변경

  • mysql에서 사용할 tmp,logs,data 폴더를 만든 후 각각 mysql사용자로 권한을 변경해줍니다.
cd /mnt/d/dbbox/
mkdir logs tmp data
touch ./logs/mysqld_safe.err # mysql서버 에러로그 파일 생성

cd /mnt/d
chown -R mysql:mysql ./dbbox

mysql 라이브러리 등록

vi /etc/ld.so.conf 

# 아래 내용 추가
/mnt/d/dbbox/lib

my.cnf 파일 생성

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

[mysql]
no-auto-rehash
show-warnings

[mysqld]
server-id=1
port = 3306
bind-address = 127.0.0.1
basedir = /mnt/d/dbbox/mysql
datadir= /mnt/d/dbbox/data
tmpdir=/mnt/d/dbbox/data
socket=/tmp/mysql.sock
user=mysql
skip_name_resolve


######## MyISAM Spectific options ############
key_buffer_size = 100M
### INNODB Spectific options
default-storage-engine = InnoDB
innodb_buffer_pool_size = 384M 

######## DATAFILE #########
innodb_data_home_dir = /mnt/d/dbbox/data/
innodb_data_file_path = ib_system:100M:autoextend
innodb_file_per_table=ON
innodb_log_buffer_size = 8M
innodb_log_files_in_group = 3
innodb_log_file_size=200M
innodb_log_files_in_group=4
#innodb_log_group_home_dir = /mnt/d/dbbox/data/redologs
#innodb_undo_directory = /mnt/d/dbbox/data/undologs
innodb_undo_tablespaces = 1

############## Connection ##################
max_connections = 1000
wait_timeout= 60

############## log ####################
# Error Log
log_error=/mnt/d/dbbox/logs/mysqld.err
log-output=FILE
general_log=0
slow-query-log=0
long_query_time = 5
slow_query_log_file = /mnt/d/dbbox/logs/slow_query.log
pid-file=/mnt/d/dbbox/tmp/mysqld.pid

################## chracterset ##################
character-set-client-handshake=OFF
skip-character-set-client-handshake
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci

[mysqld_safe]
log_error=/mnt/d/dbbox/logs/mysqld.err
pid-file=/mnt/d/dbbox/tmp/mysqld.pid
  • 여기서 buffer_pool size는 책에서 전체 메모리의 약 80%를 설정하라고 많이 나오는데 기본적으로는 buffer_pool_instance * buffer_pool_chunksize를 해야합니다.
  • buffer_pool_instance의 수는 현재 사용하고 있는 cpu코어의 2배를 설정해주시는게 제일 효과적이라고 합니다.
# cpu core개수 확인
cat /proc/cpuinfo | grep "cpu cores" | head -1 |  awk '{print$4}'

mysql 실행

  • 이제 mysql을 실행하면 됩니다. 우선 db를 생성합니다.
./mysqld --initialize --user=mysql \
--basedir=/mnt/d/dbbox \
--datadir=/mnt/d/dbbox/data

# 파일 생성 확인
ls -l /mnt/d/dbbox/data/

  • mysql root로 접속하기 위해서 log에 있는 임시비밀번호를 확인합니다.
/mnt/d/dbbox/bin/mysqld_safe --defaults-file=/etc/my.cnf & 
ps -ef | grep mysql

  • mysql 프로세스가 정상적으로 기동되고 있는 것을 확인할 수 있습니다.

mysql 접속 및 비밀번호 변경

  • root로 접속하기 위해서 log에 있는 임시비밀번호를 확인 후 비밀번호를 변경해줍니다.
cat /mnt/d/dbbox/logs/mysqld.err | grep password
--> wktfOto(0h*z

# mysql 접속
/mnt/d/dbbox/bin/mysql -uroot -p
--> 임시비밀번호 입력
# 비밀번호 변경
ALTER USER root@'localhost' identified by '비밀번호';
COMMIT;
FLUSH PRIVILEGES;
EXIT

  • 이후 설정한 비밀번호로 mysql을 사용하시면 되십니다.

후기

  • mysql source compile은 몇번 해봤지만 해도해도 헷갈리고, WSL환경에서 실행하다 보니 안되는게 이만저만이 아니었습니다.
  • 혹시라도 하게 되신다면 미리 포트, 마운트 환경, 경로 설정 등을 유의해주세요.
  • 밑에 저도 보고 따라한 내용이니 저분의 내용을 많이 참고하세요.

참고

https://codingstorywithme.tistory.com/24

0개의 댓글