← 전체 글로 돌아가기

서버 운영

Prisma 마이그레이션 서버 DB 접근 문제 해결

프로덕션 서버에서 Prisma가 데이터베이스에 접근하지 못할 때 원인을 찾는 방법.

Prisma 마이그레이션을 서버에서 실행했을 때 DB 파일에 접근하지 못한다는 에러가 나면, 문제를 크게 잡으면 모든 파일이 의심스러워진다. 하지만 체계적으로 접근하면 원인을 좁힐 수 있다.

가장 먼저: 권한 확인

권한이 없으면 데이터베이스 파일을 쓰지 못한다:

ls -la /path/to/prisma/
ls -la /path/to/database.db

Prisma가 실행되는 사용자가 DB 파일과 디렉토리에 대한 쓰기 권한을 가지고 있는지 확인하자. 필요하면 권한을 수정해야 한다:

chown app-user:app-group /path/to/database.db
chmod 664 /path/to/database.db

시간대와 타임아웃

Prisma가 DB에 연결하는 과정에서 타임아웃이 일어날 수 있다. 특히 네트워크 지연이 있는 환경에서는 시간대 설정을 확인해야 한다:

date
sudo timedatectl status

시스템 시간이 크게 뒤떨어져 있으면 연결이 실패할 수 있다. 또한 Prisma의 연결 타임아웃을 명시적으로 설정해야 한다.

디스크 공간 확인

디스크가 가득 찼으면 데이터베이스 쓰기가 실패한다:

df -h

특히 SQLite를 쓰는 경우 데이터베이스 파일이 있는 디렉토리의 여유 공간을 확인해야 한다.

포트와 연결 상태

PostgreSQL이나 MySQL 같은 원격 데이터베이스를 쓴다면 포트가 열려있는지 확인하자:

sudo ss -lntp | grep -E ':5432|:3306'

만약 포트가 없다면 데이터베이스 서버가 실행되지 않았거나, 다른 포트에서 실행 중이다.

환경 변수 확인

DATABASE_URL이 정말로 올바른지 확인해야 한다:

echo $DATABASE_URL

PostgreSQL의 경우 postgresql://user:password@host:port/database 형식이어야 한다. 만약 환경 변수가 설정되지 않았다면 Prisma는 기본값(보통 SQLite)을 사용하려고 할 것이다.

마이그레이션 상태 확인

현재 어떤 마이그레이션이 적용되었는지 확인해보자:

npx prisma migrate status

이미 적용된 마이그레이션과 미적용 마이그레이션 사이에 충돌이 있을 수 있다. 특히 여러 사람이 동시에 마이그레이션을 적용하려고 할 때 문제가 나타난다.

실제 에러 로그 읽기

Prisma가 정확히 무엇 때문에 실패하는지 로그에서 확인하자:

sudo journalctl -n 80
cat /var/log/app.log | tail -50

에러 메시지가 "permission denied"라면 권한 문제고, "connection refused"라면 데이터베이스가 실행 중이지 않다는 뜻이다.

단계별 복구

  1. 권한을 먼저 수정한다.
  2. 디스크 공간을 확인하고 필요하면 정리한다.
  3. 데이터베이스 서버가 실행 중인지 확인한다.
  4. 환경 변수가 올바른지 재확인한다.
  5. 로컬에서 같은 설정으로 마이그레이션이 작동하는지 테스트한다.

한 번에 여러 가지를 바꾸지 말자. 한 가지씩 수정하고 테스트하면서 원인을 찾는 것이 훨씬 효율적이다.