diff --git a/HowtoPostgreSQL.md b/HowtoPostgreSQL.md index 1cf9ab91..61cd7a6e 100644 --- a/HowtoPostgreSQL.md +++ b/HowtoPostgreSQL.md @@ -134,7 +134,7 @@ $ createuser -P $ createdb -O ~~~ -Comme pour les instances, par défaut la base sera créé avec l'encodage du système. Si le système est en UTF-8 par défaut, la base créée sera en UTF-8. On peut spécifier un encodage alternatif avec l'option `-E-`. +Comme pour les instances, par défaut la base sera créé avec l'encodage du système. Si le système est en UTF-8 par défaut, la base créée sera en UTF-8. On peut spécifier un encodage alternatif avec l'option `-E`. * Suppression d'une base de données : @@ -303,12 +303,12 @@ $ pg_restore -F c all.dump Optimisations pour la restauration : * paralléliser la restauration : `pg_restore -j ` (ne pas compter les cœurs hyperthreadés) ; -* augmenter autant que possible le `_maintenance_work_mem_` (attention, il sera multiplié par le nombre de jobs utilisés pour la restauration). Dans tous les cas, ne pas dépasser les 2 Go. Peut être fait dans la conf ou dans une session ; -* Définir le `_synchronous_commit_` à `_off_`. +* augmenter autant que possible le `_maintenance_work_mem_` (attention, il sera multiplié par le nombre de processus utilisés pour la restauration). Dans tous les cas, ne pas dépasser les 2 Go. Peut être fait dans la conf ou dans une session ; +* Mettre la directive `synchronous_commit` à `off`. #### Sauvegarde du datadir -Doc de référence : http://www.postgresql.org/docs/9.2/static/continuous-archiving.html +Doc de référence : http://www.postgresql.org/docs/9.4/static/continuous-archiving.html Le principe est le suivant : @@ -327,7 +327,7 @@ Ainsi, dès qu'un WAL est marqué comme complété (`pg_xlog/archive_status/*.re ~~~ postgres$ psql -c "SELECT pg_start_backup('evobackup')" -# rsync -a --delete --exclude /pg_xlog/* --exclude /postmaster.* ~postgres/9.2/main/ backup.example.com/backup/…/base/ +# rsync -a --delete --exclude /pg_xlog/* --exclude /postmaster.* ~postgres/9.4/main/ backup.example.com/backup/…/base/ postgres$ psql -c "SELECT pg_stop_backup()" ~~~ @@ -336,7 +336,7 @@ postgres$ psql -c "SELECT pg_stop_backup()" S'assurer que PostgreSQL est éteint, et restaurer le datadir : ~~~ -# rsync -a --exclude /pg_xlog/* backup.example.com/backup/…/base/ ~postgres/9.2/main/ +# rsync -a --exclude /pg_xlog/* backup.example.com/backup/…/base/ ~postgres/9.4/main/ ~~~ Attention à ne surtout pas effacer le contenu de `pg_xlog/`, qui peut contenir le dernier WAL courant (donc pas encore copié sur le serveur de backup). @@ -383,7 +383,7 @@ On peut maintenant "utiliser" notre base de données avec le client en ligne Pos ~~~ $ psql base login -ma_base=# +ma_base=> ~~~ Voici quelques commandes de base : @@ -402,8 +402,8 @@ SELECT current_date; = date actuelle Pour changer de base de données, deux possibilités : ~~~ -=# \c base; -=# USE base; +=> \c base; +=> USE base; ~~~ ### Création de table @@ -427,14 +427,14 @@ Remarque : on peut aussi définir ses propres types de données La syntaxe classique pour créer/supprimer une table : ~~~ -CREATE TABLE ma_table (col1 type, […], coln type); -DROP TABLE ma_table; +=> CREATE TABLE ma_table (col1 type, […], coln type); +=> DROP TABLE ma_table; ~~~ Pour la forme un petit exemple tiré de la doc de PostgreSQL : ~~~ -CREATE TABLE weather ( +=> CREATE TABLE weather ( city varchar(80), temp_lo int, -- low temperature temp_hi int, -- high temperature @@ -443,14 +443,14 @@ CREATE TABLE weather ( ); ~~~ -Note : deux tirets _--_ introduisent des commentaires +Note : deux tirets `--` introduisent des commentaires. Pour mettre à jour des tables : ~~~ -alter table evosondage_admin add cycle varchar(25); -alter table evosondage_admin alter column cycle set not null; -alter table evosondage_admin drop column annee; +=> ALTER TABLE evosondage_admin ADD cycle varchar(25); +=> ALTER TABLE evosondage_admin ALTER column cycle SET not null; +=> ALTER TABLE evosondage_admin DROP column annee; ~~~ ### Insertion de données @@ -458,37 +458,37 @@ alter table evosondage_admin drop column annee; Insertion de tous les champs d'une table : ~~~ -INSERT INTO weather VALUES ('San Francisco', 46, 50, 0.25, '1994-11-27'); +=> INSERT INTO weather VALUES ('San Francisco', 46, 50, 0.25, '1994-11-27'); ~~~ Insertion en précisant les champs : ~~~ -INSERT INTO weather (city, temp_lo, temp_hi, prcp, date) +=> INSERT INTO weather (city, temp_lo, temp_hi, prcp, date) VALUES ('San Francisco', 43, 57, 0.0, '1994-11-29'); ~~~ Insertion à partir d'un fichier externe : ~~~ -COPY weather FROM '/home/user/weather.txt'; +=> COPY weather FROM '/home/user/weather.txt'; ~~~ -Note : voir [http://www.postgresql.org/docs/current/interactive/sql-copy.html] +Note : voir http://www.postgresql.org/docs/current/interactive/sql-copy.html ### Gestion des indexes ~~~ -CREATE INDEX mytable_idx1 ON mytable(col1); -REINDEX TABLE mytable; -DROP INDEX mytable_idx1; +=> CREATE INDEX mytable_idx1 ON mytable(col1); +=> REINDEX TABLE mytable; +=> DROP INDEX mytable_idx1; ~~~ Pour réindexer une base de données complète : ~~~ $ psql mydb -=# REINDEX DATABASE mydb +=> REINDEX DATABASE mydb; ~~~ ### Extraction de données @@ -496,50 +496,47 @@ $ psql mydb Rien ne vaut des exemples : ~~~ -SELECT * FROM weather; -SELECT city, (temp_hi+temp_lo)/2 AS temp_avg, date FROM weather; -SELECT * FROM weatherWHERE city = 'San Francisco' AND prcp > 0.0; -SELECT DISTINCT city FROM weather ORDER BY city; +=> SELECT * FROM weather; +=> SELECT city, (temp_hi+temp_lo)/2 AS temp_avg, date FROM weather; +=> SELECT * FROM weatherWHERE city = 'San Francisco' AND prcp > 0.0; +=> SELECT DISTINCT city FROM weather ORDER BY city; ~~~ Avec des jointures : ~~~ -SELECT * FROM weather, cities WHERE city = name; -SELECT weather.city, weather.temp_lo, cities.location -FROM weather, cities WHERE cities.name = weather.city; -SELECT * FROM weather INNER JOIN cities ON (weather.city = cities.name); -SELECT * FROM weather LEFT OUTER JOIN cities ON -(weather.city = cities.name); -SELECT * FROM weather w, cities c WHERE w.city = c.name; +=> SELECT * FROM weather, cities WHERE city = name; +=> SELECT weather.city, weather.temp_lo, cities.location FROM weather, cities WHERE cities.name = weather.city; +=> SELECT * FROM weather INNER JOIN cities ON (weather.city = cities.name); +=> SELECT * FROM weather LEFT OUTER JOIN cities ON (weather.city = cities.name); +=> SELECT * FROM weather w, cities c WHERE w.city = c.name; ~~~ Avec des fonctions (Aggregate Functions) : ~~~ -SELECT max(temp_lo) FROM weather; +=> SELECT max(temp_lo) FROM weather; ~~~ -Attention, les "Aggregate Functions" ne peuvent être utilisées dans la clause WHERE +Attention, les "Aggregate Functions" ne peuvent être utilisées dans la clause WHERE. Ainsi la requête suivante est fausse : ~~~ -SELECT city FROM weather WHERE temp_lo = max(temp_lo); +=> SELECT city FROM weather WHERE temp_lo = max(temp_lo); ~~~ On devra donc faire : ~~~ -SELECT city FROM weather WHERE -temp_lo = (SELECT max(temp_lo) FROM weather); +=> SELECT city FROM weather WHERE temp_lo = (SELECT max(temp_lo) FROM weather); ~~~ On pourra bien sûr utilise _GROUP BY…_, _HAVING…_, etc. -Pour envoyer l'output dans un fichier : +Pour envoyer le résultat dans un fichier : ~~~ -SELECT * FROM weather WHERE temp_lo=10 \g '/tmp/output' +=> SELECT * FROM weather WHERE temp_lo=10 \g '/tmp/output' ~~~ ### Mise à jour des données @@ -547,8 +544,7 @@ SELECT * FROM weather WHERE temp_lo=10 \g '/tmp/output' Toujours avec un exemple : ~~~ -UPDATE weather SET temp_hi = temp_hi - 2, -temp_lo = temp_lo - 2 WHERE date > '1994-11-28'; +=> UPDATE weather SET temp_hi = temp_hi - 2, temp_lo = temp_lo - 2 WHERE date > '1994-11-28'; ~~~ ### Suppression des données @@ -556,13 +552,14 @@ temp_lo = temp_lo - 2 WHERE date > '1994-11-28'; Encore avec un exemple : ~~~ -DELETE FROM weather WHERE city = 'Hayward'; +=> DELETE FROM weather WHERE city = 'Hayward'; ~~~ Pour effacer toutes les données d'une table : ~~~ -DELETE FROM weather; +=> DELETE FROM weather; +~~~ ### Schémas @@ -571,7 +568,7 @@ Par défaut, PostgreSQL utilise le schéma *public* mais il est possible d'utili * Créer un nouveau schéma : ~~~ -=> CREATE SCHEMA foo +=> CREATE SCHEMA foo; ~~~ * Lister les schémas d'une base : @@ -586,7 +583,6 @@ Par défaut, PostgreSQL utilise le schéma *public* mais il est possible d'utili => \dt foo. => \di foo. ~~~ -~~~ ## Monitoring