SlideShare une entreprise Scribd logo
1  sur  30
Télécharger pour lire hors ligne
Répertoires et Fichiers
Outils
Structures internes des données sur disque
Sébastien Lardière
Loxodata
31 mai 2016
Sébastien Lardière DATAONDISK – 31 mai 2016 1 / 30
Répertoires et Fichiers
Outils
Structures internes des données sur disque
1 Répertoires et Fichiers
Définitions et OIDs
2 Outils
pg_filedump
Extensions
pageinspect
FSM
VM
pg_xlogdump
Sébastien Lardière DATAONDISK – 31 mai 2016 2 / 30
Répertoires et Fichiers
Outils
Définitions et OIDs
Fichiers
PostgreSQL stocke les données dans des répertoires et des fichiers :
Un répertoire par base de données
Un répertoire par TABLESPACE, contenant des bases de données
Les données d’une DB peuvent être dans plusieurs TABLESPACE
Sébastien Lardière DATAONDISK – 31 mai 2016 3 / 30
Répertoires et Fichiers
Outils
Définitions et OIDs
Définitions
Création d’objets :
Exemple
test=# create table mytable
( id serial primary key, d timestamptz, t text, b bool );
insert into mytable ( d, t, b)
values ( now(), 'test 1', true ),
( now(), 'test 2', false );
INSERT 0 2
test=# select oid from pg_database where datname = 'test';
oid | 25101
test=# select relfilenode from pg_class where relname='mytable';
relfilenode | 25137
Sébastien Lardière DATAONDISK – 31 mai 2016 4 / 30
Répertoires et Fichiers
Outils
Définitions et OIDs
Définitions
Création d’objets :
Exemple
$ ls -sh $PGDATA/base/25101/25137
8.0K /var/lib/postgresql/9.5/main/base/25101/25137
Sébastien Lardière DATAONDISK – 31 mai 2016 5 / 30
Répertoires et Fichiers
Outils
Définitions et OIDs
Fichiers
Plusieurs fichiers par tables :
Les données dans des segments de 1GB (.1, .2, etc) : tableaux de pages de 8K.
Fichier <id>_vm : contient les pages de données visibles
Fichier <id>_fsm : liste les espaces disponibles dans les pages
Un fichier par index, similaire aux tables
Une table TOAST par table
Sébastien Lardière DATAONDISK – 31 mai 2016 6 / 30
Répertoires et Fichiers
Outils
Définitions et OIDs
Définitions
Création d’un tablespace :
Exemple
test=# create tablespace test1
location '/var/lib/postgresql/9.5/tblspctest1' ;
CREATE TABLESPACE
test=# select oid from pg_tablespace where spcname='test1';
oid | 25142
test=# select pg_tablespace_location(25142);
pg_tablespace_location | /var/lib/postgresql/9.5/tblspctest1
test=# alter table mytable set tablespace test1 ;
ALTER TABLE
test=# select reltablespace from pg_class where relname='mytable';
reltablespace | 25142
Sébastien Lardière DATAONDISK – 31 mai 2016 7 / 30
Répertoires et Fichiers
Outils
Définitions et OIDs
Définitions
Création d’un tablespace :
Exemple
ls -sh /var/lib/postgresql/9.5/tblspctest1/PG_9.5_201510051/25101/25143*
8.0K /var/lib/postgresql/9.5/tblspctest1/PG_9.5_201510051/25101/25143
24K /var/lib/postgresql/9.5/tblspctest1/PG_9.5_201510051/25101/25143_fsm
8.0K /var/lib/postgresql/9.5/tblspctest1/PG_9.5_201510051/25101/25143_vm
Sébastien Lardière DATAONDISK – 31 mai 2016 8 / 30
Répertoires et Fichiers
Outils
Définitions et OIDs
Pages
Pages de 8K, composées de :
PageHeaderData : Structure de 24 octets, informations à propos de la page
ItemIdData : Paire (offset,length) pointant sur les données
Free space : Espace libre
Items : Données
Special space : Espace spécifique aux index
Sébastien Lardière DATAONDISK – 31 mai 2016 9 / 30
Répertoires et Fichiers
Outils
Définitions et OIDs
src/include/storage/bufpage.h
Exemple
++-+
| PageHeaderData | linp1 linp2 linp3 ... |
+-++-+
| ... linpN | |
+-++
| ^ pd_lower |
| |
| v pd_upper |
+-++
| | tupleN ... |
+-++-+
| ... tuple3 tuple2 tuple1 | special space |
++-+
^ pd_special
Sébastien Lardière DATAONDISK – 31 mai 2016 10 / 30
Répertoires et Fichiers
Outils
Définitions et OIDs
Pages
PageHeaderData, 24 octets composé de :
pd_lsn : Octet du XLOG correspondant à la dernière modification de la page
pd_checksum : Somme de contrôle
pd_flags : Bits d’états
pd_lower : décalage du début de l’espace libre
pd_upper : décalage de la fin de l’espace libre
pd_special : décalage de l’espace “spécial”
pd_pagesize_version : taille et version de la page
pd_prune_xid : plus vieux Xmax non-traité.
Sébastien Lardière DATAONDISK – 31 mai 2016 11 / 30
Répertoires et Fichiers
Outils
Définitions et OIDs
Items
HeapTupleHeaderData composé de :
t_xmin : XID d’insertion
t_xmax : XID de suppression
t_cid : CID d’insertion et de suppression (surcharge avec t_xvac)
t_xvac : XID pour l’opération VACUUM déplaçant une version de ligne
t_ctid : TID en cours pour cette version de ligne ou pour une version plus récente
t_infomask2 nombre d’attributs
t_infomask : flag bits
t_hoff : data offset
Sébastien Lardière DATAONDISK – 31 mai 2016 12 / 30
Répertoires et Fichiers
Outils
pg_filedump
Extensions
pg_xlogdump
pg_filedump
Outil en ligne de commande :
permet de comprendre de contenu d’un fichier (table ou index)
-a : Display absolute addresses when formatting (Block header information is always block
relative)
-i : Interprète les détails des lignes
-b : Affichage des données binaires
-d, -f : Affiche les données formatées
-k : Vérifie les sommes de contrôle
-R : Permet d’indiquer une plage de blocs
Sébastien Lardière DATAONDISK – 31 mai 2016 13 / 30
Répertoires et Fichiers
Outils
pg_filedump
Extensions
pg_xlogdump
pg_filedump
Exemple
pg_filedump -i 25137
Block 0 ********************************************************
Header -
Block Offset: 0x00000000 Offsets: Lower 40 (0x0028)
Block: Size 8192 Version 4 Upper 8000 (0x1f40)
LSN: logid 2 recoff 0x34c86198 Special 8192 (0x2000)
Items: 4 Free Space: 7960
Checksum: 0x0000 Prune XID: 0x00000000 Flags: 0x0000 ()
Length (including item array): 40
Sébastien Lardière DATAONDISK – 31 mai 2016 14 / 30
Répertoires et Fichiers
Outils
pg_filedump
Extensions
pg_xlogdump
pg_filedump
Exemple
pg_filedump -i 25137
Data 
Item 1  Length: 48 Offset: 8144 (0x1fd0) Flags: NORMAL
XMIN: 1149 XMAX: 0 CID|XVAC: 0
Block Id: 0 linp Index: 1 Attributes: 4 Size: 24
infomask: 0x0802 (HASVARWIDTH|XMAX_INVALID)
Sébastien Lardière DATAONDISK – 31 mai 2016 15 / 30
Répertoires et Fichiers
Outils
pg_filedump
Extensions
pg_xlogdump
pageinspect
pageinspect est une extension fournie avec PostgreSQL :
Exemple
test=# create extension pageinspect;
CREATE EXTENSION
test=# dx+ pageinspect
Objects in extension pageinspect
Object Description

