DB
운영 DB에서 파일을 못 열 때
데이터베이스 파일 권한, 마운트 포인트, 디스크 할당량을 확인하는 방법입니다.
운영 데이터베이스가 갑자기 "permission denied" 에러를 던진다. 로컬에서는 잘 되는데, 왜 서버에서만 문제가 나는가.
먼저 데이터베이스 프로세스 확인
데이터베이스가 정말 실행 중인지, 어떤 사용자로 실행되고 있는지 확인한다.
ps aux | grep postgres
# 또는
ps aux | grep mysql
출력 예:
postgres 5432 0.5 2.0 12345 67890 ? Ss 10:00 0:05 /usr/lib/postgresql/13/bin/postgres ...
여기서 보이는 postgres 사용자가 데이터베이스 파일에 접근할 수 있어야 한다.
데이터 디렉토리의 권한 확인
PostgreSQL 데이터 디렉토리는 보통 /var/lib/postgresql/이다.
ls -ld /var/lib/postgresql/
# 또는 MySQL
ls -ld /var/lib/mysql/
출력:
drwx------ 19 postgres postgres 4096 Jun 30 10:00 /var/lib/postgresql/
중요한 것은:
- 소유자:
postgres또는mysql - 권한:
700(소유자만 읽기/쓰기/실행)
만약 권한이 다르다면:
sudo chown -R postgres:postgres /var/lib/postgresql/
sudo chmod 700 /var/lib/postgresql/
마운트 포인트 확인
데이터베이스 파일이 별도의 마운트 포인트에 있을 수 있다. 마운트 옵션이 문제일 수 있다.
df -h
mount | grep postgresql
만약 마운트 포인트가 noexec 또는 nosuid 옵션으로 마운트되어 있으면, 데이터베이스가 제대로 동작 안 할 수 있다.
# 다시 마운트 (읽기 전용이 아닌지 확인)
sudo mount -o remount,exec /var/lib/postgresql
디스크 할당량 (Quota) 확인
일부 서버는 사용자별 디스크 할당량을 제한한다. postgres 사용자의 할당량을 확인한다.
quota -u postgres
Output:
Disk quotas for user postgres (uid 109):
Filesystem blocks quota limit grace
/dev/sda1 5000 10000 10000 none
만약 할당량이 다 찼다면 (limit 도달), 데이터베이스는 새 데이터를 쓸 수 없다.
디스크 여유 공간 확인
전체 파티션의 여유 공간도 확인한다.
df -h /var/lib/postgresql/
90% 이상 사용 중이면 위험하다. 즉시 불필요한 파일을 정리하거나 디스크를 확장해야 한다.
SELinux 또는 AppArmor 확인
일부 리눅스 시스템은 보안 프레임워크가 파일 접근을 제한한다.
getenforce # SELinux 상태
aa-status # AppArmor 상태
SELinux가 enforcing 상태면, postgresql에 접근 권한이 없을 수 있다.
데이터베이스 로그 확인
데이터베이스 자체의 로그에서 더 자세한 에러를 볼 수 있다.
# PostgreSQL
sudo tail -50 /var/log/postgresql/postgresql-*.log
# MySQL
sudo tail -50 /var/log/mysql/error.log
어떤 파일에 접근할 수 없는지, 어떤 권한이 필요한지 명확하게 나타난다.
확인 순서
- 데이터베이스 프로세스가 실행 중인가:
ps aux - 데이터 디렉토리의 소유자와 권한:
ls -ld - 마운트 포인트의 옵션:
mount - 디스크 여유 공간:
df -h - 사용자 할당량:
quota -u postgres - 보안 프레임워크 활성화:
getenforce,aa-status - 데이터베이스 로그: error.log 또는 syslog
대부분의 "permission denied" 에러는 권한, 디스크 할당량, 마운트 옵션 중 하나이다. 순서대로 확인하면 원인을 찾을 수 있다.