Windows 에 Docker Desktop 만 설치 되어 있으면 Mysql 계정 생성이 가능하다. Docker 로 MySQL 컨테이너를 띄우는 방식이면 MySQL 계정이 만들어질 수 있다.
✔️Docker Desktop 이 설치되어 있어야 함
✔️docker-compose.yml 또는 Makefile 안에 MySQL 생성 관련 설정이 있어야 함
✔️make 명령이 Windows 또는 WSL 에서 사용 가능해야 함
Makefile 에서의 db-up 자체는 단순히
db-up:
docker-compose up -d --force-recreate
만 실행할거고 (계정이나 DB가 생성되지 않음)
docker-compose.yml
안에 지정된 환경변수(MYSQL_DATABASE, MYSQL_USER, MYSQL_PASSWORD)를 넣으면 컨테이너가 처음 시작될 때 자동으로 MySQL 계정과 DB가 생성된다. 이렇게 만들어진 계정은 컨테이너 최초 실행 시에 pass_local_user@'%' 어디서든 접근 가능한 계정이 자동 생성된다.
Access denied for user 'pass_local_user'@'localhost' (using password: YES)
Access denied 는 크게 두 가지 이유가 있다.
비밀번호가 틀리거나 플러그인이 안 맞는 경우와 권한이 없는 경우이다.
추가적으로 DBeaver 연결 설정을 확인해볼 게 있다.
Username 과 Password 를 맞게 입력했는지,
Host 는 localhost 가 맞는지, (또는 127.0.0.1 둘 다 시도)
Port 는 3306,
Driver Properties: allowPublicKeyRetrieval = true, useSSL = false (useSSL false 는 로컬 개발 환경일 경우 설정해두면 편함)
다시 Test Connection 해보고 안된다면,
컨테이너 내부 MySQL 들어가기
docker exec -it mysql_local mysql -u root -p
MySQL 8.0 은 기본이 caching_sha2_password 인데, DBeaver에서 연결 시 이 플러그인을 제대로 못 쓸 수도 있다. 우리가 mysql_native_password 로 바꿨으니 다시 한 번 현재 플러그인과 비밀번호가 제대로 저장됐는지 확인이 필요하다.
SELECT user, host, plugin FROM mysql.user WHERE user = 'pass_local_user';
여기서
host 가 localhost 인지,
plugin 이 mysql_native_password 인지 체크
만약 플러그인이 caching_sha2_password 라면 다시 바꿔줘야 한다.
ALTER USER 'pass_local_user'@'localhost' IDENTIFIED WITH mysql_native_password BY '원하는 비밀번호 입력';
FLUSH PRIVILEGES;
계정이 있어도 해당 DB 에 접근 권한이 없으면 로그인은 되더라도 DB 선택 시 거부된다.
현재 계정 권한 확인
SELECT user, host FROM mysql.user WHERE user = 'pass_local_user';
권한이 부족한지 확인
SHOW GRANTS FOR 'pass_local_user'@'%';
GRANT ALL PRIVILEGES ON `pass_local`.* TO 'pass_local_user'@'%'` 이런게 있어야한다.
없다면 권한 다시 부여
GRANT ALL PRIVILEGES ON pass_local.* TO 'pass_local_user'@'localhost';
FLUSH PRIVILEGES;
그래도 안되면..
아예 기존 계정 삭제하고
새로 계정 만든 후 권한 부여도 다시 해보자
-- 1. 기존 계정 삭제
DROP USER IF EXISTS 'pass_local_user'@'localhost';
-- 2. 새 계정 생성 (mysql_native_password로)
CREATE USER 'pass_local_user'@'localhost'
IDENTIFIED WITH mysql_native_password BY '새비밀번호 입력';
-- 3. 권한 부여 (pass_local 데이터베이스 전체 권한)
GRANT ALL PRIVILEGES ON pass_local.* TO 'pass_local_user'@'localhost';
-- 4. 변경 적용
FLUSH PRIVILEGES;