PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#126 Général » Dupliquer la structure d'un schéma » 04/12/2014 17:10:59

mortimer.pw
Réponses : 13

Bonjour tout le monde,
Je travaille sous CenOS 6.4 avec un moteur PostgreSQL 9.3.2.
Je cherche un moyen de dupliquer le contenu d'un schéma (pas les données mais la structure des tables, les vues, les fonctions, les séquences, enfin tout) dans un autre.
Tout ce que j'ai trouvé tourne autour de l'utilisation d'un dump/restore ou d'un "clone schema" sur wiki mais qui ne serait pas complet.
J'aurais voulu pouvoir le faire par une procédure stockée liée à un trigger.
Est-ce possible aujourd'hui ? Existe-t'il un "projet" complet ?

#127 Sécurité » Accès Schéma » 03/12/2014 11:43:46

mortimer.pw
Réponses : 1

Bonjour tout le monde,
Je travaille sous CenOS 6.4 avec un moteur PostgreSQL 9.3.2.
J'utilise PgAdmin 1.18.1 depuis un PC.
Pourriez-vous me confirmer que l'on ne peut empêcher un User B de voir le contenu du schéma (description des tables) d'un User A, même s'il ne peut "rien faire avec", svp ?

#128 Re : Optimisation » Ratio Lecture/Ecriture » 13/11/2014 11:11:04

Bonjour Guillaume,
Ok. Pas de warning.
Que du recyclage, une moyenne de 3 à 4 fichiers par heure.
Quelques pics d'écriture, dont un "Checkpoint Peak" de 48027 buffers (quelle est la taille d'un buffer ?), qui correspondent à un traitement journalier qui fait beaucoup d'INSERT/UPDATE.
Dans une précédente réponse, vous me disiez "Le nombre de blocs écrits par le checkpointer et le writer est plus important que le nombre de blocs écrits par les processus postgres. Ce qui est bien. Il n'empêche que le ratio est plutôt inquiétant. Ça peut être dû à l'utilisation de peu de connexions, à un cache trop petit ou à des checkpoints peu fréquents.", comment identifier la cause ? pas de warning donc les checkpoints peu fréquents sont écartés ?

#129 Re : Optimisation » Ratio Lecture/Ecriture » 07/11/2014 09:23:38

Bonjour Guillaume,
J'ai relancé PgBadger comme cela :
pgbadger -p '%t [%p]: [%l-1] user=  %s ' -o /home/postgres/pgbadger-5.0/test.html /home/postgres/pgbadger-5.0/LOGS/1-08.log
J'ai à présent les graphs des checkpoints, pas de warnings.
En le faisant sur plusieurs journées, je vois que les pics sont principalement sur l'export journalier et un traitement en particulier, qui s'exécute entre 5h et 6h, qui fait beaucoup de Insert/Update sur 3-4 tables.
Quelles informations vouliez-vous voir en me demandant de "Tracez les checkpoints" ?

#130 Re : Optimisation » Ratio Lecture/Ecriture » 06/11/2014 08:34:19

Bonjour Guillaume,

Voici la variable log_line_prefix de mon fichier postgresql.conf :
     log_line_prefix = '%t [%p]: [%l-1] user=%u %h %s '

Vous avez raison, ci-dessous 2 lignes de traces :

2014-10-27 10:02:53 CET [2613]: [33210-1] user=  2014-07-04 03:04:54 CEST LOG:  checkpoint complete: wrote 1444 buffers (0.1%); 0 transaction log file(s) added, 0 removed, 1 recycled; write=144.695 s, sync=0.008 s, total=144.707 s; sync files=94, longest=0.000 s, average=0.000 s

2014-10-27 10:59:59 CET [1472]: [131358-1] user=serveurgeo 10.36.4.12 2014-10-16 00:02:13 CEST LOG:  duration: 0.061 ms  bind S_2: INSERT INTO geo.QUANTITE (code_cgu_site,id_perso,id_ligne,id_plan,id_fonction,id_operation,of_sec,id_document,jour,heure,nb_page,quantite,qta,qtb,qtc,qtd) values($1,$2,$3,$4,$5,$6,$7,$8,to_date($9,'yyyymmdd'),$10,$11,$12,$13,$14,$15,$16)

