58
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

PostgreSQL サーバの起動と停止方法まとめ




起動方法がいろいろありすぎて混乱したので、まとめました。大別すると以下の通りです。

  1. OS のデーモン管理コマンドから、起動する方法
    1. macOS の場合 ... brew services コマンド
    2. Ubuntu の場合 ... service コマンド
    3. Windows10 の場合 ... net コマンド
  2. PostgreSQL のコマンドから、起動する方法
    1. postgres コマンド
    2. pg_ctl コマンド




はじめに

〇 コマンドのまとめ

以下の通りです。

#
# 1. OS のデーモン管理コマンドから、起動する方法
#


# 1.1. macOS の場合
# 起動
brew services start postgresql

# 停止
brew services stop postgresql

# 再起動
# なし pg_ctl で再起動する。


# 1.2. Ubuntu の場合
# 起動
sudo service postgresql start

# 停止
sudo service postgresql stop

# 再起動
# なし pg_ctl で再起動する。


# 1.3. Windows の場合
#   お使いのパソコンの CPU、PostgreSQL のバージョンによって
#   末尾の -x64-12 は変わってきます。ここでは
#   パソコンの CPU が 64 bit で
#   PostgreSQL のバージョンが 12 の場合
# 起動
net start postgresql-x64-12

# 停止
net stop postgresql-x64-12

# 再起動
# なし pg_ctl で再起動する。
#
# 2.  PostgreSQL のコマンドから、起動する方法
#


# 2.1. postgres コマンド
# 起動
postgres -D 設定ファイルへのパス

# 停止
# なし pg_ctl で停止する。

# 再起動
# なし pg_ctl で再起動する。


# 2.2. pg_ctl コマンド
# 起動
pg_ctl -D 設定ファイルへのパス start

# 停止
pg_ctl -D 設定ファイルへのパス stop

# 再起動
pg_ctl -D 設定ファイルへのパス restart


〇 設定ファイルへのパス

「設定ファイルへのパス」の書式は、以下のような物です。

# 1) macOS の場合
postgres -D /usr/local/var/postgres

# 2) Ubuntu で PostgreSQL 10 の場合
#   PostgreSQL のバージョンによって、ファイルパスが変わります。
postgres -D /etc/postgresql/10/main

# 3) Windows10 で PostgreSQL 12 の場合
#   PostgreSQL のバージョンによって、ファイルパスが変わります。
#   クォーテーション ' またはダブルクーテーション " で囲む必要があります。
postgres -D "C:/Program Files/PostgreSQL/12/data"




1. デーモン管理コマンドから、起動する方法

  1. Windows10 の場合 ... net コマンド
  2. macOS の場合 ... brew services コマンド
  3. Ubuntu の場合 ... service コマンド

1.1. macOS の場合

sudo brew install postgresql でインストールしたものと仮定します。

sudo brew services コマンドから操作できます。

sudo brew services start postgresql
sudo brew services stop postgresql


1.2. Ubuntu の場合

sudo apt install postgresql でインストールしたものと仮定します。

service コマンドから操作できます。

sudo service postgresql start
sudo service postgresql stop

serviceコマンド - 日経クロステック
指定されたLinuxデーモン(サービス)の起動や停止,ステータスの確認を実行する。実際はシェル・スクリプトであり,/sbin/serviceをテキスト・エディタなどで開くとスクリプトの中身を確認できる。


/etc/init.d/postgres からも操作できます。下に掲載した記事によると実行している内容は service コマンドと同じで service コマンドを使った方が便利だそうです。

sudo /etc/init.d/networking start
sudo /etc/init.d/networking stop

/etc/init.d ディレクトリ - Linux豆知識 184
「/etc/init.d」は、デーモンなどの起動スクリプトが設置されているディレクトリです。

serviceコマンド - 日経クロステック
また,serviceコマンドの中では,/etc/init.d(/etc/rc.d/init.d)にあるサービス・スクリプトを実行しているだけである。そのため,/etc/init.d以下のスクリプトを直接実行してもserviceコマンドと同じ作業ができるが,全サービスのステータスを表示したりパスをいちいち入力する必要がないため,コマンドとして使ったほうが便利である


1.3. Windows の場合

公式サイトから専用のインストーラをダウンロードしてインストールしたものと仮定します。

net コマンドから操作できます。

net start postgresql-x64-12
net stop postgresql-x64-12
# 「管理者として実行」する必要があります。

GUI, Services.msc からも操作できます。サービス名がわからない場合、この GUI, Services.msc で確認して net コマンドを打つとよいかなと思います。

# x64-12 という文字はお使いの環境によって、異なります。
Type here to search > Services.msc > postgresql-x64-12 > 右クリック > プロパティ > General タブ > start をクリック
Type here to search > Services.msc > postgresql-x64-12 > 右クリック > プロパティ > General タブ > stop をクリック


〇 デーモンってなに?

上記では便宜上、デーモンを管理する brew services, service, net コマンドをまとめて「デーモン管理コマンド」と呼ぶことにしました。

デーモンは英語で書くと daemon になります。10 年くらい昔は、メールの宛先を間違えると This mail was sent from the mailer daemon. 的なメッセージを受け取っていました。この「メーラーだえもん」ってなんだろうって思いながら、メールを書いていました。

