dram.me

PostgreSQL多实例运行

补遗

  1. PostgreSQL在初始化的时候会生成一个默认数据库postgres(另外还有两个模板库template0template1,可以通过psql -l查看。详见文档),所以如果只是生成单数据库环境,初始化时可以省去createdb的过程。—— 2017-09-15

  2. 在Cygwin环境中运行PostgreSQL依赖于Cygserver提供的共享内存服务,如何配置详见文档(注意需要以管理员身份运行Terminal后执行相关命令)。—— 2017-09-15

  3. 利用环境变量PGDATA和PostgreSQL配置文件,可以简化下面的脚本,详见这里。—— 2017-10-09

  4. 为增加安全性,在调用pg_ctl init命令时,最好追加-o "--auth=password --pwprompt"参数以禁用本地用户未认证登录。—— 2017-11-17

虽然众多RDBMS设计之初就是向着多数据库多用户的方向发展的(SQLite是一个例外),但并不是说不能各用户独立实例使用。例如KDE就可以使用MySQL存储用户数据。

以下脚本是对在Debian中运行多实例PostgreSQL功能的简单封装,其他平台应该做小的调整也可使用。

#!/bin/sh

ROOT="$(dirname "$(readlink -f "$0")")"

DATABASE=foo

PG_BIN=/usr/lib/postgresql/9.6/bin/
PG_DATA="$ROOT/data"
PG_LOG="$PG_DATA/postgresql.log"
PG_OPTIONS="-c listen_addresses= -c unix_socket_directories='$PG_DATA'"

case $1 in
    init)
	$PG_BIN/pg_ctl init -D "$PG_DATA"
	$PG_BIN/pg_ctl start -D "$PG_DATA" -l "$PG_LOG" -o "$PG_OPTIONS"
	while [ ! -S "$PG_DATA/.s.PGSQL.5432" ]
	do
	    sleep 1
	done
	$PG_BIN/createdb -h "$PG_DATA" $DATABASE
	;;
    shell)
	$PG_BIN/psql -h "$PG_DATA" $DATABASE
	;;
    start)
	$PG_BIN/pg_ctl start -D "$PG_DATA" -l "$PG_LOG" -o "$PG_OPTIONS"
	;;
    stop)
	$PG_BIN/pg_ctl stop -D "$PG_DATA"
	;;
    *)
	echo "Unknown command"
	;;
esac