Compile PostgreSQL 9.3.4 from source under Ubuntu


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  
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/'  

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  
  • Under ## EDIT FROM HERE add the following:
  • Above su - $PGUSER -c "$DAEMON -D '$PGDATA' &" >>$PGLOG 2>&1, under start) add the followng:
touch $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 <>
# contrib/start-scripts/linux
# Installation prefix
# Data directory
# Who to run the postmaster as, usually "postgres".  (NOT "root")
# Where to keep a log file
# 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.
# 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".
# The path that is to be used for the script
# 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.)
# What to use to shut down the postmaster
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
# Parse command line parameters.
case $1 in  
        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"
        echo -n "Stopping PostgreSQL: "
        su - $PGUSER -c "$PGCTL stop -D '$PGDATA' -s -m fast"
        rm $PGPID
        echo "ok"
        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"
        echo -n "Reload PostgreSQL: "
        su - $PGUSER -c "$PGCTL reload -D '$PGDATA' -s"
        echo "ok"
        su - $PGUSER -c "$PGCTL status -D '$PGDATA'"
        # Print help
        echo "Usage: $0 {start|stop|restart|reload|status}" 1>&2
        exit 1

exit 0  

Good Luck!

Hassan El-Masri

Network Consultant Engineer

comments powered by Disqus