A arquitetura de armazenamento usada pelo postgresql toca a estrutura de armazenamento e a forma organizacional dos dados reais. Os dados armazenados no banco de dados estão originalmente aqui

arquitetura de armazenamento

insira a descrição da imagem aqui

​Conteúdo da coluna :
análise de código-fonte do kernel postgresql
banco de dados manuscrito toadb
programação simultânea
página inicial pessoal : lema da minha página inicial
: Tian Xingjian, um cavalheiro se esforça para o autoaperfeiçoamento;

visão geral

Quando o serviço de banco de dados postgresql está em execução, como os dados são armazenados no disco? Isso envolve arquitetura de armazenamento.
No sistema de arquivos, podemos ver unidades de armazenamento na forma de diretórios e arquivos. Esta é a arquitetura de armazenamento físico.
Esses diretórios e arquivos realmente têm certas conexões e formas organizacionais. Por exemplo, o diretório mais externo é o diretório de dados do cluster. Cada um banco de dados terá um diretório, que é a arquitetura de armazenamento lógico.

A arquitetura de armazenamento lógico mantém a forma organizacional dos arquivos de disco físico, e a arquitetura de armazenamento físico é a apresentação de arquivos de disco específicos.

Arquitetura de armazenamento lógico

Namespaces

Logicamente, o banco de dados tem várias camadas de namespaces de gerenciamento organizacional

insira a descrição da imagem aqui

Cluster->tablespace tablespace->database->schema
, em que o esquema é diferenciado pelo dicionário de dados no kernel do banco de dados, de modo que os três primeiros itens são todos fisicamente independentes do espaço por meio da organização da arquitetura de armazenamento.
Isso também é mencionado no artigo de análise de kernel anterior.A localização do arquivo de tabela também é identificada exclusivamente pelos três níveis de espaço de tabela/banco de dados/relação.

Para o conceito de cluster, o cluster é criado pelo initdb, ou seja, o diretório onde os dados são armazenados, ele precisa ser especificado quando o serviço de banco de dados é iniciado, geralmente chamado de PGDATA.

arquivo de dados

arquivo de dados do usuário

Existem tabelas, índices e arquivos vm e fsm correspondentes, todos armazenados de acordo com o diretório hierárquico do namespace

dados relacionados à transação

Ele é gerenciado pelo espaço no nível do cluster e há um diretório público sob o diretório do cluster.

outros documentos organizacionais

Arquivos como arquivos de espaço de tabela, arquivos de dicionário de dados, bibliotecas de modelos e logs em execução são todos gerenciados no nível do cluster e têm seus próprios diretórios no diretório do cluster

arquivo de configuração

  • arquivo de configuração do banco de dados

postgresql.conf

  • Perfil de controle de acesso do cliente

pg_hba.conf e pg_ident.conf

documentos auxiliares

Como arquivos de versão, arquivos de informações em execução, etc., estão todos no diretório raiz do PGDATA

arquitetura de armazenamento físico

  1. Normalmente referenciado como PGDATA (usando o nome da variável de ambiente que o define). Um local comum para PGDATA é /var/lib/pgsql/data. Vários clusters gerenciados por diferentes instâncias de banco de dados podem coexistir na mesma máquina.
  2. Depois que uma tabela ou índice excede 1 GB, ela é dividida em segmentos de tamanho de 1 G.
    O nome de arquivo do primeiro segmento é o mesmo do nó do arquivo, os segmentos subseqüentes são denominados filenode.1, filenode.2 e assim por diante. Este arranjo evita problemas em algumas plataformas com limitações de tamanho de arquivo (na verdade, 1GB é apenas o tamanho padrão do segmento. O tamanho do segmento pode ser ajustado usando a opção configure --with-segsize ao compilar o PostgreSQL). Em princípio, as ramificações do mapa de espaço livre e do mapa de visibilidade também podem exigir vários segmentos, mas na prática isso raramente acontece.
  3. Cada banco de dados terá um diretório separado, que armazena os arquivos de tabela da biblioteca.

Estrutura de arquivo de cluster

Primeiro, inicialize um novo cluster de banco de dados e, em seguida, inicialize e inicie o banco de dados