function brin_metapage_info(bytea)
function brin_page_items(bytea,regclass)
...
Sébastien Lardière DATAONDISK – 31 mai 2016 16 / 30
Répertoires et Fichiers
Outils
pg_filedump
Extensions
pg_xlogdump
pageinspect
pageinspect est une extension fournie avec PostgreSQL, disposant de fonctions :
get_raw_page()
heap_page_item_attrs(), heap_page_items()
page_header()
fsm_page_contents()
tuple_data_split()
brin_metapage_info(), brin_page_items()
brin_page_type(), brin_revmap_data()
bt_metap(), bt_page_items(), bt_page_stats()
gin_leafpage_items(), gin_metapage_info(),
gin_page_opaque_info()
Sébastien Lardière DATAONDISK – 31 mai 2016 17 / 30
Répertoires et Fichiers
Outils
pg_filedump
Extensions
pg_xlogdump
pageinspect
Exemple
test=# insert into mytable values( 1, now(), 'texte 1', true ) ;
INSERT 0 1
test=# select lp, lp_off, lp_flags, lp_len, t_xmin, t_xmax, t_ctid,
t_infomask, t_data from heap_page_items(get_raw_page('mytable', 0));
-[ RECORD 1 ]+
lp | 1
lp_off | 8136
lp_flags | 1
lp_len | 49
t_xmin | 560
t_xmax | 0
t_ctid | (0,1)
t_infomask | 2818
t_data | x0100000000000000e28d5502a9d60100117465787465203101
Sébastien Lardière DATAONDISK – 31 mai 2016 18 / 30
Répertoires et Fichiers
Outils
pg_filedump
Extensions
pg_xlogdump
pageinspect
Exemple
test=# insert into mytable values( 2, now(), 'texte 2', false );
INSERT 0 1
test=# select lp, lp_off, lp_flags, lp_len, t_xmin, t_ctid, t_data from heap_page_items(get_raw_
-[ RECORD 1 ]+
lp | 1
lp_off | 8136
lp_flags | 1
lp_len | 49
t_xmin | 560
t_ctid | (0,1)
t_data | x0100000000000000e28d5502a9d60100117465787465203101
-[ RECORD 2 ]-
lp | 2
lp_off | 8080
lp_flags | 1
lp_len | 49
t_xmin | 561
t_ctid | (0,2)
t_data | x02000000000000000600e403a9d60100117465787465203200
Sébastien Lardière DATAONDISK – 31 mai 2016 19 / 30
Répertoires et Fichiers
Outils
pg_filedump
Extensions
pg_xlogdump
pageinspect
Exemple
test=# select txid_current(), t_xmin, t_xmax, t_ctid,
t_infomask, t_attrs from
heap_page_item_attrs(get_raw_page('mytable', 0), 'mytable', true);
-[ RECORD 6 ]+
txid_current | 659
t_xmin | 575
t_xmax | 0
t_ctid | (0,6)
t_infomask | 2818
t_attrs | {x06000000,x4082faa9c21c0000,x74657874652033...
Sébastien Lardière DATAONDISK – 31 mai 2016 20 / 30
Répertoires et Fichiers
Outils
pg_filedump
Extensions
pg_xlogdump
pageinspect
Exemple
test=# insert into mytable values
( 6, '2001-01-01 00:00:01 +00'::timestamptz, 'texte 3', false ) ;
ERROR: duplicate key value violates unique constraint mytable_pkey
DETAIL: Key (id)=(6) already exists.
test=# select txid_current(), t_xmin, t_xmax, t_ctid, t_infomask, t_attrs
from heap_page_item_attrs(get_raw_page('mytable', 0), 'mytable', true);
-[ RECORD 6 ]+
txid_current | 663
t_xmin | 575
t_xmax | 0
t_ctid | (0,6)
t_infomask | 2818
t_attrs | {x06000000,x4082faa9c21c0000,x74657874652033...
-[ RECORD 7 ]+
txid_current | 663
t_xmin | 662
t_xmax | 0
t_ctid | (0,7)
t_infomask | 2050
t_attrs | {x06000000,x4082faa9c21c0000,x74657874652033...
Sébastien Lardière DATAONDISK – 31 mai 2016 21 / 30
Répertoires et Fichiers
Outils
pg_filedump
Extensions
pg_xlogdump
pageinspect
Inspection d’un B-tree :
Exemple
test=# SELECT * FROM bt_metap('mytable_pkey');
-[ RECORD 1 ]-
magic | 340322
version | 2
root | 1
level | 0
fastroot | 1
fastlevel | 0
c
Sébastien Lardière DATAONDISK – 31 mai 2016 22 / 30
Répertoires et Fichiers
Outils
pg_filedump
Extensions
pg_xlogdump
pageinspect
Inspection d’un B-tree :
Exemple
test=# SELECT * FROM bt_page_stats('mytable_pkey', 1);
-[ RECORD 1 ]-+-
blkno | 1
type | l
live_items | 5
dead_items | 0
avg_item_size | 16
page_size | 8192
free_size | 8048
btpo_prev | 0
btpo_next | 0
btpo | 0
btpo_flags | 3
Sébastien Lardière DATAONDISK – 31 mai 2016 23 / 30
Répertoires et Fichiers
Outils
pg_filedump
Extensions
pg_xlogdump
pageinspect
Inspection d’un B-tree :
Exemple
SELECT * FROM bt_page_items('mytable_pkey', 1);
-[ RECORD 1 ]-
itemoffset | 1
ctid | (0,1)
itemlen | 16
nulls | f
vars | f
data | 01 00 00 00 00 00 00 00
-[ RECORD 2 ]-
itemoffset | 2
ctid | (0,2)
itemlen | 16
nulls | f
vars | f
data | 02 00 00 00 00 00 00 00
Sébastien Lardière DATAONDISK – 31 mai 2016 24 / 30
Répertoires et Fichiers
Outils
pg_filedump
Extensions
pg_xlogdump
pageinspect
Exemple
test=# delete from mytable where id=6;
DELETE 1
test=# select txid_current(), t_xmin, t_xmax, t_ctid, t_infomask, t_attrs from heap_page_item_at
-[ RECORD 5 ]+
txid_current | 665
t_xmin | 566
t_xmax | 0
t_ctid | (0,5)
t_infomask | 2818
t_attrs | {x05000000,x402227afbd7f0ffd,x74657874652033...
-[ RECORD 6 ]+
txid_current | 665
t_xmin | 575
t_xmax | 664
t_ctid | (0,6)
t_infomask | 770
t_attrs | {x06000000,x4082faa9c21c0000,x74657874652033...
Sébastien Lardière DATAONDISK – 31 mai 2016 25 / 30
Répertoires et Fichiers
Outils
pg_filedump
Extensions
pg_xlogdump
pageinspect
Exemple
test=# vacuum ;
VACUUM
test=# select txid_current(), t_xmin, t_xmax, t_ctid, t_infomask, t_attrs
from heap_page_item_attrs(get_raw_page('mytable', 0), 'mytable', true);
-[ RECORD 5 ]+
txid_current | 666
t_xmin | 566
t_xmax | 0
t_ctid | (0,5)
t_infomask | 2818
t_attrs | {x05000000,x402227afbd7f0ffd,x74657874652033...
-[ RECORD 6 ]+
txid_current | 666
t_xmin |
t_xmax |
t_ctid |
t_infomask |
t_attrs |
Sébastien Lardière DATAONDISK – 31 mai 2016 26 / 30
Répertoires et Fichiers
Outils
pg_filedump
Extensions
pg_xlogdump
pg_freespacemap
Extension permettant d’inspecter le contenu du FSM d’une table :
Exemple
test=# create extension pg_freespacemap ;
CREATE EXTENSION
test=# dx+ pg_freespacemap
Objects in extension pg_freespacemap
Object Description

function pg_freespace(regclass)
function pg_freespace(regclass,bigint)
(2 rows)
test=# select * from pg_freespace('mytable');
-[ RECORD 1 ]
blkno | 0
avail | 7840
Sébastien Lardière DATAONDISK – 31 mai 2016 27 / 30
Répertoires et Fichiers
Outils
pg_filedump
Extensions
pg_xlogdump
pg_visibility
Extension permettant d’inspecter la Visibility Map d’une table :
Exemple
test=# create extension pg_visibility ;
CREATE EXTENSION
test=# select * from pg_visibility('mytable', 0);
-[ RECORD 1 ]+
all_visible | t
all_frozen | t
pd_all_visible | t
Sébastien Lardière DATAONDISK – 31 mai 2016 28 / 30
Répertoires et Fichiers
Outils
pg_filedump
Extensions
pg_xlogdump
pg_xlogdump
Exemple
~$ pg_xlogdump pg_xlog/000000010000000000000001
rmgr: Heap len (rec/tot): 14/ 15130, tx: 3,
lsn: 0/01000148, prev 0/01000128, desc: UPDATE off 33 xmax 3 ;
new off 40 xmax 0, blkref #0: rel 1663/1/1259 blk 3 FPW,
blkref #1: rel 1663/1/1259 blk 0 FPW
rmgr: Btree len (rec/tot): 2/ 3713, tx: 3,
lsn: 0/01003C80, prev 0/01000148, desc: INSERT_LEAF off 20,
blkref #0: rel 1663/1/2662 blk 1 FPW
Sébastien Lardière DATAONDISK – 31 mai 2016 29 / 30
Répertoires et Fichiers
Outils
pg_filedump
Extensions
pg_xlogdump
Des Questions ?
Merci à vous ! Des Questions ?
Sébastien Lardière - Loxodata
s.lardiere@loxodata.com
Twitter @slardiere
Sébastien Lardière DATAONDISK – 31 mai 2016 30 / 30

Contenu connexe

Similaire à Structures internes des données sur disque, Mai 2016, Loxodata

Découvrez le parcours de vos données : lignage de données de bout en bout ...
Découvrez le parcours de vos données : lignage de données de bout en bout ...Découvrez le parcours de vos données : lignage de données de bout en bout ...
Découvrez le parcours de vos données : lignage de données de bout en bout ...Wiiisdom
 
Deep Learning on Apache Spark: TensorFrames & Deep Learning Pipelines
Deep Learning on Apache Spark: TensorFrames & Deep Learning Pipelines Deep Learning on Apache Spark: TensorFrames & Deep Learning Pipelines
Deep Learning on Apache Spark: TensorFrames & Deep Learning Pipelines Databricks
 
Scrapez facilement et gratuitement
Scrapez facilement et gratuitementScrapez facilement et gratuitement
Scrapez facilement et gratuitementMadeline Pinthon
 
PostgreSQL plprofiler - Mars 2017 - Loxodata
PostgreSQL  plprofiler - Mars 2017 - LoxodataPostgreSQL  plprofiler - Mars 2017 - Loxodata
PostgreSQL plprofiler - Mars 2017 - Loxodataslardiere
 
Salesforce Einstein analytics - Formation sur les-bases - By iMalka
Salesforce Einstein analytics - Formation sur les-bases - By iMalkaSalesforce Einstein analytics - Formation sur les-bases - By iMalka
Salesforce Einstein analytics - Formation sur les-bases - By iMalkaIlan Malka
 
D3 js-last
D3 js-lastD3 js-last
D3 js-lastTECOS
 
4-Recherche d'information.pdf
4-Recherche d'information.pdf4-Recherche d'information.pdf
4-Recherche d'information.pdfRihabBENLAMINE
 
Algorithmique_et_programmation_part3_V2
Algorithmique_et_programmation_part3_V2Algorithmique_et_programmation_part3_V2
Algorithmique_et_programmation_part3_V2Emeric Tapachès
 
Mehari 2010-manuel-de-reference-2-14
Mehari 2010-manuel-de-reference-2-14Mehari 2010-manuel-de-reference-2-14
Mehari 2010-manuel-de-reference-2-14imen1989
 
Spark - Alexis Seigneurin (Français)
Spark - Alexis Seigneurin (Français)Spark - Alexis Seigneurin (Français)
Spark - Alexis Seigneurin (Français)Alexis Seigneurin
 
Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017)
Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017) Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017)
Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017) univalence
 
SIBD101-Introduction aux bases de données.pdf
SIBD101-Introduction aux bases de données.pdfSIBD101-Introduction aux bases de données.pdf
SIBD101-Introduction aux bases de données.pdfNadim ELSAKAAN
 
lpi 101 notes de cours
lpi 101 notes de courslpi 101 notes de cours
lpi 101 notes de coursISIG
 

Similaire à Structures internes des données sur disque, Mai 2016, Loxodata (15)

Découvrez le parcours de vos données : lignage de données de bout en bout ...
Découvrez le parcours de vos données : lignage de données de bout en bout ...Découvrez le parcours de vos données : lignage de données de bout en bout ...
Découvrez le parcours de vos données : lignage de données de bout en bout ...
 
Deep Learning on Apache Spark: TensorFrames & Deep Learning Pipelines
Deep Learning on Apache Spark: TensorFrames & Deep Learning Pipelines Deep Learning on Apache Spark: TensorFrames & Deep Learning Pipelines
Deep Learning on Apache Spark: TensorFrames & Deep Learning Pipelines
 
Scrapez facilement et gratuitement
Scrapez facilement et gratuitementScrapez facilement et gratuitement
Scrapez facilement et gratuitement
 
PostgreSQL plprofiler - Mars 2017 - Loxodata
PostgreSQL  plprofiler - Mars 2017 - LoxodataPostgreSQL  plprofiler - Mars 2017 - Loxodata
PostgreSQL plprofiler - Mars 2017 - Loxodata
 
Salesforce Einstein analytics - Formation sur les-bases - By iMalka
Salesforce Einstein analytics - Formation sur les-bases - By iMalkaSalesforce Einstein analytics - Formation sur les-bases - By iMalka
Salesforce Einstein analytics - Formation sur les-bases - By iMalka
 
D3 js-last
D3 js-lastD3 js-last
D3 js-last
 
Chapitre 2
Chapitre 2Chapitre 2
Chapitre 2
 
4-Recherche d'information.pdf
4-Recherche d'information.pdf4-Recherche d'information.pdf
4-Recherche d'information.pdf
 
Algorithmique_et_programmation_part3_V2
Algorithmique_et_programmation_part3_V2Algorithmique_et_programmation_part3_V2
Algorithmique_et_programmation_part3_V2
 
Mehari 2010-manuel-de-reference-2-14
Mehari 2010-manuel-de-reference-2-14Mehari 2010-manuel-de-reference-2-14
Mehari 2010-manuel-de-reference-2-14
 
Spark - Alexis Seigneurin (Français)
Spark - Alexis Seigneurin (Français)Spark - Alexis Seigneurin (Français)
Spark - Alexis Seigneurin (Français)
 
Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017)
Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017) Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017)
Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017)
 
