[Prisma] User `db` was denied access on the database `db`.
문제 발견 과정
nest 스터디 중 발생한 오류다. 공부할 것도 많은데 오류가 아주 꼬리에 꼬리를 물고 발생하였다🤦♀️
테스트코드 실행 중에The table User does not exist in the current database. PrismaClientKnownRequestError:
에러가 발생하였다. prisma
데이터베이스 생성을 지나친 것이다.
아래 명령어로 시도하였다.
pnpm prisma migrate dev --name init
# 또는
npx prisma migrate dev --name init
하지만 또 부딪히게 된 오류.
Error: P3014
Prisma Migrate could not create the shadow database. Please make sure the database user has permission to create databases. Read more about the shadow database (and workarounds) at https://pris.ly/d/migrate-shadow
Original error: Error code: P1010
User `nest` was denied access on the database `nestdb`
위 오류는 Prisma가 Shadow Database(마이그레이션에 사용되는 임시 DB)를 생성하려고 시도하는 과정에서, nest
사용자에게 데이터베이스 생성 권한 이 없어서 발생한 문제였다. 모든 문제의 원인!!!
gpt 에게 물어보니 docker로 띄운 mariaDB 컨테이너 내부 쉘에서 nest
사용자에게 권한을 줘야 한다고 하였다. 이 과정이 굉장히 길었다. 나와 같은 문제를 겪은 사람이 어딘가 고군분투를 하고 있지 않을까 싶어 도움을 주고자 글을 쓰게 되었다.
문제 해결과정
User `nest` was denied access on the database `nestdb`
위 오류 상세 내용을 살펴 보면 nest
계정이 CREATE DATABASE 권한이 없는 상태이다.
해답은 간단하다.
그럼 권한을 만들어주면 된다!
(하지만 난 간단한 길을 여러 삽질을 통해 가야 했다,,)
1. Docker 환경에서 mariaDB 컨테이너 접근
나는 Docker
컨테이너를 이용하여 mariaDB에 접속했다. 그래서 mariaDB 컨테이너에 접근해야 했다.
docker exec -it nest-mariadb bash
위 명령어를 터미널에 입력하면
root@컨테이너ID:/#
위 계정정보와 함께 도커 컨테이너 내부의 리눅스 셸로 변경될 것이다.
1.1 mariaDB(혹은 MySQL) 클라이언트 설치 후 사용
여기서 mariaDB
DB 클라이언트를 설치한 적이 있다면 아래 1.1 과정을 생략하고 2번으로 넘어가면 된다.
나는 설치한 적이 없어서 삽질을 몇 번이나 더 했다.
이미지가 Debian/Ubuntu
계열인지 Alpine
계열인지에 따라 명령이 다르다고 한다.
# Debian/Ubuntu 계열일 경우
apt-get update && apt-get install mariadb-client -y
# Alpine 계열인 경우
apk update && apk add mariadb-client
대부분 Debian/Ubuntu
계열이라 하고 그래서 Debian/Ubuntu
계열의 명령어를 썼는데 잘 설치 됐다.
설치가 끝나면
Get:
번호 어쩌구 로그들이 줄줄이 뜨다가 아래와 같은 예쁜 로그가 올라올 것이다.
Fetched 28.0 MB in 24s (1174 kB/s)
Reading package lists... Done
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
mariadb-client is already the newest version (1:11.7.2+maria~ubu2404).
mariadb-client set to manually installed.
0 upgraded, 0 newly installed, 0 to remove and 19 not upgraded.
1.2 클라이언트 설치 확인
which mariadb
# 또는
which mysql
위 명령어로 설치가 됐는지 확인하자.
셸에 /usr/bin/mariadb
혹은 /usr/bin/mysql
이 출력된다면 설치가 성공적으로 끝난 것이다.
2. DB 접속 후 권한 부여
2.1 DB 접속
드디어!!!! DB에 접속해보자.
mariadb -u root -p
# 비밀번호 입력 (docker-compose.yml에 지정한 root PW, 예: root1234)
비밀번호 입력란이 나온다면 님은 반은 성공한 거임
Enter password: # docker-compose.yml 에서 설정했던 root 사용자의 비밀번호를 입력한다.
비밀번호 입력 후 아래와 같은 내용이 출력된다면 DB CLI 접속에 성공한 것이다!!!!
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 7
Server version: 11.7.2-MariaDB-ubu2404 mariadb.org binary distribution
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
2.2 권한 부여
MariaDB 프롬프트에 아래 SQL문을 입력하면 된다.
;(세미콜론)
은 빼먹지 말고 반드시 입력해야 한다!
# 접속 후 MariaDB 프롬프트에서:
GRANT ALL PRIVILEGES ON *.* TO 'nest'@'%';
FLUSH PRIVILEGES;
3. 종료
MariaDB 프롬프트에서 나오려면 exit
을 입력하면 된다.
컨테이너 내부 셸에서 나오는 것도 똑같이 exit
입력이다.
기다리고 기다려온 코드를 터미널에 입력해본다.
pnpm prisma migrate dev --name init
결과물
Environment variables loaded from .env
Prisma schema loaded from prisma/schema.prisma
Datasource "db": MySQL database "nestdb" at "localhost:3306"
Applying migration `20250226092036_init`
The following migration(s) have been created and applied from new schema changes:
migrations/
└─ 20250226092036_init/
└─ migration.sql
Your database is now in sync with your schema.
✔ Generated Prisma Client (v6.4.1) to ./node_modules/.pnpm/@prisma+client@6.4.1_prisma@6.4.1_typescript@5.7.3__typescript@5.7.3/node_modules/@prisma/client in 37ms
아름답다. 아름다와
마치며
테스트 코드도 잘 동작한다. 감동의 눈물 좔좔..
기본적인 내용일 수도 있겠지만 나 같이 고생하는 분이 없길 바라며 글을 마친다,, 저처럼 삽질하지 마시고 얼른 이 글 검색해서 시간을 아끼세요.
다 해봤는데 안된다면,,
혹시 docker desktop 컨테이너가 정지 된 건 아닌지 한 번 더 확인해보자.