Ces temps c i j'effectue pas mal de migration PostgreSQL, du coup je vais vous mettre a disposition un petit WIKI qui vous permet de prendre en main PostGreSQL. Cela me serre egalement de WIKI car il est parfois pas evident de se souvenir des commandes de base.
Pour se connecter sous Linux en ligne de commande, on basculera en utilisateur postgres :
su - postegres
Ensuite on lance la commande :
psql
Pour se connecter a une base de donnée distance via l'IP ou son nom DNS
psql "postgresql://login:password@host:port/database?sslmode=require"
Si vous êtes sous Windows Il est possible d'utiliser des logiciels graphiques comme pgAdmin ou HeidiSQL.
Une fois connecté en ligne de commande on est sur la base postgres :
Pour lister les bases de données :
defaultdb=> \l
defaultdb=> \l+
Pour se connecter à une base de données :
defaultdb=> \c kermit01
On a une sortie nous indiquant la bascule :
\c kermit01psql (12.18 (Ubuntu 12.18-0ubuntu0.20.04.1), server 14.13)WARNING: psql major version 12, server major version 14. Some psql features might not work.SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)You are now connected to database "kermit01" as user "doadmin".kermit01=>
Le prompt change avec le nom de la base de données :
kermit01=>
Pour lister les tables :
kermit01=> \dt
pour quitter
kermit01=> \q
Pour crée une base de données, saisir simplement (exemple avec gonzo_test) :
CREATE DATABASE gonzo_testWITHOWNER = doadminENCODING = 'UTF8'LC_COLLATE = 'en_US.UTF-8'LC_CTYPE = 'en_US.UTF-8'TABLESPACE = pg_defaultCONNECTION LIMIT = -1;
Pour la supprimer (exemple avec gonzo_test) :
DROP DATABASE gonzo_test
Pour se connecter à la base :
Gestion des utilisateurs
Créer des utilisateurs
CREATE ROLE adrien WITH LOGIN NOSUPERUSER NOCREATEDB NOCREATEROLE INHERIT NOREPLICATION CONNECTION LIMIT -1 PASSWORD 'SuperMot2Passe';
Attribuer des droits aux utilisateurs
Pour attribuer tous les droits à un utilisateur (en faire en quelque sortes un deuxième root) :
Changer un mot de passe d'utilisateur de PostgreSQL
Cette commande fonctionne uniquement pour PostgreSQL :
Copier vers le presse-papierCode SQL :
ALTER USER adrien WITH PASSWORD 'SuperMot2Passe!';
Pour voir les utilisateurs créés :
Copier vers le presse-papierCode SQL :
\du
Pour un utilisateur donné, on peut voir ses droits de la façon suivante :
[code=sql][/code]
Si on souhaite renommer un utilisateur, on utilisera ALTER USER :
Copier vers le presse-papierCode SQL :
ALTER USER adrien RENAME TO nouveauadrien;
Pour créer une table simple, voici un exemple :
Copier vers le presse-papierCode SQL :
CREATE TABLE table1 ( id serial PRIMARY KEY, message text );
Ici serial est in entier qui s'autoincrémente.
Donner les droits d'une table à un utilisateur (table1 à adrien) :
Copier vers le presse-papierCode SQL :
ALTER TABLE table1 OWNER TO adrien;
Ici, on retrouve des commandes d'admin avancées.
Lorsqu'on modifie le fichier pg_hba.conf, pour prendre en compte les nouveaux paramétrages à chaud (sans interrompre la prod), on va pouvoir lancer la commande SQL suivante :
Copier vers le presse-papierCode BASH :
SELECT pg_reload_conf();
Quand on a une base avec 6300 tables, pas facile de changer le propriétaire des tables.
Voici un script BASH (oneliner) utilisant la commande psql depuis l'utilisateur postgres :
Copier vers le presse-papierCode BASH :
for tbl in `psql -qAt -c "select tablename from pg_tables where schemaname = 'public';" VOTRE_BDD` ; do psql -c "alter table \"$tbl\" owner to NEW_OWNER" VOTRE_BDD; done
Quand on a une base avec 6300 tables, pas facile de supprimer toutes les tables. L'idée est de réimporter un dump sans recréer la base.
Voici un script BASH (oneliner) utilisant la commande psql depuis l'utilisateur postgres :
Copier vers le presse-papierCode BASH :
for tbl in `psql -qAt -c "select tablename from pg_tables where schemaname = 'public';" VOTRE_BDD` ; do psql -c "drop table \"$tbl\" CASCADE " VOTRE_BDD ; done
Si vous souhaiter réimporter une base (et donc supprimer et recréer la base) et qu'elle est en cours d'utilisation, vous pouvez avoir ce type de message :
Copier vers le presse-papierCode :ERREUR: la base de données « adrien_test » est en cours d'utilisation par d'autres utilisateurs
DÉTAIL : 3 autres sessions utilisent la base de données.
Récupérez les PID des connexions (exemple avec la base adrien_test) :
Copier vers le presse-papierCode SQL :
SELECT pid FROM pg_stat_activity WHERE datname='adrien_test';
Vous avez une sortie de ce type :
Copier vers le presse-papierCode TEXT :
pid --------- 2633163 2633180 2633196 (3 lignes)
Il suffit de kill les sessions avec cette commande :
Copier vers le presse-papierCode SQL :
SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE pid IN (2633163, 2633180 ,2633196 );
On a un retour "t" sur chaque connexion terminées :
Copier vers le presse-papierCode TEXT :
pg_terminate_backend ---------------------- t t t (3 lignes)
On peut le faire en oneliner avec pg_dump suivi de psql (depuis la console Linux connecté en root OU postgres) :
Copier vers le presse-papierCode BASH :
pg_dump -U postgres adrien_db | psql -d adrien_db_copie -U postgres