Ubuntu(우분투) 18.04 에 MySQL 5.7 설치 - apt source binary 방식

Last Updated on 3월 3, 2021 by 태랑(정현호)



@ 설치 환경

OS : Ubuntu 18.04 
Mysql : 5.7


우분투 18.04 환경에서 Mysql 5.7 설치 방법에 대한 포스팅 입니다.

apt(패키지 설치) 방법, Binary를 이용한 설치 , Source Compile 설치 3개 방법에 대해서 기술하려고 합니다


프롬프트는 ubuntu$  입니다.







apt(패키지) 방식으로 설치



먼저 mysql 설치 가능 버전 확인 합니다.

ubuntu$ sudo apt update

ubuntu$ sudo apt-cache search mysql-server

mysql-server - MySQL database server (metapackage depending on the latest version)
mysql-server-5.7 - MySQL database server binaries and system database setup
mysql-server-core-5.7 - MySQL database server binaries
default-mysql-server - MySQL database server binaries and system database setup (metapackage)
default-mysql-server-core - MySQL database server binaries (metapackage)
mariadb-server-10.1 - MariaDB database server binaries
mariadb-server-core-10.1 - MariaDB database core server files
percona-xtradb-cluster-server-5.7 - Percona XtraDB Cluster database server binaries
mariadb-server-10.5 - MariaDB database server binaries
mariadb-server-core-10.5 - MariaDB database core server files



필요 패키지 설치

ubuntu$ sudo apt install libaio1 libaio-dev \
libnuma-dev numactl libc6-dev



MySQL 패키지 설치

ubuntu$ sudo apt install mysql-server-5.7 \
mysql-server-core-5.7 mysql-client-5.7 \
mysql-client-core-5.7




설치 직후 Mysql 은 가동된 상태 입니다.

ubuntu$ ps -ef |grep mysql
mysql 11401 1 1 15:41 ? 00:00:00 /usr/sbin/mysqld --daemonize --pid-file=/run/mysqld/mysqld.pid




설치가 완료가 되었습니다.

root 유저에서는   mysql

일반 유저에서  sudo mysql

를 사용하면 패스워드 없이 접속이 가능 합니다.



이는 우분투 에서 mysql 접속 방법을 기존의 패스워드 방식이 아니라 auth_socket 플러그인을 이용하여 인증 로그인을 하기 때문입니다

apt 로 설치하게 되면 접속 인증 방식에 대해서 OS 인증방식으로 설정되어 db가 생성됩니다.


mysql> select user,host,plugin from mysql.user where User='root';
+------+-----------+-------------+
| user | host | plugin |
+------+-----------+-------------+
| root | localhost | auth_socket |
+------+-----------+-------------+
1 row in set (0.00 sec)




# mysql 비밀번호 로그인 방식으로 변경

현재 기본적으로는 OS 인증으로 패스워드 없이 로그인 할 수 있습니다.
ubuntu$ sudo mysql


root 유저에서는

root# mysql



* 기존과 같이 패스워드 입력 방식으로 사용하길 원할 경우 아래 절차대로 진행 하시면 됩니다.
OS 인증을 통하여 사용 하실려는 경우 패스워드 변경 절차는 생략하여도 됩니다.








# 기존 패스워드 방식으로 변경, 한줄로 입력 합니다.

mysql> UPDATE mysql.user SET plugin = 'mysql_native_password', authentication_string = PASSWORD('패스워드입력') WHERE User = 'root';

mysql> commit;
mysql> FLUSH PRIVILEGES;
mysql> quit







# MySQL 설정 변경 

설정 파일의 위치는 2곳에 있습니다.
/etc/mysql/mysql.conf.d/
/etc/mysql/conf.d/

그 중에 [mysqld] 항목은 /etc/mysql/mysql.conf.d/mysqld.cnf 에 내용이 있습니다.



먼저 mysqld.cnf 에서 몇가지 수정 하겠습니다.
ubuntu$ sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf



[mysqld] <-- 절에 아래 내용을 추가로 입력해 줍니다.

user=mysql

innodb_buffer_pool_size = 384M
  # -> 값은 더 크게 해도 되고 128MB 단위로 변경하면 됩니다.
innodb_file_per_table=ON
character-set-client-handshake=OFF
skip-character-set-client-handshake

init_connect=SET collation_connection = utf8mb4_general_ci
init_connect=SET NAMES utf8mb4
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci

