Quand j'ai commencé, j'ai utilisé pg_dump
avec le format standard par défaut. Je n'étais pas éclairé.
Des recherches m'ont révélé des améliorations de temps et de taille de fichier avec pg_dump -Fc | gzip -9 -c > dumpfile.gz
. J'étais éclairé.
Quand est venu le temps de recréer la base de données,
# create tablespace dbname location '/SAN/dbname';
# create database dbname tablespace dbname;
# alter database dbname set temp_tablespaces = dbname;
% gunzip dumpfile.gz # to evaluate restore time without a piped uncompression
% pg_restore -d dbname dumpfile # into a new, empty database defined above
Je ne me sentais pas éclairé: la restauration a pris 12 heures pour créer la base de données qui n'est qu'une fraction de ce qu'elle deviendra:
# select pg_size_pretty(pg_database_size('dbname'));
47 GB
Parce qu'il y a des prédictions que cette base de données sera de quelques téraoctets, je dois maintenant chercher à améliorer les performances.
Veuillez m'éclairer.
Vérifiez d'abord que vous obtenez des performances IO raisonnables à partir de la configuration de votre disque. Vérifiez ensuite que votre installation PostgreSQL est correctement réglée. En particulier shared_buffers
doit être défini correctement, maintenance_work_mem
devrait être augmenté pendant la restauration, full_page_writes
devrait être désactivé pendant la restauration, wal_buffers
devrait être porté à 16 Mo lors de la restauration, checkpoint_segments
devrait être augmenté à quelque chose comme 16 pendant la restauration, vous ne devriez pas avoir de connexion déraisonnable (comme la journalisation de chaque instruction exécutée), auto_vacuum
doit être désactivé pendant la restauration.
Si vous êtes sur 8.4, essayez également la restauration parallèle, l'option --jobs pour pg_restore.
Deux problèmes/idées:
En spécifiant -Fc, la sortie pg_dump est déjà compressée. La compression n'est pas maximale, vous pouvez donc trouver des économies d'espace en utilisant "gzip -9", mais je parierais que ce n'est pas suffisant pour garantir le temps supplémentaire (et les E/S) utilisé pour compresser et décompresser la version -Fc de la sauvegarde .
Si vous utilisez PostgreSQL 8.4.x, vous pouvez potentiellement accélérer la restauration à partir d'une sauvegarde -Fc avec la nouvelle option de ligne de commande pg_restore "-j n" où n = nombre de connexions parallèles à utiliser pour la restauration. Cela permettra à pg_restore de charger plus de données d'une table ou de générer plus d'un index en même temps.
PG_DUMP | utilisez toujours le répertoire de format avec -j
option
time pg_dump -j 8 -Fd -f /tmp/newout.dir fsdcm_external
PG_RESTORE | utilisez toujours le réglage pour postgres.conf avec le répertoire de format Avec -j
option
work_mem = 32MB
shared_buffers = 4GB
maintenance_work_mem = 2GB
full_page_writes = off
autovacuum = off
wal_buffers = -1
time pg_restore -j 8 --format=d -C -d postgres /tmp/newout.dir/`
Pour plus d'informations
https://github.com/YanarAssaf/PostgreSQL/wiki/Improve-pg-dump%7Crestore
Je suppose que vous avez besoin d'une sauvegarde, pas d'une mise à niveau majeure de la base de données.
Pour la sauvegarde de grandes bases de données, vous devez configurer archivage contin au lieu de pg_dump
.
Faites vos sauvegardes de base par exemple tous les jours en utilisantpsql template1 -c "select pg_start_backup('
`date +% F-% T '' ') "rsync -a --delete/var/lib/pgsql/data// var/backups/pgsql/base/psql template1 -c" select pg_stop_backup () "`
Une restauration serait aussi simple que de restaurer la base de données et les journaux WAL qui ne sont pas antérieurs à pg_start_backup
temps depuis l'emplacement de sauvegarde et le démarrage de Postgres. Et ce sera beaucoup plus rapide.
zcat dumpfile.gz | pg_restore -d db_name
Supprime l'écriture complète des données non compressées sur le disque, qui est actuellement votre goulot d'étranglement.
Comme vous l'avez peut-être deviné simplement du fait que la compression de la sauvegarde entraîne des performances plus rapides, votre sauvegarde est liée aux E/S. Cela ne devrait pas être surprenant, car la sauvegarde sera presque toujours liée aux E/S. La compression des données échange la charge d'E/S contre la charge du processeur, et comme la plupart des processeurs sont inactifs pendant les transferts de données monstres, la compression est un gain net.
Ainsi, pour accélérer les temps de sauvegarde/restauration, vous avez besoin d'E/S plus rapides. Au-delà de la réorganisation de la base de données pour ne pas être une énorme instance unique, c'est à peu près tout ce que vous pouvez faire.