[MySQL] ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)

uoayop·2021년 4월 10일
8

에러 한바가지

목록 보기
2/16
post-thumbnail

[상황] mysql -u root를 통해 mysql에 접속하려고 했는데 에러 발생

ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)

[시도 1] 비밀번호를 입력해보자

ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

==> 똑같은 에러 발생
검색해보니 using password가 NO일땐 비밀번호를 입력 안한거고,
YES일땐 비밀번호가 틀린거라고 한다.

비밀번호가 틀린걸보니 까먹은게 분명하다. 재설정 해주자


[시도 2] 비밀번호 재설정

mysqld --skip-grant // 인증 없이 mysql 진입
[ERROR] [MY-010262] [Server] Can't start server: Bind on TCP/IP port: Address already in use
2021-04-10T17:01:46.616351Z 0 [ERROR] [MY-010257] [Server] Do you already have another mysqld server running on port: 3306 ?
2021-04-10T17:01:46.617010Z 0 [ERROR] [MY-010119] [Server] Aborting

3306 포트를 이미 쓰고 있어서 aborting 됐다.


[시도 3] 3306 포트 kill 하고, 재설정 시도

sudo lsof -i:3306 //실행중인 포트 찾기
COMMAND PID   USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
mysqld  154 _mysql   31u  IPv6 0x18c1898642d5348d      0t0  TCP *:mysql (LISTEN)

다른 프로젝트에서 쓰고있는 mysql이 실행이 되고 있었다.

$ sudo kill -9 154 //kill 하고싶은 프로세스의 PID 넣어주기

프로세스 kill을 해줬는데 3306 포트가 계속 실행이 되고 있다.
알고보니 mysql stop을 하지 않은 상태여서 그랬다. 😓(멍청이)

검색을 해보니 service mysql stop으로 mysql을 종료할 수 있다고 한다.

$ service mysql stop       
zsh: command not found: service

음음 쉽게 될리가 없지


[시도 4] services 설치 후 mysql stop 하기
service 명령어는 리눅스 기반에만 있는 명령어라고 한다.
따라서 맥은 아래와 같이 해주면 된다.

$ brew services mysql start 	//mysql 시작하기
$ brew services mysql stop 	//mysql 나가기
$ brew services mysql stop

으로 stop을 해주었다.


[시도 5] 인증 없이 mysql 진입 시도

$ mysqld_safe --skip-grant-tables
$ mysqld -u root -p
$ 비밀번호 : (엔터)
[ERROR] [MY-011084] [Server] Keyring migration failed.

하.. 𝙒𝙝𝙮𝙧𝙖𝙣𝙤,,,


[시도 6] Keyring migration 에러 해결하기

🔗 해당 레퍼런스 참고

$ mysqld --initialize-insecure --console 
[ERROR] [MY-010457] [Server] --initialize specified but the data directory has files in it. Aborting.
[ERROR] [MY-013236] [Server] The designated data directory /usr/local/var/mysql/ is unusable. You can remove all files that the server added to it.

에러만 또 한바가지 나왔다.
해당 폴더에 데이터가 있어서 초기화 할 수 없다고 한다.

에러 로그에 표시된 /usr/local/var/mysql 폴더를 지우고 다시 시도해보자

$ mysqld --initialize-insecure --console 
[System] [MY-013169] [Server] /usr/local/Cellar/mysql/8.0.23_1/bin/mysqld (mysqld 8.0.23) initializing of server in progress as process 23653
[Warning] [MY-010159] [Server] Setting lower_case_table_names=2 because file system for /usr/local/var/mysql/ is case insensitive
[System] [MY-013576] [InnoDB] InnoDB initialization has started.
[System] [MY-013577] [InnoDB] InnoDB initialization has ended.
[Warning] [MY-010453] [Server] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option.
[System] [MY-013172] [Server] Received SHUTDOWN from user <via user signal>. Shutting down mysqld (Version: 8.0.23).

초기화 된 상태에서 비밀번호만 설정해주면 된다고 한다.


[시도 7] mysqld 콘솔 실행

$ mysqld --console
[Server] Do you already have another mysqld server running on port: 3306 ?
[ERROR] [MY-010119] [Server] Aborting

