[삽질일기] MySQL 설치

너 오늘 코드 짰니?·2023년 12월 16일
2

삽질일기

목록 보기
1/1

MySQL을 설치하기 위한 삽질과정과 알게된점을 정리한 글입니다.
아! SAMSUNG 노트북을 쓰기 때문에 Windows 환경입니다. Mac이나 Linux 환경은 저도 잘 모릅니다 ^~^

사건의 발단

서버 공부를 한번 해보려고 배달의 민족 ERD를 짠다음 SQL export 해서 실제 DB와 서버를 구축해보려고 했다.

여담
이게 내가 짠 ERD이다. (나 라는 존재가 세상에 나와 가장 처음 창조한 ERD)
https://www.erdcloud.com/d/pjFpLeTQTso4tf2E7
안드로이드 개발하다가 서버 디비 설계를 하다보니 '어... 이런건 안드쪽에서 구조 만든다음에 넘겨주면 더 효율적이지 않나...?' 라는 생각이 꽤 자주 들었다.
그래서 이부분은 프론트나 클라이언트에서 만들어주게 구현하면 되겠지 하는 부분이 많다보니 듬성듬성 허술해보이는 부분도 있고 한데.. 실제론 이런 고민이 있을 때 ERD에 아예 반영을 안하는게 맞는건지 잘 모르겠다.

여튼 무지성 ERD 짜고 막상 SQL 코드로 추출하고나니 이걸 DB로 구축하려면 MySQL이 필요했고 설치해보려고 했다.

MySQL 설치 과정

https://dev.mysql.com/downloads/mysql/
위 사이트로 들어가면 커뮤니티버전 MySQL을 설치할 수 있는데

  • MSI installer 버전
  • ZIP Archive 버전

두 가지가 있다. MSI installer는 설치 프로그램을 통해서 GUI로 MySQL을 설치가능한 버전이고 ZIP Archive 버전은 직접 zip파일을 압축해제해서 초기설정과 경로셋팅 등을 직접 해주어야 하는 버전이다.

당연히 쉬워보이는 MSI installer 먼저 시도해봤지만 알 수 없는 무수한 에러로 인해 약 2시간의 사투 끝에 포기했다.

이전에 MySQL 설치했다가 지웠었는데 그게 깔끔하게 안지워졌는지 자꾸 이전버전이랑 꼬이면서 잘 안됐다.

그래서 ZIP Archive로 갈아타서 '개발자답게' 직접 cmd에서 설치를 진행했다.

일단 뭐 대충 다운로드 받아서 원하는 경로에 압축해제하면 된다

그리고 환경변수 설정을 해주어야 하는데 무지성 구글링은 건강에 좋지 않으므로 '개발자답게' 공식문서를 통해서 한번 확인을 해보자.

오....뭐가 많은데 환경변수라는게 애초에 필수적인게 아니라 선택적인 영역이므로 딱 한가지만 보면 된다.
PATH 환경변수는 shell에서 mysql 명령어를 사용할 수 있게 해주기 때문에 '개발자답게' cmd로 mysql 설치를 할거면 이건 꼭 필수로 등록해주자.

환경변수 설정하는법은 뭐 구글링 해보면 많이 나오니까 PASS

그리고 구글링하다보면 MYSQL_HOME 이라는 환경변수도 설정하는 경우가 있는데 얘는 my.cnf 파일의 위치를 지정해주는 변수이다.

my.cnf는 MySQL 서버의 각종 default 설정을 담당하는 파일인데 얘가 없어도 DB자체는 올라가기 때문에 일단 연습하는 단계에서는 굳이 안건드려도 된다.

만약에 MYSQL_HOME 환경변수 설정을 했다면?

mysql --help 

쳤을 때 위 사진처럼 나오는데 읽어보면 Default 옵션들이 아래 경로에 있는 my.cnf나 my.ini를 순차적으로 탐색해서 찾은 파일에 의해 설정된다고 나온다. 가장 우측에 보이는 D드라이브 경로가 내가 MYSQL_HOME으로 설정한 경로.
(뭐 연습단계에선 안중요하니깐 넘어가요)

Windows에서 MySQL 실행

이제 우리는 편리한 MSI installer를 버려두고 ZIP Archive를 사용했기 때문에 cmd 코드 몇줄 치는 벌을 받아야 한다.

mysqld --initialize
mysqld --install
net start mysql

