PostgreSQL

Instal·lació

Via apt-get o synaptic el trobarem. Instal·lem el paquet PostgreSql i els paquets que necessitem, per exemple php5-pgsql

Configuració

Quan s'instal.la PostgreSQL es crea un usuari postgres (usuari en el sistema linux i de la base de dades). Aquest usuari ens permetrà administrar/configurar PostgreSQL.

usuari@maquina$ sudo su postgres
postgres@maquina#

Ara ja podem crear un usuari amb la seva clau d'accés (password) i una base de dades:

postgres@maquina# createuser --pwprompt NOM_DE_USUARI
postgres@maquina# createdb NOM_BASE_DE_DADES -E UTF8 -O NOM_DE_USUARI

Ja tenim creada una base de dades i un usuari amb la seva clau d'accés. Sortirem de l'usuari postgres amb Ctlr+D o escrivint la comanda exit al terminal.

Mirarem que el fitxer de configuració /etc/postgresql/8.3/main/postgresql.conf (segons versió serà 8.1, 8.2 o 8.3) no es trobi comentada la línia:

port = 5432

Si només acceptem connexions des del localhost:

listen_addresses = 'localhost'

Però si acceptem connexions de tot arreu:

listen_addresses = '*'

O d'alguna IP en concret (podem posar una llista de IPs separades per comes):

listen_addresses = 'localhost,80.35.151.105'            # what IP address(es) to listen on;

i a més a més en el fitxer /etc/postgresql/8.3/main/pg_hba.conf cal tenir una o més línies com aquestes depenent si volem només connexions localhost, de la xarxa local o també d'algunes màquines de l'exterior:

# IPv4 local connections:
host    all         all         127.0.0.1/32          md5
host    all         all         192.168.0.0 255.255.255.0 md5
host    all         all         62.57.200.0 255.255.248.0 md5

Per arrancar, aturar o rearrancar el servidor PostgreSQL ho podem fer amb les comandes (segons versió serà 8.1, 8.2 o 8.3):

usuari@maquina$ sudo /etc/init.d/postgresql-8.3 start
usuari@maquina$ sudo /etc/init.d/postgresql-8.3 stop
usuari@maquina$ sudo /etc/init.d/postgresql-8.3 restart

Comandes

Crear usuari

sudo su postgres
createuser --pwprompt nom_usuari

Eliminar usuari

sudo su postgres
dropuser nom_usuari

Veure usuaris donats d'alta

$ sudo su postgres
$ psql
# select * from pg_shadow;

Crear base de dades

sudo su postgres
createdb nom_base_de_dades -O nom_usuari

o

$ psql
postgres=# CREATE DATABASE nom_base_de_dades OWNER nom_usuari;

Eliminar base de dades

sudo su postgres
dropdb nom_base_de_dades

Reanomenar base de dades

ALTER DATABASE dbname RENAME TO dbnamenew;

Còpies de Seguretat

Manualment

Opció 1

pg_dump dbname > filename

Si volem només una taula:

pg_dump dbname -t res_country > res_country.sql

Es recupera amb:

psql dbname < filename

Opció 2

pg_dump -Fc dbname > filename

Es recupera amb:

pg_restore -d dbname filename

Cal indicar l'opció -i si la versió de pg_dump no coincideix amb la versió del servidor.

Scripts automatitzats

export PGPASSWORD=%s
dropdb -U %s %s_copia
createdb -U %s -T %s %s_copia -O %s
pg_dump %s -U %s > %s/backup/backup_%s.sql
export PGPASSWORD=

Comandes varies

Usuaris usant b.d.

Per saber quins usuaris estan usant les diferents b.d.:

select * from pg_stat_activity;

Volcar dades SQL a fitxer

psql base_dades usuari_postgres --command='select name from res_users;' > fitxer.txt

Modificar estructura taula

ALTER TABLE public.res_country ADD COLUMN status boolean;
ALTER TABLE distributors DROP COLUMN address RESTRICT;