最初は 「OS のデーモン管理コマンドから、起動する方法」をオススメしたいです。 なぜなら、大抵の場合、OS が提供する「デーモン管理コマンドを経由してから、起動する方法」が、「PostgreSQL のコマンドから、起動する方法」よりも簡単に起動できるからです。これは以下2つの理由からです。詳細は後述します。

  1. PostgreSQL の設定ファイルが、どこに保存されているか分からないから。
  2. postgres コマンド, pg_ctl コマンドへのパスが通っていないから。




2. 直接 PostgreSQL から、起動する方法

以下の2種類が用意されています。

  1. postgres コマンド
  2. pg_ctl コマンド

〇 -D オプション

-D オプションには 設定ファイルへのパス を記述します。

postgres -D datadir
Specifies the file system location of the database configuration files. See Section 19.2 for details.

pg_ctl -D datadir
Specifies the file system location of the database configuration files. If this option is omitted, the environment variable PGDATA is used.

〇 設定ファイルへのパスの確認方法

以下の SQL コマンドで確認できます。

SHOW data_directory;

デーモン管理コマンドから起動していてかつ pg_read_all_settings という権限が付与されたユーザ(正確にはロールというらしいですが)で psql コマンドを使ってサーバに接続できる場合に使えます。使いどころは、あまりないかもしれませんが。

〇 postgres や pg_ctl が使えない場合

psql コマンドは使えるのに、そのほかの主だったコマンド、例えば postgres コマンドや pg_ctl コマンドが使えないことがあります。

postgres コマンドや pg_ctl コマンドが使えない原因として、パスが通っていない可能性があります。この症状の対策として、自分の環境では以下のようなパスを通しました。

# macOS の場合
/usr/local/opt/postgresql@10.12/bin

# Ubuntu の場合
/usr/lib/postgresql/10/bin/

# Windows10 の場合
C:\Program Files\PostgreSQL\12\bin

# PostgreSQL のバージョンごとにパスが変化することに
# 留意してください。

最初は、OS ごとにコマンドの体系が異なるのかなと、とんでもない勘違いしていました。

もし分からなければ、そのようなケースでは、最初は無理をせず、起動と停止は上記のデーモン管理コマンドから行えば良いのかなと思います。

〇 疑問

psql だけは、特別扱いして PostgreSQL がインストールされたときに使えるようにパスを通してくれるのに、なんで他のコマンドはインストールしたときに使えるようにパスを自動的に追加してくれないのでしょうか?

パスを通すと大量にコマンドを登録することになります。

$ ls /usr/lib/postgresql/10/bin/
clusterdb   dropuser           pg_basebackup   pg_dumpall      pg_resetwal  pg_test_fsync   pgbench     reindexdb
createdb    initdb             pg_controldata  pg_isready      pg_restore   pg_test_timing  postgres    vacuumdb
createuser  oid2name           pg_ctl          pg_receivewal   pg_rewind    pg_upgrade      postmaster  vacuumlo
dropdb      pg_archivecleanup  pg_dump         pg_recvlogical  pg_standby   pg_waldump      psql
$

不用意にパスを追加して、すでに導入されているコマンドと名前が被ってしまい、障害が発生するような事態を避けるために、自動でパスを全部追加するのは避けたということなのでしょうか。パスを追加する場合は自己責任で注意してやってくださいね、という思いがあるのでしょうか。Docker のようにコマンドを階層化してくれていたらよかったのですが。

〇 postgres と pg_ctl の違い

pg_ctl コマンドは postgres コマンドのラッパらしいです。

postgresプログラムには、この他にも多くのコマンドラインオプションを指定することができます。 詳細はpostgresマニュアルページと後述の第19章を参照してください。こうしたシェル構文は長くなりがちです。そのため、 pg_ctl ラッパ プログラムが提供されていて、いくつかのタスクを単純化しています。
18.3. データベースサーバの起動

大抵の場合は、ラッパの方が機能が制限されるような気がします。なぜならラッパは「複雑なものを簡単に使えるようにしておいたよ」という類(たぐい)のものなので、簡単にする分、機能は削ぎ落とされてしまうからです。

ただ、今回の「PostgreSQL サーバの起動と停止方法まとめ」という観点から見ると pg_ctl コマンドは、「起動」だけではなく「停止」も「再起動」もでき、postgres コマンドよりも機能が豊富です。postgres コマンドは「停止」や「再起動」の機能は、提供されていません。

ドキュメントによると pg_ctlpostgres コマンドのラッパとのことなので postgres コマンドも「停止」や「再起動」があるのかな、と思ったのですが、まだ見つけられないでいます。

また pg_ctlpostgres コマンドの関係、使い分けは、正直わかりません。現状とりあえず postgres コマンドには停止 stop がないので pg_ctl で統一しています。

〇 疑問

コマンドを使えないままにしていて大丈夫なのでしょうか?困ることがなければ、そのままにしておいても、大丈夫かなと思っています。稀にサンプルコードで、ユーザの作成削除、データベースの作成削除などのデータベースの簡単な操作を、上記のコマンドで書いた説明を見かけす。しかし、その程度であれば psql から操作を行えばよいかなと思います。

# これらのコマンドが使えなくても...
createdb
dropdb
createuser
dropdb

# psql でサーバにログインして操作できる。
CREATE DATABASE 
DROP DATABASE
CREATE USER 
DROP USER

なぜ、このように2種類のコマンドがあるかは createuser コマンドを題材にして teratail に書きました。




おわりに

以上になります。ありがとうございました。




Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
58
Help us understand the problem. What are the problem?