加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

循序渐进PostgreSQL: 实现PostgreSQL自启动

发布时间:2020-12-13 17:40:35 所属栏目:百科 来源:网络整理
导读:在手动安装(针对源码编译PG或者是解压缩版安装PG的情形)情况下,PG并不是在开机的情况下自动启动,在关机的情况下自动停止,作为DBA人员来说,显然这样的情形是无法接受的。 1. windows下的服务自启动 在Windows下, 可以使用pg_ctl命令生成PostgreSQL服务

在手动安装(针对源码编译PG或者是解压缩版安装PG的情形)情况下,PG并不是在开机的情况下自动启动,在关机的情况下自动停止,作为DBA人员来说,显然这样的情形是无法接受的。


1. windows下的服务自启动


在Windows下, 可以使用pg_ctl命令生成PostgreSQL服务,并让它自启动。实际上,安装版本也是这么做的。 我们不妨看看pg_ctl命令的详细帮助先:

D:pg921>pg_ctl --help
pg_ctl is a utility to initialize,start,stop,or control a PostgreSQL server.

Usage:
  pg_ctl init[db]               [-D DATADIR] [-s] [-o "OPTIONS"]
  pg_ctl start   [-w] [-t SECS] [-D DATADIR] [-s] [-l FILENAME] [-o "OPTIONS"]
  pg_ctl stop    [-W] [-t SECS] [-D DATADIR] [-s] [-m SHUTDOWN-MODE]
  pg_ctl restart [-w] [-t SECS] [-D DATADIR] [-s] [-m SHUTDOWN-MODE]
                 [-o "OPTIONS"]
  pg_ctl reload  [-D DATADIR] [-s]
  pg_ctl status  [-D DATADIR]
  pg_ctl promote [-D DATADIR] [-s]
  pg_ctl kill    SIGNALNAME PID
  pg_ctl register   [-N SERVICENAME] [-U USERNAME] [-P PASSWORD] [-D DATADIR]
                    [-S START-TYPE] [-w] [-t SECS] [-o "OPTIONS"]
  pg_ctl unregister [-N SERVICENAME]

Common options:
  -D,--pgdata=DATADIR   location of the database storage area
  -s,--silent           only print errors,no informational messages
  -t,--timeout=SECS     seconds to wait when using -w option
  -V,--version          output version information,then exit
  -w                     wait until operation completes
  -W                     do not wait until operation completes
  -?,--help             show this help,then exit
(The default is to wait for shutdown,but not for start or restart.)

If the -D option is omitted,the environment variable PGDATA is used.

Options for start or restart:
  -c,--core-files       not applicable on this platform
  -l,--log=FILENAME     write (or append) server log to FILENAME
  -o OPTIONS             command line options to pass to postgres
                         (PostgreSQL server executable) or initdb
  -p PATH-TO-POSTGRES    normally not necessary

Options for stop or restart:
  -m,--mode=MODE        MODE can be "smart","fast",or "immediate"

Shutdown modes are:
  smart       quit after all clients have disconnected
  fast        quit directly,with proper shutdown
  immediate   quit without complete shutdown; will lead to recovery on restart

Allowed signal names for kill:
  ABRT HUP INT QUIT TERM USR1 USR2

Options for register and unregister:
  -N SERVICENAME  service name with which to register PostgreSQL server
  -P PASSWORD     password of account to register PostgreSQL server
  -U USERNAME     user name of account to register PostgreSQL server
  -S START-TYPE   service start type to register PostgreSQL server

Start types are:
  auto       start service automatically during system startup (default)
  demand     start service on demand

Report bugs to <pgsql-bugs@postgresql.org>.
从上边可以看出,pg_ctl register用于生成服务,而pg_ctl unregister -N <服务名>用于删除一个服务。

如:

D:pg921>pg_ctl register -N pg921 -D d:pg921data -S auto -w -t 10 -l d:/pg921/log/pg921.log -o "-p 5433"

此命令,即是要生成一个服务:pg921,启动方式: -S auto,自启动,如果想生成手动启动,就用-S demand来指定。

-t 10,意指等待10秒钟,实际上可以设定的长一些(在生产环境中).

-l d:/pg921/log/pg921.log, 指定生成的日志文件的位置。

-o "-p 5433",将服务端口号改为5433。

