제목 그대로 입니다.
최초 initdb 수행시 -U 옵션으로 넣었던 유저명을 알 수 없고, db에 접속할 다른 유저정보도 없는 상태에서 해당 dba계정이름을 알 수 있는 방법이 있을까요?
어떤 정보도 알 수 없는 상황이라면,
실행 중인 데이터베이스 프로세스 소유주의 OS 계정으로 일단 OS 접속 한 뒤,
데이터베이스 자료 파일이 있는 디렉터리를 일단 찾아야합니다.
lsof 명령이나, 프로세스 이름 뒤에 혹 그 경로가 보이기도 합니다.
아니면, 해당 프로세스의 실행환경 /prot/[pid]/environ 파일을 살펴봐서 PGDATA 환경 설정값으로 간주할 수도 있고,
어떻게든 일단 데이터베이스 자료 파일이 있는 디렉터리로 가면, 그 안에 global 이라는 디렉터리가 있고 그 안에 이진파일 형태로 데이터베이스 사용자 정보가 있는 파일이 있습니다. 파일 이름이 숫자로 되어 있어 일단 모두 뒤져봐야겠지요. 통상 strings 같은 OS 명령어로 살펴봅니다. 그 결과 가운데, 일단 사용자 이름 같아 보이는 이름들을 메모해 두고, (통상 비밀번호를 지정하기 때문에 비밀번호(md5문자열)와 함께 보이는 단어들이 사용자 이름입니다.
다음 pg_hba.conf 를 수정해서 local 접속을 모든 사용자의 모든 데이터베이스로 비밀번호 없이 접속할 수 있도록 한 뒤,
찍은 사용자 이름으로 접속을 시도해 봅니다. 데이터베이스는 template1
잘 접속 되면, 이 때부터는 pg_roles 뷰를 통해서 슈퍼유저를 찾으면 됩니다.
접속이 거부되면 잘 접속 되는 이름을 찾을 때까지. :(
(그 찾은 이름이 그룹 이름일 수도 있고, 테이블 스페이스 이름일 수도 있고, 데이터베이스 이름일 수도 있거든요.. 아무튼 잘 찍어야 합니다.)
global 디렉터리네 몇번 파일이다고 알려드리지 못하는게, 데이터베이스 버전마다 다르거든요.
통상 이 방법은 정말 저수준 방법입니다.
일반적으로 하나의 데이터베이스는 반드시 그 데이터베이스를 사용하는 응용프로그램이 있기 때문에, 프로세스를 보면 그 응용 프로그램이 사용하는 계정 이름이 보입니다. 그 이름으로 pg_hba.conf 를 위에서 설명한 대로 임시로 바꿔서 비밀번호 없이 접속하면, pg_roles 뷰를 접근할 수 있게 됩니다.