안녕, 세상!

1-2. Lamp 소스 설치 및 구현 - MySQL 컴파일 설치 본문

It공부/Server

1-2. Lamp 소스 설치 및 구현 - MySQL 컴파일 설치

dev_Lumin 2021. 1. 27. 00:16

앞서 apache를 구현했으므로 이제 mysql을 컴파일 설치로 구현하겠습니다.

mysql의 버전은 MySQL 8.0.19로 설치하겠습니다.

 

구현 환경

가상 환경 : vmware workstation 16 community player

OS : Ubuntu 18.04.05 Desktop 64bit (LTS)

Apache : Apache 2.4.46

mysql : MySQL 8.0.19

 

(1) MySQL 설치를 위한 의존성 패키지 설치

mysql 컴파일 설치와 관한 가이드는 공홈에 잘 나와있습니다.

( dev.mysql.com/doc/refman/8.0/en/installing-source-distribution.html )

mysql 컴파일 설치를 위해서 먼저 설치해야 할 패키지들에 대한 명시도 공홈에 나와있습니다.

(dev.mysql.com/doc/refman/8.0/en/source-installation-prerequisites.html)

 

MySQL 의존성 패키지

1. CMake

2. GNU make 3.75 이상

3. Linux 운영체제는 GCC 5.3 이상

4. C++ 혹은 C99 compiler

5. SSL Library : OpenSSL Library

6. Boot C++ libraries 

7. ncurses library 

8. Perl

 

이렇게 총 8개의 패키지를 요구합니다.

앞서 apache를 실습할 때 이미 설치한 것이 있거나 이미 존재할 수 도 있으므로 다음 명령어로 설치 여부를 파악합니다.

$ dpkg -l | grep [이름]

(위의 명령어는 참고로 apt-get으로 설치한 것만 확인 가능함.)

 

사진에서 윗부분 잘못 짤랐는데 cmake 부분은 설치안되어 있었음

결과로 보아서 1번과 6번만 설치해주면 될 것 같습니다.

4번은 MySQL C API가 필요하다고 하는 것인데, GCC와 G++가 이미 설치되어 있어서 상관없습니다.

6번은 libboost-all-dev로 다운로드하면 됩니다.

 

만약 5번이 없다면 : $ sudo apt-get install libssl-dev

만약 7번이 없다면 : $ sudo apt-get install libncurses5-dev libncursesw5-dev

$ sudo apt-get update
$ sudo apt-get install cmake
$ sudo apt-get install libboost-all-dev

( 지금은 이것만 설치하면 되는 것처럼 보이지만 사실은 아직 덜 설치한 것임

  밑으로 내려가서 처음부터 설치해야 할 의존성 패키지들 추가로 적은 것이 있으니 

  그것을 미리 보고 미리 설치해도 됨)

 

(2) MySQL Community Server 8.0.19 

 

① MySQL 다운로드

다운로드 링크는 다음 링크를 통해 확인할 수 있습니다.

https://dev.mysql.com/downloads/mysql/

 

MySQL :: Download MySQL Community Server

Select Operating System: Select Operating System… Microsoft Windows Ubuntu Linux Debian Linux SUSE Linux Enterprise Server Red Hat Enterprise Linux / Oracle Linux Fedora Linux - Generic Oracle Solaris macOS FreeBSD Source Code Select OS Version: All Wind

dev.mysql.com

 

MySQL Community Server 8.0.10 다운로드 링크

( https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.19.tar.gz )

 

 

이제 mysql을 다운로드하고 설치 및 컴파일을 해보겠습니다.

마찬가지로 설치받고 압축을 풉니다.

$ cd /usr/local
$ sudo wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.19.tar.gz
$ sudo tar xvfz mysql-8.0.19.tar.gz
$ ls -l

 

② MySQL 설치

이제 cmake와 make명령어를 이용해서 mysql을 설치합니다.

cmake 명령어를 통해 설치 옵션을 부여하고, make 명령어로 빌드한 뒤, make install로 설치를 진행합니다.