验证一下上述命令生成的效果:

D:pg921>net start pg921
The pg921 service is starting.
The pg921 service was started successfully.


D:pg921>psql -p 5433 iihero
psql (9.2.1)
Type "help" for help.

iihero=# q


2. Linux下的服务自启动


在Linux下,我们需要写一个自启动的脚本,至少支持两个命令选项: start 和 stop,并将这个脚本建立适当的链接。我们就以Ubuntu10为例,

先看看系统有没有chkconfig命令工具:

xionghe@seanlinux2:~$ chkconfig
程序“chkconfig”尚未安装。 您可以使用以下命令安装:
sudo apt-get install chkconfig
xionghe@seanlinux2:~$ sudo apt-get install chkconfig

脚本内容如下: 放入目录/etc/init.d目录下边

#! /bin/sh

# Installation prefix
prefix=/home/xionghe/pgsql

# Data directory
PGDATA="/home/xionghe/pgsql/data"

# Who to run the postmaster as,usually "postgres".  (NOT "root")
PGUSER=xionghe

# Where to keep a log file
PGLOG="$PGDATA/serverlog"

# It's often a good idea to protect the postmaster from being killed by the
# OOM killer (which will tend to preferentially kill the postmaster because
# of the way it accounts for shared memory).  Setting the OOM_ADJ value to
# -17 will disable OOM kill altogether.  If you enable this,you probably want
# to compile PostgreSQL with "-DLINUX_OOM_ADJ=0",so that individual backends
# can still be killed by the OOM killer.
#OOM_ADJ=-17

## STOP EDITING HERE

# The path that is to be used for the script
PATH=/home/xionghe/pgsql/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# What to use to start up the postmaster.  (If you want the script to wait
# until the server has started,you could use "pg_ctl start -w" here.
# But without -w,pg_ctl adds no value.)
DAEMON="$prefix/bin/postmaster"

# What to use to shut down the postmaster
PGCTL="$prefix/bin/pg_ctl"

set -e

# Only start if we can find the postmaster.
test -x $DAEMON ||
{
	echo "$DAEMON not found"
	if [ "$1" = "stop" ]
	then exit 0
	else exit 5
	fi
}


# Parse command line parameters.
case $1 in
  start)
	echo -n "Starting PostgreSQL: "
	test x"$OOM_ADJ" != x && echo "$OOM_ADJ" > /proc/self/oom_adj
	su - $PGUSER -c "$DAEMON -D '$PGDATA' &" >>$PGLOG 2>&1
	echo "ok"
	;;
  stop)
	echo -n "Stopping PostgreSQL: "
	su - $PGUSER -c "$PGCTL stop -D '$PGDATA' -s -m fast"
	echo "ok"
	;;
  restart)
	echo -n "Restarting PostgreSQL: "
	su - $PGUSER -c "$PGCTL stop -D '$PGDATA' -s -m fast -w"
	test x"$OOM_ADJ" != x && echo "$OOM_ADJ" > /proc/self/oom_adj
	su - $PGUSER -c "$DAEMON -D '$PGDATA' &" >>$PGLOG 2>&1
	echo "ok"
	;;
  reload)
        echo -n "Reload PostgreSQL: "
        su - $PGUSER -c "$PGCTL reload -D '$PGDATA' -s"
        echo "ok"
        ;;
  status)
	su - $PGUSER -c "$PGCTL status -D '$PGDATA'"
	;;
  *)
	# Print help
	echo "Usage: $0 {start|stop|restart|reload|status}" 1>&2
	exit 1
	;;
esac

exit 0

建立相应链接:

root@seanlinux2:/etc# ln -s /etc/init.d/postgresql /etc/rc0.d/K02postgresqlroot@seanlinux2:/etc# ln -s /etc/init.d/postgresql /etc/rc1.d/K02postgresqlroot@seanlinux2:/etc# ln -s /etc/init.d/postgresql /etc/rc2.d/K02postgresqlroot@seanlinux2:/etc# ln -s /etc/init.d/postgresql /etc/rc3.d/K98postgresqlroot@seanlinux2:/etc# ln -s /etc/init.d/postgresql /etc/rc4.d/K98postgresqlroot@seanlinux2:/etc# ln -s /etc/init.d/postgresql /etc/rc5.d/K98postgresql

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读