lancer un vacuum full pour récupérer d’espace disque

Un détail à noter sur  l’autovacuum   c’est qu’il ne restitue pas l’espace qu’il libère dans le système d’exploitation. Au lieu de cela, il ne marque que l’espace comme libre, de sorte qu’il peut être utilisé plus tard de nouvelles lignes. Cela signifie que si vous avez un volume de 100 Go et que vous en supprimez la moitié, il occupera tout de même 100 Go, même si vous exécutez  VACUUM dessus. Pour contourner ce problème, Postgres a une commande  VACUUM FULL .

VACUUM FULL  prend une table existante et crée une nouvelle copie de la table. Cela permettra au système d’exploitation de récupérer tout l’espace libre utilisé auparavant par les lignes, mais il présente quelques inconvénients. L’implémentation actuelle de  VACUUM FULL  verrouille complètement la table en cours d’aspiration. Cela signifie que vous ne pourrez pas exécuter de requêtes ni insérer de données dans la table tant que VACUUM FULL n’est pas  terminé. En général, si vous voulez récupérer tout l’espace vide d’une table, au lieu d’utiliser  VACUUM FULL , vous devriez regarder pg_repack . L’extension pg_repack est une extension Postgres qui fournit une commande équivalente à  VACUUM FULL cela vous permet toujours d’exécuter des requêtes sur la table en cours de compactage

create table Test_vacumm (a int , b varchar(50), c varchar(80));
 
 insert into test_vacumm (a,b,c) select 1, md5('abdallah'::varchar), md5('abdallah'::varchar) from generate_series ( 1, 60000000 ) ;
INSERT 0 10000000

en lançant une requête de delete massive

delete from  test_vacumm;

DELETE 60000000

j’utilise cette petit requête

delete from  test_vacumm;


Pour récupérer les taille des différent table dans ma base de donnée

SELECT N.nspname || '.' || C.relname AS "relation",
    CASE WHEN reltype = 0
        THEN pg_size_pretty(pg_total_relation_size(C.oid)) || ' (index)'
        ELSE pg_size_pretty(pg_total_relation_size(C.oid)) || ' (' ||  pg_size_pretty(pg_relation_size(C.oid)) || ' data)'
    END AS "size (data)",
    COALESCE(T.tablespace, I.tablespace, '') AS "tablespace"
FROM pg_class C
LEFT JOIN pg_namespace N ON  (N.oid = C.relnamespace)
LEFT JOIN pg_tables T ON (T.tablename = C.relname)
LEFT JOIN pg_indexes I ON (I.indexname = C.relname)
LEFT JOIN pg_tablespace TS ON TS.spcname = T.tablespace
LEFT JOIN pg_tablespace XS ON XS.spcname = I.tablespace
WHERE nspname NOT IN ('pg_catalog','pg_toast','information_schema')
ORDER BY pg_total_relation_size(C.oid) DESC;


alors j’obtiens cette résultat

En lançant un vacuum FULL

VACUUM FULL verbose test_vacumm;

INFO: exécution du VACUUM sur « public.test_vacumm »
INFO: « test_vacumm » : 46347450 versions de ligne supprimables, 0 non supprimables
parmi 740741 pages
DÉTAIL : 0 versions de lignes ne peuvent pas encore être supprimées.
CPU 15.82s/13.03u sec elapsed 53.02 sec.

N’oubliez pas que VACUUM FULL nécessite un verrou exclusif sur la table afin que, pendant cette opération, votre table ne soit pas accessible.

aussi vous avez évidemment besoin d’un espace de stockage supplémentaire. il doit être au moins deux fois plus grand que la taille du table en question,. Si vous avez de la chance pouvez ajouter dynamiquement un disque à la machine

Comment effectuer une sauvegarde PostgreSQL de base à l’aide de l’utilitaire pg_basebackup