Sur la ligne de trace du checkpoint, il manque les %u (Utilisateur) et %h (adresse IP), mais je ne sais pas pourquoi ?

Même chose avec les analyze et vacuum (je n'ai rien dans l'onglet "vacuum" d'un html pgbadger) :

2014-10-27 18:17:20 CET [30436]: [2-1] user=  2014-10-27 18:17:19 CET LOG:  automatic analyze of table "geo.geo.pointage_test" system usage: CPU 0.00s/0.47u sec elapsed 0.53 sec

J'ai l'impression que je n'ai pas les infos sur les traces générées par le serveur lui-même.

#131 Re : Optimisation » Ratio Lecture/Ecriture » 05/11/2014 15:35:35

Bonjour Guillaume,

Ci-dessous les paramètres du postgresql.conf :
     max_connections = 300
     shared_buffers = 8192MB
     work_mem = 10MB
     maintenance_work_mem = 4096MB
     checkpoint_segments = 64
     checkpoint_timeout = 10min
     effective_cache_size = 21840MB

32Go de RAM sur la machine.
En moyenne, 130 à 140 utilisateurs connectés.

Le log_checkpoints est bien à ON, j'ai bien des logs du style :
     2014-10-27 08:10:28 CET [2613]: [33187-1] user=  2014-07-04 03:04:54 CEST LOG:  checkpoint starting: time
     2014-10-27 08:11:16 CET [2613]: [33188-1] user=  2014-07-04 03:04:54 CEST LOG:  checkpoint complete: wrote 476 buffers (0.0%); 0 transaction log file(s) added, 0 removed, 0 recycled; write=47.524 s, sync=0.009 s, total=47.536 s; sync files=113, longest=0.000 s, average=0.000 s
     2014-10-27 08:20:28 CET [2613]: [33189-1] user=  2014-07-04 03:04:54 CEST LOG:  checkpoint starting: time
     2014-10-27 08:21:38 CET [2613]: [33190-1] user=  2014-07-04 03:04:54 CEST LOG:  checkpoint complete: wrote 696 buffers (0.1%); 0 transaction log file(s) added, 0 removed, 0 recycled; write=69.572 s, sync=0.011 s, total=69.587 s; sync files=72, longest=0.001 s, average=0.000 s
     2014-10-27 08:30:28 CET [2613]: [33191-1] user=  2014-07-04 03:04:54 CEST LOG:  checkpoint starting: time
     2014-10-27 08:31:37 CET [2613]: [33192-1] user=  2014-07-04 03:04:54 CEST LOG:  checkpoint complete: wrote 690 buffers (0.1%); 0 transaction log file(s) added, 0 removed, 1 recycled; write=69.071 s, sync=0.008 s, total=69.082 s; sync files=83, longest=0.000 s, average=0.000 s
     2014-10-27 08:40:28 CET [2613]: [33193-1] user=  2014-07-04 03:04:54 CEST LOG:  checkpoint starting: time
     2014-10-27 08:42:12 CET [2613]: [33194-1] user=  2014-07-04 03:04:54 CEST LOG:  checkpoint complete: wrote 1041 buffers (0.1%); 0 transaction log file(s) added, 0 removed, 0 recycled; write=104.147 s, sync=0.009 s, total=104.158 s; sync files=95, longest=0.000 s, average=0.000 s

Par contre, je n'ai rien dans "l'onglet" Checkpoints, d'une sortie HTML de PgBadger 5, exécuté de la façon suivante :
     pgbadger -p '%t [%p]: [%l-1] user=%u %h %s ' -u postgres -o /home/postgres/pgbadger-5.0/HTML/postgres_20141027.html /home/postgres/pgbadger-5.0/LOGS/3-*.log

#132 Re : Optimisation » Ratio Lecture/Ecriture » 04/11/2014 09:07:44

Bonjour Guillaume,
C'est vrai qu'il manque quelques infos, désolé.
Alors, j'ai repris la technique suivante, extraite du livre "Base de données PostgreSQL - Gestion des performances", Chapitre 11 "Activité et statistiques de la base de données", paragraphe "Sauvegarder des images de pg_stat_bgwriter" :
Toutes les 6 heures, je fais la "photo" : INSERT INTO pg_stat_bgwriter_snapshot (SELECT current_timestamp,* FROM pg_stat_bgwriter);
Ensuite, le dimanche, je fais la requête suivante pour extraire les infos de ma table de collecte :
    select cast(date_trunc('second',now) as timestamp) as jour,
    date_trunc('second',elapsed) as elapsed,
    date_trunc('second',elapsed/(checkpoints_timed+checkpoints_req)) as avg_checkpoint_interval,
    (100 * checkpoints_req) / (checkpoints_timed + checkpoints_req) AS checkpoint_requis,
    100 * buffers_checkpoint / (buffers_checkpoint + buffers_clean + buffers_backend) AS checkpoint_serveur,
    100 * buffers_backend / (buffers_checkpoint + buffers_clean + buffers_backend) AS checkpoint_client,
    pg_size_pretty(buffers_checkpoint * block_size / (checkpoints_timed + checkpoints_req)) AS volume_moyen_ecrit,
    pg_size_pretty(cast(block_size * (buffers_checkpoint + buffers_clean + buffers_backend) / extract(epoch FROM elapsed) AS int8)) AS volume_ecrit,
    pg_size_pretty(cast(block_size * (buffers_alloc) / extract(epoch FROM elapsed) AS int8)) AS volume_lecture
    from
            (select now,
            ((lead(now,1) over(order by now))-now) as elapsed,
            ((lead(checkpoints_timed,1) over(order by now))-checkpoints_timed) as checkpoints_timed,
            ((lead(checkpoints_req,1) over(order by now))-checkpoints_req) as checkpoints_req,
            ((lead(buffers_checkpoint,1) over(order by now))-buffers_checkpoint) as buffers_checkpoint,
            ((lead(buffers_clean,1) over(order by now))-buffers_clean) as buffers_clean,
            ((lead(maxwritten_clean,1) over(order by now))-maxwritten_clean) as maxwritten_clean,
            ((lead(buffers_backend,1) over(order by now))-buffers_backend) as buffers_backend,
            ((lead(buffers_alloc,1) over(order by now))-buffers_alloc) as buffers_alloc,
            (select cast(current_setting('block_size') as integer)) as block_size
            from pg_stat_bgwriter_snapshot
            order by now) as bgwriter_diff
    where (checkpoints_timed+checkpoints_req)>0;
Les buffers_checkpoint sont donc bien en majorité supérieur aux buffers_backend, cependant ces derniers augmentent.
Dans quelle mesure faut-il s'en inquiéter ?
Concernant le cache, oui c'est bien le cache Linux qui est à 24Go.
Merci encore pour votre analyse.

#133 Re : Optimisation » Ratio Lecture/Ecriture » 03/11/2014 11:24:22

Bonjour Guillaume,
Désolé pour ma question un peu inadaptée.
En fait nous avions plusieurs bases de données (une par site) et nous avons évolué vers une architecture centralisée (une seule machine plus puissante, plus de mémoire, disques plus gros, OS mieux utilisé, séparation des data et logs sur différents disques, ...) et nous rapatrions progressivement les données et traitements des différents sites.
J'essaye de mettre en place les outils qui me permettront d'anticiper d'éventuels problèmes.
J'ai des infos au niveau système grâce à une surveillance Centreon.
Le ratio Cache hit/miss de ma BD reste au-dessus de 96%.
Le volume des données est bien géré.
J'ai mis en place la prise de "photos" de la table pg_stat_bgwriter, mais j'ai du mal à en interpréter les résultats.
Je me demande si les "Checkpoints clients" ne sont pas trop nombreux ?
Le volume des écritures a augmenté, je pense, avec l'augmentation de l'activité de la base.
Le volume des lectures a lui augmenté de façon plus significative.
Est-ce à dire que toutes les infos ne tiennent plus en mémoire ?
La machine dispose de 32Go et le cache n'est qu'à 24Go.
Le ratio global ne devrait-il pas baisser ?
Plus globalement, sur quels critères dois-je me baser pour lever une alerte ?

#134 Re : Optimisation » Ratio Lecture/Ecriture » 03/11/2014 09:53:56

Bonjour,

Je prend également des photos de la table pg_stat_bgwriter, toutes les 6h, du lundi au samedi :

                Checkpoint requis    Checkpoint Serveur    Checkpoint Client     Volume moyen écrit (kB/Check)           Volume écriture (kB/s)                           Volume lecture (kB/s)   
                0h  6h 12h  18h      0h   6h  12h  18h       0h  6h  12h  18h         0h      6h     12h     18h                 0h           6h         12h       18h          0h          6h           12h        18h
20140526   0    0    0    0        71   66   70   53        28   33   29   46       0718   4403   4145   1176           01,721    11,000    10,068   03,751      07,143  002,880    019,000    00,381
20140527   0    0    0    0        78   68   70   52        21   31   29   47       2752   6096   4205   1130           05,992    15,000    10,179   03,663      01,653  003,997    016,000    00,440
20140528   0    0    0    0        77   68   65   47        22   31   34   52       2775   4375   3273   0937           06,144    11,000    08,498   03,386      01,342  007,080    000,650    00,404
20140529   0    0    0    0        76   49   43   45        23   50   56   54       2209   1373   1076   0845           04,910    04,704    04,212   03,174      00,938  000,083    000,076    00,055
20140530   0    0    0    0        92   62   61   48        07   37   38   51       0666   2925   2659   0998           01,228    07,981    07,428   03,493      00,135  000,845    000,518    00,459
20140531   0    0    0    0        76   57   46   00        23   42   53   00       1824   1958   1232   0000           04,073    05,876    04,559   00,000      00,784  000,226    000,166    00,000

                Checkpoint requis    Checkpoint Serveur    Checkpoint Client     Volume moyen écrit (kB/Check)           Volume écriture (kB/s)                           Volume lecture (kB/s)   
                0h  6h 12h  18h      0h   6h  12h  18h       0h  6h  12h  18h         0h      6h     12h     18h                 0h           6h         12h       18h          0h          6h           12h        18h
20141027   0    0    0    0        76   59   58   38        23   40   41   61       1250   6760   5603   1497           02,778    19,000    16,000   06,627      09,109  190,000    051,000    00,558
20141028   0    0    0    0        74   62   61   38        25   37   38   61       4872   8120   5973   1541           11,000    22,000    16,000   06,778      03,704  005,870    284,000    01,836
20141029   0    0    0    0        80   59   61   35        19   40   38   64       5711   6088   7803   1284           12,000    17,000    21,000   06,255      64,000  025,000    407,000    02,927
20141030   0    0    0    0        82   61   59   46        16   38   40   53       6221   6474   6379   2781           12,000    18,000    18,000   10,227      75,000  325,000    885,000    33,000
20141031   0    0    0    0        76   60   61   47        23   39   37   52       3946   6435   6621   2502           08,785    18,000    18,000   08,993      69,000  584,000    675,000    04,796
20141101   0    0    0    0        80   75   28   33        19   24   71   66       4374   8990   1140   0991           09,319    20,000    06,798   05,060      83,000  000,810    000,177    00,109

Je vois une augmentation du volume des écritures, mais surtout des lectures.

En même temps, comme il s'agit d'une base "centrale", dans laquelle de nouveaux sites sont venus s'intégrer (donc le nombre des connexions a augmenté, le volume des traitements et le volume des tables également) et que nous n'avons pas de remonté d'informations sur des lenteurs ou blocages, je ne suis pas trop inquiet.

Les volumes de lecture/écriture sont ils cohérents ?

#135 Re : Optimisation » Ratio Lecture/Ecriture » 09/10/2014 07:22:54

Bonjour Anayrat,
Au niveau système, c'est bon, j'ai des graph centreon avec les lectures/écritures sur les différents disques (OS+moteur+logs sur disque A, data sur disque B, journaux sur disque C).
Je surveille déjà :
        Taille BD : SELECT pg_database_size('ma_base');
        Taille Table + Indexes + autres Relations rattachés : SELECT pg_total_relation_size('ma_table');
        Le ratio cache hit/miss sur la BD (lecture en cache si bien compris) : SELECT ROUND((blks_hit::FLOAT/(blks_read+blks_hit+1)*100)::NUMERIC,2) FROM pg_stat_database WHERE datname='ma_base';
Je voudrai également surveiller les lectures/écritures côté base de données. Si j'ai bien compris : l'écriture des journaux de transactions, l'écriture en base et l'écriture des logs.
Merci pour votre aide.

#136 Optimisation » Ratio Lecture/Ecriture » 08/10/2014 10:38:47

mortimer.pw
Réponses : 34

Bonjour tout le monde,

Je travaille sous CenOS 6.4 avec un moteur PostgreSQL 9.3.2.

J'ai accès à des graphs centreon de surveillance des I/O sur mon serveur, mais je cherche le moyen de calculer le ratio des lectures/écritures de ma base de données.

Quelqu'un peut-il aiguiller mes recherches, svp ?

D'avance merci.

#137 Re : PL/pgSQL » SET TIME ZONE &variable » 24/09/2014 10:43:21

Bonjour Guillaume,

C'est ce que j'avais fait en attendant, je pensais qu'il y avait "plus propre".

Merci.

#138 PL/pgSQL » SET TIME ZONE &variable » 22/09/2014 11:33:21

mortimer.pw
Réponses : 2

Bonjour tout le monde,

Je travaille sous CenOS 5.4 avec un moteur PostgreSQL 9.3.2.

Je souhaite écrire une procédure stockée dans laquelle je veux fixer le TIMEZONE à l'aide d'une variable (cTimeZone).

Ci-dessous un bout de mon code :
        ......
    cTimeZone VARCHAR(50);
BEGIN
    SELECT timezone INTO cTimeZone FROM TOTO.Site WHERE id_cgu=$1 AND id_site=$2;
    IF cTimeZone IS NOT NULL AND cTimeZone!='' THEN SET TIME ZONE cTimeZone;END IF;
        .....

Cela ne fonctionne pas, à l'exécution de ma procédure j'obtiens :
        ERROR:  invalid value for parameter "TimeZone": "ctimezone"
        CONTEXT:  SQL statement "SET TIME ZONE cTimeZone"
        PL/pgSQL function poin(character varying,character varying,character varying,character varying,character,character) line 20 at SQL statement
        ********** Erreur **********
        ERROR: invalid value for parameter "TimeZone": "ctimezone"
        État SQL :22023
        Contexte : SQL statement "SET TIME ZONE cTimeZone"
        PL/pgSQL function poin(character varying,character varying,character varying,character varying,character,character) line 20 at SQL statement


Comment faire interpréter mon "cTimeZone" dans la commande SET TIME ZONE ?

#139 Re : Général » DROP COLUMN : erreur 42703 » 28/05/2014 12:28:27

Bonjour Thomas,
Je me permets d'intervenir car en lisant votre post, je vois que le champ défini dans la table est "datemaj" alors que dans votre requête c'est "datmaj" (manque le e).

#140 Re : Général » [Résolu] Monitoring de base de données » 23/05/2014 07:25:32

Bonjour Guillaume,
Bon d'accord, je ne vais pas réinitialiser les stats et regarder cet outil.
Merci encore.

#141 Re : Général » [Résolu] Monitoring de base de données » 22/05/2014 07:54:17

Bonjour Guillaume,
Donc pas une bonne idée de réinitialiser les statistiques le dimanche. Sinon, les tables pour lesquelles il y aurait des modifications (Insert/update/Delete) pourraient ne jamais être vacuumé ?
Mais dans ce cas, comment avoir des statistiques "parlantes", par exemple à la semaine (nombre de transactions, nombre d'insert/update/delete, parcours séquentiels ou parcours d'index, ......) ?

#142 Re : Général » [Résolu] Monitoring de base de données » 21/05/2014 13:14:37

Rebonjour,
Désolé, j'avais mis le post en [résolu] un peu vite.
Le PG_STAT_RESET va remettre les compteurs à zéro, par exemple dans la table PG_STAT_USER_TABLES. Le VACUUM ne se base t'il pas sur les compteurs n_live_tup et n_dead_tup pour ses déclenchements ?
Le PG_STAT_RESET réinitialise t'il également les compteurs du BGWRITER ?

#143 Re : Général » [Résolu] Monitoring de base de données » 21/05/2014 07:48:48

Bonjour Guillaume,
Ok, merci encore pour votre aide.

#144 Re : Général » [Résolu] Monitoring de base de données » 19/05/2014 07:36:02

Ok, merci Guillaume pour l'analyse.
Comme il n'y a pas de grosse activité, je pense faire des snapshots toutes les 6 heures.
Pour que les compteurs soient un peu plus parlant, je voudrais faire un reset des compteurs le dimanche, pour avoir des chiffres à la semaine.
Le PG_STAT_RESET() peut-il avoir des effets négatifs sur l'optimiseur de requêtes ou autre ?
Est-ce une bonne pratique ?

#145 Re : Général » [Résolu] Monitoring de base de données » 16/05/2014 08:44:59

Bonjour Guillaume,
La surveillance de pg_stat_bgwriter porte sur 1h30, entre 10h10 et 11h30, avec une photo toutes les dix minutes.
Pouvez-vous vérifier cela, svp ?
Pour les sum_read et sum_hit, ils sont le résultat de :
     Création de la table : CREATE TABLE pg_stat_database_snapshot AS SELECT current_timestamp,blks_read,blks_hit FROM pg_stat_database where datname='geo';
     Prise d'une photo toutes les 10 minutes.
     Résultat de la requête :
               select round((((lead(blks_read,1) over(order by now))-blks_read)*8192)/1024/1024,2) as read_Mo,round((((lead(blks_hit,1) over(order by now))-blks_hit)*8192)/1024/1024,2) as cache_Mo
               from pg_stat_database_snapshot;
Merci pour votre analyse.

#146 Re : Général » [Résolu] Monitoring de base de données » 15/05/2014 11:54:04

Bonjour Guillaume,
Merci pour les fonctions de fenêtrage (un nouvel outil bien sympa).
J'ai donc modifier ma requête :
     select cast(date_trunc('second',now) as timestamp) as jour,
     date_trunc('second',elapsed) as elapsed,
     date_trunc('second',elapsed/(checkpoints_timed+checkpoints_req)) as avg_checkpoint_interval,
     (100 * checkpoints_req) / (checkpoints_timed + checkpoints_req) AS checkpoints_req_pct,
     100 * buffers_checkpoint / (buffers_checkpoint + buffers_clean + buffers_backend) AS checkpoint_write_pct,
     100 * buffers_backend / (buffers_checkpoint + buffers_clean + buffers_backend) AS backend_write_pct,
     pg_size_pretty(buffers_checkpoint * block_size / (checkpoints_timed + checkpoints_req)) AS avg_checkpoint_write,
     pg_size_pretty(cast(block_size * (buffers_checkpoint + buffers_clean + buffers_backend) / extract(epoch FROM elapsed) AS int8)) AS written_per_sec,
     pg_size_pretty(cast(block_size * (buffers_alloc) / extract(epoch FROM elapsed) AS int8)) AS alloc_per_sec
     from
              (select now,
              ((lead(now,1) over(order by now))-now) as elapsed,
              ((lead(checkpoints_timed,1) over(order by now))-checkpoints_timed) as checkpoints_timed,
              ((lead(checkpoints_req,1) over(order by now))-checkpoints_req) as checkpoints_req,
              ((lead(buffers_checkpoint,1) over(order by now))-buffers_checkpoint) as buffers_checkpoint,
              ((lead(buffers_clean,1) over(order by now))-buffers_clean) as buffers_clean,
              ((lead(maxwritten_clean,1) over(order by now))-maxwritten_clean) as maxwritten_clean,
              ((lead(buffers_backend,1) over(order by now))-buffers_backend) as buffers_backend,
              ((lead(buffers_alloc,1) over(order by now))-buffers_alloc) as buffers_alloc,
              (select cast(current_setting('block_size') as integer)) as block_size
              from pg_stat_bgwriter_snapshot
              order by now) as bgwriter_diff
          where (checkpoints_timed+checkpoints_req)>0;
J'obtiens les résultats suivants pour les 2 dernières heures :
jour    elapsed    avg_checkpoint_interval    checkpoints_req_pct    checkpoint_write_pct    backend_write_pct    avg_checkpoint_write    written_per_sec    alloc_per_sec
2014-05-15 10:10:01    00:10:00    00:10:00    0    60    39    3472 kB    9829 bytes    2212 bytes
2014-05-15 10:20:01    00:10:00    00:10:00    0    65    34    6416 kB    16 kB    3618 bytes
2014-05-15 10:30:01    00:10:00    00:10:00    0    73    26    8424 kB    19 kB    2252 bytes
2014-05-15 10:40:01    00:10:00    00:10:00    0    67    32    5400 kB    13 kB    942 bytes
2014-05-15 10:50:01    00:10:00    00:10:00    0    59    40    3880 kB    11 kB    778 bytes
2014-05-15 11:00:02    00:09:59    00:09:59    0    93    6    3792 kB    6946 bytes    711 bytes
2014-05-15 11:10:01    00:10:00    00:10:00    0    61    38    3808 kB    10 kB    505 bytes
2014-05-15 11:20:01    00:10:00    00:10:00    0    77    22    4032 kB    8873 bytes    614 bytes
2014-05-15 11:30:01    00:10:00    00:10:00    0    65    34    3408 kB    8914 bytes    491 bytes
J'ai également fait cette requête pour avoir le ratio de lecture en cache :
     select round((((lead(sum_read,1) over(order by now))-sum_read)*8192)/1024/1024,2) as read_Mo,round((((lead(sum_hit,1) over(order by now))-sum_hit)*8192)/1024/1024,2) as cache_Mo
     from pg_stat_database_snapshot
     where datname='geo'
     and to_char(now,'YYYYMMDD')='20140515' and to_char(now,'HH24:MI:SS')>'100000';
J'obtiens les chiffres suivants :
read_mo    cache_mo
0.39    5410.89
0.51    14342.68
2.83    22846.39
1.29    13710.18
0.54    7395.71
0.45    8036.46
0.40    12417.09
0.30    7482.95
0.35    13399.13
0.28    6752.86
Les paramètres de mon postgresql.conf sont :
     max_connections = 300
     shared_buffers = 8192MB
     work_mem = 10MB
     maintenance_work_mem = 4096MB
     checkpoint_segments = 64
     checkpoint_timeout = 10min
     effective_cache_size = 21840MB
Pouvez-vous me donner votre avis sur le comportement de ma base, svp ?
Encore merci pour votre aide.

#147 Re : Général » [Résolu] Monitoring de base de données » 14/05/2014 12:25:56

Bonjour Guillaume,
J'ai repris la technique suivante, extraite du livre "Base de données PostgreSQL - Gestion des performances", Chapitre 11 "Activité et statistiques de la base de données", paragraphe "Sauvegarder des images de pg_stat_bgwriter" :
          Création d'une table : CREATE TABLE pg_stat_bgwriter_snapshot AS SELECT current_timestamp,* FROM pg_stat_bgwriter;
          Insertion d'une image dans la table par crontab toutes les 5 minutes : INSERT INTO pg_stat_bgwriter_snapshot (SELECT current_timestamp,* FROM pg_stat_bgwriter);
J'essaye d'utiliser la requête suivante qui exploite les informations de la table :
          SELECT
          cast(date_trunc(‘minute’,start) AS timestamp) AS start,
          date_trunc(‘second’,elapsed) AS elapsed,
          date_trunc(‘second’,elapsed / (checkpoints_timed + checkpoints_req)) AS avg_checkpoint_interval,
          (100 * checkpoints_req) / (checkpoints_timed + checkpoints_req) AS checkpoints_req_pct,
          100 * buffers_checkpoint / (buffers_checkpoint + buffers_clean + buffers_backend) AS checkpoint_write_pct,
          100 * buffers_backend / (buffers_checkpoint + buffers_clean + buffers_backend) AS backend_write_pct,
          pg_size_pretty(buffers_checkpoint * block_size / (checkpoints_timed + checkpoints_req)) AS avg_checkpoint_write,
          pg_size_pretty(cast(block_size * (buffers_checkpoint + buffers_clean + buffers_backend) / extract(epoch FROM elapsed) AS int8)) AS written_per_sec,
          pg_size_pretty(cast(block_size * (buffers_alloc) / extract(epoch FROM elapsed) AS int8)) AS alloc_per_sec
          FROM
          (
          SELECT
          one.now AS start,
          two.now - one.now AS elapsed,
          two.checkpoints_timed - one.checkpoints_timed AS checkpoints_timed,
          two.checkpoints_req - one.checkpoints_req AS checkpoints_req,
          two.buffers_checkpoint - one.buffers_checkpoint AS buffers_checkpoint,
          two.buffers_clean - one.buffers_clean AS buffers_clean,
          two.maxwritten_clean - one.maxwritten_clean AS maxwritten_clean,
          two.buffers_backend - one.buffers_backend AS buffers_backend,
          two.buffers_alloc - one.buffers_alloc AS buffers_alloc,
          (SELECT cast(current_setting(‘block_size’) AS integer)) AS block_size
          FROM pg_stat_bgwriter_snapshot one
          INNER JOIN pg_stat_bgwriter_snapshot two ON two.now > one.now
          ) bgwriter_diff
          WHERE (checkpoints_timed + checkpoints_req) > 0;
Je n'arrive pas à l'adapter pour qu'elle traite l'ensemble des enregistrements de la table et non pas uniquement deux enregistrements.
En fait chaque ligne est comparée avec L'ENSEMBLE des suivantes et non pas uniquement avec LA suivante.
Pourriez-vous m'apporter votre aide ?
D'avance merci.

#148 Re : PL/pgSQL » Auto-jointure et Horodatage » 14/05/2014 12:13:53

C'est vrai, je suis bête :-(
Merci Arthurr.

#149 Re : PL/pgSQL » Auto-jointure et Horodatage » 14/05/2014 10:22:22

Bonjour Arthurr,
Merci pour la réponse, cela fonctionne bien.
J'ai une petite question subsidiaire : je dois ajouter d'autres colonnes dans ma table avec des valeurs numériques, sur lesquelles je souhaite faire des calculs du style addition, soustraction et division.
     CREATE TABLE ma_table (
       now timestamp with time zone,
       action character varying(3),
       nb1_action integer,
       nb2_action integer);
Nouveau contenu de ma table :
     "2014-05-13 10:57:14.209095+02";"01";0;0
     "2014-05-13 10:59:47.221529+02";"02";0;0
     "2014-05-13 11:00:28.773153+02";"03";1;3
     "2014-05-13 11:05:25.814538+02";"04";4;2
La requête suivante :
     Select a.action,
     a.now,
     date_trunc('second',((lead(a.now,1) over(order by a.now))-a.now)) as temps,
     date_trunc('second',((lead(now,1) over(order by now))-now)/(((lead(nb1_action,1) over(order by now))-nb1_action)+((lead(nb2_action,1) over(order by now))-nb2_action))) AS calcul
     from ma_table a
     order by a.now;
Me retourne le message d'erreur "division by zero".
Comment faire pour tester que le diviseur de mon calcul est supérieur à zéro ?
Encore merci pour votre aide.

#150 PL/pgSQL » Auto-jointure et Horodatage » 13/05/2014 11:35:47

mortimer.pw
Réponses : 5

Bonjour tout le monde,
Je travaille sous CenOS 5.4 avec un moteur PostgreSQL 9.3.2.
J'ai une table dans laquelle je stocke des actions et le moment où cette action est faite (current_timestamp) :
    CREATE TABLE ma_table(
        now timestamp with time zone,
        action character varying(3));
Contenu de ma table :
    "2014-05-13 10:57:14.209095+02";"01"
    "2014-05-13 10:59:47.221529+02";"02"
    "2014-05-13 11:00:28.773153+02";"03"
    "2014-05-13 11:05:25.814538+02";"04"
Je voudrai afficher le temps passé entre 2 actions en utilisant une auto-jointure :
    SELECT A.now AS Debut,B.now-A.now AS Temps,A.action
    FROM ma_table A INNER JOIN ma_table B ON B.now>A.now
    ORDER BY A.now;
Le résultat n'est pas celui attendu :
    "2014-05-13 10:57:14.209095+02";"00:02:33.012434";"01"
    "2014-05-13 10:57:14.209095+02";"00:03:14.564058";"01"
    "2014-05-13 10:57:14.209095+02";"00:08:11.605443";"01"
    "2014-05-13 10:59:47.221529+02";"00:00:41.551624";"02"
    "2014-05-13 10:59:47.221529+02";"00:05:38.593009";"02"
    "2014-05-13 11:00:28.773153+02";"00:04:57.041385";"03"
Quelqu'un a t'il une idée ? pour ne traiter qu'une fois chaque ligne ?
D'avance merci pour votre aide.

Pied de page des forums

Propulsé par FluxBB