서버 운영
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"라면 데이터베이스가 실행 중이지 않다는 뜻이다.
단계별 복구
- 권한을 먼저 수정한다.
- 디스크 공간을 확인하고 필요하면 정리한다.
- 데이터베이스 서버가 실행 중인지 확인한다.
- 환경 변수가 올바른지 재확인한다.
- 로컬에서 같은 설정으로 마이그레이션이 작동하는지 테스트한다.
한 번에 여러 가지를 바꾸지 말자. 한 가지씩 수정하고 테스트하면서 원인을 찾는 것이 훨씬 효율적이다.