$ cd /usr/local/mysql-8.0.19
$ sudo cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \
-DMYSQL_TCP_PORT=3306 \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DSYSCONFDIR=/etc \
-DWITH_EXTRA_CHARSETS=all \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DDOWNLOAD_BOOST=1 \
-DWITH_BOOST=/usr/local/mysql/boost 
$ make
$ make test
$ make install

이제 cmake 명령어를 입력합니다.

분명 다음과 같이 확인해보면 openssl이 있는데 이게 대문자를 말하는 것인지 소문자를 말하는 것인지 파악을 못하겠음

결국은 SSL 관련 cmake 오류가 났으므로 appropriate openssl developer package를 설치해야 합니다.

 

sudo apt-get install libssl-dev

 

 

또다시 cmake 명령어를 입력합니다.

ncurses library 없다고 또 오류 뜹니다.

분명 ncurse 과련 dpkg 명령어를 하면 뭔가 나오기는 하는데도 불구하고 오류가 나오니 설치를 해야 합니다.

sudo apt-get install libncurses5-dev libncursesw5-dev

 

이제 또다시,

하지만 cmake를 하면 다음과 같은 오류가 발생합니다.

CMake Error at CMakeLists.txt:352 (MESSAGE)

please do not build in-source. Out-of source builds are highly recommend:

해당 오류는 소스 디렉터리 내에 build를 위한 디렉터리를 추가 생성하고 (디렉터리 이름은 마음대로)

그 안에서 작업을 진행하도록 권고하는 오류입니다.

 

그래서 이를 해결해야 하는데 이를 해결하기 전에 먼저 삭제해야 하는. txt 파일이 있습니다.

해당 명령어 과정으로 CMakeCache.txt라는 파일이 생기는데 이 파일을 삭제하지 않고 다음을 수행하면 오류가 발생할 수 있으므로 먼저 이 파일을 지우고 위의 오류를 해결하겠습니다.

(위에서 cmake 할 때 오류가 떴었는데 그때도 cmake 할 때마다 CMakeCache.txt가 생김)

(참고로 CMakeCache.txt 파일은 위의 cmake 명령어를 실행한 위치의 디렉터리 안에 생깁니다.

ls명령어로 확인 가능)

$ ls -l
$ rm -f CMakeCache.txt

 

이제 위의 본격적인 오류를 해결해보겠습니다.

위의 말대로 cmake 명령어를 수행할 디렉터리를 만들고 그 안에서 실행하라고 했으니 다음과 같이 합니다.

$ cd /usr/local/mysql-8.0.19
$ sudo mkdir [디렉토리명]
$ cd [디렉토리명]
$ cmake .. \
> -DCMAKE_INSTALL_PREFIX.... (이하생략)