Més opcions: ALTER TABLE

Canviar caràcters d'un camp per tots els registres

UPDATE account_invoice SET number = replace(number, '/', '-') where type='out_invoice';

Detectar dos registres amb el mateix camp

  • Manera “senzilla”
select magento_sku,count(*) from product_product group by magento_sku;
  • Manera “complexa”
select o.id from res_partner o where exists ( select 'x' from res_partner i where i.vat = o.vat and i.id < o.id);
select o.id from product_product o where exists ( select 'x' from product_product i where i.magento_sku = o.magento_sku and i.id < o.id);
--
-- select duplicate rows
--
select o.id, o.a, o.b from test o
 where exists ( select 'x' 
                  from test i
                 where i.a = o.a
                   and i.b = o.b
                   and i.id < o.id
             );
--
-- delete duplicate rows
--
-- Note: PostgreSQL dosn't support aliases on
--       the table mentioned in the from clause
--       of a delete.
--
 
delete from test 
 where exists ( select 'x' 
                  from test i
                 where i.a = test.a
                   and i.b = test.b
                   and i.id < test.id
             );

Omplir un camp que relaciona dos taules amb la informació recíproca

Per exemple, per omplir el camp training_offer_invoicing_id de les factures que les relaciona amb els training_offer_invoicing, quan training_offer_invoicing té un camp invoice_id que apunta a les factures:

update account_invoice i set training_offer_invoicing_id = (select id from training_offer_invoicing t where t.invoice_id = i.id);

Crear un usuari de postgres amb permisos de només lectura

# Crea el nou usuari mydbuser_ro:

sudo su postgres
createuser --pwprompt mydbuser_ro

# Dóna permisos d'usar l'esquema públic a l'usuari només lectura des del client psql:

psql
GRANT USAGE ON SCHEMA public TO mydbuser_ro;

# Dóna permisos de select (consultar) a totes les taules i a totes les vistes de la base de dades mydb des de la línia de comandes:

psql -U postgres -qAt -c "SELECT 'GRANT SELECT ON ' || tablename || ' TO \"mydbuser_ro\";' FROM pg_tables WHERE schemaname = 'public'" mydb | psql -U postgres mydb
psql -U postgres -qAt -c "SELECT 'GRANT SELECT ON ' || viewname || ' TO \"mydbuser_ro\";' FROM pg_views WHERE schemaname = 'public'" mydb | psql -U postgres mydb

Llista del nom de totes les taules d'una b.d.

SELECT table_name
  FROM information_schema.tables
  WHERE table_type = 'BASE TABLE'
  AND table_schema NOT IN ('pg_catalog', 'information_schema')
  ORDER BY table_name ASC;

Llista del nombre de registres de totes les taules d'una b.d.

Al resultat de l'apartat anterior executar per cada taula SELECT count(*) FROM nom_taula;

O podem obtenir el nombre de registres aproximat executant:

SELECT
  nspname AS schemaname,relname,reltuples
FROM pg_class C
LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
WHERE
  nspname NOT IN ('pg_catalog', 'information_schema') AND
  relkind='r'
ORDER BY reltuples DESC;   

PhpPgAdmin

Administració de bases de dades Postgres mitjançant l'aplicació web PhpPgAdmin (Nota: També es poden administrar còmodament amb l'aplicació d'escriptori PgAdminIII).

apt-get install phppgadmin

Creem un link simbòlic o un alias a l'apache per poder executar el phppgadmin amb Apache.

ln -s /usr/share/phppgadmin /var/www/

http://localhost/phppgadmin.

És normal que tinguem encara problemes per registrar-nos. Si es així, editeu el fitxer /etc/phppgadmin/config.inc.php i mirem si es troba a “false” la línia:

$conf['extra_login_security'] = false;
 
servers/postgresql.txt · Darrera modificació: 2012/01/09 01:48 per jesteve
 
Copyright: Zikzakmedia Llicència Creative Commons By-NC-SA
Recent changes RSS feed Creative Commons License Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki