MySQL 권한 에러, DB 이관하기
지난 시간까지 Fast API와 MariaDB를 연동시켜서 가상환경에서 MariaDB에 있는 데이터들을 API로 만드는 작업을 했다. 코드 작성과 이해를 끝내고 포트를 열어서 확인하는 절차만 남았는데, MySQL 권한이 없다는 이유로 500 Server Error가 발생했다. 이번 시간에는 이 에러를 해결하기 위해 고생한 이야기를 작성해보려 한다.✍
※ Fast API와 MariaDB 연동하기 - https://hjinn0813.tistory.com/145
FastAPI와 MariaDB 연동하기
DB화된 데이터를 FastAPI에 연동시켜서 API로 만들기
hjinn0813.tistory.com
MySQL 권한 에러 해결 시도
솔직히 햇병아리 FE 개발자인 나는, 스스로가 직접 HeidiSQL에서 한땀 한땀 작성한 데이터인데 왜 권한이 없다고 하는지 이해가 안됐다. 이 문제를 해결하려고 구글링도 해보고 GPT에게도 방법을 물어보다가 이유를 알게 되었다.
MySQL을 설치하면 가장 먼저 사용하는 계정은 root 계정이다.
root 계정은 관리자 계정이라서 DB에 대한 모든 권한이 있다.
하지만 실제 서비스에 사용되는 DB는 DBA가 root 권한을 가지고 있다.
따라서 DB를 이용하는 개발자 및 사용자들은 역할에 맞도록 권한을 부여받아 사용한다.
일단 구글링해서 알아낸 다양한 방법으로 에러 해결을 시도했다.
가장 먼저 DB 서버가 열려있는지 확인했다.
sudo 명령어로도 확인할 수 있지만 나는 sudo 권한이 없다고 에러가 떴었기 때문에, 윈도우 기준으로 [제어판 > 관리 도구 > 서비스]에서 MySQL 실행이 꺼져있는지 봤다. 나는 MySQL 대신 MariaDB를 사용하고 있고, MariaDB가 '실행중' 상태였다. 현재 DB 서버가 열려있다는 의미니까 이건 패스.
다음으로는 방화벽의 문제인지 살펴보았다.
[Windows Defender 방화벽 > 고급 설정 > 인바운드 규칙]에서 MariaDB 기본 포트인 3306을 차단하고 있는지 확인했다. MariaDB는 로컬주소, 원격주소, 로컬포트, 원격포트 전부 '모두'로 되어있었다. 특정 포트를 차단하고 있는게 아니라서 이것도 패스.
기본 설정을 하나도 건드리지 않았기 때문에, 구글링해서 찾은 방법들이 크게 의미있지 않았다.
사수님이 가상환경 서버에 DB 계정을 만들어서 로컬의 데이터를 옮기는게 더 빠른 해결방법 같다고 하셔서, 그렇게 진행했다.
사수님이 "DB 계정을 새로 만든다" 라고 하셔서 구조가 헷갈렸는데, 서버 > 가상환경 > DB 계정 순서로 속해있다.
내가 가상환경에 접속하던 계정은 말 그대로 가상환경에 대한 접속 권한만 있는 것이다.
가상환경 접속 계정에 DB에 대한 권한을 추가하면 되지 않을까 생각했는데, 기존 계정에 권한을 추가하는 것보다는 필요한 권한을 가진 새로운 계정을 만드는 것이 더 간단할 수 있다고 한다!
HeidiSQL에서 데이터 옮기기
가장 먼저 HeidiSQL로 로컬의 DB에 접속해서 sql 파일로 데이터를 export했다.
세션명에서 우클릭하고 [데이터베이스를 SQL로 내보내기]를 클릭하면, 오른쪽과 같은 화면이 나온다.
다른 곳에서 데이터를 만들어야 하는거니까, [생성]에 체크하고 INSERT 명령어를 선택한다. 파일이 저장될 경로를 선택하고 [내보내기] 버튼을 클릭하면, 알아서 export가 된다. 필요한 테이블만 체크했어야 하는데 처음이라 몰라서 그냥 전부 선택된 상태로 export했다.
그 다음에 DB계정으로 접속해서 방금 내보내기한 sql 파일을 불러왔다.
[파일] 탭에서 [SQL 파일 불러오기]로 앞서 내보냈던 파일을 가져왔더니, 화면 중앙에 자동으로 쿼리문이 열렸다. 여기에 마우스 놓고 우클릭해서 실행을 시켰는데, 무슨 일인지 에러가 발생해서 쿼리문이 실행되지 않았다. 지금 글을 작성하면서 쿼리문이 문제였다는걸 알았다.
CREATE DATABASE IF NOT EXISTS 'volleyball'
사진에도 보이는 이 쿼리문 때문이었다.
데이터가 옮겨질 데이터베이스 이름이 'volleyball'이 아니고, DB계정의 데이터베이스 목록에는 'volleyball'이 없다. 또한 앞서 언급했듯, DB계정은 사수님이 만들어주신거라 나한테는 데이터베이스 생성 권한이 없는데, 'volleyball'이 없으면 만들라고 하니까 문제가 된 것이다.
하지만 당시에는 이게 문제라는걸 몰랐기 때문에, 할 수 없이 직접 테이블을 만들고 속성을 하나씩 추가한 뒤에, 데이터를 입력하는 부분만 아래의 쿼리문을 사용했다. 선수가 20명이고 이름, 생일, 포지션, 신장, 연봉, 데뷔시즌 등 10가지 속성이 있는데 그걸 하나씩 하드코딩하는건 비효율적이기 때문!🙂
INSERT INTO ~ VALUES ~
쿼리문으로 20명을 한번에 입력하려고 하니까 서버와의 연결이 끊어지는 에러가 발생해서, 4명씩 끊어서 입력했다.
아무튼 그래서 데이터 이관 작업 끝!👏
데이터 이관 작업을 마치고, 가상환경에 접속해서 database.py 파일에서 DATABASE_URL에 들어가는 사용자 이름, 비밀번호, IP주소 등을 DB 계정의 정보로 수정했다. 포트를 열어서 정보들이 정상적으로 보여지는걸 확인했다.👍
이제 프론트엔드에서 API 불러와서 화면에 예쁘게 보여지도록 코드를 수정해야지..
참고했던 글
https://10web.io/blog/mysql-error-2003/
How to Fix MySQL Error 2003: Can't Connect to MySQL Server on 'localhost:3306'
Let's learn how to effectively fix MySQL error 2003 (hy000): "can't connect to MySQL server on 'localhost:3306'".
10web.io
https://marumaru.tistory.com/5
HeidiSQL을 활용한 데이터베이스 이관
1. HeidiSQL에서 DB 내보내기 1) SQL로 내보내기 HeidiSQL을 통해 데이터베이스에 접속한 후 내보낼 DB를 우클릭하여 '데이터베이스를 SQL로 내보내기' 선택 2) 내보낼 요소 및 경로 설정 데이터베이스, 테
marumaru.tistory.com