bind-address = 127.0.0.1

to

bind-address = 0.0.0.0
-> 외부에서 직접 접속 하려는 환경이라면 위의 값을 public-ip 나 0.0.0.0 으로 설정 합니다.



설정파일을 수정하였다면 mysql을 재시작합니다.

ubuntu$ sudo systemctl restart mysql


재시작이 완료되었다면 몇가지를 확인 해봅니다.
ubuntu$ mysql -u root -p
Enter password: [패스워드 입력]
Welcome to the MySQL monitor. Commands end with ; or \g.
< 중략 >







# status 로 조회

mysql> status;
--------------
mysql Ver 14.14 Distrib 5.7.32, for Linux (x86_64) using EditLine wrapper

<중략>
Server version: 5.7.32-0ubuntu0.18.04.1 (Ubuntu)
<중략>
Server characterset: utf8mb4
Db characterset: utf8mb4
Client characterset: utf8mb4
Conn. characterset: utf8mb4






innodb_buffer_pool_size 조회

mysql> show global variables like '%innodb_buffer_pool_size%';
+-------------------------+-----------+
| Variable_name | Value |
+-------------------------+-----------+
| innodb_buffer_pool_size | 402653184 |
+-------------------------+-----------+



여기까지 설정하면 apt 로 mysql 설치가 완료 된 것 입니다







binary 방식 설치



# 필요 패키지 설치
ubuntu$ sudo apt install build-essential bison \
gcc g++ libncurses5-dev libxml2-dev openssl \
libssl-dev curl libcurl4-openssl-dev libjpeg-dev \
libpng-dev libfreetype6-dev libsasl2-dev \
autoconf libncurses5-dev libtirpc-dev \
ncurses* cmake-gui cmake -y



# 유저 및 그룹 생성

* apt 로 설치시 group과 user는 자동생성 되고
* 소스컴파일이나 unzip 형태는 별도로 생성이 필요 합니다.


ubuntu$ sudo addgroup mysql
ubuntu$ sudo useradd -s /sbin/nologin -g mysql mysql

-s /bin/false 혹은 /sbin/nologin 옵션을 사용해서 유저의 로그인쉘을 사용할 수 없게 하는 것입니다.
즉 mysql이라는 유저는 mysql 데몬을 실행하기 위한 유저일뿐이라는 것입니다.
서버의 보안강화 측면에서 외부에서 mysql 유저로 쉘로그인은 할 필요는 없기 때문입니다.



파일 다운 및 압축 해제
wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.31-linux-glibc2.12-x86_64.tar.gz

ubuntu$ sudo tar zxvf mysql-5.7.31-linux-glibc2.12-x86_64.tar.gz -C /usr/local


ubuntu$ cd /usr/local/mysql-5.7.31-linux-glibc2.12-x86_64
ubuntu$ sudo mkdir logs tmp data

ubuntu$ sudo touch /usr/local/mysql/logs/mysqld_safe.err

ubuntu$ cd /usr/local/
ubuntu$ sudo chown -R mysql:mysql mysql-5.7.31-linux-glibc2.12-x86_64


심볼릭 링크 사용
ubuntu$ cd /usr/local
ubuntu$ sudo ln -s mysql-5.7.31-linux-glibc2.12-x86_64 mysql


# MySQL 라이브러리 등록
ubuntu$ sudo vi /etc/ld.so.conf
/usr/local/mysql/lib
--> 내용 추가

ubuntu$ sudo ldconfig
--> 명령어 수행



# 환경변수에 PATH 추가
-- user profile
ubuntu$ vi .profile 

export PATH=$PATH:/usr/local/mysql/bin
--> 추가 


-- root profile
ubuntu$ sudo -I
[root]# vi .profile

export PATH=$PATH:/usr/local/mysql/bin
--> 추가 


sudoers 수정
ubuntu$ sudo vi /etc/sudoers

Defaults secure_path= 
=> 에 /usr/local/mysql/bin 추가


* 이미지는 스크린샷을 위해 경로를 일부 제외/수정한 것입니다.


* Source컴파일 / Binary 설치 시 - 파라미터 설정
항목으로 이동 하시면 됩니다.




Source 컴파일 방식 설치