까지 하면 MySQL 서버 초기화하고 실행시키는것까지 된다.
명령어에 대해 궁금해서 조사한 내용 바탕으로 설명을 좀 덧붙였다.

mysqld

mysqld, also known as MySQL Server, is a single multithreaded program that does most of the work in a MySQL installation. It does not spawn additional processes. MySQL Server manages access to the MySQL data directory that contains databases and tables. The data directory is also the default location for other information such as log files and status files.

시스템 프로그래밍 관련해서 공부를 좀 하다보면 콘솔창에서 치는 이 명령어도 결국에는 하나의 응용프로그램인것을 알 수 있는데 mysqld라는 응용프로그램은 MySQL 서버에서 멀티스레딩으로 동작하는 데몬프로세스이다. (mysql뒤에 붙은 d가 Daemon이라는 뜻)

데몬은 유닉스(Unix) 운영체제에서 부팅 시 자동으로 켜져, 백그라운드에서 계속 실행되는 프로세스.

따라서 MySQL 서버가 실질적으로 동작하는 백그라운드 프로그램이라고 보면 된다.

그럼 mysql 명령어는 뭐고 mysqld랑 뭐가 다르냐?
mysql명령어는 클라이언트 프로그램을 실행하여 포그라운드에서 사용자와 상호작용하기 위한 명령어이다.
정리해보면

  • mysqld는 백그라운드에서 동작하는 실질적인 MySQL 서버 데몬 프로세스이기 때문에 서버의 구동, 초기화, 클라이언트 요청과 실제 데이터베이스 작업 처리를 담당한다.
  • mysql은 포그라운드에서 동작하는 명령어이고 MySQL 서버에 연결하여 데이터베이스 관리, 쿼리 실행, 데이터 검색, 수정, 삭제 등과 같은 데이터베이스 작업을 요청하는 인터페이스를 제공한다.

mysqld --initialize

Information managed by the MySQL server is stored under a directory known as the data directory. The following list briefly describes the items typically found in the data directory, with cross references for additional information:
After MySQL is installed, the data directory must be initialized, including the tables in the mysql system schema:

'mysqld --initialize' 명령어는 각종 초기화 과정을 통해 data 디렉토리를 생성한다.
data 디렉토리는 스키마 정보와 실제 데이터들을 저장하는 디렉토리이기 때문에 말그대로 data = database 라고 보면 된다. (1대1 대응)
데이터베이스 안에 여러 테이블이 있고 각 테이블에 데이터가 저장되는데 이 모든 정보가 data 디렉토리 안에 들어가는 셈.

mysqld --install

mysql 관련 파일을 가져와서 압축해제까지 했지만 아직 Windows에서 사용될 준비가 되지 않았습니다.
Windows운영체제에서는 서비스라는 개념으로 백그라운드 프로세스를 관리하는데 'Windows 키' -> '서비스' 라는 것을 검색해서 열어보면 아래 사진과 같이 네트워크나 보안 등등 각종 백그라운드 프로그램이 실행되고 있는 것을 볼 수 있습니다.

따라서 방금 전에 설치하고 초기화를 마친 MySQL을 Windows의 서비스 형태로 만들어주는 과정이 필요한데 이게 mysqld --install 명령어입니다.
--install 옵션뒤에 서비스명을 붙일 수 있지만 안붙여도 자동으로 MySQL 로 초기화 됩니다.

net start mysql

net start 명령어는 Window 서비스를 실행시키는 명령어입니다.
위에서 --install 옵션 통해서 MySQL을 서비스형태로 만들어줬죠? 이걸 실행시키는 겁니다. 만약 mysqld --install araralla 와 같이 옵션으로 서비스명을 지정해줬다 -> net start araralla 가 되는겁니다.

만약 위와 같이 Can't connect to MySQL server on 'localhost' (10061) 에러가 나오면 MySQL 서비스가 실행되지 않아서 접속을 못하는 거니 겁먹지않고 net start mysql 해주시면 해결됩니다.

🚨문제발생🚨

자~~ 이제 DB를 백그라운드로 돌리는거까지 했으니까 직접 mysql에 들어가서 스키마 만들고 디비작업 이것저것 해줘야겠죠?

mysqld -u root -p

명령어로 입장해봅시다.

띠롱?

난 아무것도 한게 없는데 뭔 password를 치라고 나옵니다. 그래서 그냥 아무것도 안치고 Enter 누르니까 using password : NO 가 나옵니다.