SIBD101-Introduction aux bases de données.pdf
SIBD101-Introduction aux bases de données.pdfSIBD101-Introduction aux bases de données.pdf
SIBD101-Introduction aux bases de données.pdf
 
lpi 101 notes de cours
lpi 101 notes de courslpi 101 notes de cours
lpi 101 notes de cours
 
22410 b 04
22410 b 0422410 b 04
22410 b 04
 

Plus de slardiere

Nouveautés PostgreSQL 12
Nouveautés PostgreSQL 12Nouveautés PostgreSQL 12
Nouveautés PostgreSQL 12slardiere
 
PostgreSQL - Haute disponibilité avec Patroni
PostgreSQL - Haute disponibilité avec PatroniPostgreSQL - Haute disponibilité avec Patroni
PostgreSQL - Haute disponibilité avec Patronislardiere
 
pgBackRest - pgday.fr
pgBackRest - pgday.frpgBackRest - pgday.fr
pgBackRest - pgday.frslardiere
 
Nouveautés de PostgreSQL 9.5
Nouveautés de PostgreSQL 9.5Nouveautés de PostgreSQL 9.5
Nouveautés de PostgreSQL 9.5slardiere
 
Meetup PostgreSQL Nantes PG10
Meetup PostgreSQL Nantes PG10Meetup PostgreSQL Nantes PG10
Meetup PostgreSQL Nantes PG10slardiere
 
