PostgreSQL

【PostgreSQL】エラーと対処方法まとめ

記事内に商品プロモーションを含む場合があります

こんにちは、やすです。

この記事では、PostgreSQLを触っていて、つまづいた箇所をまとめておこうと思います。

PostgreSQLの起動ができない

エラー:Failed to start postgres.service: Unit not found.

事象

「Failed to start postgres.service: Unit not found.」というエラーが出て起動に失敗する。

原因

サービス名を間違えてた(笑)
「postgres」で指定してたけど正しくは「postgresql」。

[root@localhost opt]# systemctl start postgres
Failed to start postgres.service: Unit not found.
[root@localhost opt]#

対応

サービス名を正しく指定する。

[root@localhost ~]# systemctl start postgresql
[root@localhost ~]#

エラー:Job for postgresql.service failed because the control process exited with error code.

事象

「Job for postgresql.service failed because the control process exited with error code. See “systemctl status postgresql.service” and “journalctl -xe” for details.」というエラーが出て起動に失敗する。

[root@localhost ~]# systemctl start postgresql
Job for postgresql.service failed because the control process exited with error code. See "systemctl status postgresql.service" and "journalctl -xe" for details.
[root@localhost ~]#

原因

  1. 初期化をしていないから。
    (インストール直後にPostgreSQLを起動しようとした場合で、PostgreSQLのディレクトリはここだよって決めるinitdbコマンドの実行をまだしていない)
  2. 停止が正常終了せず、起動時に作成される「/tmp/.s.PGSQL.5432.lock」ファイルが残ってしまっているから。

対応

①初期化をしていない場合は、下記を参考に初期化しましょう。

②停止が正常終了していない場合(ステータスが「inactive(正常終了)」ではなく「failed(異常終了)」の場合)は、下記を実行しましょう。

(1)とりあえずエラーで言われた通りPostgreSQLサービスの状態を確認
[root@localhost ~]# systemctl status postgresql.service
● postgresql.service - PostgreSQL database server
   Loaded: loaded (/usr/lib/systemd/system/postgresql.service; disabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since 火 2024-01-09 07:44:44 JST; 1min 20s ago
  Process: 1492 ExecStart=/usr/bin/pg_ctl start -D ${PGDATA} -s -o -p ${PGPORT} -w -t 300 (code=exited, status=1/FAILURE)
  Process: 1486 ExecStartPre=/usr/bin/postgresql-check-db-dir ${PGDATA} (code=exited, status=0/SUCCESS)

 1月 09 07:44:43 localhost.localdomain systemd: Starting PostgreSQL database server...
 1月 09 07:44:43 localhost.localdomain pg_ctl[1492]: pg_ctl: 他のサーバが動作中の可能性がありますが、とにかくpostmasterの起動を試みます。
 1月 09 07:44:44 localhost.localdomain pg_ctl[1492]: FATAL:  could not remove old lock file "/tmp/.s.PGSQL.5432.lock": Permission denied
 1月 09 07:44:44 localhost.localdomain pg_ctl[1492]: HINT:  The file seems accidentally left over, but it could not be removed. Please r... again.
 1月 09 07:44:44 localhost.localdomain systemd: postgresql.service: control process exited, code=exited status=1
 1月 09 07:44:44 localhost.localdomain systemd: Failed to start PostgreSQL database server.
 1月 09 07:44:44 localhost.localdomain systemd: Unit postgresql.service entered failed state.
 1月 09 07:44:44 localhost.localdomain systemd: postgresql.service failed.
Hint: Some lines were ellipsized, use -l to show in full.
[root@localhost ~]#

(2)プロセス確認
(なんか動いているっぽいメッセージでて、ゴミプロセスが残っているのかもって思ったけど何も起動していないね)
[root@localhost ~]# ps aux | grep postgres
root      1497  0.0  0.0 112824   984 pts/0    S+   07:45   0:00 grep --color=auto postgres
[root@localhost ~]#

(3)「/tmp/.s.PGSQL.5432.lock」を削除
-bash-4.2$ ls -la /tmp/.s.PGSQL.5432.lock
-rw-------. 1 postgres postgres 46  1月  8 16:17 /tmp/.s.PGSQL.5432.lock
-bash-4.2$
-bash-4.2$ rm /tmp/.s.PGSQL.5432.lock
-bash-4.2$
-bash-4.2$ ls -la /tmp/.s.PGSQL.5432.lock
ls: /tmp/.s.PGSQL.5432.lock にアクセスできません: そのようなファイルやディレクトリはありません
-bash-4.2$

(4)起動すればまた作成されるから消しても大丈夫です。中身はよくわからない。
[root@localhost ~]# systemctl start postgresql
[root@localhost ~]#
[root@localhost ~]# systemctl status postgresql
● postgresql.service - PostgreSQL database server
   Loaded: loaded (/usr/lib/systemd/system/postgresql.service; disabled; vendor preset: disabled)
   Active: active (running) since 火 2024-01-09 13:42:20 JST; 2s ago
  Process: 1844 ExecStart=/usr/bin/pg_ctl start -D ${PGDATA} -s -o -p ${PGPORT} -w -t 300 (code=exited, status=0/SUCCESS)
  Process: 1838 ExecStartPre=/usr/bin/postgresql-check-db-dir ${PGDATA} (code=exited, status=0/SUCCESS)
 Main PID: 1847 (postgres)
   CGroup: /system.slice/postgresql.service
           tq1847 /usr/bin/postgres -D /var/lib/pgsql/data -p 5432
           tq1848 postgres: logger process
           tq1855 postgres: checkpointer process
           tq1856 postgres: writer process
           tq1857 postgres: wal writer process
           tq1858 postgres: autovacuum launcher process
           mq1859 postgres: stats collector process

 1月 09 13:42:13 localhost.localdomain systemd: Starting PostgreSQL database server...
 1月 09 13:42:14 localhost.localdomain pg_ctl[1844]: LOG:  could not bind Unix socket: Address already in use
 1月 09 13:42:14 localhost.localdomain pg_ctl[1844]: HINT:  Is another postmaster already running on port 5432? If not, remove socket fi... retry.
 1月 09 13:42:14 localhost.localdomain pg_ctl[1844]: WARNING:  could not create Unix-domain socket in directory "/tmp"
 1月 09 13:42:20 localhost.localdomain systemd: Started PostgreSQL database server.
Hint: Some lines were ellipsized, use -l to show in full.
[root@localhost ~]#
[root@localhost ~]# ls -l /tmp/.s.PGSQL.5432.lock
-rw-------. 1 postgres postgres 46  1月  9 13:42 /tmp/.s.PGSQL.5432.lock
[root@localhost ~]#
[root@localhost ~]# cat /tmp/.s.PGSQL.5432.lock
1847
/var/lib/pgsql/data
1704775334
5432
/tmp
[root@localhost ~]#

データベースが削除できない

エラー:ERROR: cannot drop the currently open database

事象

「drop database データベース名;」を実行してもデータベースの削除に失敗する。

原因

そのデータベースを使っているから。
削除しようとしているデータベースに繋げていない?

test1=# drop database test1;
ERROR:  cannot drop the currently open database
test1=#

対応

削除対象のデータベースから抜けて、別のデータベースに繋げてpostgreSQLのコマンドで削除するかOSのコマンドラインから削除する。

エラーコード

PostgreSQLのエラーコード一覧はこちら
バージョンによる際はほとんどないとのこと。

まとめ

この記事では、PostgreSQLを使っていて出会ったエラーと対応方法について紹介してみました。

ではまた、バイバーイ♪