# 필요 패키지 설치
ubuntu$ sudo apt install build-essential bison \
gcc g++ libncurses5-dev libxml2-dev openssl \
libssl-dev curl libcurl4-openssl-dev libjpeg-dev \
libpng-dev libfreetype6-dev libsasl2-dev \
autoconf libncurses5-dev libtirpc-dev \
ncurses* cmake-gui cmake -y



# 유저 및 그룹 생성

* apt 로 설치시 group과 user는 자동생성 되고
* 소스컴파일이나 unzip 형태는 별도로 생성이 필요 합니다.


ubuntu$ sudo addgroup mysql
ubuntu$ sudo useradd -s /sbin/nologin -g mysql mysql

-s /bin/false 혹은 /sbin/nologin 옵션을 사용해서 유저의 로그인쉘을 사용할 수 없게 하는 것입니다.
즉 mysql이라는 유저는 mysql 데몬을 실행하기 위한 유저일뿐이라는 것입니다.
서버의 보안강화 측면에서 외부에서 mysql 유저로 쉘로그인은 할 필요는 없기 때문입니다.



파일 다운 및 압축 해제

파일은 boost가 포함된 버전으로 받으시면 됩니다.
Compressed TAR Archive, Includes Boost Headers
wget https://downloads.mysql.com/archives/get/p/23/file/mysql-boost-5.7.31.tar.gz

ubuntu$ tar zxvf mysql-boost-5.7.31.tar.gz

ubuntu$ cd mysql-5.7.31


cmake  수행
ubuntu$ sudo cmake \
'-DCMAKE_INSTALL_PREFIX=/usr/local/mysql5.7' \
'-DINSTALL_SBINDIR=/usr/local/mysql5.7/bin' \
'-DINSTALL_BINDIR=/usr/local/mysql5.7/bin' \
'-DMYSQL_DATADIR=/usr/local/mysql5.7/data' \
'-DINSTALL_SCRIPTDIR=/usr/local/mysql5.7/bin' \
'-DWITH_INNOBASE_STORAGE_ENGINE=1' \
'-DWITH_PARTITION_STORAGE_ENGINE=1' \
'-DSYSCONFDIR=/usr/local/mysql5.7/etc' \
'-DDEFAULT_CHARSET=utf8mb4' \
'-DDEFAULT_COLLATION=utf8mb4_general_ci' \
'-DWITH_EXTRA_CHARSETS=all' \
'-DENABLED_LOCAL_INFILE=1' \
'-DMYSQL_TCP_PORT=3306' \
'-DMYSQL_UNIX_ADDR=/tmp/mysql.sock' \
'-DCURSES_LIBRARY=/usr/lib/x86_64-linux-gnu/libncurses.so' \
'-DCURSES_INCLUDE_PATH=/usr/include' \
'-DDOWNLOAD_BOOST=1' \
'-DWITH_BOOST=./boost' \
'-DWITH_ARCHIVE_STORAGE_ENGINE=1' \
'-DWITH_BLACKHOLE_STORAGE_ENGINE=1' \
'-DWITH_PERFSCHEMA_STORAGE_ENGINE=1' \
'-DWITH_FEDERATED_STORAGE_ENGINE=1'



빌드 수행 
ubuntu$ sudo make
ubuntu$ sudo make install



디렉토리 생성 및 권한 변경 작업 
ubuntu$ cd /usr/local/mysql5.7
ubuntu$ sudo mkdir logs tmp data
ubuntu$ sudo touch /usr/local/mysql5.7/logs/mysqld_safe.err

ubuntu$ cd /usr/local/
ubuntu$ sudo chown -R mysql:mysql mysql-5.7.31-linux-glibc2.12-x86_64



퍼미션 변경
ubuntu$ sudo chown -R mysql:mysql /usr/local/mysql5.7


심볼릭 링크 사용
ubuntu$ cd /usr/local
ubuntu$ sudo ln -s mysql5.7  mysql



MySQL 라이브러리 등록
ubuntu$ sudo vi /etc/ld.so.conf
/usr/local/mysql/lib
--> 내용 추가


ubuntu$ sudo ldconfig
--> 명령어 수행



# 환경변수에 PATH 추가
-- user profile
ubuntu$ vi .profile 

export PATH=$PATH:/usr/local/mysql/bin
--> 추가 


-- root profile
ubuntu$ sudo -I
[root]# vi .profile

export PATH=$PATH:/usr/local/mysql/bin
--> 추가 


sudoers 수정
ubuntu$ sudo vi /etc/sudoers

