42.91
IOPS en moyenne en lecture contre 5575.55
pour le disque principal !
apt install rsync
psql
SHOW data_directory;
/var/lib/postgresql/11/main
systemctl stop postgresql
systemctl status postgresql
/
final au 2 chemins) :--dry-run
: rsync -av /var/lib/postgresql /data --dry-run
--dry-run
: rsync -av /var/lib/postgresql /data
mv /var/lib/postgresql/11/main /var/lib/postgresql/11/main.bak
vi /etc/postgresql/11/main/postgresql.conf
data_directory = '/data/postgresql/11/main
'systemctl start postgresql
systemctl status postgresql
psql
SHOW data_directory;
cd /var/lib/postgresql/; rm -fR 11/
vi ~/.psqlrc
\timing
sudo -i -u postgres
psql -c "CREATE ROLE admin WITH LOGIN PASSWORD '<mot-de-passe>';"
psql -c "ALTER USER admin WITH SUPERUSER CREATEDB CREATEROLE REPLICATION;"
psql
: createdb -E UTF8 -O admin admin
exit
psql
\q
psql -c "CREATE ROLE geonatadmin WITH LOGIN PASSWORD '<mot-de-passe>';"
GRANT pg_read_server_files TO geonatadmin ;
createdb -E UTF8 -O geonatadmin geonature2db
) psql -c "CREATE ROLE geonatatlas WITH LOGIN PASSWORD '<mot-de-passe>';"
createdb -E UTF8 -O geonatatlas gnatlas
) psql -c "CREATE ROLE telegraf WITH LOGIN PASSWORD '<mot-de-passe>';"
postgres
avec : psql -c "GRANT CONNECT ON DATABASE postgres TO telegraf;"
psql -c "ALTER USER telegraf SUPERUSER CONNECTION LIMIT 3;"
createdb -E UTF8 -O telegraf telegraf
postgresql.conf
avec : vi /etc/postgresql/12/main/conf.d/01_override.conf
pour ouvrir le port 5432 sur l'IP privé de l'instance db-srv avec la propriété : listen_addresses = 'localhost,10.0.1.20,172.18.5.1'
vi /etc/postgresql/12/main/pg_hba.conf
pour :# IPv4 local connections: ... host all all 10.0.1.20/32 scram-sha-256
# GeoNature host geonature2db geonatadmin 10.0.1.10/32 scram-sha-256 host gnatlas geonatadmin 10.0.1.10/32 scram-sha-256 host gnatlas geonatatlas 10.0.1.10/32 scram-sha-256 host postgres telegraf 172.18.5.0/24 scram-sha-256
systemctl restart postgresql
ss -tunelp | grep 5432
doit afficher : tcp LISTEN 0 128 172.18.5.1:5432 0.0.0.0:* uid:108 ino:18316865 sk:11 <-> tcp LISTEN 0 128 10.0.1.20:5432 0.0.0.0:* uid:108 ino:498249 sk:12 <-> tcp LISTEN 0 128 127.0.0.1:5432 0.0.0.0:* uid:108 ino:498248 sk:13 <-> tcp LISTEN 0 128 [::1]:5432 [::]:* uid:108 ino:498247 sk:14 v6only:1 <->
netstat -anpt|grep :5432
doit afficher : tcp 0 0 172.18.5.1:5432 0.0.0.0:* LISTEN 29707/postgres tcp 0 0 10.0.1.20:5432 0.0.0.0:* LISTEN 31259/postgres tcp 0 0 127.0.0.1:5432 0.0.0.0:* LISTEN 31259/postgres tcp6 0 0 ::1:5432 :::* LISTEN 31259/postgres
telnet 10.0.1.20 5432
nft add rule ip filter INPUT ip daddr 10.0.1.20 tcp sport 1024-65535 tcp dport 5432 ct state new,established counter accept
nft add rule ip filter OUTPUT ip saddr 10.0.1.20 tcp sport 5432 tcp dport 1024-65535 ct state established counter accept
/var/log/postgresql/*.log { weekly rotate 10 copytruncate delaycompress compress notifempty missingok su root root }
postgresql.conf
) via le fichier 01_override.conf
avec : vi /etc/postgresql/12/main/conf.d/01_override.conf
# General shared_preload_libraries = 'pg_stat_statements,pg_prewarm' # Log log_destination = stderr logging_collector = on # Use logrotate for rotation. See: /etc/logrotate.d/postgresql-common #log_rotation_age = 1d #log_rotation_size = 100MB # Log format for PgBadger. See: https://pgbadger.darold.net/documentation.html#REQUIREMENT log_line_prefix= '%t [%p]: db=%d,user=%u,app=%a,client=%h ' lc_messages = 'C.UTF-8' log_autovacuum_min_duration = 0 log_checkpoints = on log_connections = on log_disconnections = on log_lock_waits = on log_temp_files = 0 log_error_verbosity = default # Activity stats track_activity_query_size = 20480 compute_query_id = on track_io_timing = on track_wal_io_timing = on track_functions = 'pl' # Extenssion pg_stat_statements config pg_stat_statements.max = 10000 pg_stat_statements.track = all
L'idée est d'adapter rapidement la configuration de Postgresql fournie par défaut aux caractéristiques de l'instance abritant le serveur Postgresql. Pour cela nous utiliserons le site https://pgtune.leopard.in.ua/.
# DB Version: 11 # OS Type: linux # DB Type: web/data warehouse # Total Memory (RAM): 15 GB # CPUs num: 4 # Data Storage: ssd
# DB Version: 12 # OS Type: linux # DB Type: web # Total Memory (RAM): 15 GB # CPUs num: 4 # Data Storage: ssd
ssh admin@db-<region>-sinp
sudo -i
vi /etc/postgresql/15/main/conf.d/02_optimize.conf
# DB Version: 11 # OS Type: linux # DB Type: web/data warehouse # Total Memory (RAM): 15 GB # CPUs num: 4 # Data Storage: ssd max_connections = 100 shared_buffers = 3840MB effective_cache_size = 11520MB maintenance_work_mem = 1920MB checkpoint_completion_target = 0.7 wal_buffers = 16MB default_statistics_target = 100 random_page_cost = 1.1 effective_io_concurrency = 200 work_mem = 24MB min_wal_size = 4GB max_wal_size = 16GB max_worker_processes = 4 max_parallel_workers_per_gather = 2 max_parallel_workers = 4 max_parallel_maintenance_workers = 2 # ATTENTION : ne pas limiter idle_in_transaction_session_timeout à 5mn10s car la mise à jour de l'Atlas nécessite plus ! #idle_in_transaction_session_timeout=310000
systemctl restart postgresql
SHOW <ma-variable>;
apt install libdbd-pg-perl libdbi-perl perl-modules
mkdir ~/bin/; cd ~/bin/
wget -O postgresqltuner.pl postgresqltuner.pl
chmod +x postgresqltuner.pl
source ~/.bashrc
postgresqltuner.pl --host=localhost --database=geonature2db --user=admin --password=<mot-de-passe>
vi /etc/postgresql/15/main/conf.d/02_optimize.conf
cat /proc/cpuinfo
pse
est présent : indique le support des Huges Pages de 2MBpdpe1gb
est présent : indique le support des Huges Pages de 1GBHugepagesize
dans la sortie de : cat /proc/meminfo
pdpe1gb
) et que Hugepagesize
indique 2MB, vous pouvez changer cette valeur en suivant les indications de la page 34 de ce document PDF.cat /data/postgresql/15/main/postmaster.pid
ou cat /var/lib/postgresql/15/main/postmaster.pid
c'est le nombre sur la première ligne.grep ^VmPeak /proc/<pid-pg-postmaseter>/status
, affiche par exemple VmPeak: 215424 kB
/etc/sysctl.conf
et ajouter le nombre de Huge Pages en l'augmentatn légèrement (ex. 110 pour 106) vm.nr_hugepages = 110
systemctl stop postgresql
sysctl -p
vi /etc/postgresql/15/main/conf.d/02_optimize.conf
huge_pages = on
grep ^Huge /proc/meminfo
HugePages_Rsvd: 0
systemctl start postgresql
systemctl status postgresql
/etc/sysctl.conf
en recommençant les étapes précédentes.grep ^Huge /proc/meminfo
HugePages_Rsvd: 64
geonatadmin
existe en local et que la base de données geonature2db
n'existe pas en local ou peut être supprimée. Postgresql doit écouter en local (localhost
) sur le port par défaut (= 5432
). L'archive générée par pg_dump doit être au format directory
(= "d").geonatadmin
localement avec la commande (changer le mot de passe) : sudo -u postgres psql -c "CREATE ROLE geonatadmin WITH LOGIN PASSWORD '<password-local>';"
sudo -u postgres dropdb --if-exists geonature2db
ERREUR: la base de données « geonature2db » est en cours d'utilisation par d'autres utilisateurs
: fermer les connexions à la base (DBeaver) ou utiliser la commande suivante pour forcer la fermeture de toutes les connexions à la base geonature2db
: sudo -u postgres psql -c "SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity WHERE pg_stat_activity.datname = 'geonature2db' AND pid <> pg_backend_pid();"
geonatadmin
de recréer les extenssions dans la base, nous lui donnons temporairement (le temps de l’exécution de pg_restore) des droits de super-utilisateur : sudo -u postgres psql -c "ALTER ROLE geonatadmin SUPERUSER;"
template0
) portant le même nom que la base distante (impossible de changer directement le nom avec pg_restore) : sudo -u postgres createdb -T template0 geonature2db
geonatadmin
qui doit avoir les droits sur la base geonature2db
: sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE geonature2db TO geonatadmin;"
pg_restore les emplacements de connexions restants sont réservés pour les connexions super-utilisateur non relatif à la réplication
cd /home/${USER}/tmp/ ; tar xvf /home/${USER}/tmp/2021-07-27_geonature2db.tar ; chmod +x -R /home/${USER}/tmp/2021-07-27_geonature2db/
sudo -u postgres pg_restore --host "localhost" --port "5432" -U "geonatadmin" --jobs "8" --verbose --dbname "geonature2db" "/home/${USER}/tmp/2021-07-27_geonature2db" 2>&1 | tee "./$(date +"%Y-%m-%d")_pgrestore.log"
~/tmp/2021-07-27_geonature2db
. Changer l'emplacement en fonction de votre machine.tee
) copie les éléments affichés à l'écran dans un fichier de log <date>_pgrestore.log
.--format
s'il n'est pas précisé est détecté automatiquement. Attention sinon à définir la bonne option: "c"
(custom), "d"
(directory), "t"
(tar)--jobs
indiquer seulement 3/4 du nombre de processeurs (sinon une erreur "nombre max de client atteint" peut apparaître). Dans l'exemple, 8 pour 12 CPU. Pour afficher le nombre de processeur de votre machine : grep -c ^processor /proc/cpuinfo
geonatadmin
: sudo -u postgres psql -c "ALTER ROLE geonatadmin NOSUPERUSER;"
gn2_sinp_paca
: sudo -u postgres dropdb --if-exists gn2_sinp_paca
geonature2db
soit vous en servir de template et la maintenir en local :sudo -u postgres psql -c "CREATE DATABASE gn2_sinp_paca WITH TEMPLATE geonature2db ;"
sudo -u postgres psql -c "ALTER DATABASE geonature2db RENAME TO gn2_sinp_paca;"
psql -c "ALTER DATABASE gn2_sinp_paca OWNER TO geonatadmin;"
web-srv
, activer la maintenance longue de GeoNature et l'Atlas.db-srv
en tant que "admin" puis passer en "root"screen -S upgrade-postgresl
sudo -u postgres pg_dumpall > "/home/admin/backups/postgresql/2022-10-31_dumpall.dump"
du -hs /home/admin/backups/postgresql/2022-10-31_dumpall.dump
systemctl stop postgresql
systemctl status postgresql postgresql@11-main
apt install -y postgresql-15-postgis-3
cp /etc/postgresql/11/main/conf.d/01_optimizing.conf /etc/postgresql/15/main/conf.d/
diff /etc/postgresql/11/main/postgresql.conf /etc/postgresql/15/main/postgresql.conf
listen_addresses = 'localhost,10.0.1.20,172.18.5.1' log_timezone = 'Europe/Paris' datestyle = 'ISO, DMY' timezone = 'Europe/Paris' lc_messages = 'fr_FR.UTF-8' lc_monetary = 'fr_FR.UTF-8' lc_numeric = 'fr_FR.UTF-8' lc_time = 'fr_FR.UTF-8' default_text_search_config = 'pg_catalog.french'
diff /etc/postgresql/11/main/pg_hba.conf /etc/postgresql/15/main/pg_hba.conf
host all all 10.0.1.20/32 scram-sha-256 # GeoNature host geonature2db geonatadmin 10.0.1.10/32 scram-sha-256 host gnatlas geonatadmin 10.0.1.10/32 scram-sha-256 host gnatlas geonatatlas 10.0.1.10/32 scram-sha-256 # Si telegraf utilisé avec un accès basique (base postgres uniquement) : #host postgres telegraf 172.18.5.0/24 scram-sha-256 # Si telegraf utilisé avec un accès avancé (toutes les bases) : host all telegraf 172.18.5.0/24 scram-sha-256 # GeoNature : access by gnreader (read only) host geonature2db gnreader 10.0.1.20/32 scram-sha-256 host gnatlas gnreader 10.0.1.20/32 scram-sha-256
systemctl start postgresql
sudo -u postgres pg_dumpall -p 5432 | sudo -u postgres psql -d postgres -p 5433
systemctl stop postgresql postgresql@11-main postgresql@15-main
vi /etc/postgresql/11/main/postgresql.conf
mettre port = 5433
vi /etc/postgresql/15/main/postgresql.conf
mettre port = 5432
systemctl start postgresql postgresql@11-main postgresql@15-main
pg_lsclusters
web-srv
:sudo systemctl restart geonature geonature-atlas taxhub usershub
systemctl stop postgresql@11-main
sudo apt remove --purge postgresql-11
apt list -a --installed postgresql*
puis apt autoremove
s'il faut supprimer des reliquats.docker compose up -d --build borgmatic
Le type de cryptage des mots de passe par défaut à changé (md5 → SCRAM-SHA-256) dans la version 14. Il est nécessaire de mettre à jour les mots de passe :
psql
SELECT rolname, rolpassword ~ '^SCRAM-SHA-256\$' AS has_upgraded FROM pg_authid WHERE rolcanlogin;
\password <login>
psql -U <login> -h localhost
mkdir ~/bin
.
) ou de tiret (-
) car sinon ils ne sont pas exécutés. mkdir -p ~/backups/postgresql/
--format=d
) qui permet une parallélisation sur plusieurs CPUs (paramètre --jobs
) et une compression (paramètre --compress 9
): export BACKUP_DIR="/home/${USER}/backups/postgresql"; \ export BACKUP_NAME="$(date +%F)_gonature2db"; \ export BACKUP_PATH="${BACKUP_DIR}/${BACKUP_NAME}"; \ mkdir -p "${BACKUP_DIR}"; \ pg_dump --file "${BACKUP_PATH}" --host "localhost" --port "5432" --username "geonatadmin" --verbose --format=d --jobs=$(grep -c ^processor /proc/cpuinfo) --compress 9 geonature2db ; \ tar -cvf "${BACKUP_NAME}.tar" -C "${BACKUP_DIR}" "${BACKUP_NAME}/" ; \ cd "${BACKUP_DIR}" ; \ rm -fR "${BACKUP_NAME}/" ; find "${BACKUP_DIR}" -name "*_gonature2db.tar" -type f -mtime +5 -exec rm -f {} \;
--format=p
) : export BACKUP_DIR="/home/${USER}/backups/postgresql"; \ export BACKUP_NAME="$(date +%F)_gnatlas"; \ export BACKUP_PATH="${BACKUP_DIR}/${BACKUP_NAME}.sql"; \ pg_dump --file "${BACKUP_PATH}" --host "localhost" --port "5432" --username "geonatatlas" --verbose --format=p gnatlas ; \ tar -cvf "${BACKUP_NAME}.tar" -C "${BACKUP_DIR}" "${BACKUP_NAME}.sql" ; \ rm -f "${BACKUP_PATH}" ; \ find "${BACKUP_DIR}" -name "*_gnatlas.tar" -type f -mtime +365 -exec rm -f {} \;
/opt/bkp2dbx/bkp2dbx.sh "postgresql" "/home/admin/backups/postgresql/*.tar" "/home/admin/.dropbox_uploader"
mkdir ~/bin
scp -r bin/* admin@db-<region>-sinp:~/bin/
vi ~/.pgpass
# Format: hostname:port:database:username:password localhost:5432:geonature2db:geonatadmin:<mot-de-passe> localhost:5432:gnatlas:geonatatlas:<mot-de-passe>
chmod 600 ~/.pgpass
mkdir -p ~/backups/postgresql/
scp -r backups admin@db-<region>-sinp:~/dwl/
puis sur le serveur : sudo -i ; mv /home/admin/dwl/backups /etc/cron.d/