PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

pg_ctl Dicas e truques


pg_ctl é um utilitário muito útil, mas subestimado, que pode facilitar a vida das equipes de desenvolvimento. Continue lendo para saber mais sobre pg_ctl e como isso pode melhorar seus fluxos de trabalho de desenvolvimento e teste.

O que é pg_ctl?


pg_ctl é uma ferramenta de linha de comando incluída na distribuição padrão do Postgres. Ela está disponível em todos os lugares que o próprio Postgres estiver, semelhante a outras ferramentas incluídas como o psql e pg_dump .

O executável estará no mesmo diretório que os outros binários do Postgres. A localização exata varia de acordo com a distribuição Linux e a versão do Postgres:
# debain, ubuntu, ...
/usr/lib/postgresql/11/bin

# rhel, centos, ...
/usr/pgsql-11/bin

Você pode querer adicionar este diretório ao seu PATH, ou alias pg_ctl ao caminho completo.

Criar um cluster de banco de dados


Ao contrário de outros RDBMSes, um único processo de servidor de banco de dados Postgres (historicamente chamado de postmaster ), gerencia um cluster de banco de dados . O uso do termocluster não é moderno e não se refere a um grupo de nós em rede. Um cluster de banco de dados hospeda um conjunto de bancos de dados, com alguns recursos (funções, replicação física, arquivos WAL, etc.) comuns a todos eles. O serviço Postgressystemd instalado por sua distribuição Linux atende a um único cluster de banco de dados.

Você pode usar pg_ctl para criar um cluster de banco de dados. Na criação, o cluster vive inteiramente em um único diretório. Ele contém todos os arquivos de configuração necessários (postgres.conf , pg_hba.conf , etc.) e arquivos de dados. É autocontido e pode ser movido para outra máquina razoavelmente semelhante se as permissões de arquivo forem tratadas corretamente. Você pode até colocar arquivos de log dentro do diretório, para que tenha todos os arquivos relacionados (configuração, dados, logs) em um só lugar.

Para criar um cluster de banco de dados, use:
$ pg_ctl -D myclus initdb

Isso cria um diretório chamado myclus sob o diretório atual e o preenche com todos os arquivos necessários para iniciar um servidor a partir dele.

Aqui está um exemplo de sessão:
$ pg_ctl -D myclus initdb
The files belonging to this database system will be owned by user "alice".
This user must also own the server process.

The database cluster will be initialized with locale "C.UTF-8".
The default database encoding has accordingly been set to "UTF8".
The default text search configuration will be set to "english".

Data page checksums are disabled.

creating directory myclus ... ok
creating subdirectories ... ok
selecting default max_connections ... 100
selecting default shared_buffers ... 128MB
selecting default timezone ... Etc/UTC
selecting dynamic shared memory implementation ... posix
creating configuration files ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... ok
syncing data to disk ... ok

WARNING: enabling "trust" authentication for local connections
You can change this by editing pg_hba.conf or using the option -A, or
--auth-local and --auth-host, the next time you run initdb.

Success. You can now start the database server using:

    /usr/lib/postgresql/11/bin/pg_ctl -D myclus -l logfile start

Iniciar um servidor de banco de dados


Um “servidor Postgres” é basicamente um postmaster processo que é iniciado com o local de um diretório de cluster de banco de dados. Esse processo de postmaster, por sua vez, gera vários processos que realizam várias atividades em segundo plano, bem como lidam com conexões de entrada. Você pode ver esse modelo de processo em ação visualizando a árvore de processos do sistema usando uma ferramenta como htop, por exemplo.

Para iniciar um processo postmaster para seu novo cluster de banco de dados, use:
$ pg_ctl -D myclus -l myclus/log start

O -l A opção especifica a localização do arquivo de log do Postgres, que neste caso está dentro do próprio diretório do cluster. Não é incomum colocar o arquivo de log no diretório do cluster.

Você deve ver uma saída como esta:
waiting for server to start.... done
server started

Recarregar, reiniciar e parar acontecem como seria de esperar:
$ pg_ctl -D myclus -l myclus/log reload
server signaled
$ pg_ctl -D myclus -l myclus/log restart
waiting for server to shut down.... done
server stopped
waiting for server to start.... done
server started
$ pg_ctl -D myclus -l myclus/log stop
waiting for server to shut down.... done
server stopped

Agora você deve conseguir se conectar a este novo cluster usando clientes como psql e pgAdmin .

Definindo a porta e outras opções


Praticamente, porém, se você já tiver o Postgres instalado em sua máquina, provavelmente precisará editar myclus/postgres.conf e altere os valores para porta , unix_socket_directories e também talvez listen_address antes que o cluster seja iniciado de forma limpa. Isso ocorre porque o Postgresservice instalado pelo sistema já está sendo executado na porta 5432 e os diretórios emunix_socket_directories não pode ser gravado por um usuário comum. O padrãoendereço_escuta é localhost, o que significa que você não poderá se conectar ao cluster de fora do localhost.

Se você estiver usando pg_ctl para criar e desmontar clusters em seus scripts de teste automatizado, é mais fácil especificar essas opções diretamente da linha de comando em vez de editar programaticamente myclus/postgres.conf .Você pode especificar as opções assim:
$ pg_ctl -D myclus -l myclus/log -o "-p 6000 -k /tmp -i" start

Isso inicia o servidor na porta 6000, com o socket unix criado no diretório /tmp e escutando em todas as interfaces.

Você precisa especificar essas opções apenas para “iniciar”, você pode omiti-las para outros comandos, incluindo até mesmo “reiniciar”.

Outras opções úteis de início


Existem algumas outras opções que você pode usar dentro de “-o” que podem ser úteis:
  • -F desativa o fsync, útil para a conclusão mais rápida de scripts de teste
  • -B shared_bufffers definir valor de shared_buffers , exemplo -B 100MB
  • -c conf_var=value defina qualquer valor de configuração, exemplo -c wal_level=logical

Aqui está um exemplo com alguns desses conjuntos:
$ pg_ctl -D myclus -l myclus/log -o "-p 6000 -k /tmp -i -B 100MB -c wal_level=logical" start

Essas opções são na verdade as opções de linha de comando do postgres processo, cuja lista completa está documentada aqui.

Executar banco de dados de uma versão diferente do Postgres


O EnterpriseDB hospeda binários pré-construídos para várias versões do Postgres para várias plataformas. Estes são tarballs sem nenhum instalador.

Pegue o tarball desejado, descompacte-o, localize o pg_ctl binário com ele e use isso para criar um cluster. pg_ctl irá encontrar automaticamente o initdb/postgres/outros binários associados que ele precisa para criar/iniciar o cluster.

Você pode usar isso independentemente de qualquer instalação do PostgreSQL existente na máquina.

Criar serviços no Windows


pg_ctl está disponível em todas as plataformas, incluindo MacOS e Windows. Em particular, você pode usá-lo para criar facilmente um serviço que pode ser iniciado e interrompido através do Service Control Manager (SCM). Para criar um serviço, use:
pg_ctl -D myclus -N myclus_service register

Isso cria um serviço de inicialização automática chamado “myclus_service”.

Esse recurso está disponível apenas no Postgres v10 e superior.