Bonjour Si vous utilisez l’envoi de journaux de transactions (
(or Point-In-Time-Recovery) ) pour protéger vos données, vous connaissez sûrement déjà pg_basebackup. L’idée derrière pg_basebackup est de permettre aux utilisateurs de créer une copie binaire des données, qui peut servir de base à la récupération ponctuelle

Afin de faire fonctionner cet outil pg_basebackup, nous devons d’abord définir certaines variables de configuration dans le fichier postgresql.conf qui se trouve généralement dans le répertoire de données

archive_mode = on
max_wal_senders = 2		# max number of walsender processes
archive_command = 'test! -f / var / lib / pgsql / pg_log_archive /% f && cp% p / var / lib / pgsql / pg_log_archive /% f 
wal_level = replica			# minimal, replica, or logical
Redémarrez le service PostgreSQL pour appliquer les modifications.
:~$ pg_ctlcluster 9.4 main restart

Pg_basebackup établit une connexion au protocole de réplication (exactement comme un client de réplication) sur le serveur PostgreSQL et crée une copie binaire des fichiers de données stockés dans le $PGDATA répertoire du serveur. La copie qu’il crée est cohérente – les fichiers correspondent exactement à l’état à la fin d’une transaction particulière

Créez un utilisateur avec le privilège de réplication car pg_basebackup a besoin du privilège de réplication pour créer une sauvegarde de base [il existe plusieurs façons de créer un utilisateur, je suis celui qui suit]:

su - postgres- postgres psql -c "CREATE ROLE base_backup_user REPLICATION LOGIN PASSWORD 'backupuser';"-c "CREATE ROLE base_backup_user REPLICATION LOGIN PASSWORD 'backup';"

Mettez à jour le fichier pg_hba.conf situé dans le répertoire de données postgres [/var/lib/pgsql/9.4/data] et ajoutez une règle pour activer cet utilisateur nouvellement créé sous la section de connexions de réplication de ce fichier, jusqu’à la fin du fichier:

                                                                                vi  /var/lib/pgsql/9.4/data/pg_hba.conf 
            host     replication     base_backup_user       127.0.0.1/32     trust             

Si vous craignez des transactions manquantes pendant la sauvegarde, vous pouvez demander à pg_basebackup d’extraire et d’inclure ces fichiers du journal des transactions (fichiers WAL) à l’aide des options -xou -X

Tar and Compressed Format
$ pg_basebackup -h localhost -p 5432 -U postgres -D /backupdir/latest_backup -Ft -z -Xs -P
 
Plain Format
$ pg_basebackup -h localhost -p 5432 -U postgres -D /backupdir/latest_backup -Fp -Xs -P

À ce stade, vous êtes prêt à effectuer une sauvegarde de base à l’aide de pg_basebackup.

Crée et utilisée le Fichier .PGPASS

Bonjour a tous

plus-petit-1

Le  fichier .pgpass vous permettra d’utiliser des outils CLI tels que psql et pg_dump sans avoir à saisir manuellement un mot de passe. Vous pouvez utiliser les programmes à partir de scripts sans les exécuter en tant qu’utilisateur non protégé par mot de passe.

Tout d’abord, créez le fichier .pgpass

#nano /root/.pgpass 

Selon la documentation officielle,  le format du fichier est le suivant:

nom d'hôte : port : base de données : nom d'utilisateur : mot de passe

Le fichier prend en charge l’utilisation de balises # pour les commentaires et * pour faire correspondre les caractères génériques. Voici un exemple de la mienne:

*: *: *: postgres: postgres

Entrez les informations de votre base de données et enregistrez.

Ensuite, définissez les autorisations. S’ils ne sont pas 600, Postgres ignorera le fichier.

#chmod 600 /root/.pgpass

Maintenant, comment pouvons-nous utiliser postgres? Une analyse rapide de la page de manuel psql montre

psql -d postgres -U postgres -w
#pg_dump -U postgres -w -Fc

PostgreSQL: Comment désinstaller PostgreSQL 9.6 SOUS Ubuntu

