2013-10-01

PostgreSQL is an open source database released under the PostgreSQL license. This license allows for the free use and distribution of the PostgreSQL software for any reason. After few years back, I got a chance to setup a PostgreSQL server (one enterprise-class open source database) for an upcoming Rails project. I had worked with PostgreSQL7 few years back. The latest version is 9.3 and EnterpriseDB company currently take over the PostgreSQL distribution. I found postgreSQL is good for developing desktop type or Intranet application as the complexity of it’s design and MYSQL is good for web based project due to it’s high performance on light weight platform.

How Do I install latest PostgreSQL on CentOS server.

You can easily get the repository file from Postgresql Yum repository. Yum rpms can be downloaded from here.

[root@rc-090 installation]# wget http://yum.postgresql.org/9.3/redhat/rhel-6-i386/pgdg-centos93-9.3-1.noarch.rpm

[root@rc-090 installation]# rpm -ivh pgdg-centos93-9.3-1.noarch.rpm

warning: pgdg-centos93-9.3-1.noarch.rpm: Header V4 DSA/SHA1 Signature, key ID 442df0f8: NOKEY

Preparing...                ########################################### [100%]

   1:pgdg-centos93          ########################################### [100%]

[root@rc-090 installation]#

The real problem is you can not install easily using “yum install postgresql” as each of it distribution having unique release name. How do I find the correct postgresql version which support yum install.

Check the file “/etc/yum.repos.d/pgdg-93-centos.repo” which shows the version in the file name itself. 93 ie 9.3 and also we can verify the same by browsing the base url on browser ie http://yum.postgresql.org/9.3/redhat/. Here you can see various PG distribution according to our OS platform. Open the proper folder and search the string “postgresql” and identify the package name respect to the YUM install.

[root@rc-090 installation]# yum install postgresql93-server postgresql93-libs postgresql93-contrib

Dependencies Resolved

=======================================================================================================================

 Package                             Arch                Version                           Repository             Size

=======================================================================================================================

Installing:

 postgresql93-contrib                i686                9.3.0-1PGDG.rhel6                 pgdg93                477 k

 postgresql93-libs                   i686                9.3.0-1PGDG.rhel6                 pgdg93                193 k

 postgresql93-server                 i686                9.3.0-1PGDG.rhel6                 pgdg93                4.0 M

Installing for dependencies:

 postgresql93                        i686                9.3.0-1PGDG.rhel6                 pgdg93                1.0 M

 uuid                                i686                1.6.1-10.el6                      base                   54 k

Transaction Summary

=======================================================================================================================

Install       5 Package(s)

Total download size: 5.7 M

Installed size: 23 M

Is this ok [y/N]:

[root@rc-090 installation]# service postgresql-9.3 initdb

Initializing database:                                     [  OK  ]

[root@rc-090 installation]#

[root@rc-090 installation]# service postgresql-9.3 start

Starting postgresql-9.3 service:                           [  OK  ]

[root@rc-090 installation]#

Now you have PostgreSQL successfully installed. Next I’m going to,

a. create a postgresql user and password
b. create a database for the above user.
c. Permitting all the access to db for a particular user.
d. Restoring database.
e. Backup the database.
f. Setting UP PgMyADmin (web UI like PhpMyadmin) to manage tables.
g. Publishing postgresSQL server.

a. Creating User

The default installing will be created ‘postgres” system user as default admin user. So we need to switch ‘postgres” system user shell account to create other users.

a. Creating postgres user

Switch to postgres system account and type “psql” to get the db console. Then execute the following command “CREATE USER liju WITH password ‘pass123′;” will create a user “liju” with password “pass123″

[root@rc-090 installation]# su - postgres

-bash-4.1$ psql

psql (8.4.13, server 9.3.0)

WARNING: psql version 8.4, server version 9.3.

         Some psql features might not work.

Type "help" for help.

postgres=# CREATE USER liju WITH password 'pass123';

CREATE ROLE

