MySQL

이전에 MySQL 5.7 설치 매뉴얼을 읽고 포스팅을 한 바 있는데, 마찬가지로 MySQL 8.0 설치 매뉴얼도 정리 해두려고 한다. 설치 방법은 큰 차이점은 없어보이지만, 매뉴얼을 꼼꼼히 읽는 것에 의의를 둔다.

기본적으로는 기존 5.7 버전 설치와 큰 차이가 없기 때문에, 기존 포스팅 기반으로 내용을 추가/수정 하는 방식으로 작성 한다.

버전은 8.0 기준이며, OS는 linux 기준으로 진행한다.
리눅스 중에서도 redhat 계열인 centos 기준으로 진행한다.

MySQL :: MySQL 8.0 Reference Manual :: 2.5 Installing MySQL on Linux

MySQL 다운로드

MySQL 8.0 Community 버전을 바이너리 배포판으로 다운로드 받은 후, 리눅스(CentOS)에 설치하려고 한다. 바이너리 방식 외에도 yum 방식이나 rpm 설치, source를 직접 컴파일 해서 사용하는 방법도 있지만, 오늘은 바이너리 배포판으로 설치하는 방법을 알아보자.

MySQL Community Server 다운로드 받기 https://dev.mysql.com/downloads/

위 공식 다운로드 페이지에서 설치하고자 하는 버전을 다운로드 받는다.

MySQL 8.0.26 다운로드하는 모습

설치할 리눅스 서버가 외부 인터넷이 가능한 환경이라면, wget으로 바로 내려받으면 더 편리하게 다운로드 받을 수 있다. (설치 파일을 서버에 upload 하는 과정이 생략되기 때문)

## MySQL community server 8.0.26 다운로드
wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.26-linux-glibc2.12-x86_64.tar.xz
MySQL 8.0 Release Notes
https://dev.mysql.com/doc/relnotes/mysql/8.0/en/

설치 전 주의사항

