Postgresql

在 CentOS 上更改 postgres 的數據目錄

  • February 11, 2019

我在 CentOS 上安裝了 postgres 9.2.18,它使用標準安裝路徑。現在我意識到在這個特定的分區上,沒有足夠的硬碟空間來進行一些更大的查詢。

預設 data_directory 處於打開狀態:

/var/lib/pgsql/data


$ df -h /var/lib/pgsql
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   50G   39G   12G  77% /

所以,我想將數據目錄移動到我的主記憶體儲庫(它只是我自己的測試數據庫)

$ df -h /home/mlu
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-home  395G  171G  224G  44% /home

為此,我嘗試過:

1) Copying postgres data using rsync:    
sudo rsync -av /var/lib/pgsql /home/mlu/postgres-data

2) Addressing the new path within postgresql.conf:
sudo -u postgres nano /var/lib/pgsql/data/postgresql.conf
 data_directory = '/home/mlu/postgres-data/pgsql/'

3) starting postgres:
sudo systemctl start postgresql

由於 postgresql.conf 中的新 data_directory 路徑,現在無法啟動 postgres 服務。(如果我再次註釋掉目錄路徑,它會起作用)

編輯:好的,我發現這是權限衝突。但是 rsync 不應該也複製了正確的權限嗎?

sudo service postgresql.service status
Redirecting to /bin/systemctl status  postgresql.service.service
● postgresql.service - PostgreSQL database server
  Loaded: loaded (/usr/lib/systemd/system/postgresql.service; enabled; vendor preset: disabled)
  Active: failed (Result: exit-code) since Tue 2018-02-13 18:34:54 CET; 21s ago
 Process: 27416 ExecStop=/usr/bin/pg_ctl stop -D ${PGDATA} -s -m fast (code=exited, status=0/SUCCESS)
 Process: 27484 ExecStart=/usr/bin/pg_ctl start -D ${PGDATA} -s -o -p ${PGPORT} -w -t 300 (code=exited, status=1/FAILURE)
 Process: 27473 ExecStartPre=/usr/bin/postgresql-check-db-dir ${PGDATA} (code=exited, status=0/SUCCESS)
Main PID: 27290 (code=exited, status=0/SUCCESS)

Feb 13 18:34:53 axonlu-ws026.mappuls.int systemd[1]: Starting PostgreSQL database server...
Feb 13 18:34:53 axonlu-ws026.mappuls.int pg_ctl[27484]: FATAL:  could not read permissions of directory "/home/mlu/postgres-data/pgsql": Permission denied
Feb 13 18:34:54 axonlu-ws026.mappuls.int pg_ctl[27484]: pg_ctl: could not start server
Feb 13 18:34:54 axonlu-ws026.mappuls.int pg_ctl[27484]: Examine the log output.
Feb 13 18:34:54 axonlu-ws026.mappuls.int systemd[1]: postgresql.service: control process exited, code=exited status=1
Feb 13 18:34:54 axonlu-ws026.mappuls.int systemd[1]: Failed to start PostgreSQL database server.
Feb 13 18:34:54 axonlu-ws026.mappuls.int systemd[1]: Unit postgresql.service entered failed state.
Feb 13 18:34:54 axonlu-ws026.mappuls.int systemd[1]: postgresql.service failed.

不知道為什麼我仍然被拒絕,因為 postgres 作為文件夾的所有者應該擁有所有必要的權利:

$ ls -l
total 4
drwxrwxrwx. 6 postgres postgres 4096 Aug  3  2017 pgsq

SELinux 阻止訪問?檢查您的 /var/log/audit/audit.log。

可能需要為新目錄修復 SELinux 上下文:

semanage fcontext --add --equal /var/lib/pgsql /home/mlu/postgres-data/pgsql
restorecon -rv /home/mlu/postgres-data/pgsql/

不知道為什麼我仍然被拒絕,因為 postgres 作為文件夾的所有者應該擁有所有必要的權利:

sudo rsync -av不保留權限。您需要為此使用-p,或者,

  1. 創建文件夾並將所有者設置為postgres
  2. 切換到postgres使用者
  3. 複製文件。

引用自:https://dba.stackexchange.com/questions/197809