La arquitectura de almacenamiento utilizada por postgresql toca la estructura de almacenamiento y la forma organizativa de los datos reales. Los datos almacenados en la base de datos están originalmente aquí.

arquitectura de almacenamiento

inserte la descripción de la imagen aquí

Contenido de la columna :
análisis del código fuente del kernel postgresql
base de datos manuscrita toadb
programación concurrente
página de inicio personal : el lema de mi página de inicio
: Tian Xingjian, un caballero se esfuerza por superarse a sí mismo;

descripción general

Cuando se ejecuta el servicio de base de datos postgresql, ¿cómo se almacenan los datos en el disco? Esto implica arquitectura de almacenamiento.
En el sistema de archivos, podemos ver unidades de almacenamiento en forma de directorios y archivos. Esta es la arquitectura de almacenamiento físico.
Estos directorios y archivos en realidad tienen ciertas conexiones y formas organizativas. Por ejemplo, el directorio más externo es el directorio de datos del clúster. Cada base de datos tendrá un directorio, que es la arquitectura de almacenamiento lógico.

La arquitectura de almacenamiento lógico mantiene la forma organizativa de los archivos de disco físico y la arquitectura de almacenamiento físico es la presentación de archivos de disco específicos.

Arquitectura de almacenamiento lógico

Espacios de nombres

Lógicamente, la base de datos tiene varias capas de espacios de nombres de gestión organizacional

inserte la descripción de la imagen aquí

Clúster->tablespace tablespace->base de datos->esquema
donde el esquema se distingue por el diccionario de datos en el núcleo de la base de datos, por lo que los primeros tres elementos son todos físicamente independientes del espacio a través de la organización de la arquitectura de almacenamiento.
Esto también se menciona en el artículo de análisis del núcleo anterior.La ubicación del archivo de la tabla también se identifica de forma única por los tres niveles de tablespace/base de datos/relación.

Para el concepto de clúster, el clúster es creado por initdb, es decir, el directorio donde se almacenan los datos, debe especificarse cuando se inicia el servicio de base de datos, generalmente se llama PGDATA.

archivo de datos

archivo de datos de usuario

Hay tablas, índices y archivos vm y fsm correspondientes, todos los cuales se almacenan de acuerdo con el directorio jerárquico del espacio de nombres.

datos relacionados con transacciones

Está administrado por espacio a nivel de clúster y hay un directorio público debajo del directorio del clúster.

otros documentos organizacionales

Los archivos como los archivos de espacio de tabla, los archivos de diccionario de datos, las bibliotecas de plantillas y los registros en ejecución se administran a nivel de clúster y tienen sus propios directorios en el directorio del clúster.

archivo de configuración

  • archivo de configuración de la base de datos

postgresql.conf

  • Perfil de control de acceso del cliente

pg_hba.conf y pg_ident.conf

Documentos auxiliares

Tales como archivos de versión, archivos de información en ejecución, etc., están todos en el directorio raíz de PGDATA

arquitectura de almacenamiento físico

  1. Por lo general, se hace referencia a él como PGDATA (usando el nombre de la variable de entorno que lo define). Una ubicación común para PGDATA es /var/lib/pgsql/data. Varios clústeres administrados por diferentes instancias de base de datos pueden coexistir en la misma máquina.
  2. Después de que una tabla o índice exceda 1GB, se divide en segmentos de 1G de tamaño.
    El nombre de archivo del primer segmento es el mismo que el del nodo de archivo, los segmentos subsiguientes se denominan filenode.1, filenode.2 y así sucesivamente. Esta disposición evita problemas en algunas plataformas con limitaciones de tamaño de archivo (en realidad, 1 GB es solo el tamaño de segmento predeterminado. El tamaño de segmento se puede ajustar usando la opción de configuración --with-segsize al compilar PostgreSQL). En principio, las ramas del mapa de espacio libre y del mapa de visibilidad también podrían requerir varios segmentos, pero en la práctica esto rara vez sucede.
  3. Cada base de datos tendrá un directorio separado, que almacena los archivos de tabla de la biblioteca.

Estructura de archivos de clúster

Primero inicialice un nuevo clúster de base de datos, luego inicialice e inicie la base de datos

