Tag Archives: postgresql

Quelques liens en vrac…

Une petite sélection de liens pour le mois de Juin:

Not doing Code Reviews? What’s your excuse?
Getting started with android development
What are your favorite Vim tricks?
GNU Screen: Working with the Scrollback Buffer
C++ clear winner in Google language tests
Scaling with MongoDB (or how Urban Airship abandoned it for PostgreSQL)
SECCURE Elliptic Curve Crypto Utility for Reliable Encryption

Postgresql et nettoyage des tables

Quand une base Postgresql prend trop de place, il est temps de faire place. Et si bien que parfois, un DELETE massif d’une table entière et d’un VACUUM FULL derrière ne suffisent plus. Du coup, j’ai découvert cet après midi quelques manipulations pour voir en détail un peu plus comment faire de la place.

Par exemple, j’ai fais un simple « DELETE * FROM obj; », suivi d’un VACUUM. Bien qu’ayant gagné 300 Mo, je vois quand même que ma table, même vide, prend encore pas mal de place:

engineProd=# SELECT COUNT(*) FROM obj;
 COUNT
-------
     0
(1 ROW)

engineProd=# SELECT pg_size_pretty(pg_total_relation_size('obj'));
 pg_size_pretty
----------------
 85 MB
(1 ROW)

Il est possible dans Postgresql de monitorer très précisement la place utilisée par les tables et leurs index: Il s’agit d’utiliser les tables internes, et en particulier pg_class:

engineProd=# SELECT relname, relpages FROM pg_class WHERE relpages > 1000 ORDER BY relpages DESC;
           relname           | relpages
-----------------------------+----------
 obj_hash_index              |     4322
 obj_action_created_at_index |     1586
 obj_created_at_index        |     1527
 obj_st_to_index             |     1262
 obj_st_from_index           |     1248
 obj_status_index            |     1224
 obj_pkey                    |     1223

Le trick est de réindexer (avec REINDEX) la table après:

engineProd=# REINDEX TABLE obj;
REINDEX

Et le résultat est nettement plus appréciable:

engineProd=# SELECT pg_size_pretty(pg_total_relation_size('obj'));
 pg_size_pretty
----------------
 88 kB
(1 ROW)

Noter qu’il y a une page un peu plus technique à propos de tout cela dans le manuel de Postgresql.

Dump & réimport de bases de données postgresql

Juste pour le garder quelque part, voici la procédure simple pour faire un backup puis un import d’une base complète postgresql:

Export:

// dump de la base "db" appartenant à "dbUser"
$ pg_dump -Ft -O -U dbUser db | gzip -c - > /tmp/mydump.tar.gz

Import:

// création de la base et import:
$ createdb newdb -E UTF-8 -O dbUser
$ zcat /tmp/mydump.tar.gz | pg_restore -Ft -O -U dbUser -d newdb

Note: Je préfère utilise le format « tar », car généralement, un tar+gz pèse moins lourd qu’un export custom de ce que j’ai pu manipuler. Mais chacun se fera son avis en utilisant le flag -Ft (tar) ou -Fc (custom).
Note 2: On ne peut que faire des mises à jour vers des bases de version égales ou plus récentes… et j’ai appris cela en essayant d’importer en vain mon dump pgsql 8.4 sur une base 8.3 …