Historique des bases de données, Mars 2016' Loxodata
Historique des bases de données, Mars 2016' LoxodataHistorique des bases de données, Mars 2016' Loxodata
Historique des bases de données, Mars 2016' Loxodataslardiere
 

Plus de slardiere (6)

Nouveautés PostgreSQL 12
Nouveautés PostgreSQL 12Nouveautés PostgreSQL 12
Nouveautés PostgreSQL 12
 
PostgreSQL - Haute disponibilité avec Patroni
PostgreSQL - Haute disponibilité avec PatroniPostgreSQL - Haute disponibilité avec Patroni
PostgreSQL - Haute disponibilité avec Patroni
 
pgBackRest - pgday.fr
pgBackRest - pgday.frpgBackRest - pgday.fr
pgBackRest - pgday.fr
 
Nouveautés de PostgreSQL 9.5
Nouveautés de PostgreSQL 9.5Nouveautés de PostgreSQL 9.5
Nouveautés de PostgreSQL 9.5
 
Meetup PostgreSQL Nantes PG10
Meetup PostgreSQL Nantes PG10Meetup PostgreSQL Nantes PG10
Meetup PostgreSQL Nantes PG10
 
Historique des bases de données, Mars 2016' Loxodata
Historique des bases de données, Mars 2016' LoxodataHistorique des bases de données, Mars 2016' Loxodata
Historique des bases de données, Mars 2016' Loxodata
 

