购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.4 PostgreSQL的安装技巧

本节将讲解一些安装中的技巧,比如,如何把数据库的数据目录安装到非var/lib/pgsql目录下,如何改变数据库的数据块大小等。

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

2.4.2 如何使用较大的数据块提高I/O性能

在数据仓库中使用PostgreSQL时,如果希望使用较大的数据块以提高I/O性能怎么办?对于这类问题,只能使用从源码安装的方法,在执行“./configure”命令时指定较大的数据块,一般也需要指定较大的WAL日志块和WAL日志文件大小,如指定32KB的数据块、32KB的WAL日志块、64MB的WAL日志文件的configure命令如下:


./configure --prefix=/usr/local/pgsql9.2.4 --with-perl --with-python 
--with-blocksize=32 --with-wal-blocksize=32 --with-wal-segsize=64

对于此时编译出来的PostgreSQL程序创建的PostgreSQL数据库,不能使用其他块大小的PostgreSQL程序启动。

2.4.3 打开数据块的checksum功能

对于一些数据可靠性要求很高的场景,如一些金融领域,建议打开数据块的checksum校验功能。而在PostgreSQL12版本之前,需要在用initdb命令创建数据库时就把这个功能加上:


initdb -k

initdb命令中增加了“-k”参数,所创建的数据库的数据块就有了checksum功能。在PostgreSQL12版本之后提供了工具pg_checksums,可以把一个没有checksum功能的数据库转换为具有该功能的数据库。运行这个工具需要先把数据库停掉,否则会报如下错误:


pg_checksums: error: cluster must be shut down

用“pg_checksums -c”检查当前数据库是否打开了checksum功能:


[postgres@pg01 ~]$ pg_checksums -c
pg_checksums: error: data checksums are not enabled in cluster

上面的提示是指没有打开checksum功能,则用下面的命令把数据库转换成具有checksum功能的数据库:


[postgres@pg01 ~]$  pg_checksums -e -P
1223/1223 MB (100%) computed
Checksum operation completed
Files scanned:  1325
Blocks scanned: 156566
pg_checksums: syncing data directory
pg_checksums: updating control file
Checksums enabled in cluster

在上面的命令中,“-P”参数是为了显示进度。

如果数据库比较大,使用pg_checksums把数据库转换成具有checksum功能的数据库需要比较长的时间,所以做这个操作要求有比较长的数据库停机时间。 ZauLoQSVRwMWkr67rWz7NpMokZ1f+AHSMNKxcZCBWCkUYzB/nt8A7RDDYg+dHjeC

点击中间区域
呼出菜单
上一章
目录
下一章
×