Formation DBA1
Dalibo SCOP
8 janvier 2018
Vous êtes libres de redistribuer et/ou modifier cette création selon les conditions suivantes :
Paternité
Pas d'utilisation commerciale
Partage des conditions initiales à l'identique
Apparitions de la communauté internationale
OVER
)'EXPLAIN
UNIQUE
différableGRANT ALL
WHEN
pg_basebackup
utilisable sur un esclaveLATERAL
dans un SELECT
COPY FREEZE
BRIN
INSERT ... ON CONFLICT { UPDATE | IGNORE }
SKIP LOCKED
SQL/MED
pg_stat_statements
, ajout de pg_stat_ssl
GROUPING SETS
, CUBE
et ROLLUP
)VACUUM FREEZE
, CHECKPOINT
, ancien snapshotSAVEPOINT
disponible pour sauvegarde des modifications d'une transaction à un instant t
BEGIN ISOLATION LEVEL xxx;
read commited
repeatable read
serializable
Création de types de données et
pg_hba.conf
Les algorithmes suivants sont supportés :
B-tree
(par défaut)GiST
/ SP-GiST
Hash
GIN
(version 8.2
)BRIN
(version 9.5
)CHECK
: prix > 0
NOT NULL
: id_client NOT NULL
id_client UNIQUE
UNIQUE NOT NULL
==> PRIMARY KEY (id_client)
produit_id REFERENCES produits(id_produit)
EXCLUDE
: EXCLUDE USING gist (room WITH =, during WITH &&)
INSERT
, COPY
, UPDATE
, DELETE
TRUNCATE
FOR STATEMENT
)FOR EACH ROW
)Site de petites annonces :
N'hésitez pas, c'est le moment !
Étapes :
$ tar xvfj postgresql-<version>.tar.bz2
$ cd postgresql-<version>
$ ./configure
$ make
$ make install
--prefix=
répertoire--with-pgport=
port--with-openssl
--enable-nls
--with-perl
$ pg_config --configure
check
de la commande make
$ make check
export PATH=/usr/local/pgsql/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/pgsql/lib:$LD_LIBRARY_PATH
export MANPATH=$MANPATH:/usr/local/pgsql/share/man
export PGDATA=/usr/local/pgsql/data
$ initdb --data /usr/local/pgsql/data
--data
pour les fichiers de données--waldir
pour les journaux de transactions--pwprompt
pour configurer immédiatement le mot de passe de l'utilisateur postgres
--data-checksums
pour ajouter des sommes de contrôle sur les fichier de données# /etc/init.d/postgresql [action]
$ pg_ctl --pgdata /usr/local/pgsql/data --log logfile [action]
[action]
dépend du besoin
apt-get install postgresql-<version majeure>
yum install postgresqlxx-server
postgres
systèmepostgres
pg_hba.conf
postgresql.conf
Installation
N'hésitez pas, c'est le moment !
Les outils graphiques et console :
PostgreSQL
createdb
: ajouter une nouvelle base de donnéescreatelang
: ajouter un langage de procédures à une base (<v10)createuser
: ajouter un nouveau compte utilisateurdropdb
: supprimer une base de donnéesdroplang
: supprimer un langage de procédures (<v10)dropuser
: supprimer un compte utilisateurpg_dumpall
: sauvegarder l'instance PostgreSQLpg_dump
: sauvegarder une base de donnéespg_restore
: restaurer une base de données PostgreSQLvacuumdb
: récupérer l'espace inutilisé (VACUUM FULL
) et/ou mettre à jour les statistiques de l'optimiseur (ANALYZE
)reindexdb
: réindexer une base de données PostgreSQLclusterdb
: réorganiser une table en fonction d'un indexpg_ctl
: lancer, arrêter, relancer, promouvoir le serveur PostgreSQL-W | --password
-w | --no-password
$PGPASSWORD
.pgpass
nom_hote:port:database:nomutilisateur:motdepasse
postgres$ psql
base=#
\? [motif]
\h [motif]
\q
\encoding [ENCODING]
\password [USERNAME]
\conninfo
\connect [DBNAME|- USER|- HOST|- PORT|-]
\c [DBNAME|- USER|- HOST|- PORT|-]
\timing
\! [COMMAND]
\cd [DIR]
\l
\dn
\d{t|i|s|v|m}[S][+] [motif]
\df[+] [motif]
\da [motif]
\du[+]
\dp
\ddp
\drds
\db
\dx
\dD[S+]
\dT[S+]
\do [motif]
\dF [motif]
\dFd [motif]
\dFt [motif]
\dFp [motif]
\dc [motif]
\dC [motif]
\sv
\sf
;
\g
\gx
ctrl-R
suivi d'un extrait de texte représentatif\gexec
\e
\ev nom_vue
\ef nom_fonction
\g [FICHIER]
\p
\w [FICHIER]
\r
\i FICHIER
\o FICHIER
\echo texte...
\qecho texte...
\set [NOM [VALEUR]]
\unset NOM
ON_ERROR_STOP
: on
ou off
ON_ERROR_ROLLBACK
: on
, off
ou interactive
AUTOCOMMIT
: on
ou off
\if
\elif
\else
\endif
${HOME}
.psqlrc-X.Y
.psqlrc-X
.psqlrc
.psqlrc
contient des méta-commandes \set
\set ON_ERROR_ROLLBACK interactive
-c "ordre SQL"
-f nom_fichier.sql
\i nom_fichier.sql
AUTOCOMMIT
BEGIN;
COMMIT;
-1
ou --single-transaction
\encoding
Positionner des variables
\set nom_table 'ma_table'
SELECT * FROM :"nom_table";
\set valeur_col1 'test'
SELECT * FROM :"nom_table" WHERE col1 = :'valeur_col1';
\prompt 'invite' nom_variable
\unset variable
ON_ERROR_ROLLBACK
ON_ERROR_STOP
-A | --no-align
-t | --tuples-only
-x | --expanded
-H | --html
-T TEXT | --table-attr TEXT
-F CHAINE | --field-separator CHAINE
-z | --field-separator-zero
-R CHAINE | --record-separator CHAINE
-0 | --record-separator-zero
\crosstabview [ colV [ colH [ colD [ sortcolH ] ] ] ]
\pset option [ valeur ]
\pset expanded on
\pset title 'Résultat de la requête
'\pset format html
crontab -e
Sauvegarder une base et classer l'archive
#!/bin/bash
t=`mktemp`
pg_dump $1 | gzip > $t
d=`eval date +%d%m%y-%H%M%S`
mv $t /backup/${1}_${d}.dump.gz
exit 0
" temBoard est un outil permettant à un DBA de mener à bien la plupart de ses tâches courantes.
Le serveur web est installé de façon centralisée et un agent est déployé pour chaque instance.
vacuum
, analyze
, reindex
)
Notes: Multiplateforme
Mais ne semble plus maintenu
N'hésitez pas, c'est le moment !
pg_database
\l
dans psql
template1
est utiliséeCREATE DATABASE
createdb
DROP DATABASE
dropdb
ALTER DATABASE
CREATE/DROP/ALTER USER
CREATE/DROP/ALTER GROUP
pg_roles
\du
dans psql
CREATE ROLE
createuser
LOGIN
par défautDROP ROLE
dropuser
ALTER ROLE
GRANT
REVOKE
WITH GRANT OPTION
SET ROLE
pg_hba.conf
local
host
hostssl
hostnossl
hostssl
nécessite d'avoir activé ssl
dans postgresql.conf
all
(pour toutes les bases)sameuser
, samerole
(pour la base de même nom que le rôle)replication
(pour les connexions de réplication)all
(pour tous les rôles)host
, hostssl
et hostnossl
map
trust
reject
password
md5
ldap
, radius
, cert
gss
, sspi
ident
, peer
, pam
bsd
crypt
depuis la version 8.4krb5
depuis la version 9.3Un exemple:
TYPE DATABASE USER CIDR-ADDRESS METHOD
local all postgres ident
local web web md5
local sameuser all ident
host all postgres 127.0.0.1/32 ident
host all all 127.0.0.1/32 md5
host all all 89.192.0.3/8 md5
hostssl recherche recherche 89.192.0.4/32 md5
à ne pas suivre…
VACUUM
ANALYZE
REINDEX
default_statistics_target
REINDEX
régulièrement permet
VACUUM
ne provoque pas de réindexationVACUUM FULL
réindexeCLUSTER
, alternative à VACUUM FULL
VACUUM FULL
suivi de REINDEX
avant la 9.0CLUSTER
nécessite près du double de l'espace disque utilisé pour stocker la table et ses indexpg_dump
pg_dumpall
pg_dump -f b1.dump b1
PostgreSQL demande peu de travail au quotidien.
À l'installation, certaines tâches doivent être automatisées, par exemple la sauvegarde, les VACUUM
.
Pour le reste, il s'agit surtout de surveiller la bonne exécution des scripts automatisés et le contenu des journaux applicatifs.
N'hésitez pas, c'est le moment !
pg_dump
pg_dumpall
-F
p
: plain, SQLt
: tarc
: custom (spécifique PostgreSQL)d
: directory-Z
: de 0 Ã 9-f
: fichier où est stockée la sauvegarde-f
, sur la sortie standard--schema-only
ou -s
: uniquement la structure--data-only
ou -a
: uniquement les données--section
pre-data
, la définition des objets (hors contraintes et index)data
, les donnéespost-data
, la définition des contraintes et index-n <schema>
: uniquement ce schéma-N <schema>
: tous les schémas sauf celui-là -t <table>
: uniquement cette table-T <table>
: toutes les tables sauf celle-là --exclude-table-data=<table>
--strict-names
-j <nombre_de_threads>
-O
: ignorer le propriétaire-x
: ignorer les droits--no-tablespaces
: ignorer les tablespaces--inserts
: remplacer COPY par INSERT-v
: pour voir la progression-F
p
: plain, SQL-f
: fichier où est stockée la sauvegarde-f
, sur la sortie standard-g
: tous les objets globaux-r
: uniquement les rôles-t
: uniquement les tablespaces--no-role-passwords
: pour ne pas sauvegarder les mots de passe
-h
/ $PGHOST
/ socket Unix-p
/ $PGPORT
/ 5432-U
/ $PGUSER
/ utilisateur du système$PGPASSWORD
.pgpass
pg_dump | bzip2
-b
-n
/-N
et/ou -t
/-T
--no-blobs
bytea_output
escape
hex
-f
pour indiquer le fichier contenant la sauvegarde
-f
, lit l'entrée standard-1
pour tout restaurer en une seule transaction-e
pour afficher les ordres SQL exécutésON_ERROR_ROLLBACK
/ON_ERROR_STOP
-F
inutile, même si présent)-f
(fichier en sortie)-s
: uniquement la structure-a
: uniquement les données--section
pre-data
, la définition des objets (hors contraintes et index)data
, les donnéespost-data
, la définition des contraintes et index-n <schema>
: uniquement ce schéma-N <schema>
: tous les schémas sauf ce schéma-t <table>
: cette relation-T <trigger>
: ce trigger-I <index>
: cet index-P <fonction>
: cette fonction--strict-names
, pour avoir une erreur si l'objet est inconnu-l
: récupération de la liste des objets-L <liste_objets>
: restauration uniquement des objets listés dans ce fichier-j <nombre_de_threads>
-O
: ignorer le propriétaire-x
: ignorer les droits--no-tablespaces
: ignorer le tablespace-1
pour tout restaurer en une seule transaction-c
: pour détruire un objet avant de le restaurerANALYZE
après une restaurationSimplicité | Coupure | Restauration | Fragmentation | |
---|---|---|---|---|
copie à froid |
facile |
longue |
rapide |
conservée |
snapshot FS |
facile |
aucune |
rapide |
conservée |
pg_dump |
facile |
aucune |
lente |
perdue |
rsync + copie à froid |
moyen |
courte |
rapide |
conservée |
PITR |
difficile |
aucune |
rapide |
conservée |
N'hésitez pas, c'est le moment !
check_postgres
, en corrigeant certainescheck_postgres
log_destination
logging_collector
log_directory
, log_filename
, log_file_mode
log_rotation_age
, log_rotation_size
, log_truncate_on_rotation
syslog
(Unix)eventlog
(Windows)log_min_messages
log_min_error_statement
log_error_verbosity
log_min_duration_statement
log_statement
log_duration
log_connections
, log_disconnections
log_autovacuum_min_duration
log_checkpoints
log_lock_waits
log_temp_files
log_line_prefix
lc_messages
log_timezone
log_statement et log_duration
log_min_duration_statement
Exemple:
LOG: duration: 112.615 ms statement: select * from t1 where c1=4;
PANIC: could not write to file "pg_wal/xlogtemp.9109":
No space left on device
LOG: received SIGHUP, reloading configuration files
LOG: temporary file: path "base/pgsql_tmp/pgsql_tmp9894.0",
size 26927104
log_destination
, log_line_prefix
et lc_messages
log_connections
, log_disconnections
log_checkpoints
, log_lock_waits
, log_temp_files
log_autovacuum_min_duration
log_min_duration_statement
--outfile
--begin
, --end
--dbname
, --dbuser
, --dbclient
, --appname
--logfile
, les fichiers à traiter--service
, filtre sur le service unique à traiter--detail
, niveau de détails du rapport--print
, pour afficher le rapport sur la sortie standard--save
, pour sauvegarder le rapport dans un fichier--mailto
, pour envoyer le rapport par mail/usr/sbin/logwatch --detail Med --service postgresql --range All
/usr/sbin/logwatch --detail Med --service postgresql \
--range Yesterday --output mail \
--mailto admin@mydom.com --format html
EMAIL: astreinte@dalibo.com
MAILSUBJECT: HOST Postgres fatal errors (FILE)
FILE: /var/log/postgresql-%Y-%m-%d.log
INCLUDE: PANIC:
INCLUDE: FATAL:
EXCLUDE: database ".+" does not exist
INCLUDE: temporary file
INCLUDE: reloading configuration files
Exemple:
[1] Between lines 123005 and 147976, occurs 39 times.
First: Jan 1 00:00:01 rojogrande postgres[4306]
Last: Jan 1 10:30:00 rojogrande postgres[16854]
Statement: user=root,db=rojogrande
FATAL: password authentication failed for user "root"
track_activities
track_activity_query_size
track_counts
track_io_timing
track_functions
stats_temp_directory
SELECT datname, numbackends FROM pg_stat_database GROUP BY 1;
SELECT datname, count(*) FROM pg_stat_activity WHERE datname IS NOT NULL GROUP BY 1;
SELECT datname, pg_database_size(oid) FROM pg_database;
SELECT d.datname, count(*) FROM pg_locks l
JOIN pg_database d ON l.database=d.oid
GROUP BY d.datname ORDER BY d.datname;
hitratio
)check_postgres
et check_pgactivity
check_postgres.pl