PostgreSQLなどのRDBサーバにおいて,データの保存場所を変更することは「ストレージの最適化」,「パフォーマンスの向上」,「セキュリティの向上」,「冗長性の確保」などさまざまなメリットが存在します.
この記事では,PostgreSQLのデータの保存場所を変更する方法について記載します.
Debian系とRHEL系で手順が異なりますので,それぞれ説明します.
データ保存場所の確認
現在のデータ保存場所の確認は下記コマンドです.
sudo -u postgres psql -c 'SHOW data_directory'
data_directory
---------------------
/var/lib/postgresql/13/main
(1 row)
コマンドを確認すると/var/lib/postgresql/13/main
がデータの保存場所となっています.
データの保存場所の変更(Debian系)
検証環境はMX Linuxですが,Debian系は同様の手順で設定可能です.
ここでは,デフォルトのデータ保存場所(/var/lib/postgresql/13/main
)から/path/to/data
というディレクトリに保存場所を変更する方法を示します.
1. PostgreSQLサービスの停止
まず,PostgreSQLサービスを停止します.
systemctl stop postgresql
2. 新しいディレクトリを作成
新しいデータの保存先を作成します.
mkdir /path/to/data
また,所有者と権限を変更します.
chown -R postgres:postgres /path/to/data
chmod -R 700 /path/to/data
3. データの移行
元々のディレクトリ(/var/lib/postgresql/13/main
)のデータを新しいディレクトリにコピーします.
rsync -av /var/lib/postgresql/13/main /path/to/data
また,古いデータは不要であれば削除します.
4. PostgreSQLの設定変更
設定ファイルにより,データ保存場所を変更します.
設定ファイルの場所は下記コマンドで確認できます.
sudo -u postgres psql -c 'SHOW config_file'
config_file
-----------------------------------------
/etc/postgresql/13/main/postgresql.conf
(1 row)
ここでは,設定ファイルが/etc/postgresql/13/main/postgresql.conf
にあることが確認できるので,設定ファイルを下記のように変更します.
- data_directory = '/var/lib/postgresql/13/main' # use data in another directory
+ data_directory = '/path/to/data-dir' # use data in another directory
# (change requires restart)
5. PostgreSQLサービスの起動
設定の変更が完了したら,サービスを再起動します.
systemctl start postgresql
サービス起動後にデータ保存場所を確認すると/path/to/data
となっていればデータ保存場所の変更が完了しています.
sudo -u postgres psql -c 'SHOW data_directory'
data_directory
---------------------
/path/to/data
(1 row)
データの保存場所の変更(RHEL系)
検証環境はRocky Linuxですが,CentOSなどRHEL系は同様の手順になります.
データ移行先を/path/to/data
と仮定し,手順を記載します.
1. バックアップの作成
まずは,現在のDBのバックアップを作成します.
pg_dumpall -U postgres -f backup.sql
2. PostgreSQLサービスの停止
まず,PostgreSQLサービスを停止します.
systemctl stop postgresql
3. データ移行先のディレクトリの作成
新しいデータの保存先を作成し,権限・所有者を設定します.
mkdir /path/to/data
chown -R postgres: /path/to/data
chmod -R 700 /path/to/data
4. 設定ファイルの変更
RHEL系では,systemdファイルでデータ保存場所を設定しています./usr/lib/systemd/system/postgresql.service
を下記のように変更します.
/usr/lib/systemd/system/postgresql.service
- Environment=PGDATA=/var/lib/pgsql/data
+ Environment=PGDATA=/data/pgsql/data
設定ファイルの変更を反映します.
systemctl daemon-reload
5. DBの再起動
設定が完了したら,DBを再設定します.
postgresql-setup --initdb
* Initializing database in '/path/to/data'
* Initialized, logs are in /var/lib/pgsql/initdb_postgresql.log
DBの再設定後にサービスを再起動します.
systemctl start postgresql.service
SELinuxの影響により下記のようなエラーが発生する場合があります.
systemctl start postgresql.service
Job for postgresql.service failed because the control process exited with error code.
See "systemctl status postgresql.service" and "journalctl -xeu postgresql.service" for details.
下記の手順で,SELinuxに新しいデータ保存場所を認識させる必要があります.
semanage fcontext -a -t postgresql_db_t "/path/to/data(/.*)?"
restorecon -Rv /path/to/data
その後サービスを再起動することで,正常に動作するはずです.
systemctl start postgresql.service
6. DBのリストア
最後に,下記のようにバックアップ済みのDBをリストアすることで,データの移行が完了します.
psql -f backup.sql -U postgres