Install PostGreSQL

by Vinod Kurup

OpenACS docs are written by the named authors, and may be edited by OpenACS documentation staff.

Skip this section if you will run only Oracle.

OpenACS 5.0.0b1 will run with PostGreSQL 7.2.x, 7.3.2, 7.3.3, and 7.3.4. 7.3.4 is the recommended version of PostgreSQL.

  1. Unpack PostGreSQL. If you have not downloaded the postgresql tarball to /tmp/postgresql-7.3.4.tar.gz, get it.

    [root@yourserver root]# cd /usr/local/src
    [root@yourserver src]# tar xzf /tmp/postgresql-7.3.4.tar.gz
    [root@yourserver src]# 
    
    cd /usr/local/src
    tar xzf /tmp/postgresql-7.3.4.tar.gz
  2. Create the Postgres user.  Create a user and group (if you haven't done so before) for PostgreSQL. This is the account that PostgreSQL will run as since it will not run as root. Since nobody will log in directly as that user, we'll leave the password blank.

    [root@yourserver src]# groupadd web
    [root@yourserver src]# useradd -g web -d /usr/local/pgsql postgres
    [root@yourserver src]# mkdir -p /usr/local/pgsql
    [root@yourserver src]# chown -R postgres.web /usr/local/pgsql /usr/local/src/postgresql-7.3.4
    [root@yourserver src]# chmod 750 /usr/local/pgsql
    [root@yourserver src]#
    
    groupadd web
    useradd -g web -d /usr/local/pgsql postgres
    mkdir -p /usr/local/pgsql
    chown -R postgres.web /usr/local/pgsql /usr/local/src/postgresql-7.3.4
    chmod 750 /usr/local/pgsql
  3. Set up postgres's environment variables. They are necessary for the executable to find its supporting libraries. For convenience, we'll simply append the necessary lines to the postgres shell config file.

    [root@yourserver src]# echo "export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/pgsql/lib" >> ~postgres/.bashrc
    [root@yourserver src]# echo "export PATH=$PATH:/usr/local/pgsql/bin" >> ~postgres/.bashrc
    
    echo "export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/pgsql/lib" >> ~postgres/.bashrc
    echo "export PATH=$PATH:/usr/local/pgsql/bin" >> ~postgres/.bashrc

    Test this by logging in as postgres and checking the paths; you should see /usr/local/pgsql/bin

    [root@yourserver src]# su - postgres
    [postgres@yourserver pgsql]$ env | grep PATH
    LD_LIBRARY_PATH=:/usr/local/pgsql/lib
    PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/usr/bin/X11:/usr/X11R6/bin:/root/bin:/usr/local/pgsql/bin:/usr/local/pgsql/bin
    [postgres@yourserver pgsql]$ exit
    
  4. Compile and install PostgreSQL.  Change to the postgres user and run ./configure to set the compilation options automatically. This is the point at which you can configure PostgreSQL in various ways. For example, if you want to enable Unicode support, add the flags --enable-locale and --enable-multibyte. If you want to see what the other possibilities are, run ./configure --help.

    [root@yourserver src]# su - postgres
    [postgres@yourserver pgsql]$ cd /usr/local/src/postgresql-7.3.4
    [postgres@yourserver postgresql-7.3.4]$ ./configure
    creating cache ./config.cache
    checking host system type... i686-pc-linux-gnu
    (many lines omitted>
    linking ./src/makefiles/Makefile.linux to src/Makefile.port
    linking ./src/backend/port/tas/dummy.s to src/backend/port/tas.s
    [postgres@yourserver postgresql-7.3.4]$ make all
    make -C doc all
    make[1]: Entering directory `/usr/local/src/postgresql-7.3.4/doc'
    (many lines omitted)
    make[1]: Leaving directory `/usr/local/src/postgresql-7.3.4/src'
    All of PostgreSQL successfully made. Ready to install.
    [postgres@yourserver postgresql-7.3.4]$ make install
    make -C doc install
    make[1]: Entering directory `/usr/local/src/postgresql-7.3.4/doc'
    (many lines omitted)
    Thank you for choosing PostgreSQL, the most advanced open source database
    engine.
    
    su - postgres
    cd /usr/local/src/postgresql-7.3.4
    ./configure
    make all
    make install
  5. Start PostgreSQL.  The initdb command initializes the database. pg_ctl is used to start up PostgreSQL.

    [postgres@yourserver tsearch]$ /usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data
    The files belonging to this database system will be owned by user "postgres".
    This user must also own the server process.
    (17 lines omitted)
    or
        /usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data -l logfile start
    [postgres@yourserver tsearch]$ /usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data -l /usr/local/pgsql/data/server.log start
    postmaster successfully started
    [postgres@yourserver tsearch]$
    
    /usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data
    /usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data -l /usr/local/pgsql/data/server.log start

    PostgreSQL errors will be logged in /usr/local/pgsql/data/server.log

  6. Install Pl/pgSQL. Set up plpgsq and allow your user to have access. Plpgsql is a PL/SQL-like language. We add it to template1, which is the template from which all new databases are created. We can verify that it was created with the createlang command in list mode.

    [postgres@yourserver pgsql]$ createlang plpgsql template1
    [postgres@yourserver pgsql]$ createlang -l template1
    Procedural languages
      Name   | Trusted?
    ---------+----------
     plpgsql | t
    (1 row)
    
    [postgres@yourserver pgsql]$
    
    createlang plpgsql template1
    createlang -l template1
  7. Test PostgreSQL (OPTIONAL). Create a database and try some simple commands. The output should be as shown.

    [postgres@yourserver pgsql]$ createdb mytestdb
    CREATE DATABASE
    [postgres@yourserver pgsql]$ psql mytestdb
    Welcome to psql, the PostgreSQL interactive terminal.
    
    Type:  \copyright for distribution terms
           \h for help with SQL commands
           \? for help on internal slash commands
           \g or terminate with semicolon to execute query
           \q to quit
    
    mytestdb=# select current_timestamp;
              timestamptz
    -------------------------------
     2003-03-07 22:18:29.185413-08
    (1 row)
    
    mytestdb=# create function test1() returns integer as 'begin return 1; end;' language 'plpgsql';
    CREATE
    mytestdb=# select test1();
     test1
    -------
         1
    (1 row)
    
    mytestdb=# \q
    [postgres@yourserver pgsql]$ dropdb mytestdb
    DROP DATABASE
    [postgres@yourserver pgsql]$ exit
    logout
    
    [root@yourserver src]#
  8. Set PostgreSQL to start on boot. First, we copy the postgresql.txt init script, which automates startup and shutdown, to the distribution-specific init.d directory. Then we verify that it works. Then we automate it by setting up a bunch of symlinks that ensure that, when the operating system changes runlevels, postgresql goes to the appropriate state. Red Hat and Debian and SuSE each work a little differently.

    • Red Hat RPM:

      The init script is already installed; just turn it on for the appropriate run levels.

      [root@yourserver root]# chkconfig --level 345 postgresql on
      [root@yourserver root]# 
    • Red Hat from source:

      [root@yourserver src]# cp /tmp/openacs-5.0.0b1/packages/acs-core-docs/www/files/postgresql.txt /etc/init.d/postgresql
      [root@yourserver src]# chown root.root /etc/rc.d/init.d/postgresql
      [root@yourserver src]# chmod 755 /etc/rc.d/init.d/postgresql
      [root@yourserver src]# 
      
      cp /tmp/openacs-5.0.0b1/packages/acs-core-docs/www/files/postgresql.txt /etc/init.d/postgresql
      chown root.root /etc/rc.d/init.d/postgresql
      chmod 755 /etc/rc.d/init.d/postgresql

      Test the script.

      [root@yourserver root]# service postgresql stop
      Stopping PostgreSQL: ok
      [root@yourserver root]# 

      If PostgreSQL successfully stopped, then use the following command to make sure that the script is run appropriately at boot and shutdown. And turn it back on because we'll use it later.

      [root@yourserver root]# chkconfig --add postgresql
      [root@yourserver root]# chkconfig --level 345 postgresql on
      [root@yourserver root]# chkconfig --list postgresql
      postgresql      0:off   1:off   2:on    3:on    4:on    5:on    6:off
      [root@yourserver root]# service postgresql start
      Starting PostgreSQL: ok
      [root@yourserver root]#
      
      chkconfig --add postgresql
      chkconfig --level 345 postgresql on
      chkconfig --list postgresql
      service postgresql start
    • Debian:

      root:~# cp /tmp/openacs-5.0.0b1/packages/acs-core-docs/www/files/postgresql.txt /etc/init.d/postgresql
      root:~# chown root.root /etc/init.d/postgresql
      root:~# chmod 755 /etc/init.d/postgresql
      root:~# 
      
      cp /tmp/openacs-5.0.0b1/packages/acs-core-docs/www/files/postgresql.txt /etc/init.d/postgresql
      chown root.root /etc/init.d/postgresql
      chmod 755 /etc/init.d/postgresql

      Test the script

      root:~# /etc/init.d/postgresql stop
      Stopping PostgreSQL: ok
      root:~# 

      If PostgreSQL successfully stopped, then use the following command to make sure that the script is run appropriately at boot and shutdown.

      root:~# update-rc.d postgresql defaults
       Adding system startup for /etc/init.d/postgresql ...
         /etc/rc0.d/K20postgresql -> ../init.d/postgresql
         /etc/rc1.d/K20postgresql -> ../init.d/postgresql
         /etc/rc6.d/K20postgresql -> ../init.d/postgresql
         /etc/rc2.d/S20postgresql -> ../init.d/postgresql
         /etc/rc3.d/S20postgresql -> ../init.d/postgresql
         /etc/rc4.d/S20postgresql -> ../init.d/postgresql
         /etc/rc5.d/S20postgresql -> ../init.d/postgresql
      root:~# /etc/init.d/postgresql start
      Starting PostgreSQL: ok
      root:~#
    • SuSE:

      Note

      I have received reports that SuSE 8.0 is different from previous versions. Instead of installing the boot scripts in /etc/rc.d/init.d/, they should be placed in /etc/init.d/. If you're using SuSE 8.0, delete the rc.d/ part in each of the following commands.

      root:~# cp /tmp/openacs-5.0.0b1/packages/acs-core-docs/www/files/postgresql.txt /etc/rc.d/init.d/postgresql
      root:~# chown root.root /etc/rc.d/init.d/postgresql
      root:~# chmod 755 /etc/rc.d/init.d/postgresql

      Test the script.

      root:~# /etc/rc.d/init.d/postgresql stop
      Stopping PostgreSQL: ok

      If PostgreSQL successfully stopped, then use the following command to make sure that the script is run appropriately at boot and shutdown.

      root:~# cd /etc/rc.d/init.d
      root:/etc/rc.d/init.d# ln -s /etc/rc.d/init.d/postgresql K20postgresql
      root:/etc/rc.d/init.d# ln -s /etc/rc.d/init.d/postgresql S20postgresql  
      root:/etc/rc.d/init.d# cp K20postgresql rc2.d
      root:/etc/rc.d/init.d# cp S20postgresql rc2.d
      root:/etc/rc.d/init.d# cp K20postgresql rc3.d
      root:/etc/rc.d/init.d# cp S20postgresql rc3.d
      root:/etc/rc.d/init.d# cp K20postgresql rc4.d
      root:/etc/rc.d/init.d# cp S20postgresql rc4.d 
      root:/etc/rc.d/init.d# cp K20postgresql rc5.d
      root:/etc/rc.d/init.d# cp S20postgresql rc5.d
      root:/etc/rc.d/init.d# rm K20postgresql
      root:/etc/rc.d/init.d# rm S20postgresql
      root:/etc/rc.d/init.d# 

      Test configuration.

      root:/etc/rc.d/init.d # cd
      root:~ # /etc/rc.d/init.d/rc2.d/S20postgresql start
      Starting PostgreSQL: ok
      root:~ # 

    From now on, PostgreSQL should start automatically each time you boot up and it should shutdown gracefully each time you shut down. (Note: Debian defaults to starting all services on runlevels 2-5. Red Hat defaults to starting services on 3-5. So, on Red Hat, PostgreSQL won't start on runlevel 2 unless you alter the above commands a little. This usually isn't a problem as Red Hat defaults to runlevel 3)

  9. Tune postgres. (OPTIONAL). The default values for PostGreSQL are very conservative; we can safely change some of them and improve performance.

    1. Change the kernel parameter for maximum shared memory segment size to 128Mb:

      [root@yourserver root]# echo 134217728 >/proc/sys/kernel/shmmax
      [root@yourserver root]#

      Make that change permanent by editing /etc/sysctl.conf to add these lines at the end:

      # increase shared memory limit for postgres
      kernel.shmmax = 134217728
    2. Edit the PostGreSQL config file, /usr/local/pgsql/data/postgresql.conf, to use more memory. These values should improve performance in most cases. (more information)

      #       Shared Memory Size
      #
      shared_buffers = 15200      # 2*max_connections, min 16
      
      #       Non-shared Memory Sizes
      #
      sort_mem = 32168            # min 32
      
      
      #       Write-ahead log (WAL)
      #
      checkpoint_segments = 3     # in logfile segments (16MB each), min 1
      

      Restart postgres (service postgres restart) so that the changes take effect.

more information about PostgreSQL

($Id: postgres.html,v 1.22 2003/11/19 15:44:51 jeffd Exp $)
View comments on this page at openacs.org