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