bonjour
Dans ce post, je partage les étapes nécessaires pour supprimer ou désinstaller PostgreSQL 9.6 sous Ubuntu Comme il s’agit de mon serveur de test, j’ai tout simplement désinstallé le programme d’installation complet, puis à nouveau l’installé
Veuillez vérifier ci-dessous les commandes que j’ai appliquées pour désinstaller PostgreSQL

Commencez par vérifier les dossiers associés à Postgres

ps aux | grep postgres 

Sans titre
la Commande suivantes vous permet de supprimer POstgresql sous ubunto

sudo apt-get --purge remove postgresql-9.6   postgresql-client  postgresql-client-9.6 

 

rm -rf /etc/postgresql/
rm -rf /var/lib/postgresql/
rm -rf /var/log/postgresql/

Capture du 2018-10-20 18-50-02

Maintenant vérifier bien que PostgreSQL est désinstallé, vérifiez si PSQL est en cours d’exécution ou non

PSQL -U postgres 
The program 'psql' is currently not installed. You can install it by typing:
sudo apt install postgresql-client-common

Tracer Drop Table dans Postgres

Comment Tracer l’instruction DROP TABLE dans le fichier journal de PostgreSQL?

Ci-dessus est une question connu  par les DBA PostgreSQL. Nous devrions enregistrer tout le type d’instructions  DDL dans le fichier log du postgres                                                   

Pour  Tracer  l’instruction DDL dans les fichiers journaux, nous devons modifier les paramètres suivants dans le fichier postgresql.conf

log_statement=’ddl’
log_line_prefix = ‘%t %c %u ‘ (time, sessionid, user)
logging_collector = ON

Sans titre

Par exemple:
J’ai supprimer la table « visit  » et j’ai modifier la table « card » 

Sans titre

Maintenant, je peux voir ci-dessous la ligne dans mon fichier journal

Sans titre

Bonne supervision

Error droping database Postgres

bonjour a tous

J’ai besoin de supprimer une base de données d’un cluster DB PostgreSQL en essayant de

le supprimer j’aurai un message bloquant qui dit qu’il est impossible de supprimer  la

base de donnée a cause de la présence des connexions actives et que la base il est en cours

d’utilisation

backup

alors j’ai essayer Tout d’abord de détecter les listes des connexions actives sur ma base de donnée backup a travers cette petit instruction

select * from pg_stat_activity where datname='backup'

Puis j’ai essayer de tuer ces connexion a travers  pg_terminate_backend(PID)

normalement Ce ci est possible a travers cette requête

select pg_terminate_backend(PID)from pg_stat_activity where datname='backup'

il exit une autre méthode qui vous permettre non seulement de Tuer les listes des connexions  existant mais aussi de fermer votre base de donnée   pour tout nouvelle demande de connexion

Ce ci en faisant  l’update de la colonne  datallowconn de la  VUE  PG_database

update pg_database set datallowconn=false  where  datname=’backup2′

Si datallowconn est faux, alors aucune nouvelle connexion à cette base de données ne sera autorisée
aussi La base de données template0 est normalement marquée datallowconn = false pour empêcher sa modification

Sans titre.png

Finalement j’ai arrivée a supprimer ma base de donnée après avoir fait l’update sur la Vue PG_database

n’hésitez pas a utiliser cette instruction si vous rencontrer prochainement un problème  a cause du présence des Transactions actives sur votre base

bonne Lecture a tous

pg_cancel_backend  vs pg_terminate_backend

bonjour

Pour faire tuer un Spid bloquant sous oracle on fait  ALTER SYSTEM KILL SESSION  sous SQL Server on fait un  KILL Spid

Alors comment le faire en Postgresql

Pour le faire en postgres alors c’est  pg_cancel_backend  et pg_terminate_backend

Quelle est la différence entre les deux?

Pour tester cette fonctionnalité, nous utilisons  la requête suivante

SELECT procpid, age(query_start, clock_timestamp()), usename, current_query
FROM pg_stat_activity
WHERE current_query != '' AND current_query NOT ILIKE '%pg_stat_activity%'
ORDER BY query_start desc;