# 初始化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

A seguir está a estrutura do diretório do cluster depois que o initdb é concluído e um novo espaço de tabela é criado
e, para ver alguns tipos de arquivo, tabelas temporárias, tabelas não registradas e índices são criados;
a lista de arquivos de algumas tabelas é omitida no meio, e a hierarquia de diretórios é mantida e os arquivos principais.

-- 表空间 
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);

Após a construção da cena acima, vamos dar uma olhada na hierarquia de arquivos e diretórios no cluster de banco de dados

[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

introdução detalhada

Diretório de arquivos descrever
PG_VERSION Um arquivo contendo o número da versão principal do PostgreSQL
base Um subdiretório contendo um subdiretório para cada banco de dados
current_logfiles Um arquivo que registra os arquivos de log atualmente sendo gravados pelo coletor de log
global Subdiretórios contendo tabelas de todo o cluster, como pg_database
pg_commit_ts Subdiretório contendo dados de registro de data e hora de confirmação de transação
pg_dynshmem subdiretório contendo arquivos usados ​​pelo subsistema dinâmico de memória compartilhada
pg_logical Subdiretório contendo dados de estado para replicação lógica
pg_multixact Subdiretório contendo dados de estado de várias transações (para bloqueios de linha compartilhados)
pg_notify Subdiretório contendo dados de status LISTEN/NOTIFY
pg_replslot Subdiretório contendo dados do slot de replicação
pg_serial Subdiretório contendo informações de transações serializáveis ​​confirmadas
pg_snapshots Subdiretório contendo instantâneos exportados
pg_stat Subdiretório contendo arquivos permanentes para o subsistema de estatísticas
pg_stat_tmp subdiretório contendo arquivos temporários para o subsistema de estatísticas
pg_subtrans Subdiretório contendo dados de estado de subtransação
pg_tblspc Subdiretório contendo links simbólicos para tablespaces
pg_twophase Contém subdiretórios para preparar arquivos de estado da transação
pg_wal Subdiretório contendo arquivos WAL (write-ahead log)
pg_xact Subdiretório contendo dados de status de confirmação da transação
postgresql.auto.conf Um arquivo usado para armazenar parâmetros de configuração definidos por ALTER SYSTEM
postmaster.opts Um arquivo que registra os argumentos da linha de comando usados ​​na última vez em que o servidor foi iniciado
postmaster.pid Um arquivo de bloqueio que registra o ID do processo do postmaster atual (PID), o caminho do diretório de dados do cluster, o carimbo de data/hora de inicialização do postmaster, o número da porta, o caminho do diretório do soquete do domínio Unix (vazio no Windows), o primeiro listen_address disponível (endereço IP ou *, ou vazio significa não está escutando no TCP) e ID do segmento de memória compartilhada (o arquivo não existe depois que o servidor é fechado)

espaço de mesa

Criou uma tabela temporária, uma tabela comum e um banco de dados no espaço de tabela

-- 创建数据库,指定存储的表空间 
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;

Estrutura física

Visualize os arquivos no diretório tablespace, a hierarquia de diretórios e a lista de arquivos são as seguintes

[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

Pode-se observar que sob o diretório do espaço de tabela, existe um diretório PG_16_202306141, cujo nome começa com PG, seguido da versão do banco de dados e a data de criação.
Os espaços de tabela definidos pelo usuário possuem um link simbólico no diretório PGDATA/pg_tblspc, que aponta para o diretório do espaço de tabela físico (ou seja, o diretório especificado no comando CREATE TABLESPACE).
O link simbólico é nomeado com o OID do tablespace.

Descrição do Princípio

No diretório do tablespace físico existe um subdiretório com um nome que depende da versão do servidor PostgreSQL, como PG_16_202306141 (a razão para usar este subdiretório é que as versões subseqüentes do banco de dados podem usar CREATE TABLESPACE para especificar a mesma localização do diretório sem causando conflitos).

Dentro deste subdiretório específico da versão, há um subdiretório para cada banco de dados que possui elementos neste espaço de tabela, nomeado após o OID do banco de dados. Tabelas e índices neste diretório seguem o esquema de nomeação de nó de arquivo.

Depois que o cluster é inicializado, existem dois espaços de tabela padrão, pg_default e pg_global.Quando não especificamos um espaço de tabela, o banco de dados criado, tabelas, etc., são armazenados no espaço de tabela pg_default.
pg_default não precisa ser acessado através de pg_tblspc, mas corresponde a PGDATA/base. Da mesma forma, o tablespace pg_global não é acessado por meio de pg_tblspc, mas corresponde a PGDATA/global.

base de dados

insira a descrição da imagem aqui

Para cada banco de dados no cluster, existe um subdiretório correspondente em PGDATA/base, e o nome do subdiretório é o OID do banco de dados em pg_database.
Este subdiretório é o local padrão para os arquivos do banco de dados; em particular, os catálogos do sistema para o banco de dados são armazenados aqui.

arquivo de dados

A função pg_relation_filepath() exibe o caminho completo (relativo a PGDATA) de qualquer relação.
Pode ser usado como uma alternativa para memorizar tantas regras acima.

Mas lembre-se que esta função apenas dá o nome do primeiro segmento do ramo mestre da relação - você pode precisar anexar um número de segmento ou _fsm, _vm, _init para encontrar todos os arquivos relacionados à relação.

Tabela e arquivos de índice

Cada tabela e índice são armazenados em um arquivo separado.
Para tabelas comuns, esses arquivos são nomeados de acordo com o número do filenode da tabela ou índice, que pode ser encontrado em pg_class.relfilenode.

Tabelas temporárias

Para tabelas temporárias, o nome do arquivo está no formato tBBB_FFF, onde BBB é o ID do backend que criou o arquivo e FFF é o número do nó do arquivo.

mapa do espaço livre fsm

Em cada caso, fora do arquivo master (a/k/a branch master), existe um mapa de espaço livre para cada tabela e índice, que armazena informações sobre o espaço livre disponível na tabela.
O mapa de espaço livre é armazenado em um arquivo com o nome do número do nó com o sufixo _fsm.

mapa de visibilidade vm

A tabela também possui um mapa de visibilidade, armazenado em um arquivo com o número do nó sufixado com _vm, que é usado para rastrear quais páginas são conhecidas por conter tuplas não mortas.

tabela não registrada

Tabelas e índices que não são registrados, ou seja, tabelas não registradas, também possuem uma terceira ramificação, a ramificação de inicialização, que é armazenada no arquivo de ramificação com o número do nó mais o sufixo _init.

A ramificação de inicialização é uma tabela ou índice vazio do tipo apropriado.
Quando uma tabela não registrada deve ser redefinida como vazia devido a uma falha, a ramificação de inicialização é copiada junto com a ramificação principal, enquanto quaisquer outras ramificações são limpas (elas são reconstruídas automaticamente quando necessário).

mesa de torradas

Se uma coluna de uma tabela pode armazenar itens muito grandes, então a tabela terá uma tabela TOAST associada, que é
usada para armazenamento off-line de valores de campo que não podem ser mantidos na linha da tabela.

Se a tabela tiver uma tabela TOAST, o pg_class.reltoastrelid da tabela será vinculado à sua tabela TOAST;

Arquivos temporários

Arquivos temporários (para operações como classificação de dados que não cabem na memória) são criados em PGDATA/base/pgsql_tmp. Se os arquivos temporários forem especificados em um tablespace diferente de pg_default, eles serão criados em pgsql_tmp desse tablespace, no subdiretório. O nome do arquivo temporário está no formato pgsql_tmpPPP.NNN, onde PPP é o PID do backend ao qual pertence, e NNN é usado para distinguir diferentes arquivos temporários do backend.

fim

Muito obrigado pelo seu apoio. Não se esqueça de deixar seus comentários valiosos enquanto navega. Se você acha que vale a pena encorajar, por favor, curta e marque, vou trabalhar mais!

E-mail do autor: [email protected]
Se houver algum erro ou omissão, por favor, aponte-os e aprendam uns com os outros.

Nota: Não reimprima sem consentimento!

Acho que você gosta

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