본문 바로가기
DBMS/PostgreSQL

[PostgreSQL] postgres 계정 로그인 불가 single 모드 복구 (FATAL: role "postgres" is not permitted to log in)

by 드바 2024. 4. 19.

DBMS: PostgreSQL 14.9

 

postgres계정처럼 superuser의 login 권한을 제거하였을 경우 접속이 불가한 경우 해결하는 방법입니다

싱글모드로 접속하여 postgres 계정에 grant 문을 통한 권한 부여로 복구합니다

 

[목차여기]

postgres 계정 권한 제거

superuser인 postgres 계정의 login 권한을 제거한 후 테스트 시 접속 실패합니다

-- postgres(super user)로그인 권한 제거
postgres=# alter user postgres nologin ;
ALTER ROLE
postgres=# \du
                                                       List of roles
  Role name  |                                Attributes                                |        	Member of         	
-------------+--------------------------------------------------------------------------+----------------------------------
 postgres    | Superuser, Create role, Create DB, Cannot login, Replication, Bypass RLS | {}
 sk          |                                                                          | {}
 
postgres=# exit
 
-- DB 접속 실패
[postgres@svr1 ~]$ psql
psql: error: connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: FATAL:  role "postgres" is not permitted to log in
[postgres@svr1 ~]$

 

single 모드 접속 후 권한부여

기존 postgres 엔진이 살아있을 경우 에러가 발생하니 종료 후 진행해 주세요

-- single 모드 접속(postgres 명령 주의)
-- 기존 postgres 엔진 살아있으면 에러발생
[postgres@svr1 pg_data]$ postgres --single
2024-01-26 18:41:33.711 KST [824491] FATAL:  lock file "postmaster.pid" already exists
2024-01-26 18:41:33.711 KST [824491] HINT:  Is another postmaster (PID 824441) running in data directory "/pg_data"?
 
-- DB STOP
[postgres@svr1 pg_data]$ pg_ctl stop
waiting for server to shut down.... done
server stopped
[postgres@svr1 pg_data]$ ps -ef | grep -i postgres
postgres  824534  816668  0 18:41 pts/0	00:00:00 grep --color=auto -i postgres

 

반응형

DB중지 후 single 모드 접속하여 postgres계정에 login 권한 부여 후 접속 테스트

싱글모드접속 명령: postgres --single

-- single 모드 접속
[postgres@svr1 pg_data]$ postgres --single
 
PostgreSQL stand-alone backend 14.9
backend> select * from pg_roles ;
	 1: rolname = "postgres"        (typeid = 19, len = 64, typmod = -1, byval = f)
	 2: rolsuper = "t"        (typeid = 16, len = 1, typmod = -1, byval = t)
	 3: rolinherit = "t"        (typeid = 16, len = 1, typmod = -1, byval = t)
	 4: rolcreaterole = "t"        (typeid = 16, len = 1, typmod = -1, byval = t)
	 5: rolcreatedb = "t"        (typeid = 16, len = 1, typmod = -1, byval = t)
	 6: rolcanlogin = "f"        (typeid = 16, len = 1, typmod = -1, byval = t)
	 7: rolreplication = "t"        (typeid = 16, len = 1, typmod = -1, byval = t)
	 8: rolconnlimit = "-1"        (typeid = 23, len = 4, typmod = -1, byval = t)
	 9: rolpassword = "********"        (typeid = 25, len = -1, typmod = -1, byval = f)
	11: rolbypassrls = "t"        (typeid = 16, len = 1, typmod = -1, byval = t)
	13: oid = "10"        (typeid = 26, len = 4, typmod = -1, byval = t)
	----
 
-- postgres 계정 로그인 권한 부여
backend> alter user postgres login ;
 
-- 종료시는 (Control+D)
backend> [postgres@svr1 pg_data]$
 
-- DB 기동
[postgres@svr1 pg_data]$ pg_ctl start
waiting for server to start....2024-01-26 18:43:46.434 KST [824916] LOG:  redirecting log output to logging collector process
2024-01-26 18:43:46.434 KST [824916] HINT:  Future log output will appear in directory "/pg_logs".
 done
server started
 
-- 접속 테스트
[postgres@svr1 pg_data]$ psql
psql (14.9)
Type "help" for help.
 
postgres=# select count(*) from pg_tables ;
 count
-------
	71
(1 row)
 
postgres=#

댓글