postgres=#

b. create a database for a sigle user.

Command : CREATE DATABASE
WITH OWNER
;

 postgres=# CREATE DATABASE testdb WITH OWNER liju;

CREATE DATABASE

postgres=#

c. Permitting all the access to db for a particular user

Command : GRANT ALL PRIVILEGES ON DATABASE
to


postgres=# GRANT ALL PRIVILEGES ON DATABASE testdb to liju;

GRANT

postgres=#

a. Create a superuser user:

Create user mysuper with password ’1234′ SUPERUSER
create user mysuper with password ’1234′ SUPERUSER CREATEDB CREATEROLE INHERIT LOGIN REPLICATION;

b.Change Database Owner:

alter database database_name owner to new_owner;

Revoking database privilege.

 REVOKE ALL PRIVILEGES ON testdb FROM liju;

d. How do I verify my user name and password are working.

In order to verify postgres user credential, you may need to create system user exactly same as postgres user. Otherwise you need to test it over PgMyAdmin.

[root@rc-090 installation]# psql -h 127.0.0.1 -d testdb -U liju -W

Password for user liju:

psql: FATAL:  Ident authentication failed for user "liju"

[root@rc-090 installation]#

Solution:

Postgres using environment setting (IDENT) to identify the REAL user by default. So that you can not login to psql shell even though user details are correct. We need to change the user authentication ident to password in postgresql configuration file pg_hba.conf) . This file can be found under “$PGDATA” or in “/var/lib/pgsql/9.3/data/”

Now I changed ident mode to password on /var/lib/pgsql/9.3/data/pg_hba.conf which would apply all the calls to loopback IP.

 host    all             all             127.0.0.1/32            ident

to

host    all             all             127.0.0.1/32            password

Restarted Postgresql and now I could able to login to users psql console.

[root@rc-090 installation]# /etc/init.d/postgresql-9.3 restart

Stopping postgresql-9.3 service:                           [  OK  ]

Starting postgresql-9.3 service:                           [  OK  ]

[root@rc-090 installation]# psql -h 127.0.0.1 -d testdb -U liju -W

Password for user liju:

psql (8.4.13, server 9.3.0)

WARNING: psql version 8.4, server version 9.3.

         Some psql features might not work.

Type "help" for help.

testdb=>

a tips !!!

Also I have added another line to have LAN access enabled for all postgresql users.

host    all             all             192.168.0.0/24           password

Access remote Postgres database : psql -h 192.168.0.90 -U liju -W -d testdb

e. Configuring postgresSQL listen to all IP and enabling networking.

You may need to edit the config file “postgresql.conf” from “/var/lib/pgsql/9.3/data/postgresql.conf” and listen_addresses to “*” and declare the port 5432 for postgres daemon and then restart the service.

vi /var/lib/pgsql/9.3/data/postgresql.conf

# - Connection Settings -

listen_addresses = '*'          # what IP address(es) to listen on;

                                        # comma-separated list of addresses;

                                        # defaults to 'localhost'; use '*' for all

                                        # (change requires restart)

port = 5432                             # (change requires restart)

[root@rc-090 ~]# netstat -nlp | grep ":5432"

tcp        0      0 0.0.0.0:5432                0.0.0.0:*                   LISTEN      8887/postmaster

tcp        0      0 :::5432                     :::*                        LISTEN      8887/postmaster

[root@rc-090 ~]#

f. Listing all the databases.

You may use the switch “\l” to list database or psql -l. “\q” to quit the shell.

[root@rc-090 installation]# psql -h 127.0.0.1 -d testdb -U liju -W

Password for user liju:

testdb=> \l

                                  List of databases

   Name    |  Owner   | Encoding |  Collation  |    Ctype    |   Access privileges

-----------+----------+----------+-------------+-------------+-----------------------

 testdb    | liju     | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =Tc/liju

                                                             : liju=CTc/liju

Listing all users

Use the switch ” \du” to list all the users.

