Menú principal

Creando una instancia de PostgreSQL como usuario no-root

17 Dec
Published by antonio.hernandez in

Daré los pasos para crear una instancia de PostgreSQL que nos sirva para el desarrollo. La intención de está instancia es de que este en nuestro control como usuarios comunes del sistema y no dependamos de acceso a la cuenta root o postgres.

  1. Los requerimientos serán:

    • El proceso de la instancia se ejecutará bajo el usuario antonio.
    • La instancia usará /home/antonio/dbms/postgresql/ como directorio para las bases de datos.
    • El usuario antonio será el administrador de la instancia.
    • Los archivos de log y socket residirán en /home/antonio/dbms/var/postgresql
    • La instancia estará a la escucha de conexiones en el puerto TCP 6789.
  2. Creamos la estructura de directorios para nuestra instancia.

    antonio@slackware:~$ mkdir -p /home/antonio/dbms/postgresql/
    antonio@slackware:~$ mkdir -p /home/antonio/dbms/var/postgresql/
     
  3. Inicializamos el cluster de PostgreSQL

    antonio@slackware:~$ initdb -D /home/antonio/dbms/postgresql/ --encoding=UTF8 --no-locale
    The files belonging to this database system will be owned by user "antonio".
    This user must also own the server process.
    The database cluster will be initialized with locale "C".
    The default text search configuration will be set to "english".
    fixing permissions on existing directory /home/antonio/dbms/postgresql ... ok
    creating subdirectories ... ok
    selecting default max_connections ... 100
    selecting default shared_buffers ... 24MB
    creating configuration files ... ok
    creating template1 database in /home/antonio/dbms/postgresql/base/1 ... ok
    initializing pg_authid ... ok
    initializing dependencies ... ok
    creating system views ... ok
    loading system objects' descriptions ... ok
    creating collations ... ok
    creating conversions ... ok
    creating dictionaries ... ok
    setting privileges on built-in objects ... ok
    creating information schema ... ok
    loading PL/pgSQL server-side language ... ok
    vacuuming database template1 ... ok
    copying template1 to template0 ... ok
    copying template1 to postgres ... ok
    WARNING: enabling "trust" authentication for local connections
    You can change this by editing pg_hba.conf or using the option -A, or
    --auth-local and --auth-host, the next time you run initdb.
    Success. You can now start the database server using:
        postgres -D /home/antonio/dbms/postgresql
    or
        pg_ctl -D /home/antonio/dbms/postgresql -l logfile start
    
  4. Iniciamos la instancia

    antonio@slackware:~$ pg_ctl start -D /home/antonio/dbms/postgresql/ 
       --log /home/antonio/dbms/var/postgresql/postgresql.log -o "-k /home/antonio/dbms/var/postgresql -p 6789"
    waiting for server to start.... done
    server started
     
  5. Corroboramos que todo este en su lugar y en ejecución

    antonio@slackware:~$ tree -aL 1 /home/antonio/dbms/postgresql/
    /home/antonio/dbms/postgresql/
    ├── PG_VERSION
    ├── base
    ├── global
    ├── pg_clog
    ├── pg_hba.conf
    ├── pg_ident.conf
    ├── pg_multixact
    ├── pg_notify
    ├── pg_serial
    ├── pg_snapshots
    ├── pg_stat_tmp
    ├── pg_subtrans
    ├── pg_tblspc
    ├── pg_twophase
    ├── pg_xlog
    ├── postgresql.conf
    ├── postmaster.opts
    └── postmaster.pid
    12 directories, 6 files
    antonio@slackware:~$ tree -aL 1 /home/antonio/dbms/var/postgresql/
    /home/antonio/dbms/var/postgresql/
    ├── .s.PGSQL.6789
    ├── .s.PGSQL.6789.lock
    └── postgresql.log
    0 directories, 3 files
    antonio@slackware:~$ pg_ctl status -D /home/antonio/dbms/postgresql/
    pg_ctl: server is running (PID: 16878)
    /usr/bin/postgres "-D" "/home/antonio/dbms/postgresql" "-k" "/home/antonio/dbms/var/postgresql" "-p" "6789"
     
  6. Realizamos una prueba de conexión con psql, mediante el socket TCP

    antonio@slackware:~$ psql -h 127.0.0.1 -p 6789 -U antonio postgres
    psql (9.2.4)
    Type "help" for help.
    postgres=# \l
                              List of databases
      Name    |  Owner  | Encoding | Collate | Ctype |  Access privileges
    -----------+---------+----------+---------+-------+---------------------
    postgres  | antonio | UTF8     | C       | C     |
    template0 | antonio | UTF8     | C       | C     | =c/antonio         +
              |         |          |         |       | antonio=CTc/antonio
    template1 | antonio | UTF8     | C       | C     | =c/antonio         +
              |         |          |         |       | antonio=CTc/antonio
    (3 rows)
    postgres=# \q
     
  7. O bien mediante el socket UNIX

    antonio@slackware:~$ psql -h /home/antonio/dbms/var/postgresql/ -p 6789 -U antonio postgres
    psql (9.2.4)
    Type "help" for help.
    postgres=# select version();
                                           version
    -------------------------------------------------------------------------------------
    PostgreSQL 9.2.4 on x86_64-slackware-linux-gnu, compiled by gcc (GCC) 4.7.1, 64-bit
    (1 row)
    postgres=# \q
     
  8. Iniciamos sesión con pgadmin3:

    En la ventana de New Server Registration los campos que rellenamos:

    • Name: Nombre de la sesión, en mi caso es dev
    • Host: Dirección IP o socket UNIX al cual nos conectaremos, en mi caso /home/antonio/dbms/var/postgresql
    • Port: Número de puerto TCP, en mi caso 6789
    • Username: Nuestro nombre de usuario, en mi caso antonio

    Para finalmente dar clic en Ok y obtendremos algo como:

    pgAdmin3

  9. Detenemos a la instancia de la siguiente forma:

    antonio@slackware:~$ pg_ctl stop -D /home/antonio/dbms/postgresql/
    waiting for server to shut down.... done
    server stopped
     
  10. Finalmente, creamos un shell script que nos permitirá administrar la instancia:

    <

    div class="drupal-gist-file">

    <

    pre type="shell">#!/bin/sh

