RaspbianにPostgreSQLをインストールし、データディレクトリの保存先を変更する

RaspbianにPostgreSQLをインストールして、データディレクトリの保存先を外付けHDDに変更します。

最初は、MariaDBを使おうと思っていたのですが、どうしてもデータディレクトリの保存先を外付けHDDに変更できなかったので、断念しました。色々なサイトを見て設定方法を調べましたが、apparmor周りの設定がとても難しくて、書いてある通りに設定しても起動せず、最終的にapparmorを停止してもMariaDBを起動できなかったので、諦めました。

PostgreSQLでは、結構簡単にデータディレクトリの保存先を外付けHDDに変更できました。データベースに関しては全く知識がなく、どちらにしても1から勉強しないといけないので、PostgreSQLで構築していくことにします。

事前準備

事前に、/USBHDDディレクトリを作成し、外付けHDD(ext4形式でフォーマット済み)をマウントしています。

最終的なファイルの階層は以下のようになる予定です。

/USBHDD
└── postgresql
    └── 11
        └── main 

/USBHDD以外に、データディレクトリの保存先を変更する場合は、/USBHDDの部分を読み替えてください。

PostgreSQLをインストール

sudo apt install postgresql

インストールされるパッケージ

dattesar@raspberry:~ $ sudo apt install postgresql
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
以下の追加パッケージがインストールされます:
  libpq5 postgresql-11 postgresql-client-11 postgresql-client-common postgresql-common sysstat
提案パッケージ:
  postgresql-doc postgresql-doc-11 libjson-perl isag
以下のパッケージが新たにインストールされます:
  libpq5 postgresql postgresql-11 postgresql-client-11 postgresql-client-common postgresql-common sysstat
アップグレード: 0 個、新規インストール: 7 個、削除: 0 個、保留: 1 個。
16.8 MB のアーカイブを取得する必要があります。
この操作後に追加で 56.6 MB のディスク容量が消費されます。
続行しますか? [Y/n] 

現在のデータディレクトリを確認

sudo -u postgres psql
show data_directory;
dattesar@raspberry:~ $ sudo -u postgres psql
psql (11.11 (Debian 11.11-0+deb10u1))
"help" でヘルプを表示します。

postgres=# show data_directory;
       data_directory        
-----------------------------
 /var/lib/postgresql/11/main
(1 行)

postgres=# \q

現在のデータディレクトリは、/var/lib/postgresql/11/mainであることがわかりました。

PostgreSQLを停止

データディレクトリを変更する前に、PostgreSQLを停止します。

sudo systemctl stop postgresql

停止できたかステータスを確認。

sudo systemctl status postgresql
dattesar@raspberry:~ $ sudo systemctl stop postgresql
dattesar@raspberry:~ $ sudo systemctl status postgresql
● postgresql.service - PostgreSQL RDBMS
   Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled)
   Active: inactive (dead) since Thu 2021-04-22 14:24:07 JST; 13s ago
 Main PID: 4384 (code=exited, status=0/SUCCESS)

 4月 22 14:16:32 raspberry systemd[1]: Starting PostgreSQL RDBMS...
 4月 22 14:16:32 raspberry systemd[1]: Started PostgreSQL RDBMS.
 4月 22 14:24:07 raspberry systemd[1]: postgresql.service: Succeeded.
 4月 22 14:24:07 raspberry systemd[1]: Stopped PostgreSQL RDBMS.

データディレクトリをコピー

sudo rsync -av /var/lib/postgresql /USBHDD

rsyncの使い方

rsync [オプション] コピー元 コピー先
-aアーカイブモード。元のオーナー・グループ・パーミッション・タイムスタンプを保持したままコピーする。
-rlptgoD と同義。(–recursive –links –perms –times –group –owner –devices)
-vコピーするファイル名を標準出力する

データディレクトリを名称変更

コピーが完了したら、現在のデータディレクトリをmain.bakに変更します。

保存先の変更が完了し動作確認するまでは保持しておきます。

sudo mv /var/lib/postgresql/11/main /var/lib/postgresql/11/main.bak

