本节将讲解一些安装中的技巧,比如,如何把数据库的数据目录安装到非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
在数据仓库中使用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程序启动。
对于一些数据可靠性要求很高的场景,如一些金融领域,建议打开数据块的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功能的数据库需要比较长的时间,所以做这个操作要求有比较长的数据库停机时间。