About: shell script for a personal PostgreSQL instance / Slackware Linux

Copyright © 2013 Antonio Hernández Blas <hba.nihilismus@gmail.com>

This program is free software. It comes without any warranty, to

the extent permitted by applicable law. You can redistribute it

and/or modify it under the terms of the Do What The Fuck You Want

To Public License, Version 2, as published by Sam Hocevar. See

http://www.wtfpl.net/ for more details.

export PGDATA=$HOME/dbms/postgresql export PGPORT=6789

export PGLOG=$HOME/dbms/var/postgresql/postgresql.log export PGSOCKET=$HOME/dbms/var/postgresql

export PGDATABASE=postgres export PGHOST=$PGSOCKET

export DEFAULTDB=postgres export DEFAULTUSER=$(whoami)

export LESSSECURE=1 export PAGER="less --hilite-search --ignore-case \ --status-column --line-numbers --QUIET \ --chop-long-lines --hilite-unread"

case $1 in "start") pg_ctl status 2>&1 >/dev/null if [ $? -eq 3 ]; then pg_ctl start -w --log $PGLOG -o "-k $PGSOCKET" exit $? fi pg_dev status exit 1 ;; "stop") pg_ctl stop exit $? ;; "restart") pg_dev stop sleep 3 pg_dev start ;; "status") pg_ctl status exit $? ;; "log" | "-l") if [ -n "$2" ]; then tail -n "$2" $PGLOG else tail -f $PGLOG fi exit $? ;; "connect" | "-c") if [ -n "$2" ]; then export PGDATABASE=$2 fi psql exit $? ;; "interactive" | "-i") psql $DEFAULTDB $DEFAULTUSER exit $? ;; "source" | "-f") if [ -z $2 ]; then echo "Error: you must indicate which SQL script." exit 1 fi if [ ! -f "$2" ]; then echo "Error: '$2' does not exist." exit 1 fi

    psql -f $2 $DEFAULTDB $DEFAULTUSER
    exit $?
    ;;
&quot;url&quot; | &quot;-u&quot;)
    echo &quot;jdbc:postgresql://$PGSOCKET:$PGPORT/&quot;
    ;;
*)
    echo &quot;pg_dev [start | stop | restart | status | log/-l | connect/-c | interactive/-i | source/-f | url/-u]&quot;
    ;;

esac