【Linux】 PostgreSQLでデータの保存場所を変更する方法

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
よかったらシェアしてね!
目次