[상황] 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 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 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
파일을 만들어주면 편하다.
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 up -d
// 백그라운드에서 실행 시 옵선 -d
4. MySQL 컨테이너 bash 쉘 접속
$ docker exec -it doyeon-mysql bash
5. MySQL 서버 접속
root@48693e29a033:/# mysql -u root -p
mysql > (패스워드)
진짜 감격의 순간,, 20시간만에 mysql 콘솔에 접속했다.
가슴이 웅장해진다.
6. 컨테이너 내에서 DB, 사용자 생성, 권한 부여
중요 : 컨테이너 외부에서 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은 위에서 생성한 사용자 계정명으로 입력해주면 된다.
접속이 잘되면 연결이 됐다는 뜻이다! 😭
[출처]