Structures internes des données sur disque, Mai 2016, Loxodata

  • 1. Répertoires et Fichiers Outils Structures internes des données sur disque Sébastien Lardière Loxodata 31 mai 2016 Sébastien Lardière DATAONDISK – 31 mai 2016 1 / 30
  • 2. Répertoires et Fichiers Outils Structures internes des données sur disque 1 Répertoires et Fichiers Définitions et OIDs 2 Outils pg_filedump Extensions pageinspect FSM VM pg_xlogdump Sébastien Lardière DATAONDISK – 31 mai 2016 2 / 30
  • 3. Répertoires et Fichiers Outils Définitions et OIDs Fichiers PostgreSQL stocke les données dans des répertoires et des fichiers : Un répertoire par base de données Un répertoire par TABLESPACE, contenant des bases de données Les données d’une DB peuvent être dans plusieurs TABLESPACE Sébastien Lardière DATAONDISK – 31 mai 2016 3 / 30
  • 4. Répertoires et Fichiers Outils Définitions et OIDs Définitions Création d’objets : Exemple test=# create table mytable ( id serial primary key, d timestamptz, t text, b bool ); insert into mytable ( d, t, b) values ( now(), 'test 1', true ), ( now(), 'test 2', false ); INSERT 0 2 test=# select oid from pg_database where datname = 'test'; oid | 25101 test=# select relfilenode from pg_class where relname='mytable'; relfilenode | 25137 Sébastien Lardière DATAONDISK – 31 mai 2016 4 / 30
  • 5. Répertoires et Fichiers Outils Définitions et OIDs Définitions Création d’objets : Exemple $ ls -sh $PGDATA/base/25101/25137 8.0K /var/lib/postgresql/9.5/main/base/25101/25137 Sébastien Lardière DATAONDISK – 31 mai 2016 5 / 30
  • 6. Répertoires et Fichiers Outils Définitions et OIDs Fichiers Plusieurs fichiers par tables : Les données dans des segments de 1GB (.1, .2, etc) : tableaux de pages de 8K. Fichier <id>_vm : contient les pages de données visibles Fichier <id>_fsm : liste les espaces disponibles dans les pages Un fichier par index, similaire aux tables Une table TOAST par table Sébastien Lardière DATAONDISK – 31 mai 2016 6 / 30
  • 7. Répertoires et Fichiers Outils Définitions et OIDs Définitions Création d’un tablespace : Exemple test=# create tablespace test1 location '/var/lib/postgresql/9.5/tblspctest1' ; CREATE TABLESPACE test=# select oid from pg_tablespace where spcname='test1'; oid | 25142 test=# select pg_tablespace_location(25142); pg_tablespace_location | /var/lib/postgresql/9.5/tblspctest1 test=# alter table mytable set tablespace test1 ; ALTER TABLE test=# select reltablespace from pg_class where relname='mytable'; reltablespace | 25142 Sébastien Lardière DATAONDISK – 31 mai 2016 7 / 30
  • 8. Répertoires et Fichiers Outils Définitions et OIDs Définitions Création d’un tablespace : Exemple ls -sh /var/lib/postgresql/9.5/tblspctest1/PG_9.5_201510051/25101/25143* 8.0K /var/lib/postgresql/9.5/tblspctest1/PG_9.5_201510051/25101/25143 24K /var/lib/postgresql/9.5/tblspctest1/PG_9.5_201510051/25101/25143_fsm 8.0K /var/lib/postgresql/9.5/tblspctest1/PG_9.5_201510051/25101/25143_vm Sébastien Lardière DATAONDISK – 31 mai 2016 8 / 30
  • 9. Répertoires et Fichiers Outils Définitions et OIDs Pages Pages de 8K, composées de : PageHeaderData : Structure de 24 octets, informations à propos de la page ItemIdData : Paire (offset,length) pointant sur les données Free space : Espace libre Items : Données Special space : Espace spécifique aux index Sébastien Lardière DATAONDISK – 31 mai 2016 9 / 30
  • 10. Répertoires et Fichiers Outils Définitions et OIDs src/include/storage/bufpage.h Exemple ++-+ | PageHeaderData | linp1 linp2 linp3 ... | +-++-+ | ... linpN | | +-++ | ^ pd_lower | | | | v pd_upper | +-++ | | tupleN ... | +-++-+ | ... tuple3 tuple2 tuple1 | special space | ++-+ ^ pd_special Sébastien Lardière DATAONDISK – 31 mai 2016 10 / 30
  • 11. Répertoires et Fichiers Outils Définitions et OIDs Pages PageHeaderData, 24 octets composé de : pd_lsn : Octet du XLOG correspondant à la dernière modification de la page pd_checksum : Somme de contrôle pd_flags : Bits d’états pd_lower : décalage du début de l’espace libre pd_upper : décalage de la fin de l’espace libre pd_special : décalage de l’espace “spécial” pd_pagesize_version : taille et version de la page pd_prune_xid : plus vieux Xmax non-traité. Sébastien Lardière DATAONDISK – 31 mai 2016 11 / 30
  • 12. Répertoires et Fichiers Outils Définitions et OIDs Items HeapTupleHeaderData composé de : t_xmin : XID d’insertion t_xmax : XID de suppression t_cid : CID d’insertion et de suppression (surcharge avec t_xvac) t_xvac : XID pour l’opération VACUUM déplaçant une version de ligne t_ctid : TID en cours pour cette version de ligne ou pour une version plus récente t_infomask2 nombre d’attributs t_infomask : flag bits t_hoff : data offset Sébastien Lardière DATAONDISK – 31 mai 2016 12 / 30
  • 13. Répertoires et Fichiers Outils pg_filedump Extensions pg_xlogdump pg_filedump Outil en ligne de commande : permet de comprendre de contenu d’un fichier (table ou index) -a : Display absolute addresses when formatting (Block header information is always block relative) -i : Interprète les détails des lignes -b : Affichage des données binaires -d, -f : Affiche les données formatées -k : Vérifie les sommes de contrôle -R : Permet d’indiquer une plage de blocs Sébastien Lardière DATAONDISK – 31 mai 2016 13 / 30
  • 14. Répertoires et Fichiers Outils pg_filedump Extensions pg_xlogdump pg_filedump Exemple pg_filedump -i 25137 Block 0 ******************************************************** Header - Block Offset: 0x00000000 Offsets: Lower 40 (0x0028) Block: Size 8192 Version 4 Upper 8000 (0x1f40) LSN: logid 2 recoff 0x34c86198 Special 8192 (0x2000) Items: 4 Free Space: 7960 Checksum: 0x0000 Prune XID: 0x00000000 Flags: 0x0000 () Length (including item array): 40 Sébastien Lardière DATAONDISK – 31 mai 2016 14 / 30
  • 15. Répertoires et Fichiers Outils pg_filedump Extensions pg_xlogdump pg_filedump Exemple pg_filedump -i 25137 Data Item 1 Length: 48 Offset: 8144 (0x1fd0) Flags: NORMAL XMIN: 1149 XMAX: 0 CID|XVAC: 0 Block Id: 0 linp Index: 1 Attributes: 4 Size: 24 infomask: 0x0802 (HASVARWIDTH|XMAX_INVALID) Sébastien Lardière DATAONDISK – 31 mai 2016 15 / 30
  • 16. Répertoires et Fichiers Outils pg_filedump Extensions pg_xlogdump pageinspect pageinspect est une extension fournie avec PostgreSQL : Exemple test=# create extension pageinspect; CREATE EXTENSION test=# dx+ pageinspect Objects in extension pageinspect Object Description function brin_metapage_info(bytea) function brin_page_items(bytea,regclass) ... Sébastien Lardière DATAONDISK – 31 mai 2016 16 / 30
  • 17. Répertoires et Fichiers Outils pg_filedump Extensions pg_xlogdump pageinspect pageinspect est une extension fournie avec PostgreSQL, disposant de fonctions : get_raw_page() heap_page_item_attrs(), heap_page_items() page_header() fsm_page_contents() tuple_data_split() brin_metapage_info(), brin_page_items() brin_page_type(), brin_revmap_data() bt_metap(), bt_page_items(), bt_page_stats() gin_leafpage_items(), gin_metapage_info(), gin_page_opaque_info() Sébastien Lardière DATAONDISK – 31 mai 2016 17 / 30
  • 18. Répertoires et Fichiers Outils pg_filedump Extensions pg_xlogdump pageinspect Exemple test=# insert into mytable values( 1, now(), 'texte 1', true ) ; INSERT 0 1 test=# select lp, lp_off, lp_flags, lp_len, t_xmin, t_xmax, t_ctid, t_infomask, t_data from heap_page_items(get_raw_page('mytable', 0)); -[ RECORD 1 ]+ lp | 1 lp_off | 8136 lp_flags | 1 lp_len | 49 t_xmin | 560 t_xmax | 0 t_ctid | (0,1) t_infomask | 2818 t_data | x0100000000000000e28d5502a9d60100117465787465203101 Sébastien Lardière DATAONDISK – 31 mai 2016 18 / 30
  • 19. Répertoires et Fichiers Outils pg_filedump Extensions pg_xlogdump pageinspect Exemple test=# insert into mytable values( 2, now(), 'texte 2', false ); INSERT 0 1 test=# select lp, lp_off, lp_flags, lp_len, t_xmin, t_ctid, t_data from heap_page_items(get_raw_ -[ RECORD 1 ]+ lp | 1 lp_off | 8136 lp_flags | 1 lp_len | 49 t_xmin | 560 t_ctid | (0,1) t_data | x0100000000000000e28d5502a9d60100117465787465203101 -[ RECORD 2 ]- lp | 2 lp_off | 8080 lp_flags | 1 lp_len | 49 t_xmin | 561 t_ctid | (0,2) t_data | x02000000000000000600e403a9d60100117465787465203200 Sébastien Lardière DATAONDISK – 31 mai 2016 19 / 30
  • 20. Répertoires et Fichiers Outils pg_filedump Extensions pg_xlogdump pageinspect Exemple test=# select txid_current(), t_xmin, t_xmax, t_ctid, t_infomask, t_attrs from heap_page_item_attrs(get_raw_page('mytable', 0), 'mytable', true); -[ RECORD 6 ]+ txid_current | 659 t_xmin | 575 t_xmax | 0 t_ctid | (0,6) t_infomask | 2818 t_attrs | {x06000000,x4082faa9c21c0000,x74657874652033... Sébastien Lardière DATAONDISK – 31 mai 2016 20 / 30
  • 21. Répertoires et Fichiers Outils pg_filedump Extensions pg_xlogdump pageinspect Exemple test=# insert into mytable values ( 6, '2001-01-01 00:00:01 +00'::timestamptz, 'texte 3', false ) ; ERROR: duplicate key value violates unique constraint mytable_pkey DETAIL: Key (id)=(6) already exists. test=# select txid_current(), t_xmin, t_xmax, t_ctid, t_infomask, t_attrs from heap_page_item_attrs(get_raw_page('mytable', 0), 'mytable', true); -[ RECORD 6 ]+ txid_current | 663 t_xmin | 575 t_xmax | 0 t_ctid | (0,6) t_infomask | 2818 t_attrs | {x06000000,x4082faa9c21c0000,x74657874652033... -[ RECORD 7 ]+ txid_current | 663 t_xmin | 662 t_xmax | 0 t_ctid | (0,7) t_infomask | 2050 t_attrs | {x06000000,x4082faa9c21c0000,x74657874652033... Sébastien Lardière DATAONDISK – 31 mai 2016 21 / 30
  • 22. Répertoires et Fichiers Outils pg_filedump Extensions pg_xlogdump pageinspect Inspection d’un B-tree : Exemple test=# SELECT * FROM bt_metap('mytable_pkey'); -[ RECORD 1 ]- magic | 340322 version | 2 root | 1 level | 0 fastroot | 1 fastlevel | 0 c Sébastien Lardière DATAONDISK – 31 mai 2016 22 / 30
  • 23. Répertoires et Fichiers Outils pg_filedump Extensions pg_xlogdump pageinspect Inspection d’un B-tree : Exemple test=# SELECT * FROM bt_page_stats('mytable_pkey', 1); -[ RECORD 1 ]-+- blkno | 1 type | l live_items | 5 dead_items | 0 avg_item_size | 16 page_size | 8192 free_size | 8048 btpo_prev | 0 btpo_next | 0 btpo | 0 btpo_flags | 3 Sébastien Lardière DATAONDISK – 31 mai 2016 23 / 30
  • 24. Répertoires et Fichiers Outils pg_filedump Extensions pg_xlogdump pageinspect Inspection d’un B-tree : Exemple SELECT * FROM bt_page_items('mytable_pkey', 1); -[ RECORD 1 ]- itemoffset | 1 ctid | (0,1) itemlen | 16 nulls | f vars | f data | 01 00 00 00 00 00 00 00 -[ RECORD 2 ]- itemoffset | 2 ctid | (0,2) itemlen | 16 nulls | f vars | f data | 02 00 00 00 00 00 00 00 Sébastien Lardière DATAONDISK – 31 mai 2016 24 / 30
  • 25. Répertoires et Fichiers Outils pg_filedump Extensions pg_xlogdump pageinspect Exemple test=# delete from mytable where id=6; DELETE 1 test=# select txid_current(), t_xmin, t_xmax, t_ctid, t_infomask, t_attrs from heap_page_item_at -[ RECORD 5 ]+ txid_current | 665 t_xmin | 566 t_xmax | 0 t_ctid | (0,5) t_infomask | 2818 t_attrs | {x05000000,x402227afbd7f0ffd,x74657874652033... -[ RECORD 6 ]+ txid_current | 665 t_xmin | 575 t_xmax | 664 t_ctid | (0,6) t_infomask | 770 t_attrs | {x06000000,x4082faa9c21c0000,x74657874652033... Sébastien Lardière DATAONDISK – 31 mai 2016 25 / 30
  • 26. Répertoires et Fichiers Outils pg_filedump Extensions pg_xlogdump pageinspect Exemple test=# vacuum ; VACUUM test=# select txid_current(), t_xmin, t_xmax, t_ctid, t_infomask, t_attrs from heap_page_item_attrs(get_raw_page('mytable', 0), 'mytable', true); -[ RECORD 5 ]+ txid_current | 666 t_xmin | 566 t_xmax | 0 t_ctid | (0,5) t_infomask | 2818 t_attrs | {x05000000,x402227afbd7f0ffd,x74657874652033... -[ RECORD 6 ]+ txid_current | 666 t_xmin | t_xmax | t_ctid | t_infomask | t_attrs | Sébastien Lardière DATAONDISK – 31 mai 2016 26 / 30
  • 27. Répertoires et Fichiers Outils pg_filedump Extensions pg_xlogdump pg_freespacemap Extension permettant d’inspecter le contenu du FSM d’une table : Exemple test=# create extension pg_freespacemap ; CREATE EXTENSION test=# dx+ pg_freespacemap Objects in extension pg_freespacemap Object Description function pg_freespace(regclass) function pg_freespace(regclass,bigint) (2 rows) test=# select * from pg_freespace('mytable'); -[ RECORD 1 ] blkno | 0 avail | 7840 Sébastien Lardière DATAONDISK – 31 mai 2016 27 / 30
  • 28. Répertoires et Fichiers Outils pg_filedump Extensions pg_xlogdump pg_visibility Extension permettant d’inspecter la Visibility Map d’une table : Exemple test=# create extension pg_visibility ; CREATE EXTENSION test=# select * from pg_visibility('mytable', 0); -[ RECORD 1 ]+ all_visible | t all_frozen | t pd_all_visible | t Sébastien Lardière DATAONDISK – 31 mai 2016 28 / 30
  • 29. Répertoires et Fichiers Outils pg_filedump Extensions pg_xlogdump pg_xlogdump Exemple ~$ pg_xlogdump pg_xlog/000000010000000000000001 rmgr: Heap len (rec/tot): 14/ 15130, tx: 3, lsn: 0/01000148, prev 0/01000128, desc: UPDATE off 33 xmax 3 ; new off 40 xmax 0, blkref #0: rel 1663/1/1259 blk 3 FPW, blkref #1: rel 1663/1/1259 blk 0 FPW rmgr: Btree len (rec/tot): 2/ 3713, tx: 3, lsn: 0/01003C80, prev 0/01000148, desc: INSERT_LEAF off 20, blkref #0: rel 1663/1/2662 blk 1 FPW Sébastien Lardière DATAONDISK – 31 mai 2016 29 / 30
  • 30. Répertoires et Fichiers Outils pg_filedump Extensions pg_xlogdump Des Questions ? Merci à vous ! Des Questions ? Sébastien Lardière - Loxodata s.lardiere@loxodata.com Twitter @slardiere Sébastien Lardière DATAONDISK – 31 mai 2016 30 / 30