Я хочу изменить data_directory моего кластера базы данных postgresql. Я нашел 2 способа сделать это, ни один из них не работает для меня.
Из документации я делаю:
yum install postgresql-server
create new linux user "postgres"
sudo mkdir /home2
sudo mkdir /home2/data
sudo chown postgres:postgres /home2
sudo chown postgres:postgres /home2/data
Теперь проблема начинается в обоих случаях:
Вариант 1 :
✘ root@localhost /var/lib/pgsql/data # postgresql-setup initdb
Initializing database ... OK
✘ root@localhost /var/lib/pgsql/data # l
total 44K
drwx------. 15 postgres postgres 4.0K May 17 08:02 .
drwx------. 4 postgres postgres 72 May 16 15:17 ..
drwx------. 5 postgres postgres 41 May 17 08:02 base
drwx------. 2 postgres postgres 4.0K May 17 08:02 global
drwx------. 2 postgres postgres 18 May 17 08:02 pg_clog
-rw-------. 1 postgres postgres 4.2K May 17 08:02 pg_hba.conf
-rw-------. 1 postgres postgres 1.6K May 17 08:02 pg_ident.conf
drwx------. 2 postgres postgres 6 May 17 08:02 pg_log
drwx------. 4 postgres postgres 36 May 17 08:02 pg_multixact
drwx------. 2 postgres postgres 18 May 17 08:02 pg_notify
drwx------. 2 postgres postgres 6 May 17 08:02 pg_serial
drwx------. 2 postgres postgres 6 May 17 08:02 pg_snapshots
drwx------. 2 postgres postgres 6 May 17 08:02 pg_stat_tmp
drwx------. 2 postgres postgres 18 May 17 08:02 pg_subtrans
drwx------. 2 postgres postgres 6 May 17 08:02 pg_tblspc
drwx------. 2 postgres postgres 6 May 17 08:02 pg_twophase
-rw-------. 1 postgres postgres 4 May 17 08:02 PG_VERSION
drwx------. 3 postgres postgres 60 May 17 08:02 pg_xlog
-rw-------. 1 postgres postgres 20K May 17 08:02 postgresql.conf
root@localhost /var/lib/pgsql/data #
Запуск терминала от имени пользователя postgres:
-bash-4.2$ psql
psql (9.2.24)
Type "help" for help.
postgres=# SHOW data_directory;
data_directory
---------------------
/var/lib/pgsql/data
(1 row)
postgres=#
Я сделал systemctl stop psotgresql
, отредактировал postgresql.conf
и изменил data_directory = '/home2/data'
. Когда я systemctl start psotgresql
я получаю
FATAL: "/home2/data" is not a valid data directory
DETAIL: File "/home2/data/PG_VERSION" is missing.
так я и сделал
-bash-4.2$ initdb -D /home2/data
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.
The database cluster will be initialized with locale "en_US.utf-8".
The default database encoding has accordingly been set to "UTF8".
The default text search configuration will be set to "english".
fixing permissions on existing directory /home2/data ... ok
creating subdirectories ... ok
selecting default max_connections ... 100
selecting default shared_buffers ... 32MB
creating configuration files ... ok
creating template1 database in /home2/data/base/1 ... ok
initializing pg_authid ... ok
initializing dependencies ... ok
creating system views ... ok
loading system objects' descriptions ... ok
creating collations ... ok
creating conversions ... ok
creating dictionaries ... ok
setting privileges on built-in objects ... ok
creating information schema ... ok
loading PL/pgSQL server-side language ... ok
vacuuming database template1 ... ok
copying template1 to template0 ... ok
copying template1 to postgres ... ok
WARNING: enabling "trust" authentication for local connections
You can change this by editing pg_hba.conf or using the option -A, or
--auth-local and --auth-host, the next time you run initdb.
Success. You can now start the database server using:
postgres -D /home2/data
or
pg_ctl -D /home2/data -l logfile start
-bash-4.2$
как пользователь postgres. Когда я снова пытаюсь запустить сервер postgresql, используя systemctl start postgresql
, терминал не завершит работу
root@localhost /var/lib/pgsql/data # systemctl start postgresql
но сервер работает, я могу войти как postgres пользователь
-bash-4.2$ psql
psql (9.2.24)
Type "help" for help.
postgres=# SHOW data_directory;
data_directory
----------------
/home2/data
(1 row)
postgres=#
Что здесь не так? Почему служба «не подскажет»? Через некоторое время служба получает тайм-аут и возвращается. База данных больше не работает.
Задание для postgresql.service не выполнено из-за превышения времени ожидания. Подробности смотрите в разделах "systemctl status postgresql.service" и "journalctl -xe".
✘ root @ localhost / var / lib / pgsql / data #
Вариант 2 :
Новая свежая локальная виртуальная машина выполняла шаги сверху, пока не начались проблемы:
-bash-4.2$ initdb -D /home2/data
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.
The database cluster will be initialized with locale "en_US.utf-8".
The default database encoding has accordingly been set to "UTF8".
The default text search configuration will be set to "english".
fixing permissions on existing directory /home2/data ... ok
creating subdirectories ... ok
selecting default max_connections ... 100
selecting default shared_buffers ... 32MB
creating configuration files ... ok
creating template1 database in /home2/data/base/1 ... ok
initializing pg_authid ... ok
initializing dependencies ... ok
creating system views ... ok
loading system objects' descriptions ... ok
creating collations ... ok
creating conversions ... ok
creating dictionaries ... ok
setting privileges on built-in objects ... ok
creating information schema ... ok
loading PL/pgSQL server-side language ... ok
vacuuming database template1 ... ok
copying template1 to template0 ... ok
copying template1 to postgres ... ok
WARNING: enabling "trust" authentication for local connections
You can change this by editing pg_hba.conf or using the option -A, or
--auth-local and --auth-host, the next time you run initdb.
Success. You can now start the database server using:
postgres -D /home2/data
or
pg_ctl -D /home2/data -l logfile start
-bash-4.2$ ls -l /home2/data/
total 40
drwx------. 5 postgres postgres 41 May 17 08:20 base
drwx------. 2 postgres postgres 4096 May 17 08:20 global
drwx------. 2 postgres postgres 18 May 17 08:20 pg_clog
-rw-------. 1 postgres postgres 4476 May 17 08:20 pg_hba.conf
-rw-------. 1 postgres postgres 1636 May 17 08:20 pg_ident.conf
drwx------. 4 postgres postgres 36 May 17 08:20 pg_multixact
drwx------. 2 postgres postgres 18 May 17 08:20 pg_notify
drwx------. 2 postgres postgres 6 May 17 08:20 pg_serial
drwx------. 2 postgres postgres 6 May 17 08:20 pg_snapshots
drwx------. 2 postgres postgres 6 May 17 08:20 pg_stat_tmp
drwx------. 2 postgres postgres 18 May 17 08:20 pg_subtrans
drwx------. 2 postgres postgres 6 May 17 08:20 pg_tblspc
drwx------. 2 postgres postgres 6 May 17 08:20 pg_twophase
-rw-------. 1 postgres postgres 4 May 17 08:20 PG_VERSION
drwx------. 3 postgres postgres 60 May 17 08:20 pg_xlog
-rw-------. 1 postgres postgres 19865 May 17 08:20 postgresql.conf
-bash-4.2$
При попытке запустить сервис postgresql
✘ root@localhost /var/lib/pgsql/data # systemctl restart postgresql
Job for postgresql.service failed because the control process exited with error code. See "systemctl status postgresql.service" and "journalctl -xe" for details.
✘ root@localhost /var/lib/pgsql/data # journalctl -xe
...
May 17 08:20:58 localhost.localdomain postgresql-check-db-dir[15283]: "/var/lib/pgsql/data" is missing or empty.
May 17 08:20:58 localhost.localdomain postgresql-check-db-dir[15283]: Use "postgresql-setup initdb" to initialize the database cluster.
May 17 08:20:58 localhost.localdomain postgresql-check-db-dir[15283]: See /usr/share/doc/postgresql-9.2.24/README.rpm-dist for more information.
May 17 08:20:58 localhost.localdomain systemd[1]: postgresql.service: control process exited, code=exited status=1
May 17 08:20:58 localhost.localdomain systemd[1]: Failed to start PostgreSQL database server.
...
поэтому сервис postgresql не видит, что я уже сделал initdb. Когда я делаю postgresql-setup initdb
, он просто создает каталог данных в месте по умолчанию. Запуск postgresql от имени пользователя postgres postgres -D /home2/data
работает, но мне пришлось создать какой-то сервис из этой команды, чтобы мне не пришлось держать свой терминал открытым.
Среда: CentOS 7
Я делаю первую тест-установку в локальном бродячем боксе. При этом я пишу код в ansible. Поэтому обычно я не использую пользователя root;)