wikiv1:install_pgsql_cod_fonte
Table of Contents
Instalação por código fonte - Debian
Vagranfile
- Vagrantfile
$ cat Vagrantfile # -*- mode: ruby -*- # vi: set ft=ruby : ENV['VAGRANT_DEFAULT_PROVIDER'] = 'libvirt' vms = { "pgsql-director" => {"memory" => "4096", "cpu" => "2", "ip" => "250", "box" => "g3anmart1ns/debian11" }, "pgsql-client" => {"memory" => "1024", "cpu" => "1", "ip" => "10", "box" => "g3anmart1ns/debian11" } } Vagrant.configure("2") do |config| config.vm.box_check_update = false vms.each do |name, conf| config.vm.define "#{name}" do |vms| vms.vm.network :private_network, :ip => "10.200.250.#{conf["ip"]}" vms.vm.box = "#{conf["box"]}" vms.vm.hostname = "#{name}" vms.vm.provider :libvirt do |lv| lv.memory = conf["memory"] lv.cpus = conf["cpu"] lv.cpu_mode = "host-passthrough" lv.cputopology :sockets => "1", :cores => conf["cpu"], :threads => "1" lv.disk_driver :cache => "none" if name == 'pgsql-director' lv.storage :file, :size => '32G' end end end end config.vm.synced_folder ".", "/vagrant", disabled: true end
Arquitetura de diretórios sugerida
| Tipo | Localização |
|---|---|
| Instalação | /usr/local/pgsql/<VERSÃO MAJORITÁRIA> |
| Configuração | /var/local/pgsql/<VERSÃO MAJORITÁRIA>/data |
| Dados (PGDATA) | /var/local/pgsql/<VERSÃO MAJORITÁRIA>/data |
| Binários | /usr/local/pgsql/<VERSÃO MAJORITÁRIA>/bin |
Preparando partição para a instalação do PodtgreSQL
vagrant@pgsql-director:~$ sudo su -
root@pgsql-director:~# fdisk -l Disco /dev/vda: 32 GiB, 34359738368 bytes, 67108864 setores Unidades: setor de 1 * 512 = 512 bytes Tamanho de setor (lógico/físico): 512 bytes / 512 bytes Tamanho E/S (mínimo/ótimo): 512 bytes / 512 bytes Tipo de rótulo do disco: dos Identificador do disco: 0x5c4d2e13 Dispositivo Inicializar Início Fim Setores Tamanho Id Tipo /dev/vda1 * 2048 65107967 65105920 31G 83 Linux /dev/vda2 65110014 67106815 1996802 975M 5 Estendida /dev/vda5 65110016 67106815 1996800 975M 82 Linux swap / Solaris Disco /dev/vdb: 32 GiB, 34359738368 bytes, 67108864 setores Unidades: setor de 1 * 512 = 512 bytes Tamanho de setor (lógico/físico): 512 bytes / 512 bytes Tamanho E/S (mínimo/ótimo): 512 bytes / 512 bytes
root@pgsql-director:~# apt install lvm2
root@pgsql-director:~# pvcreate /dev/vdb
root@pgsql-director:~# vgcreate vgPGSQL /dev/vdb
root@pgsql-director:~# lvcreate -l 85%FREE -n lvPGSQL vgPGSQL
root@pgsql-director:~# lvdisplay --- Logical volume --- LV Path /dev/vgPGSQL/lvPGSQL LV Name lvPGSQL VG Name vgPGSQL LV UUID nCKWWy-9O4E-pwvk-VwdT-w9uK-xTd8-Eo8j7K LV Write Access read/write LV Creation host, time pgsql-director, 2022-12-08 17:03:44 -0300 LV Status available # open 0 LV Size <27,20 GiB Current LE 6962 Segments 1 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 253:0
root@pgsql-director:~# mkfs.xfs /dev/mapper/vgPGSQL-lvPGSQL mke2fs 1.46.2 (28-Feb-2021) Discarding device blocks: done Creating filesystem with 7129088 4k blocks and 1782368 inodes Filesystem UUID: 66f3cbfc-5ea2-4058-929d-476b8aee88fd Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 4096000 Allocating group tables: done Writing inode tables: done Creating journal (32768 blocks): done Writing superblocks and filesystem accounting information: done
root@pgsql-director:~# mkdir /var/local/pgsql root@pgsql-director:~# UUID=`sudo blkid -o export /dev/mapper/vgPGSQL-lvPGSQL | grep UUID` root@pgsql-director:~# cp -p /etc/fstab{,.dist}
root@pgsql-director:~# echo "${UUID} /var/local/pgsql xfs defaults 1 2" | tee -a /etc/fstab UUID=66f3cbfc-5ea2-4058-929d-476b8aee88fd /var/local/pgsql ext4 defaults 1 2
root@pgsql-director:~# mount -a
root@pgsql-director:~# df -h Sist. Arq. Tam. Usado Disp. Uso% Montado em udev 2,0G 0 2,0G 0% /dev tmpfs 394M 428K 393M 1% /run /dev/vda1 31G 1,4G 28G 5% / tmpfs 2,0G 0 2,0G 0% /dev/shm tmpfs 5,0M 0 5,0M 0% /run/lock tmpfs 394M 0 394M 0% /run/user/1000 /dev/mapper/vgPGSQL-lvPGSQL 27G 24K 26G 1% /var/local/pgsql
Vatiáveis de ambiente de pacotes
# Pacotes a serem removidos após a instalação PKG_RM='bison gcc flex make cmake' # Pacotes a serem mantidos: # Pacotes comuns a serem mantidos: PKG='bzip2 wget git' # Variável de ambiente para pacotes Debian: PKG_DEB="libreadline-dev libssl-dev libxml2-dev libldap2-dev \ uuid-dev python3-dev"
Instalação de pacotes e limpeza dos pacotes baixados
apt update && apt install -y ${PKG} ${PKG_RM} ${PKG_DEB} && apt clean
Habilitar configurações de localidades (locales) pt_BR.utf8 e en_US.utf8
sed -i -e 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen sed -i -e 's/# pt_BR.UTF-8 UTF-8/pt_BR.UTF-8 UTF-8/' /etc/locale.gen
locale-gen
Definição de variáveis gerais
# Variável de ambiente para versão completa do Postgres via prompt: read -p \ 'Digite o número de versão completo (X.Y) do PostgreSQL a ser baixado: ' \ PGVERSION # Definição da variável de ambiente para a versão majoritária: export PGMAJOR=`echo ${PGVERSION} | cut -f1 -d.` # Diretório de instalação do PostgreSQL PGHOME="/usr/local/pgsql/${PGMAJOR}" # Diretório de binários PGBIN="${PGHOME}/bin" # Diretório home do usuário postgres PGUSERHOME="/var/local/pgsql" # Diretório de logs PGLOG="/var/log/pgsql/${PGMAJOR}" # Diretório de dados do PostgreSQL PGDATA="${PGUSERHOME}/${PGMAJOR}/data" # Diretório de logs de transação PGWAL="${PGUSERHOME}/${PGMAJOR}/wal" # Diretório de estatísticas temporárias PG_STAT_TEMP="${PGUSERHOME}/${PGMAJOR}/pg_stat_tmp" # Diretório de headers C PGINCLUDEDIR="/usr/local/include/pgsql/${PGMAJOR}"
Variáveis de ambiente para o processo de compilação
# Variável de ambiente do executável Python 3 export PYTHON=`which python3` # Opções do configure CONFIGURE_OPTS=" --prefix=${PGHOME} \ --with-python \ --with-libxml \ --with-openssl \ --with-ldap \ --with-uuid=e2fs \ --includedir=${PGINCLUDEDIR}" # Protege o processo principal do OOM Killer CPPFLAGS="-DLINUX_OOM_SCORE_ADJ=0" # Número de jobs conforme a quantidade de cores da CPU (cores + 1): NJOBS=`expr \`nproc\` + 1` # Opções do make MAKEOPTS="-j${NJOBS}" # Tipo de hardware CHOST="x86_64-unknown-linux-gnu" # Flags de otimização para o make CFLAGS="-march=native -O2 -pipe" CXXFLAGS="$CFLAGS"
Criação de um grupo e usuário de sistema
groupadd -r postgres &> /dev/null
useradd \ -c 'PostgreSQL system user' \ -s /bin/bash \ -k /etc/skel \ -d ${PGUSERHOME} \ -g postgres \ -m -r postgres &> /dev/null
Criar o arquivo .pgvars com seu respectivo conteúdo no diretório do usuário home postgres
cat << EOF > ~postgres/.pgvars # Environment Variables ====================================================== # PostgreSQL major version PGMAJOR="${PGMAJOR}" # Postgre=SQL installation directory PGHOME="/usr/local/pgsql/\${PGMAJOR}" # Binary directory PGBIN="${PGHOME}/bin" # Library directories export LD_LIBRARY_PATH="\${PGHOME}/lib:\${LD_LIBRARY_PATH}" # Manuals directories export MANPATH="\${PGHOME}/man:\${MANPATH}" # Path to binaries export PATH="\${PGBIN}:\${PATH}" # PostgreSQL data directory export PGDATA="${PGUSERHOME}/\${PGMAJOR}/data" # Unset variables unset PGMAJOR PGHOME PGBIN EOF
Adiciona linha no arquivo de perfil do usuário postgres para ler o arquivo ~/.pgvars e aplicá-las
if [ -f ~postgres/.bash_profile ]; then echo -e "\nsource ~/.pgvars" >> ~postgres/.bash_profile else echo -e "\nsource ~/.pgvars" >> ~postgres/.profile fi
~postgres/.psqlrc otimizado
cat << EOF > ~postgres/.psqlrc \set HISTCONTROL ignoreboth \set COMP_KEYWORD_CASE upper \x auto EOF
Criação de diretórios
mkdir -pm 0700 ${PGLOG} ${PGDATA} ${PGWAL} ${PG_STAT_TEMP}
Download do código-fonte
wget -c \ https://ftp.postgresql.org/pub/source/v${PGVERSION}/postgresql-\ ${PGVERSION}.tar.bz2 -P /tmp/
Ir para /tmp onde o arquivo foi baixado, descompactá-lo
cd /tmp/ && tar xf postgresql-${PGVERSION}.tar.bz2
Após a descompactação acessar a pasta do código-fonte
cd postgresql-${PGVERSION}
Processo de configure
./configure ${CONFIGURE_OPTS}
Compilação (com manuais e contrib)
make world
Instalação
make install-world
Criação de arquivo de serviço SystemD do PostgreSQL
cat << EOF > /lib/systemd/system/postgresql-${PGMAJOR}.service [Unit] Description=PostgreSQL ${PGMAJOR} database server After=syslog.target After=network.target [Service] Type=forking User=postgres Group=postgres Environment=PGDATA="${PGDATA}" Environment=LD_LIBRARY_PATH="${PGHOME}/lib:\${LD_LIBRARY_PATH}" OOMScoreAdjust=-1000 ExecStart=${PGBIN}/pg_ctl start -D \${PGDATA} -s -w -t 300 ExecStop=${PGBIN}/pg_ctl stop -D \${PGDATA} -s -m fast ExecReload=${PGBIN}/pg_ctl reload -D \${PGDATA} -s TimeoutSec=300 [Install] WantedBy=multi-user.target EOF
Dar propriedade ao usuário e grupo postgres aos diretórios
chown -R postgres: /var/{log,local}/pgsql
Criação de cluster (instância)
su - postgres -c "\ initdb \ -D ${PGDATA} \ -E utf8 \ -U postgres \ -k \ --locale=pt_BR.utf8 \ --lc-collate=pt_BR.utf8 \ --lc-monetary=pt_BR.utf8 \ --lc-messages=en_US.utf8 \ -T portuguese \ -X ${PGWAL}"
Alterações no postgresql.conf via sed
# listen_addresses = '*' sed "s:\(^#listen_addresses.*\):\1\nlisten_addresses = '*':g" \ -i ${PGDATA}/postgresql.conf # log_destination = 'stderr' sed "s:\(^#log_destination.*\):\1\nlog_destination = 'stderr':g" \ -i ${PGDATA}/postgresql.conf # logging_collector = on sed "s:\(^#logging_collector.*\):\1\nlogging_collector = on:g" \ -i ${PGDATA}/postgresql.conf # log_filename (nova linha descomentada) sed "s:\(^#\)\(log_filename.*\):\1\2\n\2:g" \ -i ${PGDATA}/postgresql.conf # log_directory = '${PGLOG}' sed "s:\(^#log_directory.*\):\1\nlog_directory = '${PGLOG}':g" \ -i ${PGDATA}/postgresql.conf # stats_temp_directory = '${PG_STAT_TEMP}' sed \ "s:\(^#stats_temp_directory.*\):\1\nstats_temp_directory = '${PG_STAT_TEMP}':g" \ -i ${PGDATA}/postgresql.conf
Montagem da linha para montagem em memória RAM
echo -e \ "\ntmpfs ${PG_STAT_TEMP} tmpfs size=32M,uid=postgres,gid=postgres 0 0"\ >> /etc/fstab
Monta tudo definido em /etc/fstab
mount -a
Habilita e inicializa o serviço do PostgreSQL
systemctl enable --now postgresql-${PGMAJOR}
oot@pgsql-director:/tmp/postgresql-14.6# systemctl status postgresql-${PGMAJOR} ● postgresql-14.service - PostgreSQL 14 database server Loaded: loaded (/lib/systemd/system/postgresql-14.service; enabled; vendor preset: enabled) Active: active (running) since Thu 2022-12-08 18:08:18 -03; 10s ago Process: 17766 ExecStart=/usr/local/pgsql/14/bin/pg_ctl start -D ${PGDATA} -s -w -t 300 (code=exited, status=0/SUCCESS) Main PID: 17769 (postgres) Tasks: 8 (limit: 4678) Memory: 15.6M CPU: 109ms CGroup: /system.slice/postgresql-14.service ├─17769 /usr/local/pgsql/14/bin/postgres -D /var/local/pgsql/14/data ├─17770 postgres: logger ├─17772 postgres: checkpointer ├─17773 postgres: background writer ├─17774 postgres: walwriter ├─17775 postgres: autovacuum launcher ├─17776 postgres: stats collector └─17777 postgres: logical replication launcher dez 08 18:08:17 pgsql-director systemd[1]: Starting PostgreSQL 14 database server... dez 08 18:08:18 pgsql-director pg_ctl[17769]: 2022-12-08 18:08:18.091 -03 [17769] LOG: redirecting log output to logging collector process dez 08 18:08:18 pgsql-director pg_ctl[17769]: 2022-12-08 18:08:18.091 -03 [17769] HINT: Future log output will appear in directory "/var/log/pgsql/14". dez 08 18:08:18 pgsql-director systemd[1]: Started PostgreSQL 14 database server.
TimescaleDB
git clone https://github.com/timescale/timescaledb.git cd timescaledb git checkout 2.8.1 ./bootstrap -DPG_CONFIG=/usr/local/pgsql/14/bin/pg_config cd build && make make install
sed "s:\(^#shared_preload_libraries.*\):\1\nshared_preload_libraries = 'timescaledb':g" \ -i ${PGDATA}/postgresql.conf
Limpeza de pacote desnecessários
apt purge -y ${PKG_RM} ${PKG_DEB}
Testando o acesso
root@pgsql-director:/tmp/postgresql-14.6# su - postgres
postgres@pgsql-director:~$ psql -d postgres -h localhost -U postgres -p 5432 Expanded display is used automatically. psql (14.6) Type "help" for help.
postgres=# SELECT version(); version --------------------------------------------------------------------------------------------------- PostgreSQL 14.6 on x86_64-pc-linux-gnu, compiled by gcc (Debian 10.2.1-6) 10.2.1 20210110, 64-bit (1 row)
postgres=# \l List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges -----------+----------+----------+------------+------------+----------------------- postgres | postgres | UTF8 | pt_BR.utf8 | pt_BR.utf8 | template0 | postgres | UTF8 | pt_BR.utf8 | pt_BR.utf8 | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | UTF8 | pt_BR.utf8 | pt_BR.utf8 | =c/postgres + | | | | | postgres=CTc/postgres (3 rows)
postgres=# \q postgres@pgsql-director:~$ exit sair
Referências
wikiv1/install_pgsql_cod_fonte.txt · Last modified: by 127.0.0.1