# 初始化postgres数据库集簇 
/opt/postgres/bin/initdb -D pgtest -W

# 启动数据库,监听端口指定为 8888 
/opt/postgres/bin/pg_ctl -D pgtest -l logfile -o "-p 8888" start

# 以命令行客户端,登陆数据库,指定端口和数据库
/opt/postgres/bin/psql -p 8888 -d postgres

La siguiente es la estructura de directorios del clúster después de que se completa initdb y se crea un nuevo espacio de tablas,
y luego, para ver algunos tipos de archivos, se crean tablas temporales, tablas no registradas e índices;
la lista de archivos de algunas tablas se omite en el medio, y la jerarquía de directorios se conserva y archivos clave.

-- 表空间 
create tablespace tblspc_test location '/mnt/sda1/data/pgdata/pgtblspc';

-- 普通表 
create table tbl_account(id integer, name varchar, address varchar, tel varchar);

-- 临时表 会话退出后就会删除 
create temporary table tmptbl_test(id int, c_id int);

-- unlogged 表,不会记录WAL,恢复时数据全部丢失 
create unlogged table unlogtbl_test(c_id int ,consumer varchar);
create index on unlogtbl_test (c_id);

Después de la construcción de la escena anterior, echemos un vistazo a la jerarquía de archivos y directorios en el clúster de la base de datos.

[senllang@hatch pgdata]$ tree pgtest
pgtest
├── base
│   ├── 1
│   │   ├── 112
│   │   ├── 113
│   │   ├── 1247
│   │   ├── 1247_fsm
│   │   ├── 1247_vm
│   │   ├── 1249
......
│   │   ├── 827
│   │   ├── 828
│   │   ├── pg_filenode.map
│   │   ├── pg_internal.init
│   │   └── PG_VERSION
│   ├── 4
│   │   ├── 112
│   │   ├── 113
│   │   ├── 1247
│   │   ├── 1247_fsm
│   │   ├── 1247_vm
......
│   │   ├── 6238
│   │   ├── 6239
│   │   ├── 826
│   │   ├── 827
│   │   ├── 828
│   │   ├── pg_filenode.map
│   │   └── PG_VERSION
│   └── 5
│       ├── 112
│       ├── 113
│       ├── 1247
│       ├── 1247_fsm
│       ├── 1247_vm
│       ├── 16403
│       ├── 16403_init
│       ├── 16406
│       ├── 16406_init
│       ├── 16407
│       ├── 16407_init
│       ├── 16408
│       ├── 16408_init
│       ├── t3_16409
│       └── t3_16412
......
│       ├── 827
│       ├── 828
│       ├── pg_filenode.map
│       ├── pg_internal.init
│       └── PG_VERSION
├── global
│   ├── 1213
│   ├── 1213_fsm
│   ├── 1213_vm
│   ├── 1214
│   ├── 1232
│   ├── 1233
│   ├── 1260
│   ├── 1260_fsm
│   ├── 1260_vm
......
│   ├── pg_control
│   ├── pg_filenode.map
│   └── pg_internal.init
├── pg_commit_ts
├── pg_dynshmem
├── pg_hba.conf
├── pg_ident.conf
├── pg_logical
│   ├── mappings
│   ├── replorigin_checkpoint
│   └── snapshots
├── pg_multixact
│   ├── members
│   │   └── 0000
│   └── offsets
│       └── 0000
├── pg_notify
├── pg_replslot
├── pg_serial
├── pg_snapshots
├── pg_stat
├── pg_stat_tmp
├── pg_subtrans
│   └── 0000
├── pg_tblspc
│   └── 16388 -> /mnt/sda1/data/pgdata/pgtblspc
├── pg_twophase
├── PG_VERSION
├── pg_wal
│   ├── 000000010000000000000001
│   └── archive_status
├── pg_xact
│   └── 0000
├── postgresql.auto.conf
├── postgresql.conf
├── postmaster.opts
└── postmaster.pid

introducción detallada