un IDLE et une en cours d’exécution Qui a plus de 7 JOUS 

Capture

L’instruction suivante annule la requête avec le processus ID 46655 :

select pg_terminate_backend ( 466655);

*Pg_cancel_backend () :pg_cancel_backend (procpid de pg_stat_activity) doit être utilisé lorsque la requête est en cours d’exécution, la fonction n’aura pas d’impact lorsque la session est IDLE

L’ annulation de la requête peut prendre un certain temps en fonction du nettoyage / annulation des transactions

*Pg_terminate_backend ():termine l’opération entière et donc la connexion à la base de données

Lorsqu’un programme crée une connexion à la base de données et envoie des requêtes, vous pouvez annuler une requête sans détruire la connexion et arrêter les autres requêtes. Si vous détruisez toute la connexion, tout sera arrêté

-- Cancel all queries in an annoying database
	SELECT pg_cancel_backend(procpid)
	FROM pg_stat_activity
	WHERE datname = 'baddatabase';

	-- Cancel all queries by an annoying user
	SELECT pg_cancel_backend(procpid)
	FROM pg_stat_activity
	WHERE usename = 'baduser';
-- terminate process by annoying database
	SELECT pg_terminate_backend(procpid)
	FROM pg_stat_activity
	WHERE datname = 'baddatabase';

-- terminate process by an annoying user
	SELECT pg_terminate_backend(procpid)
	FROM pg_stat_activity
	WHERE usename = 'baduser';

cordialement

lancer une opération autovacum

bonjour

Dans ce article on va voir comment lancer l’autovacum a travers PgAdmin

Définition de VACUUM:c’est une opération du maintenance qui permet de récupère l’espace de stockage occupé par des lignes mortes si ont dit ligne mort se sont les lignes supprimer donc pour récupérer l’espace physique de ces lignes il faut lancer opération vacuum   

Ci joint les 3 Option pour lancer l’opération Vacuum

  • FULL récupère plus d’espace  mais est beaucoup plus long et prend un verrou exclusif sur la table  .
  • FREEZE :  VACUUM FREEZE aura pour résultat de geler toutes les lignes de la base. Donc, tant que la base n’est pas modifiée, aucun nettoyage supplémentaire n’est nécessaire.
  • ANALYZE : Met à jour les statistiques utilisées par l’optimiseur pour déterminer la méthode la plus efficace pour exécuter une requête

Pour lancer un Vacuum  —>menu outil –>Maintenance…

pg_admin

Cocher Option analyse ,pour l’option Full c’est une commande consommatrice du ressource   elle verrouille les tables sur lesquelles vous travailler et que son exécution peut prendre du temps.Il est généralement recommandé de l’exécuter une fois par jour, en période creuse

pagadmin2

Sans titre

Finalement le gain avec le vacuum peut-être énorme donc n’hésitez pas a faire ces opération du maintenance

cordialement

Optimiser vos requêtes avec les indexes Partial Postgresql

bonjour

Un des objectifs des bases de données est de stocker l’information tout en l’organisant de manière à pouvoir y accéder rapidement  il y a plusieurs manières d’accéder à l’information. Pour accéder à une ligne donnée d’une table

Postgresql dispose de plusieurs solutions que nous expliquerons sous peu. Citons parmi celles-ci par exemple le « parcours complet de table » ou « seq scan« , le « parcours d’index » ou « Seq index » … ou aussi Index partiels  c’est ce dont nous allons parler aujourd’hui

Un index partiel est un index construit sur un sous-ensemble d’une table ; le sous-ensemble est défini par une expression conditionnelle (appelée prédicat de l’index partiel). L’index ne contient des entrées que pour les lignes de la table qui satisfont au prédicat. Les index partiels sont une fonctionnalité spécialisée, mais ils trouvent leur utilité dans de nombreuses situations.

