0. 이 글을 작성하는 이유
잘 사용하다가 어느 날 postgres가 DBeaver에서 접속이 안되기 시작하였다. 이걸 조치하는 건 구글링으로 해결했지만 발생 이유와 내용을 아주 조금 더 깊게 분석해 본 내용을 공유해 보기 위함
환경 :
mac os
brew install postgresql14
0-1. 조치 방법 먼저 공유
error : 아래 에러가 발생함.
Bootstrap failed: 5: Input/output error Try re-running the command as root for richer errors. Error: Failure while executing; `/bin/launchctl bootstrap gui/501 /Users/user/Library/LaunchAgents/homebrew.mxcl.postgresql@14.plist` exited with 5.
psql: error: connection to server on socket "/tmp/.s.PGSQL.5432" failed: No such file or directory Is the server running locally and accepting connections on that socket?
solve : 아래 파일을 제거하고 다시 실행
/opt/homebrew/var/postgresql@14/postmaster.pid
1. 일단 서비스가 맛이 갔으니 다시 시작해보려고 했다.
brew services start postgresql@14
아래 에러가 발생했다.
Bootstrap failed: 5: Input/output error Try re-running the command as root for richer errors. Error: Failure while executing; `/bin/launchctl bootstrap gui/501 /Users/user/Library/LaunchAgents/homebrew.mxcl.postgresql@14.plist` exited with 5.
도대체 무슨 일이 있던 걸까. 속는 셈 치고 바로 psql을 터미널에 입력해 보았다. 에러메시지가 조금 달라졌다.
psql: error: connection to server on socket "/tmp/.s.PGSQL.5432" failed: No such file or directory Is the server running locally and accepting connections on that socket?
brew로 설치한 postgresql14는 이 파일을 통해 설정을 제어한다.
homebrew.mxcl.postgresql@14.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>KeepAlive</key>
<true/>
<key>Label</key>
<string>homebrew.mxcl.postgresql@14</string>
<key>LimitLoadToSessionType</key>
<array>
<string>Aqua</string>
<string>Background</string>
<string>LoginWindow</string>
<string>StandardIO</string>
<string>System</string>
</array>
<key>ProgramArguments</key>
<array>
<string>/opt/homebrew/opt/postgresql@14/bin/postgres</string>
<string>-D</string>
<string>/opt/homebrew/var/postgresql@14</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>StandardErrorPath</key>
<string>/opt/homebrew/var/log/postgresql@14.log</string>
<key>StandardOutPath</key>
<string>/opt/homebrew/var/log/postgresql@14.log</string>
<key>WorkingDirectory</key>
<string>/opt/homebrew</string>
</dict>
</plist>
여기서 StandardErrorPath에 있는 경로로 에러를 확인해 보았다.
징그럽게도 log에서 에러를 뱉어댄다.
2. postgresql은 알겠는데 postmaster는 뭐고 postmaster.pid파일은 뭐길래 이런 일이 발생하는가
우선 postmaster가 뭔지 알아보자.
우리가 흔히 Postgresql을 켠다고 하는데 그 데이터베이스 서버는 postmaster라고 부른다고 한다.
client가 어플리케이션에 접근하려면 반드시 postmaster가 켜져있어야 한다고 한다. 이 Postmaster는 서버 프로세스들 간의 통신도 관리한다고 한다.
이런 게 있는 줄은 몰랐다. 그러면 postmaster.pid라는 건 도대체 어떤 걸까
postmaster가 실행될 때 PID가 postmaster.pid에 저장된다고 한다.
그러면 postmaster는 postmaster.pid에 있는 데이터를 기반으로 실행하는 것 같다. 파일을 열어보자.
뭔가 경로와 pid와 ip와 이것저것 실행을 위한 정보들이 담겨있다.
찾아보니 이런 정보들이 들어간다고 한다.
- the current postmaster process ID (PID)
- cluster data directory path
- postmaster start timestamp
- port number
- Unix domain socket directory path
- listen_address (IP address)
- shared memory segment id(key)
- postmaster status
출처 : postmaster.pid - pgPedia - a PostgreSQL Encyclopedia
이제 뭔가 이해가 되기 시작한다. 모종의 이유로 이 postmaster.pid에 있는 포트나 directory path가 꼬이면 그럴 수 있을 것 같다.
그러면 이걸 막 지워도 괜찮은가?
jakob은 postgresApp의 member로 안 쓰면 지워도 된다고 한다.
3. 다시 정리해 보면
정리해 보면 이 postmaster.pid를 보고 postmaster를 실행하게 되는데 모종의 이유로 postgresql을 재시작하면서 이 postmaster.pid가 갱신이 되지 않아서 발생한 에러로 분석된다.
'컴퓨터공학 > 데이터베이스' 카테고리의 다른 글
UUID에 바로 LIKE연산자를 사용하려고 했더니 안되었던 이유는? (1) | 2024.02.04 |
---|---|
postgresql9.6 성능 이야기 1장 - 아키텍처 개요를 보다가 (1) | 2024.01.27 |
PostgreSQL Materialized View 사용기 (1) | 2024.01.12 |
[PostgreSQL]Table Partitioning (1) | 2023.12.03 |
Real MySQL 8.0 읽으면서 정리하기 (1) - 시스템 설정 (0) | 2023.08.23 |