Directorio de archivos describir
PG_VERSIÓN Un archivo que contiene el número de versión principal de PostgreSQL
base Un subdirectorio que contiene un subdirectorio para cada base de datos
archivos_de_registro_actuales Un archivo que registra los archivos de registro que está escribiendo actualmente el recopilador de registros
global Subdirectorios que contienen tablas de todo el clúster, como pg_database
pg_commit_ts Subdirectorio que contiene datos de marca de tiempo de compromiso de transacción
pg_dynshmem subdirectorio que contiene archivos utilizados por el subsistema de memoria compartida dinámica
pg_lógico Subdirectorio que contiene datos de estado para la replicación lógica
pg_multixact Subdirectorio que contiene datos de estado de transacciones múltiples (para bloqueos de fila compartidos)
pg_notificar Subdirectorio que contiene datos de estado LISTEN/NOTIFY
pg_replslot Subdirectorio que contiene datos de ranuras de replicación
pg_serial Subdirectorio que contiene información de transacción serializable confirmada
pg_instantáneas Subdirectorio que contiene instantáneas exportadas
pg_stat Subdirectorio que contiene archivos permanentes para el subsistema de estadísticas
pg_stat_tmp subdirectorio que contiene archivos temporales para el subsistema de estadísticas
pg_subtrans Subdirectorio que contiene datos de estado de subtransacción
pg_tblspc Subdirectorio que contiene enlaces simbólicos a tablespaces
pg_dosfases Contiene subdirectorios para preparar archivos de estado de transacciones
pg_wal Subdirectorio que contiene archivos WAL (registro de escritura anticipada)
pg_xact Subdirectorio que contiene datos de estado de compromiso de transacción
postgresql.auto.conf Un archivo utilizado para almacenar parámetros de configuración establecidos por ALTER SYSTEM
postmaster.opts Un archivo que registra los argumentos de la línea de comandos utilizados la última vez que se inició el servidor
postmaster.pid Un archivo de bloqueo que registra el ID del proceso postmaster (PID) actual, la ruta del directorio de datos del clúster, la marca de tiempo de inicio del postmaster, el número de puerto, la ruta del directorio del socket del dominio Unix (vacío en Windows), la primera dirección de escucha disponible (dirección IP o *, o medios vacíos no escucha en TCP) e ID de segmento de memoria compartida (el archivo no existe después de que se cierra el servidor)

espacio de mesa

Creó una tabla temporal, una tabla ordinaria y una base de datos en el espacio de tabla

-- 创建数据库,指定存储的表空间 
create database test tablespace tblspc_test ;

-- 在指定表空间创建临时表 
create temporary table tmptbl_test1(id int, c_id int) tablespace tblspc_test;

-- 在指定表空间创建普通表 
create table tbl_salary(id integer, level float, performance float) tablespace tblspc_test;

estructura física

Vea los archivos en el directorio del espacio de tablas, la jerarquía de directorios y la lista de archivos son las siguientes

[senllang@hatch pgdata]$ tree pgtblspc/
pgtblspc/
└── PG_16_202306141
    ├── 16389
    │   ├── 112
    │   ├── 113
    │   ├── 1247
    │   ├── 1247_fsm
    │   ├── 1247_vm
    │   ├── 1249
    │   ├── 1249_fsm
    │   ├── 1249_vm
    ......
    │   ├── 826
    │   ├── 827
    │   ├── 828
    │   ├── pg_filenode.map
    │   └── PG_VERSION
    └── 5
        ├── 16395
        └── t3_16413

Se puede observar que bajo el directorio del table space, existe un directorio PG_16_202306141, cuyo nombre comienza con PG, seguido de la versión de la base de datos y la fecha de creación.
Los espacios de tabla definidos por el usuario tienen un enlace simbólico en el directorio PGDATA/pg_tblspc, que apunta al directorio de espacio de tabla físico (es decir, el directorio especificado en el comando CREATE TABLESPACE).
El enlace simbólico se nombra con el OID del tablespace.

Principio Descripción

En el directorio del tablespace físico hay un subdirectorio con un nombre que depende de la versión del servidor PostgreSQL, como PG_16_202306141 (la razón para usar este subdirectorio es que las versiones posteriores de la base de datos pueden usar CREATE TABLESPACE para especificar la misma ubicación de directorio sin provocando conflictos).

Dentro de este subdirectorio específico de la versión, hay un subdirectorio para cada base de datos que tiene elementos en este espacio de tabla, con el nombre del OID de la base de datos. Las tablas y los índices de este directorio siguen el esquema de nomenclatura de nodos de archivo.

