Compile PostgreSQL 9.3.4 from source under Ubuntu

PostgreSQL

The advantage of compiling PostgreSQL from source is that you can compile with certain flags/options which may be missing/disabled in stock-standard Ubuntu packages.

Caveats and disclaimers

I don't pretend to be an expert at Postgresql (Feel free to comment below).

  • Install the required tools
sudo apt-get update  
sudo apt-get install zlib1g-dev libreadline6-dev gcc make bison flex libssl-dev libpam0g-dev libxml2-dev libxslt-dev libperl-dev python-dev  
  • Download the source files and extract it
cd /usr/local/src  
wget http://ftp.postgresql.org/pub/source/v9.3.4/postgresql-9.3.4.tar.bz2  
tar -jxvf postgresql-9.3.4.tar.bz2  
cd postgresql-9.3.4  
  • Compile and install
./configure --with-pam --with-openssl --with-perl --with-python --with-libxml --with-libxslt
make -j y world  
sudo make install-world  

Replace y with the number of processor cores you would like to use. This step generally does not take long so if you wanted to omit -j and its argument all together that would also work.

  • Copy start up script
sudo cp contrib/start-scripts/linux /etc/init.d/postgresql  
  • Add user
sudo useradd postgres  
sudo mkdir /home/postgres  
sudo chown -R postgres:postgres /home/postgres  
  • Create data directories
sudo mkdir /var/lib/postgresql/  
sudo chown postgres:postgres /var/lib/postgresql/  
  • Create initial data
sudo su - postgres -c "/usr/local/pgsql/bin/initdb -D /var/lib/postgresql/"  
  • Create configuration directory
sudo mkdir /etc/postgresql/  
sudo chown postgres:postgres /etc/postgresql/  
  • Move configuration
sudo mv /var/lib/postgresql/postgresql.conf /var/lib/postgresql/pg_hba.conf /var/lib/postgresql/pg_ident.conf /etc/postgresql/  
  • Modify postgresql.conf and add or change the following:
sudo vi /etc/postgresql/postgresql.conf  
data_directory = '/var/lib/postgresql/'  
external_pid_file = '/var/run/postgresql.pid'  

These are the bare minimum changes. You will probably want to scan the file and change it to better suit your needs.

  • Modify the start up script and/or download the [startup script] change the following:
sudo vi /etc/init.d/postgresql  
PGDATA="/etc/postgresql/"  
PGLOG="/var/log/postgresql.log"  
  • Under ## EDIT FROM HERE add the following:
PGGROUP=postgres  
PGPID="/var/run/postgresql.pid"  
  • Above su - $PGUSER -c "$DAEMON -D '$PGDATA' &" >>$PGLOG 2>&1, under start) add the followng:
touch $PGPID  
chown $PGUSER:$PGGROUP $PGPID  
  • Under su - $PGUSER -c "$PGCTL stop -D '$PGDATA' -s -m fast", under stop) add the following:
rm $PGPID  
  • Change permission and make the start up script executable:
sudo chmod +x /etc/init.d/postgresql  
sudo update-rc.d postgresql defaults  
  • Start PostgreSQL service:
sudo service postgresql start  
  • Make PostgreSQL commands and libs available to all users:
sudo ln -s /usr/local/pgsql/bin/* /usr/local/bin/  
sudo ln -s /usr/local/pgsql/include/* /usr/local/include/  
sudo ln -s /usr/local/pgsql/lib/* /usr/local/lib/  
sudo ldconfig  
Complete /etc/init.d/postgresql

Copy the script below or go back to modify startup script manually: ?

#! /bin/sh
# chkconfig: 2345 98 02
# description: PostgreSQL RDBMS
# This is an example of a start/stop script for SysV-style init, such
# as is used on Linux systems.  You should edit some of the variables
# and maybe the 'echo' commands.
#
# Place this file at /etc/init.d/postgresql (or
# /etc/rc.d/init.d/postgresql) and make symlinks to
#   /etc/rc.d/rc0.d/K02postgresql
#   /etc/rc.d/rc1.d/K02postgresql
#   /etc/rc.d/rc2.d/K02postgresql
#   /etc/rc.d/rc3.d/S98postgresql
#   /etc/rc.d/rc4.d/S98postgresql
#   /etc/rc.d/rc5.d/S98postgresql
# Or, if you have chkconfig, simply:
# chkconfig --add postgresql
#
# Proper init scripts on Linux systems normally require setting lock
# and pid files under /var/run as well as reacting to network
# settings, so you should treat this with care.
# Original author:  Ryan Kirkpatrick <pgsql@rkirkpat.net>
# contrib/start-scripts/linux
## EDIT FROM HERE
PGGROUP=postgres  
PGPID="/var/run/postgresql.pid"  
# Installation prefix
prefix=/usr/local/pgsql  
# Data directory
#PGDATA="/usr/local/pgsql/data"
PGDATA="/etc/postgresql/"  
# Who to run the postmaster as, usually "postgres".  (NOT "root")
PGUSER=postgres  
# Where to keep a log file
#PGLOG="$PGDATA/serverlog"
PGLOG="/var/log/postgresql.log"  
# 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_SCORE_ADJ value
# to -1000 will disable OOM kill altogether.  If you enable this, you probably
# want to compile PostgreSQL with "-DLINUX_OOM_SCORE_ADJ=0", so that
# individual backends can still be killed by the OOM killer.
#OOM_SCORE_ADJ=-1000
# Older Linux kernels may not have /proc/self/oom_score_adj, but instead
# /proc/self/oom_adj, which works similarly except the disable value is -17.
# For such a system, enable this and compile with "-DLINUX_OOM_ADJ=0".
#OOM_ADJ=-17
## STOP EDITING HERE
# The path that is to be used for the script
PATH=/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_SCORE_ADJ" != x && echo "$OOM_SCORE_ADJ" > /proc/self/oom_score_adj
        test x"$OOM_ADJ" != x && echo "$OOM_ADJ" > /proc/self/oom_adj
        touch $PGPID
        chown $PGUSER:$PGGROUP $PGPID
        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"
        rm $PGPID
        echo "ok"
        ;;
  restart)
        echo -n "Restarting PostgreSQL: "
        su - $PGUSER -c "$PGCTL stop -D '$PGDATA' -s -m fast -w"
        test x"$OOM_SCORE_ADJ" != x && echo "$OOM_SCORE_ADJ" > /proc/self/oom_score_adj
        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  

Good Luck!

Hassan El-Masri

Network Consultant Engineer

comments powered by Disqus