([디렉토리명]은 자기 마음대로 설정 : 필자는 'luminmysql'로 함

위의 .. 을 넣어줌으로써 새로 만든 디렉터리 내부에서도 cmake 명령어가 잘 작동되게 합니다.

 

 

 

cmake에서 위와 같이 오류가 여러 번 나므로 처음부터 필요한 패키지를 설치하면 좋습니다.

그러므로 다시 실습 시 처음부터 mysql 의존성 패키지들을 미리 다음과 같이 설치를 합니다.

$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install cmake
$ sudo apt-get install libssl-dev
$ sudo apt-get install libboost-all-dev
$ sudo apt-get install libncurses5-dev libncursesw5-dev

 

 

 

 

이제 make 명령어를 실행시킵니다.

$sudo make
$sudo make test
$sudo make install

그런데 make 명령어에서 다음과 같은 오류가 발생합니다.

c++: internal compiler error: killed (program cc1plus)

검색해보니 해당 에러는 코드의 에러가 아닌 메모리의 에러라고 합니다.

( 참조 : bogdancornianu.com/change-swap-size-in-ubuntu/ , m.blog.naver.com/jungspeedy/222036268371

velog.io/@ilcm96/Ubuntu-Swap-%EC%84%A4%EC%A0%95

lahuman.github.io/setting_swap/ )

메모리 문제 중에 Ram이 부족해서 발생하는 에러라고 합니다.

그래서 swap 메모리를 확장함으로써 해당 에러를 해결할 수 있습니다.

그렇다면 swap이란?

 

/Swap

Swap is a special area on your computer, which the operating system can use as additional RAM.

Swap은 운영체제가 추가적인 RAM을 사용할 수 있는 컴퓨터 내부의 특별한 영역입니다.

물리적인 메모리(RAM)의 연장 공간처럼 쓰이는 공간입니다.

 

 

 Set swapfile in /etc/fstab.

Ubuntu 17.04 LTS 버전부터 Swap partition(파티션)이 Swap file로 대체되었습니다.

따라서 Swap 파일을 수정할 때 /swapfile을 제어하면 됩니다.

이러한 /swapfile의 장점은 쉽게 사이즈 조절을 할 수 있다는 것입니다.

 

그래서 위의 참조 내용을 참고하여 다음과 같이 명령어를 입력합니다.

$ sudo swapoff -a
$ sudo dd if=/dev/zero of=/swapfile bs=1G count=4
$ sudo chmod 600 /swapfile
$ sudo mkswap /swapfile
$ sudo swapon /swapfile
$ free -m

그런데 두 번째 명령어를 입력하면 killed가 나오고 4번째 명령어를 입력하면 swap공간이 부족하다고 에러가 뜹니다.

그래서 두 번째 명령어가 결국 swap file의 공간을 할당하기 위해 설정하는 명령어일 텐데 안돼서

다른 명령어로 대체를 했습니다.

다음이 진짜 실행된 명령어입니다.

$ sudo swapoff -a
$ sudo fallocate -l 4G /swapfile
$ sudo chmod 600 /swapfile
$ sudo mkswap /swapfile
$ sudo swapon /swapfile
$ free -m

falllocate 명령어를 통해서 swap메모리에 4G를 할당한 것입니다.

free -m 명령어는 메모리가 할당이 되었는지 확인할 수 있는 명령어입니다.

 

또한 다음 명령어로도 swap메모리가 잘 할당되어 있는지 확인할 수 있습니다.

$ grep SwapTotal /proc/meminfo

 

시스템이 재부팅되면 swap영역이 비활성되어 수동으로 swapon명령을 통해 swap을 활성해줘야 하는 번거로움이 있다고 합니다.

하지만 필자는 재부팅 시에도 자동으로 swap이 자동으로 할당되어 있었습니다.

만약 재부팅 시 자동으로 할당이 되지 않는다면,

자동으로 할당시켜야 하는데 이때 /etc/fstab을 수정함으로써 이를 해결할 수 있습니다.

$ sudo vi /etc/fstab

# 가장 아래 부분에 추가 
/swapfile   none    swap    sw    0   0

아마 ubuntu 18.04 LTS 버전은 설정하면 reboot 되어도 자동으로 유지되는 것 같습니다.

 

추가적인 swap 참조 자료

( linuxize.com/post/how-to-add-swap-space-on-ubuntu-18-04/ )

 

How to Add Swap Space on Ubuntu 18.04

Swap is a space on a disk that is used when the amount of physical RAM memory is full. This tutorial covers the steps necessary to add a swap file to Ubuntu 18.04.

linuxize.com

 

이제 swap메모리에 메모리를 할당했으므로 다시 make 명령어를 치기 전에 한 가지 더 해줘야 할 것이 있습니다. 

 

Vmware 하드디스크 용량 확장 (Ubuntu)

만약 하드디스크가 20G로 잡았다면, 

make 과정에서 마지막에 메모리가 부족하다고 나올 것입니다.

그래서 make 명령어를 치기 전에 미리 하드디스크 확장을 하겠습니다.

Vmware workstation에서 ubuntu 환경에서의 하드디스크 확장 방법은 다음을 참조하였습니다.

( cragy0516.github.io/Expand-Hard-Disk-in-VMWare/ )

 

우선 전원을 끄고 나간 뒤

해당 가상 환경 edit settings에 들어가서 하드디스크 항목을 선택 후 expand버튼을 눌러서 원하는 만큼

하드디스크를 늘려줍니다.

(필자는 30G로 수정함)

 

그리고 다시 부팅을 시켜서 추가 설정을 해줍니다.

$ sudo parted /dev/sda
(parted) print free

print free는 파티션의 상태를 보여줍니다.

파티션 number 1에 아직 기존 20G와 추가시킨 10G가 합쳐지지 않은 것을 확인할 수 있습니다.

 

이를 위해서 다음과 같이 resizepart 명령어를 사용해서 합쳐줍니다.

(parted) resizepart 1
y
30GB
(parted) print free

이제 합쳐진 것을 확인할 수 있습니다.

(위의 경우는 30GB까지만 했는데 마저 32.2GB까지 꽉 합쳐도 상관없습니다.)

 

 

 

이제 make 명령어들 3개를 모두 실행하면 잘 됩니다.

(make 명령어로 컴파일하는 과정은 어마 무시하게 오래 걸립니다!)

make 완료
make install완료

make 명령어 실행이 너무 오래 걸렸습니다. 

또한 중간에 오류로 인해서 make 명령어만 총 4번 시도한 것 같습니다....

 

여기까지 mysql 설치 과정이었는데 만약 위의 과정 순서대로(일일이 오류를 맞이한다면) 해서 안된다면,

위의 과정을 순서대로 하되, 오류를 미리 보고 오류를 방지하는 방향으로 따라 한다면 될 것입니다.

 

 

 

(3) MySQL 데이터베이스 초기화

공식문서( https://dev.mysql.com/doc/refman/5.7/en/data-directory-initialization.html )에 의하면,

mysql을 설치한 후, mysql 시스템 데이터베이스의 테이블을 포함하여

데이터 디렉터리를 초기화해야 한다고 합니다.

① mysql을 위한 그룹과 유저를 생성

$ sudo groupadd mysql
$ sudo useradd -r -g mysql -s /bin/false mysql
$ cat /etc/passwd

mysql이라는 이름의 그룹을 만들고

mysql이라는 이름의 사용자를 mysql의 그룹에 넣고 유저의 로그인 shell을 /bin/false로 지정합니다.

 

cat /etc/passwd 명령어를 통해서 전체 유저들의 목록을 확인할 수 있습니다. 

 

② /usr/local/mysql에 mysql-files 디렉터리를 생성

/usr/local/mysql 디렉터리는 위에서 cmake 명령어로 설치할 때 만들어진 디렉터리입니다.

$ cd /usr/local/mysql
$ sudo mkdir mysql-files

디렉터리 사용자 및 그룹 소유권 부여 및 디렉터리 권한 설정

$ sudo chown -R mysql:mysql /usr/local/mysql
$ sudo chown mysql:mysql mysql-files
$ sudo chmod 750 mysql-files

디렉터리(mysql-files)의 소유권을 mysql그룹의 mysql이라는 유저에게 할당하고

디렉터리의 권한을 설정합니다.

 

chown {소유권자}:{그룹식별자} {소유권을 변경하고 싶은 파일명} 형태로 명령어를 실행합니다.

chown 뒤에 -R 옵션을 붙여 하위 디렉터리까지 모든 소유권을 할당할 수 있습니다.

 

 

④ 기본 데이터베이스를 생성(Data Directory Initialization)

MySQL 구조

SQL은 최종적으로 다양한 종류의 table들로 구성되어 완성됩니다.

이러한 table들 중 연관된 table을 모은 것이 schema(database)입니다.

그리고 schema를 모은 것이 database server입니다.

 

 

서버를 사용하여 사용자가 서버에 연결하는 방법을 결정하고

초기 MySQL 권한 부여 테이블이 포함된

mysql schema를 포함하여 데이터 디렉터리를 초기화합니다.

mysql schema는 시스템 스키마로서, MySQL 서버가 실행될 때 필요한 정보를 저장하는 테이블이 포함되어 있습니다.

mysql_install_db 라는 명령어로 초기화할 수 있지만, 해당 명령어는 deprecated 되었으므로

mysqld --initialize 명령어를 사용하는 것이 좋습니다.

 

$ sudo bin/mysqld --initialize --user=mysql \
--basedir=/usr/local/mysql \
--datadir=/usr/local/mysql/data

(mysqld의 d는 daemon(데몬)을 뜻하며, 데몬은 프로세스를 시작할 것을 보고있는 리스너입니다.)

 

위의 명령어를 통해 Data directory initialization이 실행되는데 그동안의 Server의 동작은 다음과 같습니다.

 

1. data 디렉터리가 있는지 확인합니다.

 

2. data 디렉터리에 mysql 시스템 스키마를 생성합니다.

 

3. InnoDB 테이블을 관리하는데 필요한 system tablespace와 관련 데이터 구조를 초기화합니다.

 

4. superuser 계정 및 reserved 계정을 만듭니다.

 

5. HELP 문에 사용된 server-side help table을 채웁니다.

 

6. init-file 시스템 변수가 SQL statements의 파일 이름을 지정하도록 제공된 경우,

서버는 파일의 명령문을 실행합니다.

 

7. Server가 종료됩니다.

 

위의 과정은 다음 공식 문서를 참고합니다.

Data Directory Initialization:( https://dev.mysql.com/doc/refman/8.0/en/data-directory-initialization.html )

 

MySQL :: MySQL 8.0 Reference Manual :: 2.10.1 Initializing the Data Directory

2.10.1 Initializing the Data Directory After MySQL is installed, the data directory must be initialized, including the tables in the mysql system schema: For some MySQL installation methods, data directory initialization is automatic, as described in Sect

dev.mysql.com

위의 명령어를 실행시키면 다음과 같이 나오고 임시 비밀번호가 부여됩니다.

 

 

(4) root 암호 초기화

mysql데이터베이스 초기화 과정이 완료되었으며

이제 서버를 시작하고 'root'@'localhost' 계정에 새로운 비밀번호를 설정해줘야 합니다.

 

① 서버 실행

$ bin/mysqld_safe --user=mysql &

mysqld_safe 명령어로 mysql server을 실행시키며

'&'는 백그라운드에서 프로세스를 실행하겠다는 뜻입니다.

$ ps -ef | grep mysqld

위의 명령어로 server가 백그라운드에서 잘 실행되는지 확인합니다.

 

 

② 서버 연결

실행시킨 서버에 접속을 하겠습니다.

$ sudo bin/mysql -u root -p

비밀번호는 위에서 주어진 임시 비밀번호로 입력하여 로그인합니다.

mysql 서버에 잘 접속된 것을 확인할 수 있습니다.

 

이제 mysql 서버의 root의 비밀번호를 바꿔줍니다.

ALTER USER 'root'@'localhost' IDENTIFIED BY 'root-password';

'root-password' 부분에 원하는 비밀번호를 입력합니다.

 

접속 종료를 하려면 exit명령어를 입력하면 됩니다.

 

③ 서버 종료

백그라운드에서 실행 중인 서버를 종료시키려면 다음과 같은 명령어를 입력해줍니다.

$ sudo bin/mysqladmin -u root -p shutdown

백그라운드의 mysql 서버가 종료된 것을 ps명령어를 통해 확인할 수 있습니다.

 

 

 

(5) MySQL 서비스 등록

MySQL 서비스를 등록해 놓으면 service 명령어로 보다 쉽게 mysql 서버를 관리할 수 있습니다.

 

우선 mysqld파일을 /etc/init.d/mysqld에 복사합니다.

$ sudo cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld

 

/etc/init.d/mysqld를 열어서 basedir와 datadir를 설정해줍니다.

$ sudo vim /etc/init.d/mysqld

저장하고 나간 뒤 reboot를 합니다.

꼭 reboot를 해줘야 service 명령어가 잘 됩니다.

$ service mysqld start
$ service mysqld status
$ service mysqld stop

 

 

systemctl 명령어도 역시 잘 됩니다.

$ sudo systemctl start mysqld
$ sudo systemctl status mysqld
$ sudo systemctl stop mysqld

 

 

 

 

 

 

핵심 참조 : salix97.tistory.com/141?category=837576  

 

 

Comments