아 ㅋㅋ 계속 같은 에러를 빙글뱅글 돌고있다.
로컬에 너무 많은 MySQL이 설치 되어 있어서 뭔가 꼬인 느낌이다.
고민하다가 도커를 사용해보자는 생각이 들었다.


🌈 🌸 🌼 😇 🎵 🚨 ❣️
[해결 방법] docker 사용

아래의 코드는 jmlim 의 글을 보고 작성했습니다!

1. docker 설치 확인

$ docker --version

2. MySQL Docker 이미지 다운로드

$ docker pull mysql:8.0.17 (버전 안적으면 최신 버전이 가져와진다.)
  • Docker 이미지 확인
$ docker images 

3. Docker MySQL 컨테이너 생성 및 실행

  • 데이터를 저장할 저장소를 만들어주고, 컨테이너의 /var/lib/mysql 디렉터리로 마운트 해준다.

  • 컨테이너가 삭제될 시 데이터도 날아갈 수 있기때문에, 저장소는 반드시 외부로 마운트를 해줘야 한다.
    (-v /Users/doyeon/datadir:var/lib/mysql)

  • 3306 포트 확인 후 kill 해주기

$ sudo lsof -i :3306
$ sudo kill -9 (PID)        
  • docker 컨테이너 실행
$ docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=password --name doyeon-mysql -v /Users/doyeon/datadir:/var/lib/mysql mysql:8.0.17

이때 한글이 깨지지 않도록 인자값을 넣어주려면 코드가 더 길어져 번거로운 작업을 거쳐야하므로,
docker-compose.yml 파일을 만들어주면 편하다.

  • docker-compose.yml
version: "3" # 파일 규격 버전
services: # 이 항목 밑에 실행하려는 컨테이너를 정의
  db: # 서비스 명
    image: mysql:8.0.17 # 사용할 이미지
    container_name: doyeon-mysql # 컨테이너 이름 설정
    ports:
      - "3306:3306" # 접근 포트 설정 (컨테이너 외부:컨테이너 내부)
    environment: # -e 옵션
      MYSQL_ROOT_PASSWORD: "password"  # MYSQL 패스워드 설정 옵션
    command: # 명령어 실행
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_unicode_ci
    volumes:
      - /Users/doyeon/datadir:/var/lib/mysql # -v 옵션 (다렉토리 마운트 설정)
  • docker-compose 파일 실행
    docker-compose.yml 을 작성한 위치에서 실행시키면 된다.
$ docker-compose up -d 
// 백그라운드에서 실행 시 옵선 -d

4. MySQL 컨테이너 bash 쉘 접속

$ docker exec -it doyeon-mysql bash

5. MySQL 서버 접속

  • MySQL 컨테이너를 실행할 때 지정한 정보를 넣어주자.
    • MYSQL_ROOT_PASSWORD: "password"
root@48693e29a033:/# mysql -u root -p
mysql > (패스워드)

진짜 감격의 순간,, 20시간만에 mysql 콘솔에 접속했다.
가슴이 웅장해진다.

6. 컨테이너 내에서 DB, 사용자 생성, 권한 부여

  • doyeon이라는 사용자를 생성하고, 모든 권한을 부여한다.

    중요 : 컨테이너 외부에서 MySQL에 로그인도 가능해야 하므로 doyeon@localhost에서 localhost 대신 %를 사용한다.

mysql> CREATE USER 'doyeon'@'%' IDENTIFIED BY 'password';
Query OK, 0 rows affected (0.00 sec)

mysql> GRANT ALL PRIVILEGES ON *.* TO 'doyeon'@'%';
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql> quit

7. 연결 확인하기
MySQL workbench를 설치해서 연결을 확인해줄 것이다.

  • 추가버튼을 누르자

  • connection name, username, password 를 설정한다.
    username은 위에서 생성한 사용자 계정명으로 입력해주면 된다.

접속이 잘되면 연결이 됐다는 뜻이다! 😭


[출처]

  1. Docker를 통한 MySQL 설치하기.
  2. [Java] Mac에서 MySQL 설치(+workbench)
profile
slow and steady wins the race 🐢

0개의 댓글