Issue

[Prisma] User `db` was denied access on the database `db`.

binaryJournalist 2025. 2. 26. 18:29
반응형

문제 발견 과정

 

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`

 

위 오류는 PrismaShadow 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 컨테이너가 정지 된 건 아닌지 한 번 더 확인해보자.

반응형