postgreSQL

 


Organizacion en el disco

Para empezar vamos a ver como PostgreSQL organiza los ficheros con nuestros datos en el disco. Todos los ficheros usados por PostgreSQL se encuentran en el directorio que hayamos definido como directorio de datos (data_directory) en nuestro sistema.

postgres=# SHOW data_directory;
 data_directory 
----------------
 /var/pgsql
(1 row)

Dentro del directorio de datos encontraremos varios subdirectorios con diferentes cometidos.

postgres@server01:~$ cd /var/pgsql/
postgres@server01:/var/pgsql$ ls -l
total 92
drwx------ 7 postgres nogroup  4096 2011-10-04 18:01 base
drwx------ 2 postgres nogroup  4096 2011-10-04 18:24 global
drwx------ 2 postgres nogroup  4096 2011-10-04 17:53 pg_clog
-rw------- 1 postgres nogroup  4476 2011-10-04 17:53 pg_hba.conf
-rw------- 1 postgres nogroup  1636 2011-10-04 17:53 pg_ident.conf
drwx------ 4 postgres nogroup  4096 2011-10-04 17:53 pg_multixact
drwx------ 2 postgres nogroup  4096 2011-10-04 17:53 pg_notify
drwx------ 2 postgres nogroup  4096 2011-10-04 17:53 pg_serial
drwx------ 2 postgres nogroup  4096 2011-10-05 11:23 pg_stat_tmp
drwx------ 2 postgres nogroup  4096 2011-10-04 17:53 pg_subtrans
drwx------ 2 postgres nogroup  4096 2011-10-04 17:53 pg_tblspc
drwx------ 2 postgres nogroup  4096 2011-10-04 17:53 pg_twophase
-rw------- 1 postgres nogroup     4 2011-10-04 17:53 PG_VERSION
drwx------ 3 postgres nogroup  4096 2011-10-04 17:53 pg_xlog
-rw------- 1 postgres nogroup 19129 2011-10-04 17:53 postgresql.conf
-rw------- 1 postgres nogroup    42 2011-10-04 17:53 postmaster.opts
-rw------- 1 postgres nogroup    68 2011-10-04 17:53 postmaster.pid

El que nos interesa en este artículo es uno que se llama base. Dentro de este subdirectorio se graban todos los datos contenidos en nuestras bases de datos.

En el sistema utilizado para este artículo tenemos lo siguiente en este directorio:

postgres@server01:/var/pgsql$ ls -l base/
total 28
drwx------ 2 postgres nogroup 12288 2011-10-04 17:53 1
drwx------ 2 postgres nogroup  4096 2011-10-04 17:53 11939
drwx------ 2 postgres nogroup  4096 2011-10-04 17:53 11947

Como podeis ver, dentro del subdirectorio base existen otros subdirectorios com nombres numéricos. Cada subdirectorio dentro del directorio base, es una base de datos diferente. Para saber a que base de datos corresponden estos subdirectorios podeis ejecutar este comando SQL en vuestro cliente:

postgres=# SELECT datid,datname from pg_stat_database;
 datid |  datname  
-------+-----------
     1 | template1
 11939 | template0
 11947 | postgres
(5 rows)

Los valores en la columna datid, corresponden a los valores listados en el subdirectorio base y la columna datname es el nombre de la base de datos asociada al identificador numérico.

Vamos a crear una base de datos para nuestros ejemplos y a ver como esto afecta a nuestro sistema.

postgres=# CREATE DATABASE testing_internals;
CREATE DATABASE

Podemos ver como se ha creado un nuevo subdirectorio con el nombre 16407, correspondiente a la nueva base de datos creada.

postgres@server01:/var/pgsql$ ls -l base/
total 24
drwx------ 2 postgres nogroup 12288 2011-10-04 17:53 1
drwx------ 2 postgres nogroup  4096 2011-10-04 17:53 11939
drwx------ 2 postgres nogroup  4096 2011-10-04 17:53 11947
drwx------ 2 postgres nogroup  4096 2011-10-05 11:31 16407
postgres=# SELECT datid,datname from pg_stat_database;
 datid |      datname      
-------+-------------------
     1 | template1
 11939 | template0
 11947 | postgres
 16407 | testing_internals
(4 rows)

Si haceis un listado de este nuevo subdirectorio vereis que ya tiene una serie de ficheros aunque no hayais creado ninguna tabla todavía. Estos ficheros pertenecen al sistema y son necesarios para que la base de datos que habeis creado funcione. Para este artículo no necesitamos saber nada más sobre los mismos, solo que estan ahí y que son necesarios.

Ahora creamos una tabla muy simple en nuestra base de datos con un par de columnas de tipo integer:

postgres=# \c testing_internals 
You are now connected to database "testing_internals" as user "postgres".

testing_internals=# CREATE TABLE test001 ( id INTEGER, code INTEGER, primary key(id));        
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "test001_pkey" for table "test001"
CREATE TABLE

testing_internals=# \d test001
    Table "public.test001"
 Column |  Type   | Modifiers 
--------+---------+-----------
 id     | integer | not null
 code   | integer | 
Indexes:
    "test001_pkey" PRIMARY KEY, btree (id)

El identificador de la tabla test001 y el fichero correspondiente lo podemos obtener por ejemplo de esta manera:

testing_internals=# SELECT pg_relation_filenode('test001'),pg_relation_filepath('test001');

 pg_relation_filenode | pg_relation_filepath 
----------------------+----------------------
                16465 | base/16407/16465
(1 row)

Y el del índice test001_pkeycreado para clave primaria de esta tabla con:

testing_internals=# SELECT pg_relation_filenode('test001_pkey'),pg_relation_filepath('test001_pkey');

 pg_relation_filenode | pg_relation_filepath 
----------------------+----------------------
                16468 | base/16407/16468
(1 row)

Si hacemos un listado del contenido del directorio de nuestra base de datos (base/16407) podremos ver que se han creado dos nuevos ficheros con los nombres 16465 y 16468.

postgres@server01:/var/pgsql$ ls -l base/16407/16465
-rw------- 1 postgres nogroup 0 2011-10-06 12:09 base/16407/16465

postgres@server01:/var/pgsql$ ls -l base/16407/16468
-rw------- 1 postgres nogroup 8192 2011-10-06 12:09 base/16407/16468

Si esta tabla o índice llegasen a ser mayores que 1GB, se dividirian a nivel del sistema de ficheros en ficheros con un máximo de 1GB cada uno. Si por ejemplo, nuestra tabla llegase a ser de 3,5GB, veriamos algo similar a esto:

[postgres@server]$ ls -l base/16407/16465*

-rw-------  1 postgres pgdba 1073741824 Jul  5 15:11 base/16407/16465
-rw-------  1 postgres pgdba 1073741824 Jul  6 15:11 base/16407/16465.1
-rw-------  1 postgres pgdba 1073741824 Jul  7 15:11 base/16407/16465.2
-rw-------  1 postgres pgdba  536870912 Jul  8 15:11 base/16407/16465.3

Comentarios