Ubuntu Mysql 세팅하는 방법

poogie·2022년 7월 8일
1

.시작하기전에

서버개발을 하며 aws ec2의 초기세팅을 자주 하는것 같다.
과정에 대해 이해하고는 있지만 ubuntu 명령어에는 숙련되지 않아 매번 찾아보는데
그 수고를 덜고자 기록을 남기기위해 포스팅을 하고자한다.

.mysql 설치

일단 mysql을 설치하기 전에 ubuntu의 패키지 관리 툴을 업데이트 해야한다.
ubuntu는 apt(Advanced Packaging Tool)를 기본으로 사용한다.
이는 node의 npm처럼 다양한 설치를 및 관리를 지원한다.

$ sudo apt-get update

업데이트를 완료하면 mysql을 바로 설치하면 된다.
설치중에는 특별히 설정해야할 목록은 없으니 설치를 완료하자

$ sudo apt-get install mysql-server

.mysql ufw 설정

설치를 완료했다면 mysql을 사용하기 전에 설정을 해주어야한다.
mysql을 사용할때는 user와 host(ip?)로 유저를 구분하고 비밀번호를 통해 인증한다.

그렇다면 mysql workbench같은 툴을 사용하여 편하게 db를 관리하려면 외부에서 접속속을 해주어야 하기때문에 mysql 포트를 오픈해야한다.

다음 명령어는 ubuntu의 포트를 열어주는 명령어와 mysql의 포트이다.

$ sudo ufw allow 3306

여기서 ufw는 Uncomplicated Fire Wall의 약자로 직역하면 복잡하지않은 방화벽이라는 뜻의 ubuntu에서 기본적으로 채택한 방화벽이다.
mysql의 포트인 3306을 열어주자

mysql의 포트를 열어주며 나중에 서버프로젝트 배포를 위한 22번 tcp포트와 배포된 프로젝트의 클라이언트의 접근을 위한 80번 http포트를 열어두는 것이 편하다.
추가 포트를 열고 ufw를 활성화 해주자

$ sudo ufw allow 22
$ sudo ufw allow 80
$ sudo ufw enable

그리고 내가 설정한 ufw의 상태목록을 확인하고 ufw설정을 마무리하자
아래 명령어를 입력 후 아래 사진처럼 나온다면 내가 설정한 포트들의 방화벽은 열린것이다.

$ sudo ufw status verbose

.mysql 실행 및 mysql 자동 재시작 설정

서버는 정지상태일 수 있고 이때 서버가 재시작 되었을때 mysql도 같이 시작되어야한다.
시도해본적은 없지만 서버정지 후에 mysql은 같이 다운상태에 들어갈것이다.
그래서 아래와 같이 mysql을 당장 시작하는 명령어와 서버 재시작 시 시작하는 명령어를 알아야한다.

위가 시작, 아래가 자동화 명령어이다.

$ sudo systemctl start mysql
$ sudo systemctl enable mysql

.mysql 접속

우리는 이제 mysql에 접속하고자 한다.
뭔가 어색한 아래의 명령어를 보도록 하자.

$ sudo /usr/bin/mysql -u root -p

우리가 알고있는 또는 상상하는 mysql의 접근 방법은 user이름과 비밀번호를 입력해서 접근하는 명령어 일것이다.
하지만 mysql을 처음 설치하고 기본 유저인 root@localhost로 접속하고자 하면 아래와 같은 에러와함께 액세스가 거부되기때문에 유저를 세팅하기전 첫 접속은 직접 mysql의 설치경로를 따라 접근하는 것이다.

Access denied for user 'root'@'localhost'

~~ 과거에 ubuntu 18에 mysql 구버전을 사용했을때는 없었던 에러이지만 최근 버전들로만 세팅하니 에러가 발생했다. ~~

.mysql 유저 등록 및 권한부여 후 확인

일단 유저에게 mysql 전체의 권한을 부여할것이 아니라면 db를 먼저 생성해야한다.

mysql> CREATE DATABASE test;
mysql> SHOW DATABASES;

db를 생성하고 출력까지 진행해보자.
나는 기존에 사용하던 db를 그냥 인증차 올렸기때문에 test가 아닌 sns라는 db명으로 등록되어있다.

이제 db는 생성했으니 내 db에 접근할 유저를 생성하고 접근 권한부여를 해보도록하자

mysql> CREATE USER '유저이름'@'%' IDENTIFIED BY '유저비번';
mysql> FLUSH PRIVILEGES;

