Notice
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
01-09 18:44
Today
Total
관리 메뉴

그날그날 공부기록

라즈베리파이4 DB서버 구축(MySQL) 본문

개인 서버 만들기/DB서버

라즈베리파이4 DB서버 구축(MySQL)

given_dragon 2024. 1. 13. 02:21

놀고 있는 라즈베리파이를 DB서버로 활용하고 싶었다.

마침 DB가 필요한 일이 생겼고, 이 기회에 사용해 보기로 했다.

 

환경

- raspberry pi 4 8GB

- ubuntu server 22.04.3 lts

- 3306 to 3306 포트포워딩

 

시작 전 저장소를 업데이트해준다.

sudo apt-get update

MySQL 설치

설치해야 하는 mysql 버전은 8.0.35이다.

사용 가능한 mysql 패키지 버전을 확인해 보자.

sudo apt-cache madison ${PACKAGE_NAME}

 

 

아래와 같이 패키지명=버전으로 설치하면 된다.

sudo apt-get install ${PACKAGE_NAME}=${VERSION}

 

 

설치가 완료된 뒤, mysql 서비스 유닛이 정상적으로 실행 중인지 확인해 보자.

잘 실행 중인 것을 볼 수 있다.

systemctl status ${SERVICE_NAME}


 

유저 생성

mysql 설치가 모두 끝났으니, 원격 접속지에서 사용할 유저를 생성해 보자.

유저를 생성하기 위해 localhost에서 root 계정으로 접속한 상태이다.

mysql -u root

 

 

* 이후의 사진에서도 유저명과 pw 등 필요한 정보는 모두 가려두었다.

해당 유저는 모든 IP에서 접근 가능하도록 설정하기 위해 host를 %로 설정해였다.

create user '${USER_NAME}'@'${HOST}' identified by '${PASSWD}';

 

 

유저가 잘 생성되었는지 확인해 보자.

 

 

생성한 유저에게 사용할 테이블에 대한 모든 권한을 부여했다.

* 데이터베이스와 테이블은 사전에 만들어두었다.

grant all on ${DATABASE_NAME}.${TABLE_NAME} to '${USER_NAME}'@'${HOST}';

 

 

우선, 테스트로 로컬에서 생성한 계정으로 로그인을 해보자.

mysql -u ${USER_NAME} -p


외부 접속 허용하기

우선 현재 mysql이 어느 포트를 listen 하고 있는지 확인해 봤다.

로컬에서의 접속만 받는 것을 확인할 수 있다.

sudo netstat -ntlp | grep mysqld
// n(주소나 포트 형식을 숫자로 표시), l(listen 상태), t(tcp 연결), p(프로세스 이름 표시)

 

 

외부에서의 접속을 허가하기 위해 mysql의 설정파일을 수정할 것이다.

/etc/mysql/mysql.conf.d 위치의 mysqld.cnf 파일을 vi 편집기로 연다.

cd /etc/mysql/mysql.conf.d
sudo vi mysqld.cnf

 

 

해당 사진은 이미 변경을 한 이후이다.

만약 따로 수정하지 않았다면, 변경 전 부분과 같이 구성이 되어있을 것이고, bind-address만 0.0.0.0으로 설정해 준 뒤 저장한다.

 

 

이제 변경한 설정파일을 저장하기 위해 mysql 서비스 유닛을 재실행한다.

재시작이 완료된 뒤 다시 상태를 확인해 보면 외부에서의 접속도 받는 것을 알 수 있다.

sudo systemctl restart ${SERVICE_NAME}

 


외부의 호스트에서 mysql 접속 테스트

라즈베리파이와 노트북은 모두 같은 스위치에 유선으로 물려있다.

접속을 시도하자, 접속권한이 없다는 에러가 출력하며 실패했다.

분명 유저를 생성할 때 호스트로 % 주었는데 왜 그럴까,,,

mysql -h ${HOST(pi-sub)} -P ${PORT} -u ${USER_NAME} -p

 

 

유저를 생성할 때 무언가 실수가 있었을지도 모르니 이 전의 유저는 drop 하고, 새롭게 유저를 생성했다.

이 전과 똑같지만 이번에는 pw 설정을 mysql_native_password로 미리 지정했다. (* 이전 유저는 생성 후, 해당 값을 변경해 주었다.)

그리고 권한도 똑같이 부여했다.


외부의 호스트에서 mysql 접속 테스트 - 찐막

다시 한번 테스트를 시도해 보았다.

외부 환경에서의 접속을 정확하게 보기 위해 노트북을 휴대폰의 데이터 테더링으로 연결한 뒤, 라즈베리파이에서 실행되고 있는 mysql에 접근을 시도해 보았다.

두 기기는 서로 다른 네트워크에 있기 때문에, iptime에서 설정한 도메인을 사용했다.

공유기에서 포트포워딩이 되어있는 상태이기 때문에, 공인 IP & 3306 포트로 들어온 요청을 라즈베리파이의 3306포트로 보낸다.

 

다행히 유저 문제가 맞았다.

mysql로 접속도 문제없었고, 유저에게 권한도 정상적으로 동작한다.

 

 

 

+ 워크벤치에서도 잘 접속된다 ㅎㅎ

 

 

물론 모든 IP에 대해서 접속을 열어둔 만큼 보안에 취약할 것이다.

해당 계정은 학습용으로 사용할 예정이기 때문에 일단 추가적인 설정 없이 이대로 사용하려고 한다.

Comments