新しい保存先を設定

sudo nano /etc/postgresql/11/main/postgresql.conf

41行目にある、 data_directory = ‘/var/lib/postgresql/11/main’ をコメントアウトして、新しい保存先を追記します。

# data_directory = '/var/lib/postgresql/11/main'
data_directory = '/USBHDD/postgresql/11/main'
# -----------------------------
# PostgreSQL configuration file
# -----------------------------
#
# This file consists of lines of the form:
#
#   name = value
#
# (The "=" is optional.)  Whitespace may be used.  Comments are introduced with
# "#" anywhere on a line.  The complete list of parameter names and allowed
# values can be found in the PostgreSQL documentation.
#
# The commented-out settings shown in this file represent the default values.
# Re-commenting a setting is NOT sufficient to revert it to the default value;
# you need to reload the server.
#
# This file is read on server startup and when the server receives a SIGHUP
# signal.  If you edit the file on a running system, you have to SIGHUP the
# server for the changes to take effect, run "pg_ctl reload", or execute
# "SELECT pg_reload_conf()".  Some parameters, which are marked below,
# require a server shutdown and restart to take effect.
#
# Any parameter can also be given as a command-line option to the server, e.g.,
# "postgres -c log_connections=on".  Some parameters can be changed at run time
# with the "SET" SQL command.
#
# Memory units:  kB = kilobytes        Time units:  ms  = milliseconds
#                MB = megabytes                     s   = seconds
#                GB = gigabytes                     min = minutes
#                TB = terabytes                     h   = hours
#                                                   d   = days


#------------------------------------------------------------------------------
# FILE LOCATIONS
#------------------------------------------------------------------------------

# The default values of these variables are driven from the -D command-line
# option or PGDATA environment variable, represented here as ConfigDir.

data_directory = '/var/lib/postgresql/11/main'          # use data in another directory
                                        # (change requires restart)
hba_file = '/etc/postgresql/11/main/pg_hba.conf'        # host-based authentication file
                                        # (change requires restart)
ident_file = '/etc/postgresql/11/main/pg_ident.conf'    # ident configuration file
                                        # (change requires restart)

# If external_pid_file is not explicitly set, no extra PID file is written.
external_pid_file = '/var/run/postgresql/11-main.pid'                   # write an extra PID file
                                        # (change requires restart)

(以下略)

PostgreSQLを起動

sudo systemctl start postgresql

起動できたか、ステータスを確認。

sudo systemctl status postgresql
dattesar@raspberry:~ $ sudo systemctl status postgresql
● postgresql.service - PostgreSQL RDBMS
   Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled)
   Active: active (exited) since Thu 2021-04-22 16:12:47 JST; 14min ago
  Process: 7292 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
 Main PID: 7292 (code=exited, status=0/SUCCESS)

 4月 22 16:12:47 raspberry systemd[1]: Starting PostgreSQL RDBMS...
 4月 22 16:12:47 raspberry systemd[1]: Started PostgreSQL RDBMS.

データディレクトリの変更を確認

sudo -u postgres psql
show data_directory;
dattesar@raspberry:~ $ sudo -u postgres psql
psql (11.11 (Debian 11.11-0+deb10u1))
"help" でヘルプを表示します。

postgres=# show data_directory;
       data_directory       
----------------------------
 /USBHDD/postgresql/11/main
(1 行)

postgres=# \q

バックアップを削除

データディレクトリの保存先を変更しても、問題なく動作して、バックアップファイルが必要ない場合は、削除してもかまいません。

sudo rm -r /var/lib/postgresql/11/main.bak

接続できない場合

  • postgresql.confファイル内でのタイプミス
  • 新しい保存先ディレクトリのパーミッション
  • 新しい保存先ディレクトリのオーナー

このどれかが問題の場合が多いです。私の場合は、postgresql.confでタイプミスをしていました。

例:パーミッション変更する場合

sudo chmod 700 /USBHDD

例:オーナーを変更する場合

sudo chown postgres:postgres /USBHDD