Defaults secure_path= 
=> 에 /usr/local/mysql/bin 추가


* 이미지는 스크린샷을 위해 경로를 일부 제외/수정한 것입니다.





Source 컴파일 / Binary 설치 시 - 파라미터 설정


* Source 컴파일 과 Binary 설치 방식 공통 으로 해당 되는 내용 입니다.


* 참고 :  설치방법에 따라서 5.7.18 부터는 my-default.ini 를 제공하지 않습니다.

The my-default.cnf.sh file (used to produce a default my-default.cnf or my-default.ini file) is no longer included 
in source distributions and my-default.cnf and my-default.ini are no longer included in or 
installed by distribution packages. (Bug #22525354)

https://docs.oracle.com/cd/E17952_01/mysql-5.7-relnotes-en/news-5-7-18.html
https://mysql.com/doc/relnotes/mysql/5.7/en/news-5-7-18.html#mysqld-5-7-18-packaging




/etc/my.cnf 파일을 생성 합니다.


ubuntu$ 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 = 0.0.0.0
basedir = /usr/local/mysql
datadir= /usr/local/mysql/data
tmpdir=/usr/local/mysql/data
socket=/tmp/mysql.sock
user=mysql
skip_name_resolve
#timestamp
explicit_defaults_for_timestamp = TRUE

### MyISAM Spectific options
key_buffer_size = 100M

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

#User Table Datafile
innodb_data_home_dir = /usr/local/mysql/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 = /usr/local/mysql/data/redologs
#innodb_undo_directory = /usr/local/mysql/data/undologs
innodb_undo_tablespaces = 1

### Connection
back_log = 100
max_connections = 1000
max_connect_errors = 1000
wait_timeout= 60

### log
# Error Log
log_error=/usr/local/mysql/logs/mysqld.err
log-output=FILE
general_log=0
slow-query-log=0
long_query_time = 5
# 5 sec
slow_query_log_file = /usr/local/mysql/logs/slow_query.log
pid-file=/usr/local/mysql/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=/usr/local/mysql/logs/mysqld_safe.err
pid-file=/usr/local/mysql/tmp/mysqld.pid



* innodb_buffer_pool_size 는 innodb_buffer_pool_chunk_size * innodb_buffer_pool_instances 배수와 같아야 합니다

innodb_buffer_pool_chunk_size default 값은 128M 이고
innodb_buffer_pool_instances 는 innodb_buffer_pool_size < 1GB 미만일 경우 1 이고 1GB보다 크다면 기본값 8 입니다.








DB 생성 및 root 패스워드 변경


* Source 컴파일 과 Binary 설치 방식 공통 으로 해당 되는 내용 입니다.




# DB 생성

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



데이터파일 생성 확인
ls -al /usr/local/mysql/data/



Mysql DB 기동
ubuntu$ sudo /usr/local/mysql/bin/mysqld_safe &




임시 root 패스워드 확인
ubuntu$ cd /usr/local/mysql/logs

ubuntu$ sudo cat mysqld.err | grep generated
2020-11-16T18:32:31.737958Z 1 [Note] A temporary password is generated for root@localhost:   $@!wjm>u>i4.I


ubuntu$ cd /usr/local/mysql/bin
ubuntu$ sudo ./mysql -u root -p
Enter password: $@!wjm>u>i4.I


mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '패스워드';
mysql> commit;
mysql> flush privileges;
mysql> exit




db 서비스 등록 및 시작
* Source 컴파일 과 Binary 설치 방식 공통 으로 해당 되는 내용 입니다.



서비스 등록을 위해 DB 중지

ubuntu$ cd /usr/local/mysql/bin/
ubuntu$ sudo ./mysqladmin -u root -p shutdown




서비스 생성
ubuntu$ cd /lib/systemd/system/
ubuntu$ sudo vi mysqld.service


[Unit]
Description=Mysql Community Server
After=syslog.target
After=network.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




등록 및 DB 시작
ubuntu$ sudo systemctl daemon-reload

ubuntu$ sudo systemctl enable mysqld.service

ubuntu$ sudo systemctl start mysqld




DB 가 기동 되었다면 로그 등으로 정상여부를 확인 하면 됩니다.
혹은 status 명령어를 통해 상태값을 확인 할 수 있습니다



ubuntu$ sudo mysql -u root -p
Enter password: [패스워드]

mysql> status;

Server version: 5.7.31 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


답글 남기기