web-dev-qa-db-fra.com

Meilleure pratique pour créer des espaces de table dans PostgreSQL

Version PostgreSQL: 11.2
[.____] OS: RHEL ou Oracle Linux 7.6 (pour être décidé)

Je suis au stade de la conception de la mise en place d'une base de données de production. En production, la DB sera d'environ 300 Go à 400 Go de taille.

C'est ce que j'ai à l'esprit. S'il vous plaît laissez-moi savoir si c'est une bonne idée d'un déploiement de production PostgreSQL.

Je vais avoir le système de fichiers suivant monté avec les tailles suivantes:

/db ----> 50 GB
/pgdata ---> 500 GB

Je vais initialiser le cluster de base de données dans l'emplacement personnalisé /db/postgres/pg11/data.
[.____] et dès le début, je commencerai à créer des espaces de table comme ceci:

CREATE TABLESPACE orders_tbs LOCATION '/pgdata/<db_name>/orders_tbs';

... et placer des objets d'affaires dans ces espaces de table comme ceci:

CREATE TABLE orders (id int, order_item text) tablespace orders_tbs;

Merci arkhena, cl cl

Dans ce cas, j'ai pensé à créer un système de fichiers séparé pour les datafiles (/pgdata) et garder les fichiers de configuration et vous connecter à /db. Donc, mon idée était mauvaise.

Depuis que je suis en Rhel/Oracle Linux, par défaut, mon $PGDATA sera /var/lib/pgsql/11/data.
[.____] mais, je préfère avoir mon $PGDATA Dans un endroit personnalisé comme /db/postgres/pg11/data

Puisque les datafiles résident dans $PGDATA/base Répertoire, que diriez-vous de créer une disposition de disque comme ci-dessous à l'aide de LVM?

Un système de fichiers de 50 Go pour le dernier répertoire parent de $ PGDATA /db et un système de fichiers distinct de 500 Go pour $PGDATA/base répertoire?

[root@localhost ~]# df -Ph
Filesystem                      Size  Used Avail Use% Mounted on
<output snipped>
.
.
/dev/mapper/VolGroup1-LogVol02  50G    23M  49.9G   1% /db
/dev/mapper/VolGroup1-LogVol04  500G  2.7M  499.9G  1% /db/postgres/pg11/data/base

J'ai besoin de vérifier avec notre administrateur Linux sur la manière dont la disposition de disque ci-dessus peut être créée de manière optimale sans causer de goulots d'étranglement de stockage.

1
Keith Brabant

Les espaces de table dans PostgreSQL existent pour des besoins très particuliers (et je doute que moins de 500 Go soit dans cette affaire) et pour la conformité SQL. Si vous envisagez de créer des espaces de table pour stocker éventuellement tout sur le même disque, ne faites pas. Si vous envisagez de créer des espaces de table à l'intérieur de $ pgdata, s'il vous plaît ne faites pas.

Les espaces de table mènent à des opérations de récupération plus complexes (si vous en avez besoin d'une). Vous vous maudirez plus tard, faites-moi confiance.

Vous trouverez de nombreux excellents conseils dans Christophe Pettus Diapositives ( PostgreSQL quand ce n'est pas votre travail ). La diapositive 27 concerne les espaces de table et pourquoi ne pas les utiliser.

2
Arkhena

Je ne sais pas quelle solution avez-vous adopté enfin, mais si vous ne voulez pas avoir votre $PGDATA Dans l'emplacement par défaut dans cet article Vous pouvez trouver comment créer une personnalisation $PGDATA. L'article est d'environ Centos 7 avec PostgreSQL 10:

Si vous souhaitez placer vos données dans (par exemple)/pgdata/10/données, créez le répertoire avec les bons droits ( que je dois ajouter ceci est vraiment important: propriétaire et droits. Ceci est postgres:postgres et 700):

# mkdir -p /pgdata/10/data
# chown -R postgres:postgres /pgdata

Ensuite, personnalisez le service SystemD:

# systemctl edit postgresql-10.service

Ajoutez le contenu suivant:

[Service]
Environment=PGDATA=/pgdata/10/data

Cela créera un /etc/systemd/system/postgresql-10.service.d/override.conf Fichier qui sera fusionné avec le fichier de service d'origine.

Pour vérifier son contenu:

# cat /etc/systemd/system/postgresql-10.service.d/override.conf
[Service]
Environment=PGDATA=/pgdata/10/data

Recharger SystemD:

# systemctl daemon-reload

Initialiser le répertoire de données PostgreSQL:

# /usr/pgsql-10/bin/postgresql-10-setup initdb

Démarrer et activer le service:

# systemctl enable postgresql-10
# systemctl start postgresql-10

Si vous ne le faites pas ou que vous ne pouvez pas toucher le postgresqlXX.service Fichier pour changer l'emplacement de $PGDATA Vous pouvez démarrer votre cluster manuellement au lieu d'utiliser SystemCtL:

cd /<location_of_your_PGDATA>
su postgres -c 'pg_ctl start -D  <location_of_your_PGDATA> -l <name_of_file_to_log_startup>'
0
EAmez