Después de inicializar el clúster, hay dos espacios de tabla predeterminados, pg_default y pg_global.Cuando no especificamos un espacio de tabla, la base de datos creada, las tablas, etc., se almacenan en el espacio de tabla pg_default.
No es necesario acceder a pg_default a través de pg_tblspc, pero corresponde a PGDATA/base. De manera similar, no se accede al tablespace pg_global a través de pg_tblspc, sino que corresponde a PGDATA/global.

base de datos

inserte la descripción de la imagen aquí

Para cada base de datos del clúster, hay un subdirectorio correspondiente en PGDATA/base y el nombre del subdirectorio es el OID de la base de datos en pg_database.
Este subdirectorio es la ubicación predeterminada para los archivos de la base de datos; en particular, los catálogos del sistema para la base de datos se almacenan aquí.

archivo de datos

La función pg_relation_filepath() muestra la ruta completa (relativa a PGDATA) de cualquier relación.
Se puede utilizar como una alternativa a la memorización de tantas reglas anteriores.

Pero recuerde que esta función solo proporciona el nombre del primer segmento de la rama maestra de la relación; es posible que deba agregar un número de segmento o _fsm, _vm, _init para encontrar todos los archivos relacionados con la relación.

Archivos de tablas e índices

Cada tabla e índice se almacena en un archivo separado.
Para tablas ordinarias, estos archivos reciben el nombre del número de nodo de archivo de la tabla o índice, que se puede encontrar en pg_class.relfilenode.

Mesas temporales

Para las tablas temporales, el nombre del archivo tiene el formato tBBB_FFF, donde BBB es el ID de backend del backend que creó el archivo y FFF es el número de nodo del archivo.

espacio libre mapa fsm

En cada caso, fuera del archivo maestro (a/k/a rama maestra), hay un mapa de espacio libre para cada tabla e índice, que almacena información sobre el espacio libre disponible en la tabla.
El mapa de espacio libre se almacena en un archivo que lleva el nombre del número de nodo con el sufijo _fsm.

mapa de visibilidad vm

La tabla también tiene un mapa de visibilidad, almacenado en un archivo con el número de nodo con el sufijo _vm, que se utiliza para realizar un seguimiento de las páginas que se sabe que contienen tuplas no inactivas.

tabla no registrada

Las tablas e índices que no están registrados, es decir, tablas sin registrar, también tienen una tercera rama, la rama de inicialización, que se almacena en el archivo de rama con el número de nodo más el sufijo _init.

La rama de inicialización es una tabla vacía o índice del tipo apropiado.
Cuando una tabla no registrada debe restablecerse para quedar vacía debido a un bloqueo, la rama de inicialización se copia junto con la rama maestra, mientras que las demás ramas se borran (se reconstruyen automáticamente cuando es necesario).

mesa tostada

Si una columna de una tabla puede almacenar elementos bastante grandes, entonces la tabla tendrá una tabla TOAST asociada, que se
usa para el almacenamiento fuera de línea de valores de campo que no se pueden mantener en la fila de la tabla.

Si la tabla tiene una tabla TOAST, el pg_class.reltoastrelid de la tabla se vincula a su tabla TOAST;

Archivos temporales

Los archivos temporales (para operaciones como la clasificación de datos que no caben en la memoria) se crean en PGDATA/base/pgsql_tmp. Si los archivos temporales se especifican en un tablespace que no sea pg_default, se crearán en pgsql_tmp de ese tablespace en el subdirectorio. El nombre del archivo temporal tiene el formato pgsql_tmpPPP.NNN, donde PPP es el PID del backend al que pertenece, y NNN se usa para distinguir diferentes archivos temporales del backend.

fin

Muchas gracias por su apoyo. No olvides dejar tus valiosos comentarios mientras navegas. Si crees que es digno de aliento, dale me gusta y marca, ¡trabajaré más duro!

Correo electrónico del autor: [email protected]
Si hay errores u omisiones, indíquelos y aprendan unos de otros.

Nota: ¡No reimprimir sin consentimiento!

Supongo que te gusta

Origin blog.csdn.net/senllang/article/details/132129065
Recomendado
Clasificación