Un index partiel est utile pour les conditions where fréquentes qui utilisent des valeurs constantes

voyant cette petit exemple

with cte as(select row_number()over(partition by matricule order by date_capture)as classement ,person_id,matricule,template,date_capture,First_name,last_name from finger_print fp INNER JOIN person p
on fp.person_id=p.id
where finger_type='Segma'
)select * from cte
where classement=1
order by date_capture desc

le plan d’execution du cette requéte avec aucun index montre une opération de type scan_table avec un coût d’exécution de 2820ms

Sans titre

commençons a jouer avec les choses en ajoutant cette petit index

create index indexe_partiel on finger_print(finger_type)
where finger_type=’Segma’

ci joint le nouveau plan exécution, régénérer et le temps a été minimiser vers 213ms

et l’opération scan_table a été remplacer par  un scan_index et non pas n’importe quel index mais un index partiel

Sans titre2

Une base de données peut utiliser un index partiel à chaque fois qu’une clausewhere apparaît dans une requête

bonne optimisation

Installation PostgreSQL 9.6 sur CentOS 6

bonjour

Ci joint la procédure Technique qui vous permet d’installer un serveur Postgresql sur un système centos

Procédure

*Installation des paquets
Un fichier PGDG est disponible pour chaque combinaison de distribution / architecture / base de données. sur ce site https://www.postgresql.org/download/
Par exemple, pour installer PostgreSQL 9.6 sur CentOS 7 64-bit: yum install
Sans titre1
Installez le RPM qui correspond à votre version d’OS et la version de PostgreSQL que vous voulez
RPM -IVH
Sans titre2.png
Sans titre3
Maintenant, il n’y a plus qu’à lancer l’installation avec yum  Rien de plus simple :
Yum install postgresql96-server

Sans titre4

Puis Lancez les commandes suivante pour initaliser et démarrer le serveur PostgreSQL.  vous pouvez choisir de démarrer le service automatiquement à chaque reboot du serveur

La première commande (nécessaire uniquement une fois) consiste à initialiser la base de données dans PGDATA

Service postgresql-9.6 initdb

Sans titre5

la deuxième commande pour un démarrage automatique du service postgresql9.6 lorsque le système d’exploitation démarre

chkconfig postgresql-9.6 on

Sans titre6

Configuration

Ouvrir le fichier  vi  /var/lib/pgsql/9.6/data/postgresql.conf et ajouter/dé-commenter/modifier les lignes suivantes :

Ce ci pour autoriser les machines a ce connecter sur votre serveur

listen_addresses = '*'
port = 5432

Sans titre7

Ouvrir le fichier  vi  /var/lib/pgsql/9.6/data/pg_hba.conf

et ajouter/dé-commenter/modifier les lignes suivantes :

# TYPE DATABASE USER ADDRESS METHOD

# « local » is for Unix domain socket connections only
local all all peer
# IPv4 local connections:
host all all 10.0.0.0/24 trust
# IPv6 local connections:
host all all ::1/128 ident
# Allow replication connections from localhost, by a user with the
# replication privilege.
#local replication postgres peer
#host replication postgres 127.0.0.1/32 ident
#host replication postgres ::1/128 ident

Sans titre8

Après ces modification et aprés avoir redémarrer le service postgresql  j’ai essayer de connecter a travers PGadmin3 j’était devant ce message bloquant :

le serveur n’écoute pas:Le serveur n’accepte pas les connexion

Sans titre9

maintenant il faut donner l’accé au port 5342 pour ce connecter depuis  l’extérieur
généralement pour autorisé l’accès au instant postgres

voici la commande

iptables -I INPUT 1 -m tcp -p tcp –dport 5432 -j ACCEPT

puis faite service iptables save && service iptables restart

Sans titre10

Finalement j’ai arriver a connecter sur les serveur

Il ne reste plus qu’à vérifier que tout fonctionne, en ce connectant au serveur a travers PSQL

 psql -h localhost -U postgres

Sans titre11

bonne installation