아 뭔가 비밀번호를 설정해야 하나? 싶어서 원하는 비밀번호 누르면 using password : YES 에러가 나옵니다.ㅋㅋㅋ (뭐 어쩌라고 아잇윽엑윽)

여기서 시간을 진짜 많이 까먹었는데 구글링 해서 얻은 정보는 아래와 같습니다.

  • 비밀번호가 틀렸으니 mysql에 접속해서 비밀번호를 변경해라.
    -> 아니 접속 자체를 못하는데 어케 변경하라는거야 -> 기각
  • 재접속 해라 -> 응 해도 안돼 -> 기각
  • mysqld --skip-grant 명령어를 통해 인증없이 mysql에 진입해서 비밀번호 바꿔라 -> 정책이 바뀌었는지 제 환경 문제인지 이제 먹히지 않더군요. -> 기각

진짜 여러가지 시도를 많이 해봤는데 계속 using password : NOusing passwordd : YES 만 반복되니 정신이 나가버릴 뻔 했습니다.

2시간동안 YES 와 NO를 왕복하다 정신이 나가버린 내 모습

해결방법

심기일전 해서 구글링에 의존하지 말고 공식문서로 한번 돌파해봅시다.

일단 제가 생각했을 때 이 에러가 나타난 원인은 아래와 같습니다.

mysql을 초기화할 때 제멋대로 비밀번호가 생성되었는데 내가 그걸 모른다.

이거 아니면 말이 안되는게 비밀번호가 없는데 비밀번호를 치라고 나오고 안치면 안들여보내주는거는 프로그램이 잘못된거죠 ㅋㅋ 이 문제인건 확실한거 같습니다.
아니 근데 왜 지멋대로 생성해놓고 안알려주냐고!!

그렇다면 이 제멋대로 생성된 비밀번호를 찾던지 아니면 비정상적인 방법을 통해 억지로 mysql에 접속하여 강제로 비밀번호를 변경하던지 와 같은 방법으로 해결할 수 있을것 같았습니다.

일단 비정상적인 방법은 나쁘기 때문에 쓰지 않기로 하고 시작단계부터 한번 탐색해봅시다.

mysql 초기화 단계에서 만약 실제로 비밀번호가 생성되는거라면 초기화 하는 명령어에 뭔가 실마리가 있지 않겠습니까?
https://dev.mysql.com/doc/refman/8.0/en/data-directory-initialization.html#data-directory-initialization-overview

그래서 mysqld --initialize 할 때 무슨일이 일어나는지 알아보고자 공식문서를 들고왔습니다.

어...? --initialize 를 하면 랜덤으로 비밀번호를 생성하고 --initialize-insecure 옵션을 사용하면 비밀번호를 생성하지 않고 바로 접속할 수 있다고 바로 써 있네요...?

저의 가설이 맞았습니다.

net stop mysql
mysqld --remove

로 기존의 MySQL 서비스를 중지한 다음 삭제합니다.
추가로 initialize를 통해 생긴 data 디렉토리도 지워주셔야 합니다.

그리고 다시

mysqld --initialize-insecure
mysqld --install
net start mysql

을 통해 데이터베이스를 실행시켜주면

짜잔~~ 이렇게 비밀번호 없이 mysql에 접속가능합니다.
물론 이 방법은 비밀번호 생성없이 DB를 만들었기 때문에 보안상 위험한 상태입니다. 반드시 접속후 바로 비밀번호를 설정해주세요.

위 그림처럼 두 개의 쿼리를 날려서 비밀번호를 설정해줄 수 있습니다.

--initialize 옵션 사용법

추가적으로 --initialize 옵션을 사용했을 때 랜덤생성된 비밀번호는 어디서 알 수 있는지 궁금해서 찾아봤습니다.

공식문서 보니까 Error Log로 Warning 도메인에 띄워주는거 같네요
그럼 이 Error Log는 어디서 보냐!

--initialize --console 옵션을 주면 콘솔창에 저렇게 임시 비밀번호를 찍어줍니다.
--console 옵션을 까먹고 안줬다면 걱정마세요

data 디렉토리 안에 (노트북 이름).err 파일에 로그가 기록되기 때문에 찾아보시면 알 수 있습니다.

이상으로 저는 mysql 설치 및 세팅에 대해 깨달음을 어느정도 얻게 되었습니다. 안녕히계세요!

profile
안했으면 빨리 백준하나 풀고자.

1개의 댓글

comment-user-thumbnail
2023년 12월 23일

재밌게 읽고 갑니다~~

답글 달기