在手動安裝(針對源碼編譯PG或者是解壓縮版安裝PG的情形)情況下,PG並不是在開機的情況下自動啟動,在關機的情況下自動停止,作為DBA人員來說,顯然這樣的情形是無法接受的。
1. windows下的服務自啟動
在Windows下, 可以使用pg_ctl命令產生PostgreSQL服務,並讓它自啟動。實際上,安裝版本也是這麼做的。 我們不妨看看pg_ctl命令的詳細協助先:
D:\pg921>pg_ctl --helppg_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 necessaryOptions 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 restartAllowed signal names for kill: ABRT HUP INT QUIT TERM USR1 USR2Options 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 serverStart types are: auto start service automatically during system startup (default) demand start service on demandReport bugs to <pgsql-bugs@postgresql.org>.
從上邊可以看出,pg_ctl register用於產生服務,而pg_ctl unregister -N <服務名>用於刪除一個服務。
如:
D:\pg921>pg_ctl register -N pg921 -D d:\pg921\data -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 pg921The pg921 service is starting.The pg921 service was started successfully.D:\pg921>psql -p 5433 iiheropsql (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 prefixprefix=/home/xionghe/pgsql# Data directoryPGDATA="/home/xionghe/pgsql/data"# Who to run the postmaster as, usually "postgres". (NOT "root")PGUSER=xionghe# Where to keep a log filePGLOG="$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 scriptPATH=/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 postmasterPGCTL="$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 0else exit 5fi}# Parse command line parameters.case $1 in start)echo -n "Starting PostgreSQL: "test x"$OOM_ADJ" != x && echo "$OOM_ADJ" > /proc/self/oom_adjsu - $PGUSER -c "$DAEMON -D '$PGDATA' &" >>$PGLOG 2>&1echo "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_adjsu - $PGUSER -c "$DAEMON -D '$PGDATA' &" >>$PGLOG 2>&1echo "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 helpecho "Usage: $0 {start|stop|restart|reload|status}" 1>&2exit 1;;esacexit 0
建立相應連結:
root@seanlinux2:/etc# ln -s /etc/init.d/postgresql /etc/rc0.d/K02postgresql
root@seanlinux2:/etc# ln -s /etc/init.d/postgresql /etc/rc1.d/K02postgresql
root@seanlinux2:/etc# ln -s /etc/init.d/postgresql /etc/rc2.d/K02postgresql
root@seanlinux2:/etc# ln -s /etc/init.d/postgresql /etc/rc3.d/K98postgresql
root@seanlinux2:/etc# ln -s /etc/init.d/postgresql /etc/rc4.d/K98postgresql
root@seanlinux2:/etc# ln -s /etc/init.d/postgresql /etc/rc5.d/K98postgresql