PostgreSQL修炼之道:从小工到专家(第2版)
上QQ阅读APP看书,第一时间看更新

2.4.1 不想把数据库实例创建到“/var/lib/pgsql”目录下

使用yum安装的PostgreSQL数据库实例的数据目录是在“/var/lib/pgsql”目录下,创建的操作系统用户“postgres”默认的HOME目录也不在“/home”目录下,上述配置对于生产中使用的数据库来说不是很合适。如果想自己定制这些内容,我们可以手动创建数据库实例,而不使用“/usr/pgsql-12/bin/postgresql-12-setup initdb”方法来创建数据库实例。

首先把自动创建的postgres用户删除,命令如下:


userdel -r postgres

然后把用户postgres的HOME目录建在“/home”目录下:


groupadd -g 701 postgres
useradd -g 701 -u 701 -s /bin/bash -m postgres

接着配置postgres用户的.bashrc内容,命令如下:


export PATH=/usr/pgsql-12/bin:$PATH
export LD_LIBRARY_PATH=/usr/pgsql-12/lib:$LD_LIBRARY_PATH
export PGDATA=/home/postgres/pgdata
export PGHOST=/tmp

上面PGDATA环境变量指定的数据库是“/home/postgres/pgdata”,用户可以将其修改成实际的目录。

然后重新登录postgres用户,执行initdb命令以初始化数据库:


[root@pg01 ~]# su - postgres
Last login: Tue Feb 11 14:47:52 CST 2020 on pts/0
[postgres@pg01 ~]$ initdb
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.
...
...
...
  pg_ctl -D /home/postgres/pgdata -l logfile start

我们在/home/postgres/pgdata/postgresql.conf文件的最后增加以下命令行:


unix_socket_directories = '/tmp'

这是因为我们新建的操作系统用户postgres对“/var/run/postgresql”目录没有写权限,而官方发布的二进制版本的PostgreSQL软件的unix_socket_directories默认在目录“/var/run/postgresql”下。前面我们配置环境变量“export PGHOST=/tmp”也是出于这个原因。如果不进行修改,我们将无法启动数据库。

然后我们使用pg_ctl命令启动数据库:


[postgres@pg01 ~]$ pg_ctl start
waiting for server to start....2019-12-11 15:00:28.164 CST [1739] LOG:  starting PostgreSQL 12.1 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-39), 64-bit
2019-12-11 15:00:28.166 CST [1739] LOG:  listening on IPv6 address "::1", port 5432
2019-12-11 15:00:28.166 CST [1739] LOG:  listening on IPv4 address "127.0.0.1", port 5432
2019-12-11 15:00:28.173 CST [1739] LOG:  listening on Unix socket 
"/tmp/.s.PGSQL.5432"
2019-12-11 15:00:28.194 CST [1739] LOG:  redirecting log output to logging collector process
2019-12-11 15:00:28.194 CST [1739] HINT:  Future log output will appear in directory "log".
  done
server started

pg_ctl是一个管理PostgreSQL数据库的服务工具,可以用该工具启停数据库,如可用如下命令停止数据库:


pg_ctl stop