Vous n'êtes pas identifié(e).
Bonjour à tous.
Bon en tout cas mon post aura permis d'éclaircir les idées sur le sujet. Je pense que SQLPro a tout comme moi des références identiques sur un autre SGBD mais qui ne sont pas valables dans PostgreSQL.
Merci à tous pour vos réponses.
Bonjour.
En fait, j'avais initialement créé des tables dont certaines embarquaient une séquence, tout ceci étant dans un TS dédié.
Pour certaines raisons, j'ai déplacé ces tables dans un autre tablespace et effectivement, à la lecture des tables systèmes, il semblerait que ces séquences ne bougent pas.
C'est assez gênant si nous devions avoir à supprimer ce tablespace.
Dans ce cas, on serait amené à recréer ces séquences, via la modif des tables (?)
Bonsoir à tous.
J'avais oublié de mettre à jour ce post.
Effectivement, l'augmentation du à l'échappement ne se limite qu'à la RAM (durant la manip de la donnée avec un programme C/ecpg).
J'ai ré-importé une table de 60Go d'Oracle vers Postgresql et le volume est quasi-identique entre les 2 serveurs.
Merci arthurr.
Bonjour à tous.
J'aimerai savoir si une séquence Postgres est un objet physiquement créé sur le FS comme un objet de type table ou index OU s'il s'agit simplement d'une structure dont les données sont stockées dans le dictionnaire de la base ?
Je pense qu'il s'agit de la 2ème solution car je n'ai pas trouvé de syntaxe 'ALTER SEQUENCE ... MOVE Tablespace ...' ?
Merci.
Ok.
Alors disons que dans le cas où l'utilité est avérée et si vous avez été confronté à une telle configuration, quelle a été pour vous la solution la plus satisfaisante parmi celles que j'ai listées.
Je vous remercie par avance.
Bonjour à tous.
Dans le cadre d'un projet, je souhaite stocker un (très) grand nombre de données binaires dans une même base.
J'ai commencé à regarder quelles étaient les solutions possibles. J'ai noté à ce jour 3 possibilités:
1) La première, que j'ai déjà mise en production il y a 4 ans sur un projet de base non pérenne, est le stockage des donnée binaires dans un champ de type BYTEA.
Dans ce cas, il faut échapper les caractères spéciaux par '\\'. Le volume final est de ce fait augmenté d'un facteur 2 à 3 (tout dépend du type de données origine) ce qui a un impact non négligeable sur le stockage.
2) Autre solution implémentée par un collègue, encoder le type binaire pour éviter d'avoir à échapper ces caractères spéciaux mais là aussi augmentation certes moindre mais d'environ 4/3 du volume
3) Sinon, utiliser le type 'large_object' dit 'lo' mais la limitation du type 'oid' utilisé pour référencer chacun des objets "lo" dans la table du dictionnaire est limité à 2*32 donc déjà inférieur à mon nombre actuel de données.
Si parmi vous certains ont été confrontés à cette problématique, leurs retours d'expérience me très seraient utiles, aussi bien sur la partie stockage que sur les performances en R/W.
Bonne journée.
Bonjour Guillaume.
Ca explique effectivement mon soucis.
Merci à tous.
bde=> create table test_david (col1 numeric);
CREATE TABLE
OU
bde=> create table test_david (col1 numeric) tablespace ts_1;
CREATE TABLE
Résultats identiques
bde=> \d test_david
Table "public.test_david"
Column | Type | Modifiers
--------+---------+-----------
col1 | numeric |
bde=> \d+ test_david
Table "public.test_david"
Column | Type | Modifiers | Storage | Stats target | Description
--------+---------+-----------+---------+--------------+-------------
col1 | numeric | | main | |
Has OIDs: no
bde=> \dt+ test_david
List of relations
Schema | Name | Type | Owner | Size | Description
--------+------------+-------+-------+------------+-------------
public | test_david | table | bde | 8192 bytes |
(1 row)
Par contre la base de données dans laquelle j'ai créé cette table a été créée sur ce tablespace.
Est-ce la raison ?
bde=> create database bde tablespace ts_1;
Bonjour à tous et merci pour vos réponses.
Rjuju, ni le \d, \d+, \dt, \dt+ ne me donnent le nom du tablespace sur ma config (9.2.4) ?
Effectivement la fonction pg_relation_filepath() peut aider mais il va falloir que je l'encapsule car on n'obtient pas le nom du tablespace à la première lecture.
bde=# select pg_relation_filepath('img.tab1');
pg_relation_filepath
----------------------------------------------
pg_tblspc/17917/PG_9.2_201204301/17915/28553
bash-4.1$ ll /base/data/pg_tblspc
total 0
lrwxrwxrwx 1 postgres postgres 16 Jul 10 09:33 17917 -> /base/ts_1
SQLPro, merci pour la doc. Très intéressante.
Juste une petite remarque, certaines requêtes ne passent plus en 9.2 à cause de la colonne pg_tablespace.spclocation qui n'existe plus.
David.
Bonjour.
J'ai qqs soucis pour retrouver le nom du tablespace où sont stockés mes divers objets.
Mes objets étaient auparavant stockés sous "l'arborescence" par défaut.
J'ai créé un tablespace et ai affecté ce tablespace comme emplacement par défaut pour ma base de données.
Après qqs manipulations pour déplacer les objets sous ce nouveau tablespace, j'ai voulu vérifier leur emplacement mais je ne sais pas où trouver l'information.
La colonne "tablespace" de la vue pg_tables m'indique la valeur '0' ce qui semble être la valeur du tablespace par défaut.
Il me semble qu'avant d'avoir modifié la valeur par défaut je voyais bien le nom du tablespace ?
Merci pour vos infos.
PG version 9.2.4
Bonjour.
Quand vous dites "il ne faut pas", il s'agit juste d'éviter ce problème de comptabilité n'est ce pas ? Car je ne vois pas plus de risque à être dans cette configuration qu'avec une configuration sans TS.
D'ailleurs dans notre cas, il s'agit d'un choix de départ pour nous permettre, si jamais le volume de la base venait à s'accroitre au delà de nos estimations, de déplacer ceci sur un autre FS (que nous n'avons pas aujourd'hui).
David
Bonjour à tous.
Nous avons réalisé hier un import sur une nouvelle base de données (Version : 9.2 sur x64).
Celle-ci est supervisée en partie avec l'outil "check_postgres".
C'est d'ailleurs au travers de ce module (je pense qu'il s'appuie sur les fonctions postgresql) que nous sommes aperçus que la taille de la base était largement surestimée (certainement le double).
Le taux d'occupation sur disque donné par la commande 'df' est par ailleurs inférieur conformément aux volumes prévus.
L'utilisation de check_postgres est nouvelle pour nous mais je n'avais jamais remarqué ce phénomène auparavant. Nous surveillons les volumes table/table avec un script basé sur la lecture de pg_class.
Je précise que le problème est reproductible sur deux versions antérieures de cette base sur 2 autres plateformes - 8.4.
-bash-4.1$ check_postgres.pl -H xyo-int -p 5433 -dbname bdcp --action=database_size --warning=10M --critical=100M
POSTGRES_DATABASE_SIZE CRITICAL: DB "bdcp" (host:xyo-int) (port=5433) bdcp: 756220651760 (704 GB) postgres: 6698104 (6541 kB) template1: 6665336 (6509 kB) template0: 6513156 (6361 kB) | time=0.03s bdcp=756220651760;10485760;104857600 postgres=6698104;10485760;104857600 template1=6665336;10485760;104857600 template0=6513156;10485760;104857600
Ici, on note une occupation disque de 355Go sur 1To:
Sys. de fichiers Taille Uti. Disp. Uti% Monté sur
...
...
/dev/mapper/vg_bdcp-lv_bdcp_base
1008G 355G 603G 38% /bdcp_base
Par contre, via la fonction postgresql ...
bdcp=# SELECT pg_size_pretty(pg_database_size('bdcp'));
pg_size_pretty
----------------
704 GB
(1 ligne)
J'ai eu, durant un moment, un doute sur la location du tablespace qui héberge la base, donc vérification:
postgres=# \db
List of tablespaces
Name | Owner | Location
------------+----------+--------------------------------
bdcp | postgres | /bdcp_base/data/pg_tblspc/bdcp
pg_default | postgres |
pg_global | postgres |
(3 rows)
Le tablespace est bien sous le même FS que la base, dont contenu dans les 355Go.
[postgres@xyo-int pg_tblspc]$ ll
total 4
lrwxrwxrwx 1 postgres postgres 30 Dec 6 2012 16437 -> /bdcp_base/data/pg_tblspc/bdcp
drwx------ 3 postgres postgres 4096 Dec 5 2012 bdcp
Si vous pouviez m'éclairer, je ne vois pas où est le lézard ....
David
Bonjour Guillaume.
Oui, la rotation est peut-être faite sur le même fichier mais le RAZ de ce fichier non alors que "log_truncate_on_rotation=on".
C'est ce à quoi je m'attendais à avoir comme comportement c.a.d. un même fichier mais écrasé par la rotation dès que la taille excède celle précisée par le paramètre log_rotation_size.
Testé aujourd'hui avec la 9.2.1 avec les paramètres suivants:
log_destination = 'stderr'
logging_collector = on
log_directory = 'pg_log'
log_filename = 'postgresql-%a.log'
log_truncate_on_rotation = on
log_rotation_age = 0
log_rotation_size = 10kb
[postgres@david60:/data/dav921/data/pg_log]$ ll
total 64
-rw------- 1 postgres postgres 63655 7 déc. 10:37 postgresql-Fri.log <-- 63k
-rw------- 1 postgres postgres 0 27 nov. 00:00 postgresql-Tue.log
-rw------- 1 postgres postgres 0 28 nov. 00:00 postgresql-Wed.log
NB : j'ai le même comportement avec la 9.0.
Bonjour.
Quelle est la valeur de "log_filename" ?
Je pose cette question car j'ai été confronté au même problème cette semaine sur un projet pour lequel je voulais maitriser la taille occupée par l'ensemble des fichiers logs sur une semaine.
Je me suis dit, "%a" => 7 jours * log_rotation_size => volume stable sur le FS.
Ben non, j'ai vu mes fichiers logs gonfler au delà de la taille spécifiée pour un même jour.
Si je génère plus que "log_rotation_size" de logs dans la même journée, avec la clé %a (jour) précisée comme nom de journal, la rotation n'est pas faite.
A priori, le serveur ne sait pas faire la rotation sur le même nom de fichier (je laisse les experts confirmer ce qui est peut-être déjà clairement écrit dans la doc).
En suffixant par une clé supplémentaire discriminante la rotation se fait bien.
Voila un bon exercice pour se débloquer le cerveau en ce début de semaine !
Une première idée....
Cdlt
select * from debit;
date | debit
---------------------+-------
2012-01-01 00:00:00 | 1.2
2012-01-02 00:00:00 | 8.4
2012-01-03 00:00:00 | 8.2
2012-01-04 00:00:00 | 1.0
2012-01-05 00:00:00 | 1.0
2012-01-06 00:00:00 | 1.0
2012-01-07 00:00:00 | 1.0
2012-01-08 00:00:00 | 1.4
2012-01-09 00:00:00 | 51.4
2012-01-10 00:00:00 | 0.4
2012-01-11 00:00:00 | 0.4
2012-01-12 00:00:00 | 0.4
2012-01-13 00:00:00 | 0.0
2012-01-14 00:00:00 | 0.0
(14 lignes)
select min(D1) date_debut, debit, count(*)+1 from
(select d1.date D1, d2.date D2, d1.debit Debit from debit d1, debit d2
where d2.date = d1.date + interval '1 day' ::interval and d1.debit=d2.debit and d1.debit >= 0) R1
group by debit;
date_debut| debit | ?column?
---------------------+-------+----------
2012-01-13 00:00:00 | 0.0 | 2
2012-01-10 00:00:00 | 0.4 | 3
2012-01-04 00:00:00 | 1.0 | 4
Ca bouge pas mal selon l'activité avec plus ou moins de tables listées (ici 4) mais pas de choses figées.
?
locktype | database | relation | page | tuple | virtualxid | transactionid | classid | objid | objsubid | virtualtransaction | pid | mode | granted
------------+----------+----------+------+-------+------------+---------------+---------+-------+----------+--------------------+-------+-----------------+---------
relation | 16390 | 278637 | | | | | | | | 2/1885342 | 23932 | AccessShareLock | t
relation | 16390 | 278643 | | | | | | | | 2/1885342 | 23932 | AccessShareLock | t
relation | 16390 | 278661 | | | | | | | | 2/1885342 | 23932 | AccessShareLock | t
relation | 16390 | 278663 | | | | | | | | 2/1885342 | 23932 | AccessShareLock | t
virtualxid | | | | | 2/1885342 | | | | | 2/1885342 | 23932 | ExclusiveLock | t
Guillaume, je n'ai pas compris ce que vous vouliez dire: "ce qu'il serait intéressant, c'est de savoir quel type de verrou où les sessions qui sont en "idle in transaction".
Je n'ai qu'une seule session "IDLE in rtansaction"
Ceci.
postgres=# select
pg_stat_activity.datname,pg_class.relname,pg_locks.transactionid, pg_locks.mode, pg_locks.granted,
pg_stat_activity.usename,substr(pg_stat_activity.current_query,1,30), pg_stat_activity.query_start,
age(now(),pg_stat_activity.query_start) as "age", pg_stat_activity.procpid
from pg_stat_activity,pg_locks full
join pg_class on (pg_locks.relation = pg_class.oid)
where pg_locks.pid=pg_stat_activity.procpid and substr(pg_stat_activity.current_query,1,30) like '%IDLE%' order by query_start;
datname | relname | transactionid | mode | granted | usename | substr | query_start | age | procpid
---------+---------+---------------+---------------+---------+---------+-----------------------+-------------------------------+-----------------+---------
base1 | | | ExclusiveLock | t | base1| <IDLE> in transaction | 2012-11-07 10:16:56.637027+00 | 00:01:44.220869 | 23932
(1 ligne)
Bonjour à tous.
"... qui arrive généralement très peu souvent... "
Ah, effectivement, je note en permanence ce type de lock par le même process id depuis ce matin (certainement depuis plus):
base1=# select
pg_stat_activity.datname,pg_class.relname, pg_locks.mode, pg_locks.granted,
pg_stat_activity.usename,substr(pg_stat_activity.current_query,1,30), pg_stat_activity.query_start,
age(now(),pg_stat_activity.query_start) as "age", pg_stat_activity.procpid
from pg_stat_activity,pg_locks left
outer join pg_class on (pg_locks.relation = pg_class.oid)
where pg_locks.pid=pg_stat_activity.procpid order by query_start;
datname | relname | mode | granted | usename | substr | query_start | age | procpid
---------+----------------------------+-----------------+---------+----------+-------------------------+-------------------------------+-----------------+---------
....
....
base1| | ExclusiveLock | t | base1| <IDLE> in transaction | 2012-11-07 08:43:05.609366+00 | 00:00:11.403627 | 23932
....
....
[postgres@db log]$ ps -ef | grep 23932
postgres 23932 10985 1 Oct23 ? 04:29:47 postgres: base1 base1 xxx.xxx.xx.xxx(42799) idle in transaction
base1=# SELECT locktype, database::regclass, relation::regclass,page, tuple, virtualxid, transactionid, classid, objid,objsubid, virtualtransaction, pid, mode, granted FROM pg_locks ;
locktype | database | relation | page | tuple | virtualxid | transactionid | classid | objid | objsubid | virtualtransaction | pid | mode | granted
------------+----------+----------+------+-------+------------+---------------+---------+-------+----------+--------------------+-------+-----------------+---------
virtualxid | | | | | 4/324249 | | | | | 4/324249 | 12948 | ExclusiveLock | t
virtualxid | | | | | 2/1851149 | | | | | 2/1851149 | 23932 | ExclusiveLock | t
La doc indique : "ExclusiveLock = Ce mode de verrouillage n'est acquis automatiquement sur des tables par aucune commande PostgreSQL™. "
D'où peut venir le verrou Exclusif ?
Serait-ce cette session datée du 23/10 (c'est la date de démarrage du serveur et la dernière fois où l'autovacuum a pu passer sur ces tables) ?
De plus, dans la log du serveur, je trouve uniquement et très souvent ce message d'erreur qui me fait penser que la dernière transaction de la session en cours ne s'est pas cloturée de manière satisfaisante:
2012-11-07 08:38:02 GMT::::base1:base1::BEGINATTENTION: une transaction est déjà en cours
2012-11-07 08:38:02 GMT::::base1:base1::BEGINATTENTION: une transaction est déjà en cours
2012-11-07 08:38:02 GMT::::base1:base1::BEGINATTENTION: une transaction est déjà en cours
2012-11-07 08:38:02 GMT::::base1:base1::BEGINATTENTION: une transaction est déjà en cours
Concernant ce dernier point, je ne pense pas qu'il s'agisse du même type de verrou (?)
Comment puis-je retrouver plus d'infos sur le process client ?
Non pas de différence notée.
track_counts= ON
Mais ce que je ne comprends absolument pas c'est pourquoi les tables de l'autre base qui sont sur le même cluster sont bien analysées, et même 3 tables de cette même base.
Il resterait la possibilité d'avoir désactivé ce paramètre au niveau de chaque session mais je ne pense pas que les développeurs soient allés aussi loin ?????
Autre info, le phénomène ne se produit que sur une seule des 2 bases créées sur le même cluster !?!
Les colonnes n_tup_ins, n_tup_del, etc... restent à '0' alors qu'il y a a peu près 200.000 insert par jour dans la 1ère table.
Le nombre de lignes n'est pas correct non plus (cf ci-dessous).
base1=# select relname,seq_tup_read,n_tup_ins,n_tup_upd,n_tup_del,n_tup_hot_upd,n_live_tup,n_dead_tup,last_autovacuum,last_autoanalyze from pg_stat_all_tables where relname like '%tres%';
relname | seq_tup_read | n_tup_ins | n_tup_upd | n_tup_del | n_tup_hot_upd | n_live_tup | n_dead_tup | last_autovacuum | last_autoanalyze
----------------------+--------------+-----------+-----------+-----------+---------------+------------+------------+-------------------------------+-------------------------------
tres1 | 35937175 | 350087 | 0 | 0 | 0 | 395251 | 0 | 2012-10-24 08:08:15.264593+00 |
tres2 | 22404351 | 59210 | 0 | 59349 | 0 | 233 | 0 | 2012-10-23 12:06:29.676185+00 | 2012-10-23 12:06:29.676185+00
tres3 | 52762897978 | 26307205 | 0 | 26275065 | 0 | 36634 | 0 | 2012-10-23 12:14:46.377767+00 | 2012-10-23 12:14:46.377767+00
base1=# select count(*) from tres1;
count
--------
444375
(1 ligne)
Les stats du cluster indiquent bien de l'activité sur CHACUNE des bases et une requête à intervalle régulier souligne bien cette activité (tup_inserted, tup_updated ):
postgres=# select * from pg_stat_database ;
datid | datname | numbackends | xact_commit | xact_rollback | blks_read | blks_hit | tup_returned | tup_fetched | tup_inserted | tup_updated | tup_deleted
-------+-----------+-------------+-------------+---------------+--------------+--------------+--------------+-------------+--------------+-------------+-------------
....
...
16390 | base1 | 12 | 100205231 | 1688 | 654814538597 | 114046341945 | 638065108162 | 1279110249 | 352344801 | 13979769 | 351056792
16391 | base2 | 3 | 6252807 | 4604 | 52260426 | 877573728 | 9650447251 | 247968875 | 52513721 | 1544963 | 51502840
L'autovacuum positionnée à 10%:
base1=# \d+ tres1
Table « public.tres1 »
Colonne | Type | Modificateurs | Stockage | Description
--------------+-----------------------------+---------------+----------+-------------
...
...
Index :
"pk_tres1" PRIMARY KEY, btree (id)
"i_tres1_1" btree (coldd, dateo)
Contient des OID: non
Options: autovacuum_vacuum_scale_factor=0.1
Oui, j'ai une requête similaire qui tourne en cron tous les jours avec en plus le suivi de l'évolution des volumes des tables, index.
Donc l'autovacuum n'est jamais repassé sur cette table, ni sur la plupart des autres (sur les 14 au total, 2 ou 3 sont scannées, preuve que le daemon se déclenche quand même) depuis le jour où j'ai recréé la table et les index (transfert dans une table temporaire puis reinsert, recreate des index).
Le dernier passage date donc de 2 semaines, et le ratio de modif est désormais largement dépassé.
Je n'ai pas d'info dans la log sur le déclenchement de l'autovacuum. Il y-a-t-il de l'info ailleurs (table système) ?
Comme indiqué, pour cette table j'ai abaissé le niveau à 10%. Je l'avais calibré pour environ 3 à 4 passages par jour.
Cdlt
Bonjour à tous.
Je viens de recevoir l'équipe d'un projet confronté à un problème d'augmentation excessif de volume d'une table et de ces 2 index.
Cette table fait partie d'un schéma de persistance d'un serveur JBoss, sur un serveur de prod H24.
Cette table est assez sollicitée : 200.000 lignes insérées chaque jour et autant d'effacées (rotation quotidienne des infos).
On se retrouve avec un volume croissant, pas de possibilité d'arrêter JBoss de manière aisée donc ...
J'ai beau scruter la table pg_stat_user_tables assez régulièrement, je constate que ni les stats, ni l'autovacuum n'arrivent à passer (j'avais tout d'abord abaissé la valeur du paramètre autovacum_scale_factor).
Est-ce du à la sollicitation permanente de JBoss et donc aux verrous posé par ses sessions ?
Comme solution au problème, je leur ai proposé de redécouper la table en partition, avec un drop/create régulier de partitions en lieu et place des deletes mais il faudra repasser par une modif du code pour la gestion de ces partitions. En attendant, l'eau monte ...
Merci pour vos conseils.
PS : Version 8.4.x
Bonjour à tous.
J'ai eu le même message d'erreur la semaine dernière en redémarrant une base de preprod (PostGresql 9.x + PostGIS 2.0).
Le LD_LIBRARY_PATH par défaut avait été surchargé depuis l'install (! - /etc/profile) et la libproj.so accédée n'était plus celle de la version 4.7 mais une vieille version (libproj.so.0.6.6, livrée avec le système) sous /usr/lib64 qui n'embarquait pas fonction citée ici (pj_get_spheroid_defn).
J'ai donc repositionné la variable et tout a redémarré sans problème.
Cordialement