%은 모든 ip를 허용한다는 뜻으로 특정 아이피만 허용하려면 "localhost"등의 ip를 등록해주면 된다.

하지만 나의 스프링 부트 프로젝트를 로컬환경에서 db에 접근하며 테스트를 하려면 외부접속이 필요하기때문에 모든 ip를 허용해주었다.

이제 유저를 생성해주었으니 권한 부여를 해보자

mysql> GRANT ALL PRIVILEGES ON 데이터베이스이름.* TO'유저이름'@'%';
mysql> FLUSH PRIVILEGES;

지금은 ON TO가 들어가는 명령어를 사용하지만 과거에는 ON FOR 명령어를 사용하는듯 하다.
하지만 mysql이 업데이트 되며 8.0부터는 ON TO 명령어가 잘 동작하니 이를 사용하여 권한을 등록해준다.

mysql내에서 해야하는 유저와 관련된 기본설정을 마쳤으니 제대로 적용되었는지 확인을 해야한다.

mysql> SHOW GRANTS FOR'유저이름'@'%';
mysql> SELECT User, Host, authentication_string FROM mysql.user;

위 명령어가 유저의 부여된 권한 확인
아래가 유저이름, 유저ip, 그리고 암호화된 비밀번호를 확인하는 명령어 이다.

출력된 문자열이 많아 조금 잘라서 캡쳐한 부분도 있고 개인서버의 캡쳐본이라 내 유저이름인 chjeong로 등록이 잘되어있는 것을 볼수있다.

.cnf파일 수정하기

지금까지 나와 같은 방법으로 설치를 진행하였다면 외부접속에서의 마지막 걸림돌이 남아있다.
cnf확장자를 가진 파일인데 이곳의 설정이 외부의 접속을 방해하기때문에 설정을 변경해주어야한다.
일단 vim을 통해 파일을 열어보도록 하자.
혹시 아직 mysql에 접속중이라면 exit; 명령어를 이용하여 mysql밖으로 다시 이동하자.

$ sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf

위 명령어를 통해 외부접속을 방해하는 파일로 이동하면 아래와 같은 텍스트들이 vim을 통해 보여질것이다.

bind-address와 mysql-bind-address는 설정한 ip에서부터의 접근을 바인딩해주는 설정이다.
이를 주석처리 해주어야 원활하게 우리의 프로젝트를 테스트할 수 있다.

글을 추가 또는 삭제하려면 아마 변경이 불가능한 상태일 것이다.
vim의 입력상태로 전환하는 단축키는 i이기때문에 단축키를 통한 입력상태를 변경한 후에 주석처리를 진행해주자.

여기서 나같은 터미널이 어색한 자들이라면 한번더 당황할것이다.
저장후파일에서 나가야하는데 입력상태를 변경하는 못하는 상황일텐데 일단 esc를 눌러 포커싱을 해재한다.

그리고 :wq!를 입력한다.

여기서 w란 저장을 의미하고 q는 종료 !는 강제를 의미한다.

vim으로 접근할때 sudo로 접근했기때문에 !를 통한 강제까지는 필요없을것이지만 혹여나 사소한 에러가 발생한다면 당황하지 말고 탈출하도록 하자.

추가 vim 명령어는 아래 블로그에 잘 정리되어 있으니 궁금하다면 확인해보는것도 좋을것이다.
https://iamfreeman.tistory.com/entry/vi-vim-%ED%8E%B8%EC%A7%91%EA%B8%B0-%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%A0%95%EB%A6%AC-%EB%8B%A8%EC%B6%95%ED%82%A4-%EB%AA%A8%EC%9D%8C-%EB%AA%A9%EB%A1%9D

.마무리 하며

지금까지 1년동안 단 한개의 프로젝트도 끝까지 완성하지 못하며 ec2서버만 2~30번은 종료생성을 반복한것같다.
많다면 많고 적다면 적은 횟수이지만 이번에도 서버를 날리고 다시만들며 하는김에 이제는 달라졌다는 것을 입증하기 위해 오늘도 블로그를 작성한다.
항상 새로 찾아보기 귀찮고 찾을때마다 같은 장애물에 시간을 뺏기곤했는데 이제는 그러지 않아도 될것같아 그점은 참좋다.

나의 첫 토이프로젝트 완성을 위해 화이팅!

profile
불안한 개발자

0개의 댓글