리눅스 바이너리 버전 설치 매뉴얼 페이지(https://dev.mysql.com/doc/refman/8.0/en/binary-installation.html)에 진입했더니, warning 박스가 보인다. 주의하라고 하니 읽어보자.

  • Yum이나 APT를 이용해서 OS에 이미 설치했던 적이 있다면, 바이너리 설치 시 문제가 있을 수 있다. 패키지 관리 시스템을 이용해 이전 MySQL을 완전히 지워야 한다. 부가적인 파일이나 이전 데이터 파일도 지워야 한다. my.cnf 같은 컨피그 파일도 지워야 한다.
  • MySQL은 libaio 라이브러리 dependency가 있다. 해당 라이브러리가 설치 되어 있지 않으면 데이터 디렉토리 initialization 단계나 이후 서버 시작 단계에서 실패하게 된다. 필요하다면 적절한 패키지 매니저를 이용해 라이브러리를 설치하자.
# yum 방식
shell> yum search libaio  # search for info
shell> yum install libaio # install library

우선 지금 진행하고 있는 환경에 관련한 내용만 정리해보았고, apt based 환경과 SLES 11(SUSE Linux Enterprise Server) 사용자라면 매뉴얼에서 추가 주의사항을 확인하도록 한다.

설치 전 세팅

타르볼 압축 해제

다운로드 받은 파일을 서버에 업로드 해주자.

설치 경로는?

각 사 정책이 이미 있을 수도 있고, 개인이 원하는 경로가 있을 수도 있다.
입맛에 맞게 지정해도 상관없고, 일단 오늘은 매뉴얼을 읽기로 했으니 매뉴얼 그대로 /usr/local 로 해본다.

다운로드 받은 타르볼이 다른 경로에 가있다면 /usr/local로 옮겨(mv) 주자.
그리고 압축을 풀어준다.

# 경로 이동
shell> cd /usr/local

# 압축 해제
shell> tar xvf /usr/local/mysql-VERSION-OS.tar.xz

심볼릭 링크 걸기

심볼릭 링크를 걸어주자. 바로가기 같은 개념이다.

# 심볼릭링크 지정
shell> ln -s full-path-to-mysql-VERSION-OS mysql

심볼릭 링크를 걸어주면 패치 적용이나 업그레이드/다운그레이드 할 때 용이하다.

경로가 간단 해져서 접근하기도 편리하다.

OS 유저 생성

MySQL용 OS 유저를 생성한다.

# OS 계정 설정
shell> groupadd mysql
shell> useradd -r -g mysql -s /bin/false mysql

파일 권한 설정

주요 경로 권한을 부가적으로 설정해준다.

사실 데이터파일, 로그 위치는 실 서비스 DB 서버의 경우 별도로 마운트 하여 사용하기 때문에 엔진 하위 경로로 두지는 않지만, 지금은 간단하게 설치 테스트하는 것이 목적이기 때문에 엔진 경로 하위로 모두 모아서 설치했다.

# 관련 디렉토리 생성 및 권한 설정
shell> cd /usr/local/mysql

# 로그 디렉토리 경로 설정
shell> mkdir mysql-log
shell> chown mysql:mysql mysql-log
shell> chmod 750 mysql-log

# 로그 (깡통) 파일 생성
shell> cd mysql-log
shell> touch mysqldb.log
shell> chown mysql:mysql mysqldb.log
로그 파일을 만들어주지 않으면 어떤 일이 벌어질 수 있나?
http://www.dark-hamster.com/database/how-to-solve-error-message-mysqld_safe-error-log-error-set-to-mysql-error-log-however-file-dont-exists-create-writable-for-user/

설치

DB 서버 initialize

initialize의 적절한 번역을 고민해보다, initialize는 그대로 두는 게 더 와 닿는 것 같아서 그대로 두었다.

이 설치 매뉴얼 페이지에는 my.cnf(컨피그파일) 설정하는 것에 대한 내용이 별도로 없는 것으로 보인다. 매뉴얼대로 진행하게 되면 데이터파일, 로그, 소켓 등 모든 것이 기본 패스로 설치된다.

개인적으로 컨피그파일은 반드시 별도로 작성을 하는 것을 선호하는 편이라, 몇 가지 패스(PATH)만이라도 간단하게 설정 해놓고 진행해보자.

# 경로 이동
shell> cd /usr/local/mysql

# vi로 오픈 (은 취향껏..)
shell> vi my.cnf



################### my.cnf ###################

[mysqld]
datadir=/usr/local/mysql/mysql-data
#socket=/tmp/mysql.sock ## 지정하지 않으면 소켓은 tmp에 생긴다

[mysqld_safe]
log-error=/usr/local/mysql/mysql-log/mysqldb.log
pid-file=/usr/local/mysql/mysql-log/mysqldb.pid

자 이제 initialize 하게되면...

# DB 초기 기동
shell> bin/mysqld --defaults-file=/usr/local/mysql/my.cnf --initialize --user=mysql 
shell> bin/mysql_ssl_rsa_setup --defaults-file=/usr/local/mysql/my.cnf

아래와 같은 로그가 찍힌다.

2021-07-30T16:18:25.187253Z 0 [System] [MY-013169] [Server] /usr/local/mysql-8.0.26-linux-glibc2.12-x86_64/bin/mysqld (mysqld 8.0.26) initializing of server in progress as process 2466
2021-07-30T16:18:25.195966Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2021-07-30T16:18:25.925943Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2021-07-30T16:18:26.900559Z 0 [Warning] [MY-013746] [Server] A deprecated TLS version TLSv1 is enabled for channel mysql_main
2021-07-30T16:18:26.900920Z 0 [Warning] [MY-013746] [Server] A deprecated TLS version TLSv1.1 is enabled for channel mysql_main
2021-07-30T16:18:26.998212Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: 임시패스워드

root 초기 임시 암호가 자동 생성되어 로그에 남는다. 이 임시 비밀번호는 잘 챙겨두자.

DB 서버 startup

이제 거의 완료되었다. DB 서버를 띄워보자.

# DB 서버 올리기
bin/mysqld_safe --defaults-file=/usr/local/mysql/my.cnf --user=mysql &

정상적인 상태라면 아래와 같은 로그가 화면에 출력된다. (문제가 있으면 DB가 뜨다가 다시 내려갈 것이다.)

2021-07-30T16:19:14.615103Z mysqld_safe Logging to '/usr/local/mysql/mysql-log/mysqldb.log'.
2021-07-30T16:19:14.635227Z mysqld_safe Starting mysqld daemon with databases from /usr/local/mysql/mysql-data

아직 안심이 되지 않는다면 DB가 잘 떠있는지 더 확인해보자.

# mysqld 데몬 확인
shell> ps -ef | grep mysqld

MySQL Server인 mysqld

mysqld를 기동시킨 mysqld_safe가 잘 보이면 정상이다.

로그도 확인해보자.

# 로그 확인하기
shell> cd mysql-log
shell> tail -9 mysqldb.log

2021-07-30T16:19:14.922294Z 0 [System] [MY-010116] [Server] /usr/local/mysql/bin/mysqld (mysqld 8.0.26) starting as process 2636
2021-07-30T16:19:14.934554Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2021-07-30T16:19:15.137152Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2021-07-30T16:19:15.353618Z 0 [Warning] [MY-013746] [Server] A deprecated TLS version TLSv1 is enabled for channel mysql_main
2021-07-30T16:19:15.353736Z 0 [Warning] [MY-013746] [Server] A deprecated TLS version TLSv1.1 is enabled for channel mysql_main
2021-07-30T16:19:15.354636Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
2021-07-30T16:19:15.354781Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel.
2021-07-30T16:19:15.376759Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060, socket: /tmp/mysqlx.sock
2021-07-30T16:19:15.376821Z 0 [System] [MY-010931] [Server] /usr/local/mysql/bin/mysqld: ready for connections. Version: '8.0.26'  socket: '/tmp/mysql.sock'  port: 3306  MySQL Community Server - GPL.

ready 되었단다. DB는 잘 떠있다.

패스(PATH) 설정

설치의 필수 코스는 아니지만, 해두면 편한 것이 패스 설정이다.

mysql의 bin 경로를 패스 등록해두면, 굳이 긴 패스를 입력할 필요 없이 mysql 클라이언트 이용이나 mysql 관련 유틸리티를 쉽게 접근할 수 있게 된다.

# 패스 지정하기
shell> export PATH=$PATH:/usr/local/mysql/bin 

패스 외에도 profile에 alias를 설정해서 사용하는 것도 편리하게 사용할 수 있는 팁 중 하나이다.

mysql_config_editor도 편리함을 높여주는 유틸리티 중 하나이다.

mysql_config_editor
https://dev.mysql.com/doc/refman/8.0/en/mysql-config-editor.html

관리자 암호 변경

초기 initialize 시 생성된 초기 임시비밀번호를 이용하여 DB로 접속해서 root 패스워드를 변경해보자.

# DB 접속
# MySQL 홈 디렉토리로 이동 후 실행 (혹은 패스를 잡았다면 바로 mysql 접속)
shell> bin/mysql -uroot -p 
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.26

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

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>
mysql>

# mysql.user 계정을 접속하니 에러가 발생한다. root 암호가 임시 패스워드이기 때문에 변경하라고 뜬다.
mysql> select * from mysql.user;
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.

# root 암호를 변경해준다.
mysql> alter user 'root'@'localhost' identified by '신규패스워드';
Query OK, 0 rows affected (0.00 sec)

MySQL 루트 유저 패스워드 리셋하기
https://stackoverflow.com/questions/33467337/reset-mysql-root-password-using-alter-user-statement-after-install-on-mac

끝!

오늘은 간단하게 MySQL DB (8.0 ver) 를 설치하는 방법에 대해 공식 매뉴얼을 기준으로 살펴보았다.

날짜 내용
2021.07.30 최초 글 작성