postgres=# \du

            List of roles

 Role name | Attributes  | Member of

-----------+-------------+-----------

 censususr | Superuser   | {}

           : Create role

           : Create DB

 liju      |             | {}

 postgres  | Superuser   | {}

           : Create role

           : Create DB

g. How To Backup Postgres Database,

1. Backup a single database

Command : pg_dump -d [source_db] -h [host] -U [user-name] -f [dumpfilename.sql]

[root@rc-040 ~]# pg_dump -d censusdb -h 127.0.0.1 -U censususr -W -f censusdb_backup.sql

Password:

[root@rc-040 ~]# du -sh censusdb_backup.sql 1.6M censusdb_backup.sql

[root@rc-040 ~]#

2. Backup all databases

For backuping full databas, we need to login to postgres user shell and execute pg_dumpall command.

 -bash-3.2$ pg_dumpall > alldb.sql

-bash-3.2$

3. Backing up only a table from database.

pg_dump --table users -U liju testdb -f users.testdb.sql

h. How to restore backup

You can use psql command to restore the database easily. You may need to create same user account on destination server to have a successful restoration.

Command : psql -d [database name] -h [hostname] -U [user name] -W -f [backupfile.sql]

Here I’m showing backup a database censusdb from local server and restore it on testdb in a remote server 192.168.0.90.

At remote server

Also I have created same user name and given full privileges to this user at remote server.

 [root@rc-090 ~]# su - postgres

-bash-4.1$ createdb testdb

-bash-4.1$ createuser censususr

Shall the new role be a superuser? (y/n) y

-bash-4.1$ psql

psql (8.4.13, server 9.3.0)

WARNING: psql version 8.4, server version 9.3.

         Some psql features might not work.

Type "help" for help.

postgres=# ALTER USER censususr WITH PASSWORD 'test123';

ALTER ROLE

At local database server

[root@rc-040 ~]# pg_dump -h 127.0.0.1  -d  censusdb -U censususr -W -f censususr.sql

Password:

[root@rc-040 ~]# psql -h 192.168.0.90 -U censususr  -W -d testdb -f censususr.sql

Password for user censususr:

SET

SET

CREATE EXTENSION

COMMENT

CREATE EXTENSION

COMMENT

SET

SET

SET

CREATE TABLE

ALTER TABLE

CREATE SEQUENCE

ALTER TABLE

ALTER SEQUENCE

CREATE TABLE

ALTER TABLE

i. How to setup web based Postgres admin tool.

phpPgAdmin is a web-based administration tool for PostgreSQL. It is perfect for PostgreSQL DBAs, newbies, and hosting services. We can easily install on any Php based hosting but it required the php-pgsql extension enabled on server.

Download PgAdmin from http://phppgadmin.sourceforge.net/ and extract it on any web location.

#wget http://downloads.sourceforge.net/project/phppgadmin/phpPgAdmin%20%5Bstable%5D/phpPgAdmin-5.1/phpPgAdmin-5.1.tar.gz

#tar -zxvf  phpPgAdmin-5.1.tar.gz

# mv phpPgAdmin-5.1 pgadmin

#cd pgadmin/conf

# cp config.inc.php-dist config.inc.php

Then edit config.inc.php and update the lines to as shown below,

host = ‘[postgres server ip]‘ and extra_login_security = “false” Pls note you need to set password to root postgres account using the psql command “ALTER USER postgres WITH PASSWORD ‘password’;

One you have set everything, you will see the following screen,



-Njoy !!!!

Author: Liju Mathew
Visit Liju's Website - Email Liju
I'm Liju, one linux enthusiastic who have been playing with Linux for more than 7 years. I'm curious about to read blog, learning and implementing new technologies from my personal experience. Like to be play with burning head on busy schedule :-) This is a bookmark of all challenges that I'd faced which would be helpful to others sometimes as I'd learn it from the same way :-)

Nothing more, I have to go miles, before I sleep

Show more