<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Savepoint</title>
	<atom:link href="http://savepoint.blog.br/feed/" rel="self" type="application/rss+xml" />
	<link>https://savepoint.blog.br</link>
	<description>Soluções em PostgreSQL</description>
	<lastBuildDate>Mon, 08 Jun 2026 19:00:53 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://savepoint.blog.br/wp-content/uploads/2023/12/simbolo_savepoint-150x150.png</url>
	<title>Savepoint</title>
	<link>https://savepoint.blog.br</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">43493209</site>	<item>
		<title>A história das conferências nacionais de PostgreSQL no Brasil</title>
		<link>https://savepoint.blog.br/2026/06/05/a-historia-das-conferencias-nacionais-de-postgresql-no-brasil/</link>
		
		<dc:creator><![CDATA[Fabio Telles Rodriguez]]></dc:creator>
		<pubDate>Sat, 06 Jun 2026 01:18:43 +0000</pubDate>
				<category><![CDATA[Comunidade e Eventos]]></category>
		<category><![CDATA[Notícias]]></category>
		<guid isPermaLink="false">https://savepoint.blog.br/?p=15343</guid>

					<description><![CDATA[<p>(Work in progress) São quase 20 anos de história, e eu queria só organizar algumas informações e fotos aqui. Já faz tempo que eu não sou kahuna do evento, tem uma nova geração maravilhosa fazendo história, mas&#8230; parte dessa história vem se perdendo e eu gostaria de resgatar um pouco disso aqui. O site da</p>
<p>The post <a href="https://savepoint.blog.br/2026/06/05/a-historia-das-conferencias-nacionais-de-postgresql-no-brasil/">A história das conferências nacionais de PostgreSQL no Brasil</a> first appeared on <a href="https://savepoint.blog.br">Savepoint</a>.</p>]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph"><strong>(Work in progress)</strong></p>



<p class="wp-block-paragraph">São quase 20 anos de história, e eu queria só organizar algumas informações e fotos aqui. Já faz tempo que eu não sou kahuna do evento, tem uma nova geração maravilhosa fazendo história, mas&#8230; parte dessa história vem se perdendo e eu gostaria de resgatar um pouco disso aqui. O site da comunidade, o postgresql.org.br resistiu por muito tempo, com a honrosa contribuição do FAW, mas um dia se perdeu. Depois o site do pgconf.com.br também se perdeu, com as edições organizadas pela Timbira, e agora temos um novo site com as edições de 2025, 2024 e 2023. Todo o resto se perdeu. E tem muita história para contar. Então, se você tem um relato, fotos, palestra, etc, mande para mim, que eu adoraria adicionar aqui.</p>



<h2 class="wp-block-heading">1<sup>a</sup> Conferencia Brasileira de PostgreSQL<br>PGCon Brasil 2007</h2>



<ul class="wp-block-list">
<li class="">Quando: 7 e 8 de dezembro de 2007,</li>



<li class="">Onde: São Paulo/SP (Auditório São Camilo, Pompeia)</li>



<li class="">Salas: 1 auditório</li>



<li class="">Público estimado: 150+</li>



<li class="">Oliveira de Padua <a href="https://temporealeventos.com.br/" title="">Tempo Real Eventos</a> </li>



<li class="">Outros organizadores: 
<ul class="wp-block-list">
<li class="">Diogo Biazus</li>



<li class="">Euler Taveira</li>



<li class="">Fábio Telles Rodriguez</li>



<li class="">Fernando Ike</li>



<li class="">Isis Bussons</li>



<li class="">Kenia Milene Gallego</li>



<li class="">Leonardo Cezar</li>



<li class="">Rodrigo Marins</li>
</ul>
</li>



<li class="">Key notes: 
<ul class="wp-block-list">
<li class="">Josh Berkus </li>



<li class="">David Fetter &#8211; A Babel of Programming Languages</li>
</ul>
</li>



<li class="">Outros palestrantes:
<ul class="wp-block-list">
<li class="">Diogo Biazus &#8211; Preciso armazenar arquivos no banco. O que fazer?</li>



<li class="">Euler Taveira &#8211; Sintonia em SQL</li>



<li class="">Fábio Telles &#8211; Fazendo um elefante passar debaixo da porta</li>



<li class="">Fernando Ike &#8211; PostgreSQL Tuning: Elefante mais rápido que um leopardo</li>



<li class="">Francisco Figueiredo Jr. &#8211; Npgsql: .Net Data Provider para o PostgreSQL</li>



<li class="">Leandro Dutra &#8211; Modelagem e Administração de Dados em PostgreSQL</li>



<li class="">Lucio Chiessi &#8211; Tim Studio e Tim Portal</li>



<li class="">Monica Tissiani De Toni Pereira &#8211; Recursos aplicados a distribuição de dados</li>
</ul>
</li>



<li class="">Links: 
<ul class="wp-block-list">
<li class=""><a href="https://savepoint.blog.br/2007/11/19/1%c2%aa-conferencia-brasileira-de-postgresql" title="">1ª Conferência Brasileira de PostgreSQL</a></li>



<li class=""><a href="https://savepoint.blog.br/2007/12/10/primeiras-impressoes-do-pgconbrasil-2007" title="">Primeiras impressões do PgConBrasil 2007</a></li>
</ul>
</li>



<li class="">Fotos</li>
</ul>



<div class="wp-block-cb-carousel-v2 cb-carousel-block" data-cb-slides-per-view="1" data-cb-slides-per-group="1" data-cb-space-between="15" data-cb-speed="300" data-cb-navigation="true" data-cb-pagination="true" data-cb-breakpoints="{&quot;768&quot;:{&quot;slidesPerView&quot;:3,&quot;slidesPerGroup&quot;:1}}"><div class="swiper"><div class="cb-wrapper swiper-wrapper">
<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<figure class="wp-block-image size-full"><img data-recalc-dims="1" fetchpriority="high" decoding="async" width="500" height="376" src="https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2023/12/pgbr2007.jpg?resize=500%2C376&#038;ssl=1" alt="" class="wp-image-2936" srcset="https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2023/12/pgbr2007.jpg?w=500&amp;ssl=1 500w, https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2023/12/pgbr2007.jpg?resize=300%2C226&amp;ssl=1 300w" sizes="(max-width: 500px) 100vw, 500px" /></figure>
</div>



<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<figure class="wp-block-image size-full"><img decoding="async" width="1024" height="768" src="https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgconf_2007.jpg?fit=1024%2C768&amp;ssl=1" alt="" class="wp-image-15344" srcset="https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgconf_2007.jpg?w=1024&amp;ssl=1 1024w, https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgconf_2007.jpg?resize=300%2C225&amp;ssl=1 300w, https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgconf_2007.jpg?resize=768%2C576&amp;ssl=1 768w, https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgconf_2007.jpg?resize=800%2C600&amp;ssl=1 800w, https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgconf_2007.jpg?resize=600%2C450&amp;ssl=1 600w, https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgconf_2007.jpg?resize=400%2C300&amp;ssl=1 400w, https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgconf_2007.jpg?resize=200%2C150&amp;ssl=1 200w" sizes="(max-width: 780px) 100vw, 780px" /></figure>
</div>



<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<figure class="wp-block-image size-full"><img decoding="async" width="768" height="1020" src="https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/3261783125_b5cd3dcc3e_o.jpg?fit=768%2C1020&amp;ssl=1" alt="" class="wp-image-15345" srcset="https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/3261783125_b5cd3dcc3e_o.jpg?w=768&amp;ssl=1 768w, https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/3261783125_b5cd3dcc3e_o.jpg?resize=226%2C300&amp;ssl=1 226w, https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/3261783125_b5cd3dcc3e_o.jpg?resize=150%2C200&amp;ssl=1 150w, https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/3261783125_b5cd3dcc3e_o.jpg?resize=400%2C531&amp;ssl=1 400w" sizes="(max-width: 768px) 100vw, 768px" /></figure>
</div>



<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1024" height="768" src="https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/3261781965_ae12a24fb6_o.jpg?fit=1024%2C768&amp;ssl=1" alt="" class="wp-image-15346" srcset="https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/3261781965_ae12a24fb6_o.jpg?w=1024&amp;ssl=1 1024w, https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/3261781965_ae12a24fb6_o.jpg?resize=300%2C225&amp;ssl=1 300w, https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/3261781965_ae12a24fb6_o.jpg?resize=768%2C576&amp;ssl=1 768w, https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/3261781965_ae12a24fb6_o.jpg?resize=800%2C600&amp;ssl=1 800w, https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/3261781965_ae12a24fb6_o.jpg?resize=600%2C450&amp;ssl=1 600w, https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/3261781965_ae12a24fb6_o.jpg?resize=400%2C300&amp;ssl=1 400w, https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/3261781965_ae12a24fb6_o.jpg?resize=200%2C150&amp;ssl=1 200w" sizes="auto, (max-width: 780px) 100vw, 780px" /></figure>
</div>
</div></div><div class="cb-pagination swiper-pagination"></div><div class="cb-button-prev swiper-button-prev"></div><div class="cb-button-next swiper-button-next"></div></div>



<h2 class="wp-block-heading">2<sup>a</sup> Conferencia Brasileira de PostgreSQL<br>PGCon Brasil 2008</h2>



<ul class="wp-block-list">
<li class="">Quando: 26 e 27 de Setembro de 2008</li>



<li class="">Onde: Campinas/SP (Auditório da Unicamp)</li>



<li class="">Salas: 1 auditório</li>



<li class="">Público estimado:</li>



<li class="">Palestras: 16</li>



<li class="">Kahunas: 
<ul class="wp-block-list">
<li class="">Fábio Telles Rodriguez</li>



<li class="">Leonardo Cezar</li>
</ul>
</li>



<li class="">Outros organizadores: 
<ul class="wp-block-list">
<li class=""></li>



<li class="">Dickson S. Guedes</li>



<li class="">Euler Taveira</li>



<li class="">Fernando Ike</li>



<li class="">Leandro Dutra</li>



<li class="">Rodrigo Gomes Santana</li>



<li class="">Rodrigo Marins</li>



<li class="">Sebastian SWC</li>



<li class="">Thiago Risso</li>
</ul>
</li>



<li class="">Key notes: 
<ul class="wp-block-list">
<li class="">Bruce Momjian – “PostgreSQL’s Path to the Future”</li>



<li class="">David Fetter</li>
</ul>
</li>



<li class="">Outros palestrantes:
<ul class="wp-block-list">
<li class="">Dickson dos Santos Guedes – Replicação Síncrona – “Não existe almoço de graça!”</li>



<li class="">Diogo Biazus – PostgreSQL Br – “Passado, Presente e Futuro”</li>



<li class="">Eduardo Leal – “Utilizando o PostgreSQL em bancos de dados biológicos”</li>



<li class="">Euler Taveira – “Monitorando o PostgreSQL”</li>



<li class="">Fábio Telles – “PostgreSQL, o Elefante Encouraçado”</li>



<li class="">Fernando Ike – “skytools, pgbouncer, plproxy”</li>



<li class="">Leandro Dutra &#8211; </li>



<li class="">Wagner Corrêa Ramos – “Projeto de replicação multi-master com 143 servidores”</li>
</ul>
</li>



<li class="">Relatos:
<ul class="wp-block-list">
<li class=""><a href="https://savepoint.blog.br/2008/10/16/avaliacao-pessoal-do-pgcon-brasil-2008" title="">Avaliação pessoal do PGCon Brasil 2008</a></li>



<li class=""><a href="https://savepoint.blog.br/2008/09/30/como-foi-o-pgcon-brasil-2008" title="">Como foi o PGCon Brasil 2008</a></li>



<li class=""><a href="https://www.postgresql.org/about/event/pgcon-brazil-2008-668/" title="">PGCon Brasil 2008</a></li>



<li class=""><a href="https://www.fernandoquadro.com.br/html/2008/05/12/postgresql-conference-brasil-2008/" title="">PostgreSQL Conference Brasil 2008</a></li>



<li class=""><a href="https://www.serpro.gov.br/menu/noticias/noticias-antigas/conferencia-explora-as-possibilidades-do-postgresql" title="">Conferência explora as possibilidades do PostgreSQL</a></li>



<li class=""><a href="https://wareline.com.br/blog/noticias/2a-conferencia-brasileira-sobre-postgresql/" title="">2<sup>a</sup> Conferência Brasileira sobre PostgreSQL</a></li>
</ul>
</li>
</ul>



<div class="wp-block-cb-carousel-v2 cb-carousel-block" data-cb-slides-per-view="1" data-cb-slides-per-group="1" data-cb-space-between="15" data-cb-speed="300" data-cb-navigation="true" data-cb-pagination="true" data-cb-breakpoints="{&quot;768&quot;:{&quot;slidesPerView&quot;:3,&quot;slidesPerGroup&quot;:1}}"><div class="swiper"><div class="cb-wrapper swiper-wrapper">
<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1320" height="993" src="https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgbr2008.jpg?fit=1024%2C770&amp;ssl=1" alt="" class="wp-image-15347" srcset="https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgbr2008.jpg?w=1320&amp;ssl=1 1320w, https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgbr2008.jpg?resize=300%2C226&amp;ssl=1 300w, https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgbr2008.jpg?resize=1024%2C770&amp;ssl=1 1024w, https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgbr2008.jpg?resize=768%2C578&amp;ssl=1 768w, https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgbr2008.jpg?resize=600%2C450&amp;ssl=1 600w, https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgbr2008.jpg?resize=400%2C301&amp;ssl=1 400w, https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgbr2008.jpg?resize=200%2C150&amp;ssl=1 200w, https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgbr2008.jpg?resize=1200%2C903&amp;ssl=1 1200w" sizes="auto, (max-width: 780px) 100vw, 780px" /></figure>
</div>



<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1024" height="768" src="https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgcon2008_abertura.jpg?fit=1024%2C768&amp;ssl=1" alt="" class="wp-image-15348" srcset="https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgcon2008_abertura.jpg?w=1024&amp;ssl=1 1024w, https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgcon2008_abertura.jpg?resize=300%2C225&amp;ssl=1 300w, https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgcon2008_abertura.jpg?resize=768%2C576&amp;ssl=1 768w, https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgcon2008_abertura.jpg?resize=800%2C600&amp;ssl=1 800w, https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgcon2008_abertura.jpg?resize=600%2C450&amp;ssl=1 600w, https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgcon2008_abertura.jpg?resize=400%2C300&amp;ssl=1 400w, https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgcon2008_abertura.jpg?resize=200%2C150&amp;ssl=1 200w" sizes="auto, (max-width: 780px) 100vw, 780px" /></figure>
</div>



<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="970" height="207" src="https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgcon2008_banner.jpg?fit=970%2C207&amp;ssl=1" alt="" class="wp-image-15349" srcset="https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgcon2008_banner.jpg?w=970&amp;ssl=1 970w, https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgcon2008_banner.jpg?resize=300%2C64&amp;ssl=1 300w, https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgcon2008_banner.jpg?resize=768%2C164&amp;ssl=1 768w, https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgcon2008_banner.jpg?resize=400%2C85&amp;ssl=1 400w" sizes="auto, (max-width: 780px) 100vw, 780px" /></figure>
</div>



<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<figure class="wp-block-image size-full"><img data-recalc-dims="1" loading="lazy" decoding="async" width="178" height="206" src="https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2008/05/pgcon2008.webp?resize=178%2C206&#038;ssl=1" alt="" class="wp-image-15311"/></figure>
</div>
</div></div><div class="cb-pagination swiper-pagination"></div><div class="cb-button-prev swiper-button-prev"></div><div class="cb-button-next swiper-button-next"></div></div>



<h2 class="wp-block-heading">III Conferencia Brasileira de PostgreSQL<br>PGCon Brasil 2009</h2>



<ul class="wp-block-list">
<li class="">Quando: 24 e 25 de Outubro de 2009</li>



<li class="">Onde: Campinas/SP (Auditórios da Unicamp)</li>



<li class="">Salas: 2 auditórios e uma sala
<ul class="wp-block-list">
<li class="">40 propostas na chamada de trabalhos</li>



<li class="">1 mesa redonda</li>



<li class="">4 tutoriais</li>



<li class="">4 Hacker Talks</li>



<li class="">14 palestras</li>



<li class="">10 Lithning Talks</li>
</ul>
</li>



<li class="">Kahunas:
<ul class="wp-block-list">
<li class="">Fábio Telles Rodriguez</li>



<li class="">Leonardo Cezar</li>
</ul>
</li>



<li class="">Outros organizadores
<ul class="wp-block-list">
<li class="">Dickson Guedes</li>



<li class="">Diogo Biazus</li>



<li class="">Euler Taveira</li>



<li class="">Fernando Ike</li>



<li class="">Marcelo Costa</li>
</ul>
</li>



<li class="">Banca avaliadora:
<ul class="wp-block-list">
<li class="">Fernando Ike</li>



<li class="">Leandro Gumarães Faria Corcete Dutra</li>



<li class="">Luis Fernando Bueno</li>
</ul>
</li>



<li class="">Key notes
<ul class="wp-block-list">
<li class="">Bruce Momjian
<ul class="wp-block-list">
<li class="">Rapid Upgrades With PG_Migrator;</li>



<li class="">How To Get You PostgreSQL Patch Accepted;</li>
</ul>
</li>



<li class="">Magnus Hagander
<ul class="wp-block-list">
<li class="">Secure PostgreSQL Deployment;</li>



<li class="">Using git to help you develop a PostgreSQL patch;</li>
</ul>
</li>
</ul>
</li>



<li class="">Outros palestrantes
<ul class="wp-block-list">
<li class="">Claudio C. Filho &#8211; Coordenação da mesa: Adoção de PostgreSQL pelo Governo Federal Brasileiro</li>



<li class="">Diogo Biazus &#8211; Monitoramento do PostgreSQL com collectd</li>



<li class="">Edson Ie &#8211; Alta disponibilidade com HadoopDB</li>



<li class="">Euler Taveira 
<ul class="wp-block-list">
<li class="">Desenvolvendo sua extensão em C</li>



<li class="">pg_similarity: buscas aproximadas</li>
</ul>
</li>



<li class="">Evandro Silvestre &#8211; Acesse e utilize os Medadados do PostgreSQL sem medo</li>



<li class="">Fabiano Machado Dias e Eduardo Wolak &#8211; Usando PostgreSQL na Regra de Negócio de um ERP</li>



<li class="">Fábio Telles &#8211; Tudo o que você queria saber sobre o uso de discos em servidores PostgreSQL mas tinha vergonha de perguntar</li>



<li class="">Fernando Ike &#8211; Ele veio e o que tem de bom</li>



<li class="">Flávio Gurgel &#8211; PostgreSQL em ambiente financeiro de alta criticidade</li>



<li class="">Francisco Figueiredo Jr. &#8211; Introdução ao Npgsql -.Net Data Provider para PostgreSQL</li>



<li class="">George Rodrigues &#8211; O uso do PostgreSQL e PostGIS para o cadastro geocodificado de acidentes</li>



<li class="">João Cosme Jr. &#8211; Particionando os dados e balanceando a carga com o PLProxy</li>



<li class="">Leandro Dutra &#8211; O elefante arborícola: consultas recursívas com espressões comuns de tabelas</li>



<li class="">Luis Fernando Bueno &#8211; Análise Espacial com PostGIS</li>



<li class="">Maiano Alejandro Reingart e Emanuel Calvo Franco &#8211; Introducint PyReplica: a simple and customizabre replication solution</li>



<li class="">Sérgio Lifschitz &#8211; Proposta de índices hipotéticos no PostgreSQL</li>



<li class="">Roberto Mello &#8211; PL/pgSQL para diversão e lucro</li>
</ul>
</li>



<li class="">Relatos
<ul class="wp-block-list">
<li class=""><a href="https://savepoint.blog.br/2009/10/25/commit/" title="">COMMIT</a></li>
</ul>
</li>
</ul>



<div class="wp-block-cb-carousel-v2 cb-carousel-block" data-cb-slides-per-view="1" data-cb-slides-per-group="1" data-cb-space-between="15" data-cb-speed="300" data-cb-navigation="true" data-cb-pagination="true" data-cb-breakpoints="{&quot;768&quot;:{&quot;slidesPerView&quot;:3,&quot;slidesPerGroup&quot;:1}}"><div class="swiper"><div class="cb-wrapper swiper-wrapper">
<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1024" height="317" src="https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgcon2009_bozo_oficial.jpg?fit=1024%2C317&amp;ssl=1" alt="" class="wp-image-15350" srcset="https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgcon2009_bozo_oficial.jpg?w=1024&amp;ssl=1 1024w, https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgcon2009_bozo_oficial.jpg?resize=300%2C93&amp;ssl=1 300w, https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgcon2009_bozo_oficial.jpg?resize=768%2C238&amp;ssl=1 768w, https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgcon2009_bozo_oficial.jpg?resize=400%2C124&amp;ssl=1 400w" sizes="auto, (max-width: 780px) 100vw, 780px" /></figure>
</div>



<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="127" height="172" src="https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgcon2009_canecas.jpg?fit=127%2C172&amp;ssl=1" alt="" class="wp-image-15351"/></figure>
</div>



<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="193" height="104" src="https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgcon2009_chaveiro.jpg?fit=193%2C104&amp;ssl=1" alt="" class="wp-image-15352"/></figure>
</div>



<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<figure class="wp-block-image size-full"><img data-recalc-dims="1" loading="lazy" decoding="async" width="132" height="132" src="https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgcon2009_pin.jpg?resize=132%2C132&#038;ssl=1" alt="" class="wp-image-15353"/></figure>
</div>



<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="156" height="227" src="https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgcon2009_cartaz.jpg?fit=156%2C227&amp;ssl=1" alt="" class="wp-image-15354"/></figure>
</div>



<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="127" height="195" src="https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgcon2009_cracha.jpg?fit=127%2C195&amp;ssl=1" alt="" class="wp-image-15355"/></figure>
</div>



<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="650" height="80" src="https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgconf_2009_banner.jpg?fit=650%2C80&amp;ssl=1" alt="" class="wp-image-15356" srcset="https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgconf_2009_banner.jpg?w=650&amp;ssl=1 650w, https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgconf_2009_banner.jpg?resize=300%2C37&amp;ssl=1 300w, https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgconf_2009_banner.jpg?resize=400%2C49&amp;ssl=1 400w" sizes="auto, (max-width: 650px) 100vw, 650px" /></figure>
</div>



<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="113" height="156" src="https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgcon_2009_debora_carol_rebeca.jpg?fit=113%2C156&amp;ssl=1" alt="" class="wp-image-15357"/></figure>
</div>



<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="220" height="164" src="https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgbr2009_karen_dutra_jr_denise.jpg?fit=220%2C164&amp;ssl=1" alt="" class="wp-image-15358" srcset="https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgbr2009_karen_dutra_jr_denise.jpg?w=220&amp;ssl=1 220w, https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgbr2009_karen_dutra_jr_denise.jpg?resize=200%2C150&amp;ssl=1 200w" sizes="auto, (max-width: 220px) 100vw, 220px" /></figure>
</div>



<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<figure class="wp-block-image size-full"><img data-recalc-dims="1" loading="lazy" decoding="async" width="151" height="144" src="https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgcon2009_karen_denise_chris.jpg?resize=151%2C144&#038;ssl=1" alt="" class="wp-image-15359"/></figure>
</div>



<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="152" height="128" src="https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgcon2009_diogo_euler-1.jpg?fit=152%2C128&amp;ssl=1" alt="" class="wp-image-15361"/></figure>
</div>



<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="176" height="137" src="https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgcon2009_thiago_bruno.jpg?fit=176%2C137&amp;ssl=1" alt="" class="wp-image-15362"/></figure>
</div>



<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="393" height="293" src="https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgcon2009_coffe.jpg?fit=393%2C293&amp;ssl=1" alt="" class="wp-image-15363" srcset="https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgcon2009_coffe.jpg?w=393&amp;ssl=1 393w, https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgcon2009_coffe.jpg?resize=300%2C224&amp;ssl=1 300w, https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgcon2009_coffe.jpg?resize=200%2C150&amp;ssl=1 200w" sizes="auto, (max-width: 393px) 100vw, 393px" /></figure>
</div>



<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="168" height="181" src="https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgcon2009_alice.jpg?fit=168%2C181&amp;ssl=1" alt="" class="wp-image-15365"/></figure>
</div>



<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="190" height="197" src="https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgcon2009_bruce.jpg?fit=190%2C197&amp;ssl=1" alt="" class="wp-image-15367"/></figure>
</div>



<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="203" height="259" src="https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgcon2009_diogo.jpg?fit=203%2C259&amp;ssl=1" alt="" class="wp-image-15368"/></figure>
</div>



<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="189" height="288" src="https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgcon2009_dutra.jpg?fit=189%2C288&amp;ssl=1" alt="" class="wp-image-15369"/></figure>
</div>



<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="206" height="262" src="https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgcon2009_edson_ie.jpg?fit=206%2C262&amp;ssl=1" alt="" class="wp-image-15370"/></figure>
</div>



<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="195" height="174" src="https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgcon2009_emanuel_mariano.jpg?fit=195%2C174&amp;ssl=1" alt="" class="wp-image-15371"/></figure>
</div>



<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="207" height="280" src="https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgcon2009_evendro.jpg?fit=207%2C280&amp;ssl=1" alt="" class="wp-image-15372"/></figure>
</div>



<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="217" height="201" src="https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgcon2009_fabiano_eduardo.jpg?fit=217%2C201&amp;ssl=1" alt="" class="wp-image-15373"/></figure>
</div>



<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="200" height="252" src="https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgcon2009_fabio.jpg?fit=200%2C252&amp;ssl=1" alt="" class="wp-image-15374"/></figure>
</div>



<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="196" height="258" src="https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgcon2009_fernando_ike.jpg?fit=196%2C258&amp;ssl=1" alt="" class="wp-image-15375"/></figure>
</div>



<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="201" height="269" src="https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgcon2009_flavio.jpg?fit=201%2C269&amp;ssl=1" alt="" class="wp-image-15376" srcset="https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgcon2009_flavio.jpg?w=201&amp;ssl=1 201w, https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgcon2009_flavio.jpg?resize=150%2C200&amp;ssl=1 150w" sizes="auto, (max-width: 201px) 100vw, 201px" /></figure>
</div>



<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="202" height="266" src="https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgcon2009_Francisco.jpg?fit=202%2C266&amp;ssl=1" alt="" class="wp-image-15377"/></figure>
</div>



<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="208" height="278" src="https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgcon2009_George.jpg?fit=208%2C278&amp;ssl=1" alt="" class="wp-image-15378" srcset="https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgcon2009_George.jpg?w=208&amp;ssl=1 208w, https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgcon2009_George.jpg?resize=150%2C200&amp;ssl=1 150w" sizes="auto, (max-width: 208px) 100vw, 208px" /></figure>
</div>



<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="152" height="165" src="https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgcon2009_henrimeli.jpg?fit=152%2C165&amp;ssl=1" alt="" class="wp-image-15379"/></figure>
</div>



<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="204" height="263" src="https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgcon2009_joao.jpg?fit=204%2C263&amp;ssl=1" alt="" class="wp-image-15380"/></figure>
</div>



<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="171" height="132" src="https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgcon2009_jose.jpg?fit=171%2C132&amp;ssl=1" alt="" class="wp-image-15381"/></figure>
</div>



<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="208" height="278" src="https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgcon2009_luis.jpg?fit=208%2C278&amp;ssl=1" alt="" class="wp-image-15382" srcset="https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgcon2009_luis.jpg?w=208&amp;ssl=1 208w, https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgcon2009_luis.jpg?resize=150%2C200&amp;ssl=1 150w" sizes="auto, (max-width: 208px) 100vw, 208px" /></figure>
</div>



<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="203" height="272" src="https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgcon2009_magnus.jpg?fit=203%2C272&amp;ssl=1" alt="" class="wp-image-15383" srcset="https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgcon2009_magnus.jpg?w=203&amp;ssl=1 203w, https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgcon2009_magnus.jpg?resize=150%2C200&amp;ssl=1 150w" sizes="auto, (max-width: 203px) 100vw, 203px" /></figure>
</div>



<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="202" height="256" src="https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgcon2009_roberto.jpg?fit=202%2C256&amp;ssl=1" alt="" class="wp-image-15384"/></figure>
</div>



<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="200" height="185" src="https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgcon2009_sergio.jpg?fit=200%2C185&amp;ssl=1" alt="" class="wp-image-15385"/></figure>
</div>



<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="615" height="274" src="https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgcon2009_joao_marcelo_rogerio_jose_marisa_claudio.jpg?fit=615%2C274&amp;ssl=1" alt="" class="wp-image-15386" srcset="https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgcon2009_joao_marcelo_rogerio_jose_marisa_claudio.jpg?w=615&amp;ssl=1 615w, https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgcon2009_joao_marcelo_rogerio_jose_marisa_claudio.jpg?resize=300%2C134&amp;ssl=1 300w, https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2026/06/pgcon2009_joao_marcelo_rogerio_jose_marisa_claudio.jpg?resize=400%2C178&amp;ssl=1 400w" sizes="auto, (max-width: 615px) 100vw, 615px" /></figure>
</div>
</div></div><div class="cb-pagination swiper-pagination"></div><div class="cb-button-prev swiper-button-prev"></div><div class="cb-button-next swiper-button-next"></div></div>



<h2 class="wp-block-heading">PGBR 2010</h2>



<ul class="wp-block-list">
<li class="">Onde: Brasília/DF</li>
</ul>



<p class="wp-block-paragraph">Evento cancelado</p>



<h2 class="wp-block-heading">IV Conferencia Brasileira de PostgreSQLPGBR 2011</h2>



<ul class="wp-block-list">
<li class="">Quando</li>



<li class="">Onde:</li>
</ul><p>The post <a href="https://savepoint.blog.br/2026/06/05/a-historia-das-conferencias-nacionais-de-postgresql-no-brasil/">A história das conferências nacionais de PostgreSQL no Brasil</a> first appeared on <a href="https://savepoint.blog.br">Savepoint</a>.</p>]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">15343</post-id>	</item>
		<item>
		<title>Sobre o PGConf.Brasil 2025</title>
		<link>https://savepoint.blog.br/2025/09/06/sobre-o-pgconf-brasil-2025/</link>
					<comments>https://savepoint.blog.br/2025/09/06/sobre-o-pgconf-brasil-2025/#respond</comments>
		
		<dc:creator><![CDATA[Savepoint]]></dc:creator>
		<pubDate>Sat, 06 Sep 2025 14:34:04 +0000</pubDate>
				<category><![CDATA[Comunidade e Eventos]]></category>
		<category><![CDATA[Notícias]]></category>
		<category><![CDATA[PGConf.Brasil]]></category>
		<category><![CDATA[PostgreSQL]]></category>
		<guid isPermaLink="false">https://savepoint.blog.br/?p=14435</guid>

					<description><![CDATA[<p>Nos dias 3, 4 e 5 de setembro de 2025, em João Pessoa, PB, o PGConf.Brasil brilhou pela primeira vez no nordeste. Este foi o segundo evento organizado pela &#8220;Associação PostgreSQL Brasil&#8221; que mostrou claramente que o PostgreSQL continua vivo e vibrante no Brasil. E mais uma vez, a Savepoint esteve lá! Palestra: Métricas e</p>
<p>The post <a href="https://savepoint.blog.br/2025/09/06/sobre-o-pgconf-brasil-2025/">Sobre o PGConf.Brasil 2025</a> first appeared on <a href="https://savepoint.blog.br">Savepoint</a>.</p>]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph">Nos dias 3, 4 e 5 de setembro de 2025, em João Pessoa, PB, o PGConf.Brasil brilhou pela primeira vez no nordeste. Este foi o segundo evento organizado pela &#8220;Associação PostgreSQL Brasil&#8221; que mostrou claramente que o PostgreSQL continua vivo e vibrante no Brasil. E mais uma vez, a Savepoint esteve lá!</p>



<figure class="wp-embed-aspect-16-9 wp-has-aspect-ratio wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" class="youtube-player" width="780" height="439" src="https://www.youtube.com/embed/EYQmRF5bCRw?version=3&#038;rel=1&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;fs=1&#038;hl=pt-BR&#038;autohide=2&#038;wmode=transparent" allowfullscreen="true" style="border:0;" sandbox="allow-scripts allow-same-origin allow-popups allow-presentation allow-popups-to-escape-sandbox"></iframe>
</div></figure>



<p class="wp-block-paragraph"></p>



<h2 class="wp-block-heading">Palestra: Métricas e ajustes no PostgreSQL</h2>



<p class="wp-block-paragraph">Nesta palestra apresentamos alguns pontos-chave para monitorar e ajustar o PostgreSQL:</p>



<ul class="wp-block-list">
<li class="">Scripts</li>



<li class="">Inspeção no catálogo</li>



<li class="">Ajustes no SO</li>



<li class="">Ajustes globais no PostgreSQL</li>



<li class="">Ajustes individuais objetos</li>



<li class="">Ajustes em consultas</li>
</ul>



<p class="wp-block-paragraph"></p>



<ul class="wp-block-list">
<li class=""><a href="https://speakerdeck.com/fabiotr/metricas-e-ajustes-no-postgresql" title="">Slides</a> da palestra</li>



<li class=""><a href="https://github.com/fabiotr/pg_scripts" title="">Scripts </a>apresentados</li>
</ul>



<p class="wp-block-paragraph"></p><p>The post <a href="https://savepoint.blog.br/2025/09/06/sobre-o-pgconf-brasil-2025/">Sobre o PGConf.Brasil 2025</a> first appeared on <a href="https://savepoint.blog.br">Savepoint</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://savepoint.blog.br/2025/09/06/sobre-o-pgconf-brasil-2025/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">14435</post-id>	</item>
		<item>
		<title>Meu Postgres não conecta: troubleshooting de conexões</title>
		<link>https://savepoint.blog.br/2024/12/16/meu-postgres-nao-conecta-troubleshooting-de-conexoes/</link>
					<comments>https://savepoint.blog.br/2024/12/16/meu-postgres-nao-conecta-troubleshooting-de-conexoes/#respond</comments>
		
		<dc:creator><![CDATA[Savepoint]]></dc:creator>
		<pubDate>Mon, 16 Dec 2024 18:43:36 +0000</pubDate>
				<category><![CDATA[Instalação e Setup]]></category>
		<category><![CDATA[Performance e Tuning]]></category>
		<category><![CDATA[Segurança e Acessos]]></category>
		<category><![CDATA[DBA]]></category>
		<category><![CDATA[postgres]]></category>
		<category><![CDATA[PostgreSQL]]></category>
		<guid isPermaLink="false">https://savepoint.blog.br/?p=8554</guid>

					<description><![CDATA[<p>Resolva erros de conexão no Postgres com este guia prático: verifique serviço, rota, permissões e configurações essenciais.</p>
<p>The post <a href="https://savepoint.blog.br/2024/12/16/meu-postgres-nao-conecta-troubleshooting-de-conexoes/">Meu Postgres não conecta: troubleshooting de conexões</a> first appeared on <a href="https://savepoint.blog.br">Savepoint</a>.</p>]]></description>
										<content:encoded><![CDATA[<h2 class="wp-block-heading">Introdução</h2>



<p class="wp-block-paragraph">Nesse artigo, vamos explorar problemas comuns ao tentar se conectar com seu servidor Postgres. Há diversas possibilidades de problemas enfrentados, então veremos cenários mais comuns e como solucioná-los da maneira mais simples e rápida possível.</p>



<p class="wp-block-paragraph">Roteiro:</p>



<ul class="wp-block-list">
<li class="">O postgres está no ar?</li>



<li class="">Temos rota para conectar?</li>



<li class="">O <kbd>pg_hba.conf</kbd> e o <kbd>postgresql.conf</kbd> estão conectados devidamente?</li>



<li class="">Eu tenho permissão para me conectar?</li>



<li class="">Meu usuário existe?</li>



<li class="">O banco de dados existe?</li>



<li class="">A senha está correta?</li>
</ul>



<p class="wp-block-paragraph"><br>Verifique sempre os logs da sua aplicação e, se possível, tente estabelecer uma conexão com o banco de dados utilizando o psql, que é o <em>client </em>oficial do PostgreSQL. Faça isso para eliminar qualquer possibilidade de erro em outra camada da sua aplicação e para poder ver claramente os erros que acontecem durante a conexão. Claro que para isso você vai precisar instalar o <em>client </em>do PostgreSQL no seu servidor de aplicação ou desktop, dependendo do caso. Sempre teste a conexão a partir do mesmo lugar da aplicação. Dependendo da origem da conexão, rotas, firewalls, VPNs, entre outras variáveis na sua rede podem mudar. Vamos mostrar aqui vários exemplos de erros que acontecem durante a conexão e simulá-los sempre utilizando o psql.</p>



<h2 class="wp-block-heading">Recebi uma mensagem dizendo que o banco de dados não está no ar!</h2>



<p class="wp-block-paragraph">Na maioria das vezes, o erro que você vai receber quando tem um problema de conexão é este aqui:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">psql shell: mensagem de erro por banco de dados fora do ar</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>psql: error: connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: No such file or directory
        Is the server running locally and accepting connections on that socket?</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #24292E">psql: error: </span><span style="color: #D73A49">connection</span><span style="color: #24292E"> </span><span style="color: #D73A49">to</span><span style="color: #24292E"> </span><span style="color: #D73A49">server</span><span style="color: #24292E"> </span><span style="color: #D73A49">on</span><span style="color: #24292E"> socket </span><span style="color: #032F62">&quot;/var/run/postgresql/.s.PGSQL.5432&quot;</span><span style="color: #24292E"> failed: </span><span style="color: #D73A49">No</span><span style="color: #24292E"> such </span><span style="color: #D73A49">file</span><span style="color: #24292E"> </span><span style="color: #D73A49">or</span><span style="color: #24292E"> directory</span></span>
<span class="line"><span style="color: #24292E">        </span><span style="color: #D73A49">Is</span><span style="color: #24292E"> the </span><span style="color: #D73A49">server</span><span style="color: #24292E"> running locally </span><span style="color: #D73A49">and</span><span style="color: #24292E"> accepting connections </span><span style="color: #D73A49">on</span><span style="color: #24292E"> that socket?</span></span></code></pre></div>



<p class="wp-block-paragraph"><br>Apesar de a mensagem dar a entender que o seu banco de dados não está no ar, o motivo desse aviso pode variar um pouco:</p>



<ol class="wp-block-list">
<li class="">Você pode ter digitado o endereço do servidor ou a porta incorretamente;</li>



<li class="">Você pode não ter uma rota na rede até o servidor;</li>



<li class="">Pode haver um firewall bloqueando o caminho até o servidor;</li>



<li class="">O banco de dados pode realmente não estar no ar;&nbsp;</li>



<li class="">O parâmetro <kbd>listen_address </kbd>pode estar desativado para esse IP.</li>
</ol>



<p class="wp-block-paragraph">A primeira coisa a fazer numa tentativa falha de conexão com o banco de dados, como a exibida anteriormente, é checar se o serviço do banco está disponível, ou seja, no ar.&nbsp;</p>



<p class="wp-block-paragraph">É possível verificar o status desse serviço com diversos comandos, que já abordamos por aqui, mas, para relembrar, veja alguns deles (se executados como usuário root, pode ser necessário utilizar o comando sudo antes, caso esteja logado com outro usuário):</p>



<ul class="wp-block-list">
<li class=""><kbd>ps -faux | grep postgres</kbd> (este método é o mais confiável e funciona para qualquer ambiente Linux/Unix):</li>
</ul>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">Debian shell: processos postgres</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># ps -faux | grep postgres
root     1820618  0.0  0.1   3876  1832 pts/0    S+   14:41   0:00          \_ grep postgres
999      3358569  0.0  1.4 220064 14652 ?        Ss   Jul23   7:16  \_ postgres
999      3358637  0.0  3.1 220352 31392 ?        Ss   Jul23   0:05      \_ postgres: checkpointer
999      3358638  0.0  0.7 220216  7452 ?        Ss   Jul23   1:07      \_ postgres: background writer
999      3358640  0.0  0.7 220192  6904 ?        Ss   Jul23   1:13      \_ postgres: walwriter
999      3358641  0.0  0.4 221656  4024 ?        Ss   Jul23   1:45      \_ postgres: autovacuum launcher
999      3358642  0.0  0.4 221644  4020 ?        Ss   Jul23   0:03      \_ postgres: logical replication launcher
999        82547  0.0  1.0  11828 10184 ?        Sl   Aug20   4:02      \_ postgres:
999      1800988 99.5 27.7 308912 272700 ?       Sl   Oct16 1170:12          \_ postgres:</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #6A737D"># ps -faux | grep postgres</span></span>
<span class="line"><span style="color: #6F42C1">root</span><span style="color: #24292E">     </span><span style="color: #005CC5">1820618</span><span style="color: #24292E">  </span><span style="color: #005CC5">0.0</span><span style="color: #24292E">  </span><span style="color: #005CC5">0.1</span><span style="color: #24292E">   </span><span style="color: #005CC5">3876</span><span style="color: #24292E">  </span><span style="color: #005CC5">1832</span><span style="color: #24292E"> </span><span style="color: #032F62">pts/0</span><span style="color: #24292E">    </span><span style="color: #032F62">S+</span><span style="color: #24292E">   </span><span style="color: #005CC5">14</span><span style="color: #032F62">:41</span><span style="color: #24292E">   </span><span style="color: #005CC5">0</span><span style="color: #032F62">:00</span><span style="color: #24292E">          </span><span style="color: #005CC5">\_</span><span style="color: #24292E"> </span><span style="color: #032F62">grep</span><span style="color: #24292E"> </span><span style="color: #032F62">postgres</span></span>
<span class="line"><span style="color: #6F42C1">999</span><span style="color: #24292E">      </span><span style="color: #005CC5">3358569</span><span style="color: #24292E">  </span><span style="color: #005CC5">0.0</span><span style="color: #24292E">  </span><span style="color: #005CC5">1.4</span><span style="color: #24292E"> </span><span style="color: #005CC5">220064</span><span style="color: #24292E"> </span><span style="color: #005CC5">14652</span><span style="color: #24292E"> </span><span style="color: #032F62">?</span><span style="color: #24292E">        </span><span style="color: #032F62">Ss</span><span style="color: #24292E">   </span><span style="color: #032F62">Jul23</span><span style="color: #24292E">   </span><span style="color: #005CC5">7</span><span style="color: #032F62">:16</span><span style="color: #24292E">  </span><span style="color: #005CC5">\_</span><span style="color: #24292E"> </span><span style="color: #032F62">postgres</span></span>
<span class="line"><span style="color: #6F42C1">999</span><span style="color: #24292E">      </span><span style="color: #005CC5">3358637</span><span style="color: #24292E">  </span><span style="color: #005CC5">0.0</span><span style="color: #24292E">  </span><span style="color: #005CC5">3.1</span><span style="color: #24292E"> </span><span style="color: #005CC5">220352</span><span style="color: #24292E"> </span><span style="color: #005CC5">31392</span><span style="color: #24292E"> </span><span style="color: #032F62">?</span><span style="color: #24292E">        </span><span style="color: #032F62">Ss</span><span style="color: #24292E">   </span><span style="color: #032F62">Jul23</span><span style="color: #24292E">   </span><span style="color: #005CC5">0</span><span style="color: #032F62">:05</span><span style="color: #24292E">      </span><span style="color: #005CC5">\_</span><span style="color: #24292E"> </span><span style="color: #032F62">postgres:</span><span style="color: #24292E"> </span><span style="color: #032F62">checkpointer</span></span>
<span class="line"><span style="color: #6F42C1">999</span><span style="color: #24292E">      </span><span style="color: #005CC5">3358638</span><span style="color: #24292E">  </span><span style="color: #005CC5">0.0</span><span style="color: #24292E">  </span><span style="color: #005CC5">0.7</span><span style="color: #24292E"> </span><span style="color: #005CC5">220216</span><span style="color: #24292E">  </span><span style="color: #005CC5">7452</span><span style="color: #24292E"> </span><span style="color: #032F62">?</span><span style="color: #24292E">        </span><span style="color: #032F62">Ss</span><span style="color: #24292E">   </span><span style="color: #032F62">Jul23</span><span style="color: #24292E">   </span><span style="color: #005CC5">1</span><span style="color: #032F62">:07</span><span style="color: #24292E">      </span><span style="color: #005CC5">\_</span><span style="color: #24292E"> </span><span style="color: #032F62">postgres:</span><span style="color: #24292E"> </span><span style="color: #032F62">background</span><span style="color: #24292E"> </span><span style="color: #032F62">writer</span></span>
<span class="line"><span style="color: #6F42C1">999</span><span style="color: #24292E">      </span><span style="color: #005CC5">3358640</span><span style="color: #24292E">  </span><span style="color: #005CC5">0.0</span><span style="color: #24292E">  </span><span style="color: #005CC5">0.7</span><span style="color: #24292E"> </span><span style="color: #005CC5">220192</span><span style="color: #24292E">  </span><span style="color: #005CC5">6904</span><span style="color: #24292E"> </span><span style="color: #032F62">?</span><span style="color: #24292E">        </span><span style="color: #032F62">Ss</span><span style="color: #24292E">   </span><span style="color: #032F62">Jul23</span><span style="color: #24292E">   </span><span style="color: #005CC5">1</span><span style="color: #032F62">:13</span><span style="color: #24292E">      </span><span style="color: #005CC5">\_</span><span style="color: #24292E"> </span><span style="color: #032F62">postgres:</span><span style="color: #24292E"> </span><span style="color: #032F62">walwriter</span></span>
<span class="line"><span style="color: #6F42C1">999</span><span style="color: #24292E">      </span><span style="color: #005CC5">3358641</span><span style="color: #24292E">  </span><span style="color: #005CC5">0.0</span><span style="color: #24292E">  </span><span style="color: #005CC5">0.4</span><span style="color: #24292E"> </span><span style="color: #005CC5">221656</span><span style="color: #24292E">  </span><span style="color: #005CC5">4024</span><span style="color: #24292E"> </span><span style="color: #032F62">?</span><span style="color: #24292E">        </span><span style="color: #032F62">Ss</span><span style="color: #24292E">   </span><span style="color: #032F62">Jul23</span><span style="color: #24292E">   </span><span style="color: #005CC5">1</span><span style="color: #032F62">:45</span><span style="color: #24292E">      </span><span style="color: #005CC5">\_</span><span style="color: #24292E"> </span><span style="color: #032F62">postgres:</span><span style="color: #24292E"> </span><span style="color: #032F62">autovacuum</span><span style="color: #24292E"> </span><span style="color: #032F62">launcher</span></span>
<span class="line"><span style="color: #6F42C1">999</span><span style="color: #24292E">      </span><span style="color: #005CC5">3358642</span><span style="color: #24292E">  </span><span style="color: #005CC5">0.0</span><span style="color: #24292E">  </span><span style="color: #005CC5">0.4</span><span style="color: #24292E"> </span><span style="color: #005CC5">221644</span><span style="color: #24292E">  </span><span style="color: #005CC5">4020</span><span style="color: #24292E"> </span><span style="color: #032F62">?</span><span style="color: #24292E">        </span><span style="color: #032F62">Ss</span><span style="color: #24292E">   </span><span style="color: #032F62">Jul23</span><span style="color: #24292E">   </span><span style="color: #005CC5">0</span><span style="color: #032F62">:03</span><span style="color: #24292E">      </span><span style="color: #005CC5">\_</span><span style="color: #24292E"> </span><span style="color: #032F62">postgres:</span><span style="color: #24292E"> </span><span style="color: #032F62">logical</span><span style="color: #24292E"> </span><span style="color: #032F62">replication</span><span style="color: #24292E"> </span><span style="color: #032F62">launcher</span></span>
<span class="line"><span style="color: #6F42C1">999</span><span style="color: #24292E">        </span><span style="color: #005CC5">82547</span><span style="color: #24292E">  </span><span style="color: #005CC5">0.0</span><span style="color: #24292E">  </span><span style="color: #005CC5">1.0</span><span style="color: #24292E">  </span><span style="color: #005CC5">11828</span><span style="color: #24292E"> </span><span style="color: #005CC5">10184</span><span style="color: #24292E"> </span><span style="color: #032F62">?</span><span style="color: #24292E">        </span><span style="color: #032F62">Sl</span><span style="color: #24292E">   </span><span style="color: #032F62">Aug20</span><span style="color: #24292E">   </span><span style="color: #005CC5">4</span><span style="color: #032F62">:02</span><span style="color: #24292E">      </span><span style="color: #005CC5">\_</span><span style="color: #24292E"> </span><span style="color: #032F62">postgres:</span></span>
<span class="line"><span style="color: #6F42C1">999</span><span style="color: #24292E">      </span><span style="color: #005CC5">1800988</span><span style="color: #24292E"> </span><span style="color: #005CC5">99.5</span><span style="color: #24292E"> </span><span style="color: #005CC5">27.7</span><span style="color: #24292E"> </span><span style="color: #005CC5">308912</span><span style="color: #24292E"> </span><span style="color: #005CC5">272700</span><span style="color: #24292E"> </span><span style="color: #032F62">?</span><span style="color: #24292E">       </span><span style="color: #032F62">Sl</span><span style="color: #24292E">   </span><span style="color: #032F62">Oct16</span><span style="color: #24292E"> </span><span style="color: #005CC5">1170</span><span style="color: #032F62">:12</span><span style="color: #24292E">          </span><span style="color: #005CC5">\_</span><span style="color: #24292E"> </span><span style="color: #032F62">postgres:</span></span></code></pre></div>



<p class="wp-block-paragraph"><br>Caso o banco não esteja no ar, não aparecerão os diversos processos do serviço&nbsp;<kbd>postgres</kbd>, aparecendo, em geral, apenas o processo da própria busca do comando&nbsp;<kbd>grep</kbd>.</p>



<ul class="wp-block-list">
<li class=""><kbd>systemctl status postgresql</kbd> (funciona para sistemas Linux modernos que usam o systemd configurados corretamente com o PostgreSQL. Porém, nos sistemas baseados em Red Hat, é necessário colocar <kbd>-&lt;número_versão&gt;</kbd> após <kbd>postgres</kbd>q<kbd>l</kbd>, por exemplo: <kbd>systemctl status postgresql-13</kbd>):&nbsp;</li>
</ul>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">Debian shell: consulta do status do serviço postgres</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># systemctl status postgresql
● postgresql.service - PostgreSQL RDBMS
     Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; preset: enabled)
     Active: active (exited) since Tue 2024-04-09 18:41:03 UTC; 5 months 0 days ago
    Process: 439735 ExecReload=/bin/true (code=exited, status=0/SUCCESS)
   Main PID: 171728 (code=exited, status=0/SUCCESS)
        CPU: 1ms

Sep 04 19:32:13 debian-teste systemd&#91;1&#93;: Reloading postgresql.service - PostgreSQL RDBMS...
...</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #6A737D"># systemctl status postgresql</span></span>
<span class="line"><span style="color: #6F42C1">●</span><span style="color: #24292E"> </span><span style="color: #032F62">postgresql.service</span><span style="color: #24292E"> </span><span style="color: #032F62">-</span><span style="color: #24292E"> </span><span style="color: #032F62">PostgreSQL</span><span style="color: #24292E"> </span><span style="color: #032F62">RDBMS</span></span>
<span class="line"><span style="color: #24292E">     </span><span style="color: #6F42C1">Loaded:</span><span style="color: #24292E"> </span><span style="color: #032F62">loaded</span><span style="color: #24292E"> (/lib/systemd/system/postgresql.service; </span><span style="color: #6F42C1">enabled</span><span style="color: #24292E">; </span><span style="color: #6F42C1">preset:</span><span style="color: #24292E"> </span><span style="color: #032F62">enabled</span><span style="color: #24292E">)</span></span>
<span class="line"><span style="color: #24292E">     </span><span style="color: #6F42C1">Active:</span><span style="color: #24292E"> </span><span style="color: #032F62">active</span><span style="color: #24292E"> (exited) since Tue 2024-04-09 18:41:03 UTC; </span><span style="color: #6F42C1">5</span><span style="color: #24292E"> </span><span style="color: #032F62">months</span><span style="color: #24292E"> </span><span style="color: #005CC5">0</span><span style="color: #24292E"> </span><span style="color: #032F62">days</span><span style="color: #24292E"> </span><span style="color: #032F62">ago</span></span>
<span class="line"><span style="color: #24292E">    </span><span style="color: #6F42C1">Process:</span><span style="color: #24292E"> </span><span style="color: #005CC5">439735</span><span style="color: #24292E"> </span><span style="color: #032F62">ExecReload=/bin/</span><span style="color: #005CC5">true</span><span style="color: #24292E"> (code=exited, </span><span style="color: #032F62">status=</span><span style="color: #005CC5">0</span><span style="color: #032F62">/SUCCESS</span><span style="color: #24292E">)</span></span>
<span class="line"><span style="color: #24292E">   </span><span style="color: #6F42C1">Main</span><span style="color: #24292E"> </span><span style="color: #032F62">PID:</span><span style="color: #24292E"> </span><span style="color: #005CC5">171728</span><span style="color: #24292E"> (code=exited, </span><span style="color: #032F62">status=</span><span style="color: #005CC5">0</span><span style="color: #032F62">/SUCCESS</span><span style="color: #24292E">)</span></span>
<span class="line"><span style="color: #24292E">        </span><span style="color: #6F42C1">CPU:</span><span style="color: #24292E"> </span><span style="color: #005CC5">1</span><span style="color: #032F62">ms</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6F42C1">Sep</span><span style="color: #24292E"> </span><span style="color: #005CC5">04</span><span style="color: #24292E"> </span><span style="color: #005CC5">19</span><span style="color: #032F62">:32:13</span><span style="color: #24292E"> </span><span style="color: #032F62">debian-teste</span><span style="color: #24292E"> </span><span style="color: #032F62">systemd&#91;</span><span style="color: #005CC5">1</span><span style="color: #032F62">&#93;:</span><span style="color: #24292E"> </span><span style="color: #032F62">Reloading</span><span style="color: #24292E"> </span><span style="color: #032F62">postgresql.service</span><span style="color: #24292E"> </span><span style="color: #032F62">-</span><span style="color: #24292E"> </span><span style="color: #032F62">PostgreSQL</span><span style="color: #24292E"> </span><span style="color: #032F62">RDBMS...</span></span>
<span class="line"><span style="color: #005CC5">...</span></span></code></pre></div>



<p class="wp-block-paragraph">Se o banco de dados estiver fora do ar, a seção &#8216;Active&#8217; exibirá &#8216;inactive (dead)&#8217;, também indicando desde quando o serviço está nesse estado, conforme o exemplo. Há a possibilidade de o comando systemctl não estar disponível, se o servidor foi inicializado sem o systemd, e se for esse o caso, deverão ser utilizadas as outras alternativas demonstradas.</p>



<p class="wp-block-paragraph">Uma última observação importante é que se o PostgreSQL estiver sendo manipulado sem o comando <kbd>systemct</kbd>l, pode ser que este método apresente informações incorretas, portanto, pode não ser uma boa ideia confiar nele.</p>



<ul class="wp-block-list">
<li class=""><kbd>pg_lsclusters</kbd> (para sistemas baseados em Debian):</li>
</ul>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">Debian shell: consulta do serviço postgres</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># pg_lsclusters
Ver Cluster     Port Status Owner    Data directory                     Log file
16  main        5432 online postgres /var/lib/postgresql/16/main        /var/log/postgresql/postgresql-16-main.log
16  novocluster 5433 online postgres /var/lib/postgresql/16/novocluster /var/log/postgresql/postgresql-16-novocluster.log</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #6A737D"># pg_lsclusters</span></span>
<span class="line"><span style="color: #6F42C1">Ver</span><span style="color: #24292E"> </span><span style="color: #032F62">Cluster</span><span style="color: #24292E">     </span><span style="color: #032F62">Port</span><span style="color: #24292E"> </span><span style="color: #032F62">Status</span><span style="color: #24292E"> </span><span style="color: #032F62">Owner</span><span style="color: #24292E">    </span><span style="color: #032F62">Data</span><span style="color: #24292E"> </span><span style="color: #032F62">directory</span><span style="color: #24292E">                     </span><span style="color: #032F62">Log</span><span style="color: #24292E"> </span><span style="color: #032F62">file</span></span>
<span class="line"><span style="color: #6F42C1">16</span><span style="color: #24292E">  </span><span style="color: #032F62">main</span><span style="color: #24292E">        </span><span style="color: #005CC5">5432</span><span style="color: #24292E"> </span><span style="color: #032F62">online</span><span style="color: #24292E"> </span><span style="color: #032F62">postgres</span><span style="color: #24292E"> </span><span style="color: #032F62">/var/lib/postgresql/16/main</span><span style="color: #24292E">        </span><span style="color: #032F62">/var/log/postgresql/postgresql-16-main.log</span></span>
<span class="line"><span style="color: #6F42C1">16</span><span style="color: #24292E">  </span><span style="color: #032F62">novocluster</span><span style="color: #24292E"> </span><span style="color: #005CC5">5433</span><span style="color: #24292E"> </span><span style="color: #032F62">online</span><span style="color: #24292E"> </span><span style="color: #032F62">postgres</span><span style="color: #24292E"> </span><span style="color: #032F62">/var/lib/postgresql/16/novocluster</span><span style="color: #24292E"> </span><span style="color: #032F62">/var/log/postgresql/postgresql-16-novocluster.log</span></span></code></pre></div>



<p class="wp-block-paragraph"><br>Aqui, se o serviço estiver fora do ar, aparecerá ‘<kbd>down</kbd>’ no lugar de ‘<kbd>online</kbd>’, com as letras geralmente na cor vermelha, para indicar que não está funcionando.&nbsp;</p>



<ul class="wp-block-list">
<li class=""><kbd>pg_ctlcluster &lt;sua_versao&gt; &lt;nome_cluster&gt; status</kbd> (apenas para sistemas baseados em Debian):</li>
</ul>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">Debian shell: consulta do serviço postgres</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># pg_ctlcluster 16 main status
pg_ctl: server is running (PID: 433805)
/usr/lib/postgresql/16/bin/postgres "-D" "/var/lib/postgresql/16/main" "-c" "config_file=/etc/postgresql/16/main/postgresql.conf"</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #6A737D"># pg_ctlcluster 16 main status</span></span>
<span class="line"><span style="color: #6F42C1">pg_ctl:</span><span style="color: #24292E"> </span><span style="color: #032F62">server</span><span style="color: #24292E"> </span><span style="color: #032F62">is</span><span style="color: #24292E"> </span><span style="color: #032F62">running</span><span style="color: #24292E"> (PID: </span><span style="color: #005CC5">433805</span><span style="color: #24292E">)</span></span>
<span class="line"><span style="color: #6F42C1">/usr/lib/postgresql/16/bin/postgres</span><span style="color: #24292E"> </span><span style="color: #032F62">&quot;-D&quot;</span><span style="color: #24292E"> </span><span style="color: #032F62">&quot;/var/lib/postgresql/16/main&quot;</span><span style="color: #24292E"> </span><span style="color: #032F62">&quot;-c&quot;</span><span style="color: #24292E"> </span><span style="color: #032F62">&quot;config_file=/etc/postgresql/16/main/postgresql.conf&quot;</span></span></code></pre></div>



<p class="wp-block-paragraph"><br>No caso de o banco estar fora do ar, o retorno será ‘<kbd>pg_ctl: no server running</kbd>’.</p>



<ul class="wp-block-list">
<li class=""><kbd>sc query postgresql-x64-&lt;número_versão&gt;</kbd> (para Windows):</li>
</ul>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">Windows shell: consulta do serviço postgres</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>C:\Windows\System32>sc query postgresql-x64-16

NOME_DO_SERVIÇO: postgresql-x64-16
    TIPO                       : 10  WIN32_OWN_PROCESS
    ESTADO                     : 4  RUNNING
                                (STOPPABLE, PAUSABLE, ACCEPTS_SHUTDOWN)
    CÓDIGO_DE_SAÍDA_DO_WIN32   : 0  (0x0)
    CÓDIGO_DE_SAÍDA_DO_SERVIÇO : 0  (0x0)
    PONTO_DE_VERIFICAÇÃO       : 0x0
    AGUARDAR_DICA              : 0x0</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #6F42C1">C:\Windows\System32&gt;sc</span><span style="color: #24292E"> </span><span style="color: #032F62">query</span><span style="color: #24292E"> </span><span style="color: #032F62">postgresql-x64-16</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6F42C1">NOME_DO_SERVIÇO:</span><span style="color: #24292E"> </span><span style="color: #032F62">postgresql-x64-16</span></span>
<span class="line"><span style="color: #24292E">    </span><span style="color: #6F42C1">TIPO</span><span style="color: #24292E">                       </span><span style="color: #032F62">:</span><span style="color: #24292E"> </span><span style="color: #005CC5">10</span><span style="color: #24292E">  </span><span style="color: #032F62">WIN32_OWN_PROCESS</span></span>
<span class="line"><span style="color: #24292E">    </span><span style="color: #6F42C1">ESTADO</span><span style="color: #24292E">                     </span><span style="color: #032F62">:</span><span style="color: #24292E"> </span><span style="color: #005CC5">4</span><span style="color: #24292E">  </span><span style="color: #032F62">RUNNING</span></span>
<span class="line"><span style="color: #24292E">                                (</span><span style="color: #6F42C1">STOPPABLE,</span><span style="color: #24292E"> </span><span style="color: #032F62">PAUSABLE,</span><span style="color: #24292E"> </span><span style="color: #032F62">ACCEPTS_SHUTDOWN</span><span style="color: #24292E">)</span></span>
<span class="line"><span style="color: #24292E">    </span><span style="color: #6F42C1">CÓDIGO_DE_SAÍDA_DO_WIN32</span><span style="color: #24292E">   </span><span style="color: #032F62">:</span><span style="color: #24292E"> </span><span style="color: #005CC5">0</span><span style="color: #24292E">  (0x0)</span></span>
<span class="line"><span style="color: #24292E">    </span><span style="color: #6F42C1">CÓDIGO_DE_SAÍDA_DO_SERVIÇO</span><span style="color: #24292E"> </span><span style="color: #032F62">:</span><span style="color: #24292E"> </span><span style="color: #005CC5">0</span><span style="color: #24292E">  (0x0)</span></span>
<span class="line"><span style="color: #24292E">    </span><span style="color: #6F42C1">PONTO_DE_VERIFICAÇÃO</span><span style="color: #24292E">       </span><span style="color: #032F62">:</span><span style="color: #24292E"> </span><span style="color: #005CC5">0x0</span></span>
<span class="line"><span style="color: #24292E">    </span><span style="color: #6F42C1">AGUARDAR_DICA</span><span style="color: #24292E">              </span><span style="color: #032F62">:</span><span style="color: #24292E"> </span><span style="color: #005CC5">0x0</span></span></code></pre></div>



<p class="wp-block-paragraph">Aqui, a mudança para o banco fora do ar seria no ‘<kbd>ESTADO</kbd>’, diferente de ‘<kbd>RUNNING</kbd>’.</p>



<p class="wp-block-paragraph">Como você pode ver, nos nossos exemplos, todos os comandos retornaram resposta positiva quanto ao estado do serviço do banco, que está no ar. Mas e se não estivesse, o que poderia ser feito? Como já citamos em artigos anteriores, no Linux é possível gerenciar o estado do seu banco de dados também com o utilitário <kbd>systemctl</kbd>:</p>



<ul class="wp-block-list">
<li class="">Para subir, poderíamos utilizar o comando (que não tem saída): <br><kbd>systemctl start postgresql</kbd><br><br>E assim checar novamente o status do banco por um dos meios mencionados anteriormente.<br><br>Em Windows, o comando para iniciar é: <kbd>net start postgresql-x64-16</kbd>&nbsp;</li>
</ul>



<p class="wp-block-paragraph"><br><strong>Observação: </strong>se você iniciou o serviço, verifique se ele realmente subiu. Se não subir, verifique os logs do PostgreSQL para entender o motivo. Se o banco de dados estiver no ar, verifique novamente se a conexão funciona, primeiro localmente, depois remotamente.</p>



<h2 class="wp-block-heading">Temos rota para conectar?</h2>



<p class="wp-block-paragraph">Depois de checar o status do serviço do PostgreSQL, caso ainda não tenha conseguido conectar, pode ser interessante checar a rota de conexão com o banco de dados.&nbsp;<br>Algumas das mensagens de erros comuns para esse tipo de situação são:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">psql shell: mensagem de erro por conexão recusada</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>psql: error: could not connect to server: Connection refused Is the server running on host "localhost" (127.0.0.1) and accepting TCP/IP connections on port 5432?</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #24292E">psql: error: could </span><span style="color: #D73A49">not</span><span style="color: #24292E"> </span><span style="color: #D73A49">connect</span><span style="color: #24292E"> </span><span style="color: #D73A49">to</span><span style="color: #24292E"> </span><span style="color: #D73A49">server</span><span style="color: #24292E">: </span><span style="color: #D73A49">Connection</span><span style="color: #24292E"> refused </span><span style="color: #D73A49">Is</span><span style="color: #24292E"> the </span><span style="color: #D73A49">server</span><span style="color: #24292E"> running </span><span style="color: #D73A49">on</span><span style="color: #24292E"> host </span><span style="color: #032F62">&quot;localhost&quot;</span><span style="color: #24292E"> (</span><span style="color: #005CC5">127</span><span style="color: #24292E">.</span><span style="color: #005CC5">0</span><span style="color: #24292E">.</span><span style="color: #005CC5">0</span><span style="color: #24292E">.</span><span style="color: #005CC5">1</span><span style="color: #24292E">) </span><span style="color: #D73A49">and</span><span style="color: #24292E"> accepting </span><span style="color: #D73A49">TCP/</span><span style="color: #24292E">IP connections </span><span style="color: #D73A49">on</span><span style="color: #24292E"> port </span><span style="color: #005CC5">5432</span><span style="color: #24292E">?</span></span></code></pre></div>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">psql shell: mensagem de erro por conexão falha</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>psql: error: connection to server at "192.168.0.1", port 5432 failed: Connection timed out        
Is the server running on that host and accepting TCP/IP connections?</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #24292E">psql: error: </span><span style="color: #D73A49">connection</span><span style="color: #24292E"> </span><span style="color: #D73A49">to</span><span style="color: #24292E"> </span><span style="color: #D73A49">server</span><span style="color: #24292E"> </span><span style="color: #D73A49">at</span><span style="color: #24292E"> </span><span style="color: #032F62">&quot;192.168.0.1&quot;</span><span style="color: #24292E">, port </span><span style="color: #005CC5">5432</span><span style="color: #24292E"> failed: </span><span style="color: #D73A49">Connection</span><span style="color: #24292E"> timed </span><span style="color: #D73A49">out</span><span style="color: #24292E">        </span></span>
<span class="line"><span style="color: #D73A49">Is</span><span style="color: #24292E"> the </span><span style="color: #D73A49">server</span><span style="color: #24292E"> running </span><span style="color: #D73A49">on</span><span style="color: #24292E"> that host </span><span style="color: #D73A49">and</span><span style="color: #24292E"> accepting </span><span style="color: #D73A49">TCP/</span><span style="color: #24292E">IP connections?</span></span></code></pre></div>



<p class="wp-block-paragraph">Podemos conferir o status da rota consultando a conectividade de rede entre o cliente e o servidor PostgreSQL por meio de algumas ferramentas comuns:</p>



<ul class="wp-block-list">
<li class=""><strong>Ping</strong>: verifica se o servidor está acessível a partir do cliente. O comando <kbd>ping &lt;ip-do-servidor&gt;</kbd> pode ser usado para verificar a resposta do servidor. Se o servidor não responder, isso pode indicar problemas de rede, como bloqueio por firewall ou roteamento incorreto. O comando <kbd>ping</kbd> está disponível tanto em Windows quanto em Linux e funciona de forma similar. É um bom comando para ver se um servidor está no ar, mesmo sem saber a porta que será utilizada. No entanto, alguns servidores têm o “ping” bloqueado intencionalmente por motivos de segurança, por isso ele nem sempre é a forma mais recomendada de verificar se o servidor remoto está acessível.&nbsp;</li>
</ul>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">Debian shell: teste de conexão via comando ping</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>$ ping 159.89.241.130
PING 159.89.241.130 (10.0.0.240) 56(84) bytes of data.
64 bytes from 159.89.241.130: icmp_seq=1 ttl=64 time=0.081 ms
64 bytes from 159.89.241.130: icmp_seq=2 ttl=64 time=0.127 ms
64 bytes from 159.89.241.130: icmp_seq=3 ttl=64 time=0.063 ms
64 bytes from 159.89.241.130: icmp_seq=4 ttl=64 time=0.058 ms
64 bytes from 159.89.241.130: icmp_seq=5 ttl=64 time=0.054 ms
64 bytes from 159.89.241.130: icmp_seq=6 ttl=64 time=0.062 ms</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #6F42C1">$</span><span style="color: #24292E"> </span><span style="color: #032F62">ping</span><span style="color: #24292E"> </span><span style="color: #005CC5">159.89</span><span style="color: #032F62">.241.130</span></span>
<span class="line"><span style="color: #6F42C1">PING</span><span style="color: #24292E"> </span><span style="color: #005CC5">159.89</span><span style="color: #032F62">.241.130</span><span style="color: #24292E"> (10.0.0.240) 56(</span><span style="color: #6F42C1">84</span><span style="color: #24292E">) bytes of data.</span></span>
<span class="line"><span style="color: #6F42C1">64</span><span style="color: #24292E"> </span><span style="color: #032F62">bytes</span><span style="color: #24292E"> </span><span style="color: #032F62">from</span><span style="color: #24292E"> </span><span style="color: #005CC5">159.89</span><span style="color: #032F62">.241.130:</span><span style="color: #24292E"> </span><span style="color: #032F62">icmp_seq=</span><span style="color: #005CC5">1</span><span style="color: #24292E"> </span><span style="color: #032F62">ttl=</span><span style="color: #005CC5">64</span><span style="color: #24292E"> </span><span style="color: #032F62">time=</span><span style="color: #005CC5">0.081</span><span style="color: #24292E"> </span><span style="color: #032F62">ms</span></span>
<span class="line"><span style="color: #6F42C1">64</span><span style="color: #24292E"> </span><span style="color: #032F62">bytes</span><span style="color: #24292E"> </span><span style="color: #032F62">from</span><span style="color: #24292E"> </span><span style="color: #005CC5">159.89</span><span style="color: #032F62">.241.130:</span><span style="color: #24292E"> </span><span style="color: #032F62">icmp_seq=</span><span style="color: #005CC5">2</span><span style="color: #24292E"> </span><span style="color: #032F62">ttl=</span><span style="color: #005CC5">64</span><span style="color: #24292E"> </span><span style="color: #032F62">time=</span><span style="color: #005CC5">0.127</span><span style="color: #24292E"> </span><span style="color: #032F62">ms</span></span>
<span class="line"><span style="color: #6F42C1">64</span><span style="color: #24292E"> </span><span style="color: #032F62">bytes</span><span style="color: #24292E"> </span><span style="color: #032F62">from</span><span style="color: #24292E"> </span><span style="color: #005CC5">159.89</span><span style="color: #032F62">.241.130:</span><span style="color: #24292E"> </span><span style="color: #032F62">icmp_seq=</span><span style="color: #005CC5">3</span><span style="color: #24292E"> </span><span style="color: #032F62">ttl=</span><span style="color: #005CC5">64</span><span style="color: #24292E"> </span><span style="color: #032F62">time=</span><span style="color: #005CC5">0.063</span><span style="color: #24292E"> </span><span style="color: #032F62">ms</span></span>
<span class="line"><span style="color: #6F42C1">64</span><span style="color: #24292E"> </span><span style="color: #032F62">bytes</span><span style="color: #24292E"> </span><span style="color: #032F62">from</span><span style="color: #24292E"> </span><span style="color: #005CC5">159.89</span><span style="color: #032F62">.241.130:</span><span style="color: #24292E"> </span><span style="color: #032F62">icmp_seq=</span><span style="color: #005CC5">4</span><span style="color: #24292E"> </span><span style="color: #032F62">ttl=</span><span style="color: #005CC5">64</span><span style="color: #24292E"> </span><span style="color: #032F62">time=</span><span style="color: #005CC5">0.058</span><span style="color: #24292E"> </span><span style="color: #032F62">ms</span></span>
<span class="line"><span style="color: #6F42C1">64</span><span style="color: #24292E"> </span><span style="color: #032F62">bytes</span><span style="color: #24292E"> </span><span style="color: #032F62">from</span><span style="color: #24292E"> </span><span style="color: #005CC5">159.89</span><span style="color: #032F62">.241.130:</span><span style="color: #24292E"> </span><span style="color: #032F62">icmp_seq=</span><span style="color: #005CC5">5</span><span style="color: #24292E"> </span><span style="color: #032F62">ttl=</span><span style="color: #005CC5">64</span><span style="color: #24292E"> </span><span style="color: #032F62">time=</span><span style="color: #005CC5">0.054</span><span style="color: #24292E"> </span><span style="color: #032F62">ms</span></span>
<span class="line"><span style="color: #6F42C1">64</span><span style="color: #24292E"> </span><span style="color: #032F62">bytes</span><span style="color: #24292E"> </span><span style="color: #032F62">from</span><span style="color: #24292E"> </span><span style="color: #005CC5">159.89</span><span style="color: #032F62">.241.130:</span><span style="color: #24292E"> </span><span style="color: #032F62">icmp_seq=</span><span style="color: #005CC5">6</span><span style="color: #24292E"> </span><span style="color: #032F62">ttl=</span><span style="color: #005CC5">64</span><span style="color: #24292E"> </span><span style="color: #032F62">time=</span><span style="color: #005CC5">0.062</span><span style="color: #24292E"> </span><span style="color: #032F62">ms</span></span></code></pre></div>



<ul class="wp-block-list">
<li class=""><strong>Porta</strong>: em todos os demais exemplos, você vai precisar saber em qual porta o PostgreSQL está rodando. A porta padrão é a 5432, mas ela pode ser substituída por outra conforme a necessidade. Uma maneira confiável de verificar a porta em uso é conectar-se ao banco de dados localmente via psql e executar o comando <kbd>SHOW port</kbd>:</li>
</ul>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">psql shell: consulta de porta</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>postgres=# SHOW port;
 port
------
 5432
(1 row)</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #24292E">postgres</span><span style="color: #D73A49">=</span><span style="color: #24292E"># SHOW port;</span></span>
<span class="line"><span style="color: #24292E"> port</span></span>
<span class="line"><span style="color: #6A737D">------</span></span>
<span class="line"><span style="color: #24292E"> </span><span style="color: #005CC5">5432</span></span>
<span class="line"><span style="color: #24292E">(</span><span style="color: #005CC5">1</span><span style="color: #24292E"> </span><span style="color: #D73A49">row</span><span style="color: #24292E">)</span></span></code></pre></div>



<p class="wp-block-paragraph">No caso de sistemas baseados em Debian, também é possível usar o comando <kbd>pg_lsclusters</kbd>:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">Debian shell: consulta de porta</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># pg_lsclusters
Ver Cluster Port Status Owner    Data directory              Log file
16  main    5432 online postgres /var/lib/postgresql/16/main /var/log/postgresql/postgresql-16-main.log</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #6A737D"># pg_lsclusters</span></span>
<span class="line"><span style="color: #6F42C1">Ver</span><span style="color: #24292E"> </span><span style="color: #032F62">Cluster</span><span style="color: #24292E"> </span><span style="color: #032F62">Port</span><span style="color: #24292E"> </span><span style="color: #032F62">Status</span><span style="color: #24292E"> </span><span style="color: #032F62">Owner</span><span style="color: #24292E">    </span><span style="color: #032F62">Data</span><span style="color: #24292E"> </span><span style="color: #032F62">directory</span><span style="color: #24292E">              </span><span style="color: #032F62">Log</span><span style="color: #24292E"> </span><span style="color: #032F62">file</span></span>
<span class="line"><span style="color: #6F42C1">16</span><span style="color: #24292E">  </span><span style="color: #032F62">main</span><span style="color: #24292E">    </span><span style="color: #005CC5">5432</span><span style="color: #24292E"> </span><span style="color: #032F62">online</span><span style="color: #24292E"> </span><span style="color: #032F62">postgres</span><span style="color: #24292E"> </span><span style="color: #032F62">/var/lib/postgresql/16/main</span><span style="color: #24292E"> </span><span style="color: #032F62">/var/log/postgresql/postgresql-16-main.log</span></span></code></pre></div>



<ul class="wp-block-list">
<li class=""><strong>Nmap</strong>: o Nmap foi desenvolvido na década de 1990 como uma forma de descobrir serviços e portas utilizadas numa rede. Se você não tiver acesso local ao servidor, para verificar qual é a porta utilizada, ou se o seu administrador de redes estiver indisponível, você pode utilizar o Nmap, que faz isso para você. Alguns administradores podem não gostar muito de alguém varrendo a rede local e cutucando de porta em porta do servidor para saber se alguma está aberta. Existem ambientes com defesas contra esse tipo de ação, por ser utilizada por pessoas com más intenções querendo invadir um servidor. Esteja avisado!</li>
</ul>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">Debian shell: retorno do comando nmap</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>$ nmap 159.89.241.130
Starting Nmap 7.93 ( https://nmap.org ) at 2024-12-11 15:10 -03
Nmap scan report for 159.89.241.130
Host is up (0.12s latency).
Not shown: 998 closed tcp ports (conn-refused)
PORT     STATE    SERVICE
3/tcp    filtered compressnet
22/tcp   open     ssh
5432/tcp open     postgresql

Nmap done: 1 IP address (1 host up) scanned in 14.55 seconds</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #6F42C1">$</span><span style="color: #24292E"> </span><span style="color: #032F62">nmap</span><span style="color: #24292E"> </span><span style="color: #005CC5">159.89</span><span style="color: #032F62">.241.130</span></span>
<span class="line"><span style="color: #6F42C1">Starting</span><span style="color: #24292E"> </span><span style="color: #032F62">Nmap</span><span style="color: #24292E"> </span><span style="color: #005CC5">7.93</span><span style="color: #24292E"> ( </span><span style="color: #032F62">https://nmap.org</span><span style="color: #24292E"> ) at 2024-12-11 15:10 -03</span></span>
<span class="line"><span style="color: #6F42C1">Nmap</span><span style="color: #24292E"> </span><span style="color: #032F62">scan</span><span style="color: #24292E"> </span><span style="color: #032F62">report</span><span style="color: #24292E"> </span><span style="color: #032F62">for</span><span style="color: #24292E"> </span><span style="color: #005CC5">159.89</span><span style="color: #032F62">.241.130</span></span>
<span class="line"><span style="color: #6F42C1">Host</span><span style="color: #24292E"> </span><span style="color: #032F62">is</span><span style="color: #24292E"> </span><span style="color: #032F62">up</span><span style="color: #24292E"> (0.12s </span><span style="color: #032F62">latency</span><span style="color: #24292E">).</span></span>
<span class="line"><span style="color: #6F42C1">Not</span><span style="color: #24292E"> </span><span style="color: #032F62">shown:</span><span style="color: #24292E"> </span><span style="color: #005CC5">998</span><span style="color: #24292E"> </span><span style="color: #032F62">closed</span><span style="color: #24292E"> </span><span style="color: #032F62">tcp</span><span style="color: #24292E"> </span><span style="color: #032F62">ports</span><span style="color: #24292E"> (conn-refused)</span></span>
<span class="line"><span style="color: #6F42C1">PORT</span><span style="color: #24292E">     </span><span style="color: #032F62">STATE</span><span style="color: #24292E">    </span><span style="color: #032F62">SERVICE</span></span>
<span class="line"><span style="color: #6F42C1">3/tcp</span><span style="color: #24292E">    </span><span style="color: #032F62">filtered</span><span style="color: #24292E"> </span><span style="color: #032F62">compressnet</span></span>
<span class="line"><span style="color: #6F42C1">22/tcp</span><span style="color: #24292E">   </span><span style="color: #032F62">open</span><span style="color: #24292E">     </span><span style="color: #032F62">ssh</span></span>
<span class="line"><span style="color: #6F42C1">5432/tcp</span><span style="color: #24292E"> </span><span style="color: #032F62">open</span><span style="color: #24292E">     </span><span style="color: #032F62">postgresql</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6F42C1">Nmap</span><span style="color: #24292E"> </span><span style="color: #032F62">done:</span><span style="color: #24292E"> </span><span style="color: #005CC5">1</span><span style="color: #24292E"> </span><span style="color: #032F62">IP</span><span style="color: #24292E"> </span><span style="color: #032F62">address</span><span style="color: #24292E"> (1 </span><span style="color: #032F62">host</span><span style="color: #24292E"> </span><span style="color: #032F62">up</span><span style="color: #24292E">) scanned </span><span style="color: #D73A49">in</span><span style="color: #24292E"> 14.55 seconds</span></span></code></pre></div>



<ul class="wp-block-list">
<li class=""><strong>Telnet</strong>: é um protocolo desenvolvido na década de 1960, que embora ninguém mais pense em usar com a sua finalidade original, é utilizado por algumas pessoas&nbsp; para testar conexões entre computadores, por ser amplamente conhecido e fácil de usar, estando disponível em qualquer sistema operacional. O comando telnet &lt;ip-do-servidor&gt; 5432 pode ser aplicado para testar se a porta está acessível. Se a conexão for bem-sucedida, você verá uma mensagem confirmando a conexão (antes, pode ser necessário instalar o pacote do Telnet). Provavelmente, o Telnet não estará instalado por padrão. Você também pode utilizar as próximas opções da nossa lista. Recomendamos!</li>
</ul>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">Debian shell: retorno do comando telnet</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>$ telnet 159.89.241.130 5432
Trying 159.89.241.130...
Connected to 159.89.241.130.
Escape character is '^]'.</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #6F42C1">$</span><span style="color: #24292E"> </span><span style="color: #032F62">telnet</span><span style="color: #24292E"> </span><span style="color: #005CC5">159.89</span><span style="color: #032F62">.241.130</span><span style="color: #24292E"> </span><span style="color: #005CC5">5432</span></span>
<span class="line"><span style="color: #6F42C1">Trying</span><span style="color: #24292E"> </span><span style="color: #005CC5">159.89</span><span style="color: #032F62">.241.130...</span></span>
<span class="line"><span style="color: #6F42C1">Connected</span><span style="color: #24292E"> </span><span style="color: #032F62">to</span><span style="color: #24292E"> </span><span style="color: #005CC5">159.89</span><span style="color: #032F62">.241.130.</span></span>
<span class="line"><span style="color: #6F42C1">Escape</span><span style="color: #24292E"> </span><span style="color: #032F62">character</span><span style="color: #24292E"> </span><span style="color: #032F62">is</span><span style="color: #24292E"> </span><span style="color: #032F62">&#39;^]&#39;.</span></span></code></pre></div>



<ul class="wp-block-list">
<li class=""><strong>Netcat</strong>: similar ao Telnet, o comando <kbd>nc -vz &lt;ip-do-servidor&gt; 5432</kbd> pode ser usado para verificar se a porta está aberta e acessível (também pode ser necessário instalar o pacote antes):</li>
</ul>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">Debian shell: retorno do comando netcat</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>$ nc -vz 159.89.241.130 5432
Connection to 159.89.241.130 5432 port &#91;tcp/postgresql&#93; succeeded!</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #6F42C1">$</span><span style="color: #24292E"> </span><span style="color: #032F62">nc</span><span style="color: #24292E"> </span><span style="color: #005CC5">-vz</span><span style="color: #24292E"> </span><span style="color: #005CC5">159.89</span><span style="color: #032F62">.241.130</span><span style="color: #24292E"> </span><span style="color: #005CC5">5432</span></span>
<span class="line"><span style="color: #6F42C1">Connection</span><span style="color: #24292E"> </span><span style="color: #032F62">to</span><span style="color: #24292E"> </span><span style="color: #005CC5">159.89</span><span style="color: #032F62">.241.130</span><span style="color: #24292E"> </span><span style="color: #005CC5">5432</span><span style="color: #24292E"> </span><span style="color: #032F62">port</span><span style="color: #24292E"> &#91;tcp/postgresql&#93; succeeded</span><span style="color: #D73A49">!</span></span></code></pre></div>



<h3 class="wp-block-heading">Não tenho rota para o servidor, pode ser um firewall no caminho</h3>



<p class="wp-block-paragraph">Se você sabe que o PostgreSQL está no ar, sabe em qual porta ele roda, usou um dos aplicativos citados para tentar verificar e mesmo assim não conseguiu chegar ao banco de dados, você provavelmente está sendo bloqueado por alguma regra de segurança do firewall.<br></p>



<p class="wp-block-paragraph">Para verificar se o firewall local está ativo, podemos utilizar os seguintes comandos:</p>



<ul class="wp-block-list">
<li class="">Para sistemas baseados em Debian/Ubuntu (usando UFW): <kbd>sudo ufw stat</kbd>us</li>



<li class="">Para sistemas baseados em Red Hat/CentOS (usando firewalld): <kbd>sudo firewall-cmd --list-all</kbd></li>
</ul>



<p class="wp-block-paragraph"><br>Aqui, a resposta pode ser firewall ativo ou não (<kbd>active</kbd>/<kbd>inactiv</kbd>e), e caso não esteja ativo, é improvável que ele cause alguma dificuldade de conexão. Se estiver ativo, podemos ainda checar se a porta do lado do servidor está aberta com os comandos a seguir:<br></p>



<ul class="wp-block-list">
<li class="">Para sistemas baseados em Debian/Ubuntu (usando UFW):
<ul class="wp-block-list">
<li class="">Verificar a porta: <kbd>sudo ufw status | grep 5432</kbd></li>
</ul>
</li>



<li class="">Abrir a porta (se necessário): <kbd>sudo ufw allow 5432/tcp</kbd></li>
</ul>



<p class="wp-block-paragraph"></p>



<ul class="wp-block-list">
<li class="">Para sistemas baseados em Red Hat/CentOS (usando firewalld):
<ul class="wp-block-list">
<li class="">Verificar: <kbd>sudo firewall-cmd --list-ports | grep 5432</kbd></li>
</ul>
</li>



<li class="">Abrir:<br><kbd>sudo firewall-cmd --zone=public --add-port=5432/tcp --permanent</kbd><br><kbd>sudo firewall-cmd --reload</kbd></li>
</ul>



<p class="wp-block-paragraph"><br>Geralmente, não é necessário abrir portas específicas no firewall do cliente para conexões de saída. No entanto, se houver restrições, você pode precisar permitir conexões de saída para a porta 5432:</p>



<ul class="wp-block-list">
<li class="">Para sistemas baseados em Debian/Ubuntu (usando UFW):<br><kbd>sudo ufw allow out to any port 5432</kbd></li>



<li class="">Para sistemas baseados em Red Hat/CentOS (usando firewalld): <br><kbd>sudo firewall-cmd --zone=public --add-port=5432/tcp --permanent</kbd><br><kbd>sudo firewall-cmd --reload</kbd></li>
</ul>



<h3 class="wp-block-heading">E se o firewall não for local?</h3>



<p class="wp-block-paragraph">Vejamos:</p>



<ul class="wp-block-list">
<li class="">O banco de dados está no ar;</li>



<li class="">Você sabe a porta correta;</li>



<li class="">Não existe nenhum firewall local ativo;</li>



<li class="">Ainda assim você não tem rota até o banco de dados.</li>
</ul>



<p class="wp-block-paragraph"><br>Nesse momento, pode haver algum problema de rota, firewall etc. no meio do caminho. Você vai precisar conversar com o administrador de redes para ajudar nisso. Foge um pouco do escopo deste artigo entrar nesses meandros, pois existem muitas variáveis que dependem da arquitetura da rede, da segurança, do uso de VPN etc.&nbsp;</p>



<h2 class="wp-block-heading">O pg_hba.conf e o postgresql.conf estão configurados devidamente?</h2>



<p class="wp-block-paragraph">Conforme abordado no <a href="https://savepoint.blog.br/2024/10/16/pg_hba-conf/">último artigo</a>, o <kbd>pg_hba.conf</kbd> é o arquivo que dita as regras de autenticação do banco de dados, o que significa que a sua configuração correta impacta totalmente em uma conexão bem-sucedida. Caso tenha algum problema ou impedimento nessas configurações, você deverá receber um retorno como este:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">psql shell: mensagem de erro no pg_hba.conf</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>psql: error: connection to server at "192.168.0.1" (::1), port 5432 failed: FATAL:  no pg_hba.conf entry for host "::1", user "postgres", database "postgres", SSL off</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #24292E">psql: error: </span><span style="color: #D73A49">connection</span><span style="color: #24292E"> </span><span style="color: #D73A49">to</span><span style="color: #24292E"> </span><span style="color: #D73A49">server</span><span style="color: #24292E"> </span><span style="color: #D73A49">at</span><span style="color: #24292E"> </span><span style="color: #032F62">&quot;192.168.0.1&quot;</span><span style="color: #24292E"> (::</span><span style="color: #005CC5">1</span><span style="color: #24292E">), port </span><span style="color: #005CC5">5432</span><span style="color: #24292E"> failed: FATAL:  </span><span style="color: #D73A49">no</span><span style="color: #24292E"> </span><span style="color: #005CC5">pg_hba</span><span style="color: #24292E">.</span><span style="color: #005CC5">conf</span><span style="color: #24292E"> </span><span style="color: #D73A49">entry</span><span style="color: #24292E"> </span><span style="color: #D73A49">for</span><span style="color: #24292E"> host </span><span style="color: #032F62">&quot;::1&quot;</span><span style="color: #24292E">, user </span><span style="color: #032F62">&quot;postgres&quot;</span><span style="color: #24292E">, </span><span style="color: #D73A49">database</span><span style="color: #24292E"> </span><span style="color: #032F62">&quot;postgres&quot;</span><span style="color: #24292E">, </span><span style="color: #D73A49">SSL</span><span style="color: #24292E"> </span><span style="color: #D73A49">off</span></span></code></pre></div>



<p class="wp-block-paragraph"><br>Certificar-se de que o seu usuário e IP têm permissão de conexão no banco de dados correto no arquivo é um passo fundamental em caso de erro no acesso remoto, bem como seu usuário (ou grupo de usuários).</p>



<p class="wp-block-paragraph">Além disso, no arquivo de configurações do PostgreSQL, o <kbd>postgresql.con</kbd>f, existe um parâmetro que é imprescindível para permitir conexões externas, o <kbd>listen_addresses</kbd>, que por padrão vem com o valor de <kbd>localhos</kbd>t, significando que o servidor escuta do endereço local. É possível fazer restrições aqui, para maior segurança, podendo permitir IPs específicos, por exemplo:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">postgresql.conf: definindo valores para parâmetro listen_adresses</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>listen_addresses = '192.168.1.100, localhost'</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #24292E">listen_addresses </span><span style="color: #D73A49">=</span><span style="color: #24292E"> </span><span style="color: #032F62">&#39;192.168.1.100, localhost&#39;</span></span></code></pre></div>



<p class="wp-block-paragraph">Então é necessário ter certeza de que está autorizado nas regras de ambos os arquivos.<br>Caso haja algum ajuste para permitir a conexão, o PostgreSQL deverá ser recarregado ou reiniciado, para que as novas configurações sejam aplicadas. Isso pode ser feito com os seguintes comandos:</p>



<ul class="wp-block-list">
<li class="">Para recarregar (sem interromper conexões atuais, o suficiente para mudanças no pg_hba.conf): <kbd>systemctl reload postgresql</kbd></li>



<li class="">Para reiniciar o banco (caso tenha alterado o parâmetro listen_addresses): <kbd>systemctl restart postgresql</kbd></li>
</ul>



<h2 class="wp-block-heading"><br>O banco de dados existe?</h2>



<p class="wp-block-paragraph">Outra possível causa de falha de conexão é o banco de dados que você está tentando acessar não existir. Nessa situação, temos a seguinte mensagem de erro:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">psql shell: mensagem de erro sobre banco de dados inexistente</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>psql: error: connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: FATAL:  database "banco1" does not exist</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #24292E">psql: error: </span><span style="color: #D73A49">connection</span><span style="color: #24292E"> </span><span style="color: #D73A49">to</span><span style="color: #24292E"> </span><span style="color: #D73A49">server</span><span style="color: #24292E"> </span><span style="color: #D73A49">on</span><span style="color: #24292E"> socket </span><span style="color: #032F62">&quot;/var/run/postgresql/.s.PGSQL.5432&quot;</span><span style="color: #24292E"> failed: FATAL:  </span><span style="color: #D73A49">database</span><span style="color: #24292E"> </span><span style="color: #032F62">&quot;banco1&quot;</span><span style="color: #24292E"> does </span><span style="color: #D73A49">not</span><span style="color: #24292E"> exist</span></span></code></pre></div>



<p class="wp-block-paragraph"><br>Caso tenha esse retorno e queira verificar se digitou corretamente o nome do banco de dados ou se ele está presente no servidor apontado, você pode verificar isso localmente com um terminal psql (como usuário administrador) e listar todos os bancos de dados disponíveis com o comando \l. Esse e outros comandos básicos do psql podem ser relembrados no artigo <a href="https://savepoint.blog.br/2024/08/12/utilizacao-do-psql/">Utilização do psql</a>.</p>



<p class="wp-block-paragraph">Esta é a nossa listagem de bancos:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">psql shell: listando todos os bancos de dados</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>postgres=# \l
                                                    List of databases
    Name    |  Owner   | Encoding | Locale Provider | Collate |  Ctype  | ICU Locale | ICU Rules |   Access privileges
------------+----------+----------+-----------------+---------+---------+------------+-----------+-----------------------
 aplicacao1 | postgres | UTF8     | libc            | C.UTF-8 | C.UTF-8 |            |           |
 postgres   | postgres | UTF8     | libc            | C.UTF-8 | C.UTF-8 |            |           |
 template0  | postgres | UTF8     | libc            | C.UTF-8 | C.UTF-8 |            |           | =c/postgres          +
            |          |          |                 |         |         |            |           | postgres=CTc/postgres
 template1  | postgres | UTF8     | libc            | C.UTF-8 | C.UTF-8 |            |           | =c/postgres          +
            |          |          |                 |         |         |            |           | postgres=CTc/postgres
(4 rows)</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #24292E">postgres</span><span style="color: #D73A49">=</span><span style="color: #24292E"># \l</span></span>
<span class="line"><span style="color: #24292E">                                                    List of databases</span></span>
<span class="line"><span style="color: #24292E">    </span><span style="color: #D73A49">Name</span><span style="color: #24292E">    |  </span><span style="color: #D73A49">Owner</span><span style="color: #24292E">   | </span><span style="color: #D73A49">Encoding</span><span style="color: #24292E"> | Locale </span><span style="color: #D73A49">Provider</span><span style="color: #24292E"> | </span><span style="color: #D73A49">Collate</span><span style="color: #24292E"> |  Ctype  | ICU Locale | ICU Rules |   Access privileges</span></span>
<span class="line"><span style="color: #6A737D">------------+----------+----------+-----------------+---------+---------+------------+-----------+-----------------------</span></span>
<span class="line"><span style="color: #24292E"> aplicacao1 | postgres | UTF8     | libc            | </span><span style="color: #005CC5">C</span><span style="color: #24292E">.</span><span style="color: #005CC5">UTF</span><span style="color: #D73A49">-</span><span style="color: #005CC5">8</span><span style="color: #24292E"> | </span><span style="color: #005CC5">C</span><span style="color: #24292E">.</span><span style="color: #005CC5">UTF</span><span style="color: #D73A49">-</span><span style="color: #005CC5">8</span><span style="color: #24292E"> |            |           |</span></span>
<span class="line"><span style="color: #24292E"> postgres   | postgres | UTF8     | libc            | </span><span style="color: #005CC5">C</span><span style="color: #24292E">.</span><span style="color: #005CC5">UTF</span><span style="color: #D73A49">-</span><span style="color: #005CC5">8</span><span style="color: #24292E"> | </span><span style="color: #005CC5">C</span><span style="color: #24292E">.</span><span style="color: #005CC5">UTF</span><span style="color: #D73A49">-</span><span style="color: #005CC5">8</span><span style="color: #24292E"> |            |           |</span></span>
<span class="line"><span style="color: #24292E"> template0  | postgres | UTF8     | libc            | </span><span style="color: #005CC5">C</span><span style="color: #24292E">.</span><span style="color: #005CC5">UTF</span><span style="color: #D73A49">-</span><span style="color: #005CC5">8</span><span style="color: #24292E"> | </span><span style="color: #005CC5">C</span><span style="color: #24292E">.</span><span style="color: #005CC5">UTF</span><span style="color: #D73A49">-</span><span style="color: #005CC5">8</span><span style="color: #24292E"> |            |           | </span><span style="color: #D73A49">=</span><span style="color: #24292E">c</span><span style="color: #D73A49">/</span><span style="color: #24292E">postgres          </span><span style="color: #D73A49">+</span></span>
<span class="line"><span style="color: #24292E">            |          |          |                 |         |         |            |           | postgres</span><span style="color: #D73A49">=</span><span style="color: #24292E">CTc</span><span style="color: #D73A49">/</span><span style="color: #24292E">postgres</span></span>
<span class="line"><span style="color: #24292E"> template1  | postgres | UTF8     | libc            | </span><span style="color: #005CC5">C</span><span style="color: #24292E">.</span><span style="color: #005CC5">UTF</span><span style="color: #D73A49">-</span><span style="color: #005CC5">8</span><span style="color: #24292E"> | </span><span style="color: #005CC5">C</span><span style="color: #24292E">.</span><span style="color: #005CC5">UTF</span><span style="color: #D73A49">-</span><span style="color: #005CC5">8</span><span style="color: #24292E"> |            |           | </span><span style="color: #D73A49">=</span><span style="color: #24292E">c</span><span style="color: #D73A49">/</span><span style="color: #24292E">postgres          </span><span style="color: #D73A49">+</span></span>
<span class="line"><span style="color: #24292E">            |          |          |                 |         |         |            |           | postgres</span><span style="color: #D73A49">=</span><span style="color: #24292E">CTc</span><span style="color: #D73A49">/</span><span style="color: #24292E">postgres</span></span>
<span class="line"><span style="color: #24292E">(</span><span style="color: #005CC5">4</span><span style="color: #24292E"> </span><span style="color: #D73A49">rows</span><span style="color: #24292E">)</span></span></code></pre></div>



<p class="wp-block-paragraph"><br>Se o banco de dados que você está tentando acessar estiver listado, ele existe. Caso contrário, se necessário, você pode criá-lo com o comando <kbd>CREATE DATABASE</kbd>:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">psql shell: comando para criar nova base de dados</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>CREATE DATABASE &lt;nome_do_banco> OWNER &lt;nome_do_usuario>;</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #D73A49">CREATE</span><span style="color: #24292E"> </span><span style="color: #D73A49">DATABASE</span><span style="color: #24292E"> </span><span style="color: #D73A49">&lt;</span><span style="color: #24292E">nome_do_banco</span><span style="color: #D73A49">&gt;</span><span style="color: #24292E"> </span><span style="color: #D73A49">OWNER</span><span style="color: #24292E"> </span><span style="color: #D73A49">&lt;</span><span style="color: #24292E">nome_do_usuario</span><span style="color: #D73A49">&gt;</span><span style="color: #24292E">;</span></span></code></pre></div>



<h2 class="wp-block-heading">Meu usuário existe?</h2>



<p class="wp-block-paragraph">Outra questão fundamental na hora de resolver problemas de conexão é garantir que o usuário que está tentando se conectar ao PostgreSQL realmente existe no banco de dados. Se o usuário não estiver devidamente criado ou não tiver as permissões corretas, a conexão falhará.</p>



<p class="wp-block-paragraph">A mensagem de erro para essa ocasião é:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">psql shell: mensagem de erro sobre usuário inexistente</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>psql: error: FATAL: role "my_username" does not exist</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #24292E">psql: error: FATAL: </span><span style="color: #D73A49">role</span><span style="color: #24292E"> </span><span style="color: #032F62">&quot;my_username&quot;</span><span style="color: #24292E"> does </span><span style="color: #D73A49">not</span><span style="color: #24292E"> exist</span></span></code></pre></div>



<p class="wp-block-paragraph">Para verificar se o usuário existe, você pode utilizar o comando SQL <kbd>\du</kbd> no terminal interativo psql, que lista todos os usuários (também chamados de &#8220;roles&#8221; no PostgreSQL):</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">psql shell: consultando todos os usuários</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>postgres=# \du
                                List of roles
    Role name    |                         Attributes
-----------------+------------------------------------------------------------
 admin_pagila    | Create role
 ana             |
 app1_admin      | Create role, Create DB
 app1_user1      |
 app1_user2      |
 app2_admin      | Create role, Create DB
 app2_user1      |
 app2_user2      |
 dba             | Superuser
 fabio           |
 ludmila         |
 meu_usuario     | Superuser
 postgres        | Superuser, Create role, Create DB, Replication, Bypass RLS</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #24292E">postgres</span><span style="color: #D73A49">=</span><span style="color: #24292E"># \du</span></span>
<span class="line"><span style="color: #24292E">                                List of roles</span></span>
<span class="line"><span style="color: #24292E">    </span><span style="color: #D73A49">Role</span><span style="color: #24292E"> </span><span style="color: #D73A49">name</span><span style="color: #24292E">    |                         Attributes</span></span>
<span class="line"><span style="color: #6A737D">-----------------+------------------------------------------------------------</span></span>
<span class="line"><span style="color: #24292E"> admin_pagila    | </span><span style="color: #D73A49">Create</span><span style="color: #24292E"> </span><span style="color: #D73A49">role</span></span>
<span class="line"><span style="color: #24292E"> ana             |</span></span>
<span class="line"><span style="color: #24292E"> app1_admin      | </span><span style="color: #D73A49">Create</span><span style="color: #24292E"> </span><span style="color: #D73A49">role</span><span style="color: #24292E">, </span><span style="color: #D73A49">Create</span><span style="color: #24292E"> DB</span></span>
<span class="line"><span style="color: #24292E"> app1_user1      |</span></span>
<span class="line"><span style="color: #24292E"> app1_user2      |</span></span>
<span class="line"><span style="color: #24292E"> app2_admin      | </span><span style="color: #D73A49">Create</span><span style="color: #24292E"> </span><span style="color: #D73A49">role</span><span style="color: #24292E">, </span><span style="color: #D73A49">Create</span><span style="color: #24292E"> DB</span></span>
<span class="line"><span style="color: #24292E"> app2_user1      |</span></span>
<span class="line"><span style="color: #24292E"> app2_user2      |</span></span>
<span class="line"><span style="color: #24292E"> dba             | Superuser</span></span>
<span class="line"><span style="color: #24292E"> fabio           |</span></span>
<span class="line"><span style="color: #24292E"> ludmila         |</span></span>
<span class="line"><span style="color: #24292E"> meu_usuario     | Superuser</span></span>
<span class="line"><span style="color: #24292E"> postgres        | Superuser, </span><span style="color: #D73A49">Create</span><span style="color: #24292E"> </span><span style="color: #D73A49">role</span><span style="color: #24292E">, </span><span style="color: #D73A49">Create</span><span style="color: #24292E"> DB, Replication, Bypass RLS</span></span></code></pre></div>



<p class="wp-block-paragraph"><br>Se o seu usuário estiver nessa lista, ele existe. Caso não esteja, você precisará criá-lo com o comando CREATE ROLE, que pode ser visto com detalhes no artigo <a href="https://savepoint.blog.br/2024/08/20/utilizacao-de-sql-basico/">Utilização de SQL básico</a>:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">psql shell: comando para criar um novo usuário, com permissão de login e definição de senha</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>CREATE ROLE &lt;nome_do_usuário_ou_grupo> LOGIN PASSWORD '&lt;senha>';</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #D73A49">CREATE</span><span style="color: #24292E"> </span><span style="color: #D73A49">ROLE</span><span style="color: #24292E"> </span><span style="color: #D73A49">&lt;</span><span style="color: #24292E">nome_do_usuário_ou_grupo</span><span style="color: #D73A49">&gt;</span><span style="color: #24292E"> </span><span style="color: #D73A49">LOGIN</span><span style="color: #24292E"> </span><span style="color: #D73A49">PASSWORD</span><span style="color: #24292E"> </span><span style="color: #032F62">&#39;&lt;senha&gt;&#39;</span><span style="color: #24292E">;</span></span></code></pre></div>



<p class="wp-block-paragraph">Não se esqueça de garantir as permissões necessárias para que esse usuário possa se conectar.<br></p>



<h2 class="wp-block-heading">Eu tenho permissão para me conectar?</h2>



<p class="wp-block-paragraph">Mesmo se a configuração no <kbd>pg_hba.conf</kbd> e <kbd>postgresql.conf</kbd> estiver correta, o seu usuário existir e o banco de dados também, você ainda poderá encontrar outros problemas. É possível que o usuário não tenha privilégios suficientes para realizar a conexão ou para acessar objetos específicos dentro do banco. Se for o caso de não haver permissão para login, você deverá ver uma mensagem parecida com esta:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">psql shell: mensagem de erro relacionada a falta de permissão de login</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>psql: error: connection to server on at 192.168.0.10 failed: FATAL:  role "fabio" is not permitted to log in</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #24292E">psql: error: </span><span style="color: #D73A49">connection</span><span style="color: #24292E"> </span><span style="color: #D73A49">to</span><span style="color: #24292E"> </span><span style="color: #D73A49">server</span><span style="color: #24292E"> </span><span style="color: #D73A49">on</span><span style="color: #24292E"> </span><span style="color: #D73A49">at</span><span style="color: #24292E"> </span><span style="color: #005CC5">192</span><span style="color: #24292E">.</span><span style="color: #005CC5">168</span><span style="color: #24292E">.</span><span style="color: #005CC5">0</span><span style="color: #24292E">.</span><span style="color: #005CC5">10</span><span style="color: #24292E"> failed: FATAL:  </span><span style="color: #D73A49">role</span><span style="color: #24292E"> </span><span style="color: #032F62">&quot;fabio&quot;</span><span style="color: #24292E"> </span><span style="color: #D73A49">is</span><span style="color: #24292E"> </span><span style="color: #D73A49">not</span><span style="color: #24292E"> permitted </span><span style="color: #D73A49">to</span><span style="color: #24292E"> </span><span style="color: #D73A49">log</span><span style="color: #24292E"> </span><span style="color: #D73A49">in</span></span></code></pre></div>



<p class="wp-block-paragraph"><br>Isso pode ser facilmente resolvido concedendo esse privilégio com o comando: <br><br><kbd>ALTER ROLE &lt;usuário ou grupo&gt; WITH LOGIN;</kbd></p>



<p class="wp-block-paragraph">Agora, se houver falta de permissão para se conectar com o banco, essa deverá ser a mensagem de erro visualizada:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">psql shell: mensagem de erro relacionada a falta de permissão de conexão com o banco</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>psql: error: connection to server at 192.168.0.10, port 5432 failed: FATAL: permission denied for database "postgres"
DETAIL: User does not have CONNECT privilege.</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #24292E">psql: error: </span><span style="color: #D73A49">connection</span><span style="color: #24292E"> </span><span style="color: #D73A49">to</span><span style="color: #24292E"> </span><span style="color: #D73A49">server</span><span style="color: #24292E"> </span><span style="color: #D73A49">at</span><span style="color: #24292E"> </span><span style="color: #005CC5">192</span><span style="color: #24292E">.</span><span style="color: #005CC5">168</span><span style="color: #24292E">.</span><span style="color: #005CC5">0</span><span style="color: #24292E">.</span><span style="color: #005CC5">10</span><span style="color: #24292E">, port </span><span style="color: #005CC5">5432</span><span style="color: #24292E"> failed: FATAL: permission denied </span><span style="color: #D73A49">for</span><span style="color: #24292E"> </span><span style="color: #D73A49">database</span><span style="color: #24292E"> </span><span style="color: #032F62">&quot;postgres&quot;</span></span>
<span class="line"><span style="color: #24292E">DETAIL: User does </span><span style="color: #D73A49">not</span><span style="color: #24292E"> have </span><span style="color: #D73A49">CONNECT</span><span style="color: #24292E"> privilege.</span></span></code></pre></div>



<p class="wp-block-paragraph"><br>Podemos resolver isso com o comando GRANT, que vimos detalhadamente no artigo <a href="https://savepoint.blog.br/2024/08/29/o-minimo-sobre-seguranca-que-voce-precisa-saber/">O mínimo sobre segurança que você precisa saber</a>. Em um resumo rápido, existe o privilégio <kbd>CONNEC</kbd>T, que especificamente trata de permissão de conexão com o banco, que pode ser fornecido com o seguinte comando: <br><br><kbd>GRANT CONNECT ON DATABASE &lt;nome do banco&gt; TO &lt;usuario&gt;;</kbd></p>



<p class="wp-block-paragraph">Isso e muito mais pode ser visto de forma detalhada no artigo citado.</p>



<h2 class="wp-block-heading">A senha está correta?</h2>



<p class="wp-block-paragraph">Mesmo que o banco de dados e o usuário estejam configurados corretamente, uma senha incorreta pode ser um obstáculo. Se você suspeita que a senha do seu usuário está errada ou precisa ser redefinida, há algumas formas de corrigir isso. Este é o erro para esse caso:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">psql shell: mensagem de erro para senha incorreta</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>psql: error: connection to server at "localhost" (::1), port 5432 failed: FATAL:  password authentication failed for user "user3"</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #24292E">psql: error: </span><span style="color: #D73A49">connection</span><span style="color: #24292E"> </span><span style="color: #D73A49">to</span><span style="color: #24292E"> </span><span style="color: #D73A49">server</span><span style="color: #24292E"> </span><span style="color: #D73A49">at</span><span style="color: #24292E"> </span><span style="color: #032F62">&quot;localhost&quot;</span><span style="color: #24292E"> (::</span><span style="color: #005CC5">1</span><span style="color: #24292E">), port </span><span style="color: #005CC5">5432</span><span style="color: #24292E"> failed: FATAL:  </span><span style="color: #D73A49">password</span><span style="color: #24292E"> </span><span style="color: #D73A49">authentication</span><span style="color: #24292E"> failed </span><span style="color: #D73A49">for</span><span style="color: #24292E"> user </span><span style="color: #032F62">&quot;user3&quot;</span></span></code></pre></div>



<p class="wp-block-paragraph"><br>No PostgreSQL, não há um comando direto para visualizar senhas, já que elas são armazenadas de forma segura. No entanto, se o arquivo pg_hba.conf estiver configurado para um método de autenticação que exija senha (como md5 ou scram-sha-256), a senha deve estar correta para que a conexão seja estabelecida.</p>



<p class="wp-block-paragraph">Caso precise alterar a senha de um usuário, você pode fazê-lo através do psql, com um usuário com permissões de superusuário, executando o comando <kbd>ALTER USER</kbd> para realizar a alteração:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">psql shell: comando para alterar a senha de um usuário</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>ALTER USER &lt;nome_do_usuario> WITH PASSWORD '&lt;nova_senha>';</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #D73A49">ALTER</span><span style="color: #24292E"> </span><span style="color: #D73A49">USER</span><span style="color: #24292E"> </span><span style="color: #D73A49">&lt;</span><span style="color: #24292E">nome_do_usuario</span><span style="color: #D73A49">&gt;</span><span style="color: #24292E"> </span><span style="color: #D73A49">WITH</span><span style="color: #24292E"> </span><span style="color: #D73A49">PASSWORD</span><span style="color: #24292E"> </span><span style="color: #032F62">&#39;&lt;nova_senha&gt;&#39;</span><span style="color: #24292E">;</span></span></code></pre></div>



<p class="wp-block-paragraph">Agora, a nova senha será usada nas próximas tentativas de conexão. Se o problema estava sendo causado por uma senha incorreta, ele será resolvido.</p>



<h2 class="wp-block-heading">Conclusão</h2>



<p class="wp-block-paragraph">Quando você instala o PostgreSQL pela primeira vez em um servidor, é fundamental configurar o <kbd>postgresql.conf</kbd> e o <kbd>pg_hba.conf</kbd> corretamente, uma vez que a instalação padrão não vem configurada para permitir conexões remotas. Depois disso, você talvez precise criar novos usuários, bancos de dados, senhas etc. Por fim, a rede onde você roda o PostgreSQL deve permitir o acesso remoto ao servidor naquela porta.&nbsp;</p>



<p class="wp-block-paragraph">Além disso, muitas coisas podem dar errado nesse caminho. Não caia na tentação de burlar os mecanismos de segurança! Se você entender o significado de cada mensagem de erro que apresentamos aqui, rapidamente você conseguirá chegar lá. Mas lembre-se: sempre verifique o que a mensagem de erro diz, pois isso será fundamental para entender onde e como agir para resolver o problema.&nbsp;</p><p>The post <a href="https://savepoint.blog.br/2024/12/16/meu-postgres-nao-conecta-troubleshooting-de-conexoes/">Meu Postgres não conecta: troubleshooting de conexões</a> first appeared on <a href="https://savepoint.blog.br">Savepoint</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://savepoint.blog.br/2024/12/16/meu-postgres-nao-conecta-troubleshooting-de-conexoes/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">8554</post-id>	</item>
		<item>
		<title>Savepoint no PGConf.Brasil 2024</title>
		<link>https://savepoint.blog.br/2024/11/11/savepoint-no-pgconf-brasil-2024/</link>
					<comments>https://savepoint.blog.br/2024/11/11/savepoint-no-pgconf-brasil-2024/#respond</comments>
		
		<dc:creator><![CDATA[Fabio Telles Rodriguez]]></dc:creator>
		<pubDate>Mon, 11 Nov 2024 12:39:00 +0000</pubDate>
				<category><![CDATA[Comunidade e Eventos]]></category>
		<category><![CDATA[Notícias]]></category>
		<guid isPermaLink="false">https://savepoint.blog.br/?p=13937</guid>

					<description><![CDATA[<p>Nos dias 7 e 8 de novembro de 2024, aconteceu em Belo Horizonte–MG a PGConf.Brasil 2024, o maior evento do PostgreSQL da América Latina. Foram dois dias de palestras em 2 auditórios simultâneos. Foram dois dias de palestras, networking, troca de experiências e muito conteúdo técnico sobre o banco de dados open-source que mais cresce</p>
<p>The post <a href="https://savepoint.blog.br/2024/11/11/savepoint-no-pgconf-brasil-2024/">Savepoint no PGConf.Brasil 2024</a> first appeared on <a href="https://savepoint.blog.br">Savepoint</a>.</p>]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph">Nos dias 7 e 8 de novembro de 2024, aconteceu em Belo Horizonte–MG a <a href="https://2024.pgconf.com.br" title="">PGConf.Brasil 2024</a>, o maior evento do PostgreSQL da América Latina. Foram dois dias de palestras em 2 auditórios simultâneos. Foram dois dias de palestras, networking, troca de experiências e muito conteúdo técnico sobre o banco de dados open-source que mais cresce no mundo. E para deixar tudo ainda melhor, a <a href="https://savepoint.inf.br" title="">Savepoint </a>teve a oportunidade de contribuir diretamente na organização, patrocínio e com duas palestras técnicas.</p>



<figure class="wp-embed-aspect-16-9 wp-has-aspect-ratio wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" class="youtube-player" width="780" height="439" src="https://www.youtube.com/embed/oSPVMyM1IYY?version=3&#038;rel=1&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;fs=1&#038;hl=pt-BR&#038;autohide=2&#038;wmode=transparent&#038;listType=playlist&#038;list=PLftLC13rIaT4MoqvORB5ozp9qrxZy7Er5" allowfullscreen="true" style="border:0;" sandbox="allow-scripts allow-same-origin allow-popups allow-presentation allow-popups-to-escape-sandbox"></iframe>
</div></figure>



<p class="wp-block-paragraph"></p>



<h2 class="wp-block-heading">Palestra 1 &#8211; <a href="https://speakerdeck.com/fabiotr/encontrando-uma-agulha-no-json" title="">Encontrando uma agulha no JSON</a></h2>



<ul class="wp-block-list">
<li class="">Diferenças entre json e jsonb e por que jsonb é melhor para buscas</li>



<li class="">Principais operadores e funções para extrair dados de JSON no PostgreSQL</li>



<li class="">Como filtrar dados dentro de JSON usando operadores como @>, ?, ?|, ?&amp; e JSONPath</li>



<li class="">Demonstração de consultas práticas</li>



<li class="">Importância de índices GIN em colunas jsonb</li>
</ul>



<figure class="wp-embed-aspect-16-9 wp-has-aspect-ratio wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" class="youtube-player" width="780" height="439" src="https://www.youtube.com/embed/edrPP2i9jAQ?version=3&#038;rel=1&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;fs=1&#038;hl=pt-BR&#038;autohide=2&#038;wmode=transparent&#038;listType=playlist&#038;list=PLftLC13rIaT4MoqvORB5ozp9qrxZy7Er5" allowfullscreen="true" style="border:0;" sandbox="allow-scripts allow-same-origin allow-popups allow-presentation allow-popups-to-escape-sandbox"></iframe>
</div></figure>



<h2 class="wp-block-heading">Palestra 2: <a href="https://speakerdeck.com/ludmilachagas/arquitetura-e-estruturas-internas-do-postgresql" title="">Arquitetura e Estruturas Internas do PostgreSQL</a></h2>



<ul class="wp-block-list">
<li class="">Processos, diretórios e arquivos típicos do PostgreSQL</li>



<li class="">Como visualizar metadados físicos e lógicos&nbsp;</li>



<li class="">Automatização de tarefas administrativas</li>



<li class="">Caso de uso: “como achar o arquivo em disco que está corrompido”</li>



<li class="">Visualizar privilégios</li>
</ul>



<figure class="wp-embed-aspect-16-9 wp-has-aspect-ratio wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" class="youtube-player" width="780" height="439" src="https://www.youtube.com/embed/UpP5bvkDy4Q?version=3&#038;rel=1&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;fs=1&#038;hl=pt-BR&#038;autohide=2&#038;wmode=transparent&#038;listType=playlist&#038;list=PLftLC13rIaT4MoqvORB5ozp9qrxZy7Er5" allowfullscreen="true" style="border:0;" sandbox="allow-scripts allow-same-origin allow-popups allow-presentation allow-popups-to-escape-sandbox"></iframe>
</div></figure>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">Participar do PGConf.Brasil é sempre uma aventura: palestras interessantes, muito networking, cervejas e histórias para se contar e ouvir. Em 2024 o evento foi sensacional e este foi o primeiro evento organizado 100% pela comunidade após um hiato de vários anos. Pela foto abaixo você pode ter uma ideia de que o evento bombou, foi um enorme sucesso. Estamos orgulhosos de participar de mais um evento tão relevante para a comunidade de PostgreSQL do Brasil e do mundo. Agradecemos a todos que se empenharam na organização, que patrocinaram o evento, que compartilharam conhecimento no melhor espírito do Software Livre, e claro, a todos os que vieram prestigiar o evento.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1486" height="992" src="https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2025/11/image-4.png?fit=1024%2C684&amp;ssl=1" alt="" class="wp-image-13942" srcset="https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2025/11/image-4.png?w=1486&amp;ssl=1 1486w, https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2025/11/image-4.png?resize=300%2C200&amp;ssl=1 300w, https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2025/11/image-4.png?resize=1024%2C684&amp;ssl=1 1024w, https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2025/11/image-4.png?resize=768%2C513&amp;ssl=1 768w" sizes="auto, (max-width: 780px) 100vw, 780px" /></figure>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">Esperamos reencontrá-los em 2025!</p>



<figure class="wp-block-image size-medium"><img data-recalc-dims="1" loading="lazy" decoding="async" width="300" height="225" src="https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2025/11/image-5.png?resize=300%2C225&#038;ssl=1" alt="" class="wp-image-13943" srcset="https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2025/11/image-5.png?resize=300%2C225&amp;ssl=1 300w, https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2025/11/image-5.png?resize=1024%2C768&amp;ssl=1 1024w, https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2025/11/image-5.png?resize=768%2C576&amp;ssl=1 768w, https://i0.wp.com/savepoint.blog.br/wp-content/uploads/2025/11/image-5.png?w=1323&amp;ssl=1 1323w" sizes="auto, (max-width: 300px) 100vw, 300px" /></figure><p>The post <a href="https://savepoint.blog.br/2024/11/11/savepoint-no-pgconf-brasil-2024/">Savepoint no PGConf.Brasil 2024</a> first appeared on <a href="https://savepoint.blog.br">Savepoint</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://savepoint.blog.br/2024/11/11/savepoint-no-pgconf-brasil-2024/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">13937</post-id>	</item>
		<item>
		<title>pg_hba.conf</title>
		<link>https://savepoint.blog.br/2024/10/16/pg_hba-conf/</link>
					<comments>https://savepoint.blog.br/2024/10/16/pg_hba-conf/#respond</comments>
		
		<dc:creator><![CDATA[Savepoint]]></dc:creator>
		<pubDate>Wed, 16 Oct 2024 17:12:28 +0000</pubDate>
				<category><![CDATA[Instalação e Setup]]></category>
		<category><![CDATA[Segurança e Acessos]]></category>
		<category><![CDATA[DBA]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[postgres]]></category>
		<category><![CDATA[PostgreSQL]]></category>
		<guid isPermaLink="false">https://savepoint.blog.br/?p=8535</guid>

					<description><![CDATA[<p>Aprenda a configurar o arquivo pg_hba.conf no PostgreSQL para controlar acessos, definir métodos de autenticação e garantir a segurança do seu banco de dados.</p>
<p>The post <a href="https://savepoint.blog.br/2024/10/16/pg_hba-conf/">pg_hba.conf</a> first appeared on <a href="https://savepoint.blog.br">Savepoint</a>.</p>]]></description>
										<content:encoded><![CDATA[<h2 class="wp-block-heading">Introdução</h2>



<p class="wp-block-paragraph">O arquivo <a href="https://www.postgresql.org/docs/current/auth-pg-hba-conf.html">pg_hba.conf</a> (PostgreSQL Host-Based Authentication) é uma peça fundamental na configuração de segurança de qualquer instância PostgreSQL. Ele define as regras de autenticação e acesso ao banco de dados, determinando quem pode se conectar, de onde e como essas conexões são autenticadas. Neste artigo, exploraremos as diversas opções de configuração disponíveis no <kbd>pg_hba.conf</kbd>, desde os métodos de autenticação até a especificação de IPs, usuários e grupos. Também abordaremos os modelos de autenticação mais comuns, como <kbd>TRUST</kbd>, <kbd>password</kbd>, <kbd>md5</kbd> e <kbd>scram-sha-256</kbd>, além de métodos específicos como <kbd>ident</kbd> e <kbd>peer</kbd>. Ao final, você será capaz de configurar esse arquivo para garantir um ambiente seguro e eficiente para suas aplicações.</p>



<p class="wp-block-paragraph">Roteiro:</p>



<ul class="wp-block-list">
<li class="">Modelo de autenticação
<ul class="wp-block-list">
<li class=""><kbd>TYPE</kbd> (tipos de conexão)
<ul class="wp-block-list">
<li class=""><kbd>local</kbd></li>



<li class=""><kbd>host</kbd></li>



<li class=""><kbd>hostssl</kbd></li>
</ul>
</li>



<li class=""><kbd>DATABASE</kbd> (banco de dados)</li>



<li class=""><kbd>USER</kbd> (usuários ou grupos de usuários)</li>



<li class=""><kbd>ADDRESS</kbd> (endereços)</li>



<li class=""><kbd>METHOD</kbd> (método)</li>



<li class=""><kbd>OPTIONS</kbd> (opções)</li>



<li class="">Exemplos</li>



<li class="">Considerações importantes</li>
</ul>
</li>



<li class="">Ident file</li>
</ul>



<h2 class="wp-block-heading">Modelo de autenticação</h2>



<p class="wp-block-paragraph">O modelo de autenticação define como a autenticação será realizada e gerenciada, verificando a identidade dos usuários do banco de dados de diferentes formas. No PostgreSQL, o principal modelo é baseado no arquivo <kbd>pg_hba.conf</kbd>. Ele pode estar localizado em diferentes locais, dependendo do seu ambiente:</p>



<ul class="wp-block-list">
<li class=""><kbd>/var/lib/pgsql/&lt;versão&gt;/data/</kbd> nos ambientes Linux Red Hat e derivados (como CentOS);</li>



<li class=""><kbd>/etc/postgresql/&lt;versão&gt;/&lt;cluster&gt;/pg_hba.conf</kbd> nos ambientes Linux Debian e derivados (como Ubuntu);</li>



<li class=""><kbd>C:\Program Files\PostgreSQL\&lt;versão&gt;\data\pg_hba.conf</kbd> em Windows;</li>



<li class="">Se você criou o seu cluster de dados em um diretório específico e não está utilizando o Linux Debian, o <kbd>pg_hba.conf</kbd> deverá estar nesse diretório, que chamamos de <kbd>$PGDATA</kbd> (que é a variável de ambiente que contém essa localização).</li>
</ul>



<p class="wp-block-paragraph">O <kbd>pg_hba.conf</kbd> tem como características regras específicas que suportam vários métodos de autenticação, que podem ainda ser aplicados de forma seletiva.</p>



<p class="wp-block-paragraph">A estrutura básica do pg_hba.conf é (em cada linha):</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">Arquivo pg_hba.conf: estrutura padrão</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>TYPE  DATABASE  USER  ADDRESS  METHOD &#91;OPTIONS&#93;</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #005CC5">TYPE  DATABASE  USER  ADDRESS  METHOD &#91;OPTIONS&#93;</span></span></code></pre></div>



<p class="wp-block-paragraph">Sendo que&nbsp; <kbd>TYPE</kbd> se refere ao tipo de conexão, <kbd>DATABASE</kbd>, ao banco de dados&nbsp; ao qual a regra se aplica, <kbd>USER</kbd>, a usuário ou grupo de usuários, <kbd>ADDRESS</kbd>, ao endereço IP ou intervalo (range) de IPs, <kbd>METHOD</kbd>&nbsp; ao método de autenticação, e <kbd>OPTIONS</kbd> a algumas opções que podem existir de acordo com o método escolhido, respectivamente.<br>Além disso, no <kbd>pg_hba.conf</kbd>, as linhas de regras são divididas por seções, sendo uma para conexões locais, outra para IPv4, outra para IPv6 e mais uma para replicações.<br>Apenas para lembrar, é tradição no universo Linux/Unix (de onde o PostgreSQL surgiu) usar o caractere &#8216;<kbd>#</kbd>&#8216; para marcar comentários no início da linha.</p>



<p class="wp-block-paragraph">Confira um exemplo de conteúdo do <kbd>pg_hba.conf</kbd>:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">Arquivo pg_hba.conf: exemplo de conteúdo</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># DO NOT DISABLE!
# If you change this first entry you will need to make sure that the
# database superuser can access the database using some other method.
# Noninteractive access to all databases is required during automatic
# maintenance (custom daily cronjobs, replication, and similar tasks).
#
# Database administrative login by Unix domain socket
local   all             postgres                                peer

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     peer
# IPv4 local connections:
host    all             all             127.0.0.1/32            scram-sha-256
# IPv6 local connections:
host    all             all             ::1/128                 scram-sha-256
# Allow replication connections from localhost, by a user with the
# replication privilege.
local   replication     all                                     peer
host    replication     all             127.0.0.1/32            scram-sha-256
host    replication     all             ::1/128                 scram-sha-256</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #24292E"># DO NOT DISABLE</span><span style="color: #D73A49">!</span></span>
<span class="line"><span style="color: #24292E"># If you change this first entry you will need to make sure that the</span></span>
<span class="line"><span style="color: #24292E"># database superuser can access the database using some other method.</span></span>
<span class="line"><span style="color: #24292E"># Noninteractive access to all databases is required during automatic</span></span>
<span class="line"><span style="color: #24292E"># maintenance (</span><span style="color: #6F42C1">custom</span><span style="color: #24292E"> </span><span style="color: #032F62">daily</span><span style="color: #24292E"> </span><span style="color: #032F62">cronjobs,</span><span style="color: #24292E"> </span><span style="color: #032F62">replication,</span><span style="color: #24292E"> </span><span style="color: #032F62">and</span><span style="color: #24292E"> </span><span style="color: #032F62">similar</span><span style="color: #24292E"> </span><span style="color: #032F62">tasks</span><span style="color: #24292E">).</span></span>
<span class="line"><span style="color: #24292E">#</span></span>
<span class="line"><span style="color: #24292E"># Database administrative login by Unix domain socket</span></span>
<span class="line"><span style="color: #005CC5">local   all             postgres                                peer</span></span>
<span class="line"></span>
<span class="line"><span style="color: #24292E"># TYPE  DATABASE        USER            ADDRESS                 METHOD</span></span>
<span class="line"></span>
<span class="line"><span style="color: #24292E"># </span><span style="color: #032F62">&quot;local&quot;</span><span style="color: #24292E"> is </span><span style="color: #D73A49">for</span><span style="color: #24292E"> Unix domain socket connections only</span></span>
<span class="line"><span style="color: #005CC5">local   all             all                                     peer</span></span>
<span class="line"><span style="color: #24292E"># IPv4 local connections:</span></span>
<span class="line"><span style="color: #005CC5">host    all             all             127.0.0.1/32            scram-sha-256</span></span>
<span class="line"><span style="color: #24292E"># IPv6 local connections:</span></span>
<span class="line"><span style="color: #005CC5">host    all             all             ::1/128                 scram-sha-256</span></span>
<span class="line"><span style="color: #24292E"># Allow replication connections from localhost, by a user with the</span></span>
<span class="line"><span style="color: #24292E"># replication privilege.</span></span>
<span class="line"><span style="color: #005CC5">local   replication     all                                     peer</span></span>
<span class="line"><span style="color: #005CC5">host    replication     all             127.0.0.1/32            scram-sha-256</span></span>
<span class="line"><span style="color: #005CC5">host    replication     all             ::1/128                 scram-sha-256</span></span></code></pre></div>



<h3 class="wp-block-heading"><kbd>TYPE</kbd> (tipos de conexão)</h3>



<p class="wp-block-paragraph">O PostgreSQL suporta diversos tipos de conexão, cada um com suas próprias características e casos de uso, que determinam como os clientes podem se conectar ao servidor de banco de dados. Entre os principais e mais utilizados, estão:</p>



<ul class="wp-block-list">
<li class=""><kbd>local</kbd>: conexões feitas através de Unix sockets no mesmo sistema onde o servidor PostgreSQL está rodando, ou seja, conexões locais, portanto, não sendo necessário passar a informação da coluna <kbd>ADDRESS</kbd>;</li>



<li class=""><kbd>host</kbd>: conexões TCP/IP tanto locais quanto remotas não criptografadas, ou seja, sem criptografia SSL;</li>



<li class=""><kbd>hostssl</kbd>: para conexões TCP/IP seguras, ou seja, criptografadas via SSL. É o que recomendamos utilizar e teremos um artigo especial dedicado a ele.</li>
</ul>



<p class="wp-block-paragraph">Existem ainda as opções mais incomuns: <kbd>hostnossl</kbd> (sem SSL), <kbd>hostgssenc</kbd> (com criptografia GSSAPI) e <kbd>hostnogssenc</kbd> (sem criptografia GSSAPI).</p>



<h3 class="wp-block-heading"><kbd>DATABASE</kbd> (banco de dados)</h3>



<p class="wp-block-paragraph">Para isolar as regras de autenticação, deve-se especificar a qual banco a linha com as instruções se refere, sendo possível utilizar <kbd>all</kbd> para aplicação em todos os bancos. Além disso, há a opção<strong> <kbd>samerole</kbd></strong>, que é particularmente útil em ambientes com multitenancy, onde diferentes usuários ou grupos precisam acessar seus próprios bancos de dados sem interferir em outros. Com samerole, o Postgres permite que um usuário se conecte apenas a bancos de dados cujo nome coincide com uma role (grupo) da qual ele é membro. Assim, é possível definir que cada usuário tenha acesso apenas aos bancos relacionados ao seu papel, reforçando a segurança e o isolamento entre bancos de dados de diferentes usuários.</p>



<h3 class="wp-block-heading"><kbd>USER</kbd> (usuários ou grupos de usuários)</h3>



<p class="wp-block-paragraph">É possível especificar usuários individuais do PostgreSQL no <kbd>pg_hba.conf</kbd> pelo campo USER ou, ainda, usar <kbd>all</kbd> para corresponder a todos os usuários, assim como para os bancos de dados.<br>Podemos também indicar grupos de usuários com o prefixo <kbd>+</kbd>, por exemplo, <kbd>+admins</kbd>, o que torna fácil o processo de gerenciar permissões de vários usuários simultaneamente. É importante lembrar que não são grupos do sistema operacional, mas, sim, roles definidas no PostgreSQL.<br>No contexto do PostgreSQL, um &#8220;grupo de usuários&#8221; é, na verdade, uma role à qual outras roles (usuários) recebem grants (privilégios). Isso permite agrupar vários usuários sob uma mesma role, facilitando o gerenciamento de permissões e acessos em ambientes mais complexos.<br>Além disso, também podemos informar nomes de usuário como expressões regulares, indicando com o prefixo <kbd>/</kbd>, e também é possível gerenciar os usuários, com nome ou expressões regulares, em um arquivo separado, que deve ser mencionado com o prefixo <kbd>@</kbd>. Há ainda o caso de replicação, que trata-se de uma conexão usada para sincronizar dados entre servidores, e que deve ser indicada nessa coluna com a palavra-chave <kbd>replication</kbd>.</p>



<h3 class="wp-block-heading"><kbd>ADDRESS</kbd> (endereços)</h3>



<p class="wp-block-paragraph">O campo <kbd>ADDRESS</kbd> no <kbd>pg_hba.conf</kbd> permite especificar quais endereços podem se conectar:</p>



<ul class="wp-block-list">
<li class=""><strong>Subnet</strong>: permite conexões de uma faixa de IPs, por exemplo:
<ul class="wp-block-list">
<li class=""><kbd>192.168.1.1/32</kbd> ou <kbd>fe80::7a31:c1ff:fa34:9eb3/128</kbd> &#8211; permite apenas um IP específico;</li>



<li class=""><kbd>127.0.0.1</kbd> ou <kbd>::1/128 - (ipv6)</kbd> &#8211; permite apenas conexões locais;</li>



<li class=""><kbd>192.168.1.0/24</kbd> &#8211; permite todos os IPs classe C, de <kbd>192.168.1.0</kbd> a <kbd>192.168.1.255</kbd>;</li>



<li class=""><kbd>192.168.0.0/16</kbd> &#8211; permite todos os IPs classe B, de <kbd>192.168.0.0</kbd> a <kbd>192.168.255.255</kbd>;</li>



<li class=""><kbd>192.0.0.0/8</kbd> &#8211; permite todos os IPs classe A, de <kbd>192.0.0.0</kbd> a <kbd>192.255.255.255</kbd>;</li>



<li class=""><kbd>0.0.0.0/0</kbd> ou <kbd>::0/0 (ipv6)</kbd> &#8211; permite qualquer IP (não recomendamos usar esta configuração em ambiente de produção).</li>
</ul>
</li>



<li class=""><strong>IP-mask</strong>: permite a definição de uma faixa de IPs, semelhante a anterior, mas em vez de usar a subnet, colocamos o IP e a máscara de IPs:
<ul class="wp-block-list">
<li class=""><kbd>192.168.1.0</kbd> ou <kbd>255.255.255.0</kbd> &#8211; permite todos os IPs classe C, de <kbd>192.168.1.0</kbd> a <kbd>192.168.1.255</kbd>;</li>



<li class=""><kbd>192.168.0.0</kbd> ou <kbd>255.255.0.0</kbd> &#8211; permite todos os IPs classe B, de <kbd>192.168.0.0</kbd> a <kbd>192.168.255.255</kbd>.</li>
</ul>
</li>



<li class=""><strong>Hostname</strong>: além de endereços IP, podemos utilizar um hostname, no qual o PostgreSQL realiza várias verificações para garantir a correspondência entre o hostname especificado e o cliente. Lembrando que qualquer lentidão na resolução de nomes pelo DNS irá provocar uma lentidão no processo de conexão em si.
<ul class="wp-block-list">
<li class="">Hostname específico: é só colocá-lo, como exemplo.com;</li>



<li class="">Subdomínios: necessário colocar o prefixo “.” antes do hostname, e assim qualquer endereço com esse subdomínio será autorizado, como em .exemplo.com permitiria conexão de sub.exemplo.com, app.exemplo.com etc. (mas não o próprio exemplo.com).</li>
</ul>
</li>



<li class="">Também podemos utilizar <kbd>all</kbd> para permitir a conexão de qualquer IP, <kbd>samehost</kbd> para permitir qualquer IP do próprio servidor e <kbd>samenet</kbd> para permitir qualquer IP em qualquer sub-rede à qual o servidor esteja conectado.</li>
</ul>



<h3 class="wp-block-heading"><kbd>METHOD</kbd> (método)</h3>



<p class="wp-block-paragraph">Os métodos de autenticação no PostgreSQL são as diferentes maneiras que o banco de dados usa para verificar e realizar a autenticação, indo desde a exigência de senhas até a confiança total e permissão absoluta. Os principais são:</p>



<ul class="wp-block-list">
<li class=""><kbd>trust</kbd>: permite conexões sem nenhuma autenticação, ou seja, se o seu IP for contemplado na lista de endereços autorizados, não será necessário fornecer senhas, por isso é adequado apenas para ambiente de testes e desenvolvimento local ou com redes totalmente isoladas e confiáveis endereçando apenas um IP local ou um IP único confiável;</li>



<li class="">password / <kbd>md5</kbd> / <kbd>scram-sha-256</kbd>: é exigida uma senha no momento da conexão, que varia entre essas três opções com diferentes níveis de segurança:
<ul class="wp-block-list">
<li class=""><kbd>password</kbd>: senha em texto simples, sem criptografia durante a transmissão pela rede;</li>



<li class=""><kbd>md5</kbd>: usa hash MD5 para criptografar a senha durante a transmissão, o que torna o processo um pouco mais seguro, mas seu uso está sendo descontinuado em favor do próximo método considerado mais seguro;</li>



<li class=""><kbd>scram-sha-256</kbd>: usa o método SCRAM (<em>Salted Challenge Response Authentication Mechanism</em>) como hash SHA-256, o que o torna a opção baseada em senha mais segura, já que seu protocolo de autenticação não transmite a senha real, e sua criptografia é considerada muito forte.</li>
</ul>
</li>
</ul>



<p class="wp-block-paragraph">É importante saber que o tipo de encriptação padrão da senha (md5 ou scram-sha-256) é definido pelo parâmetro <kbd>password_encryption</kbd>, que significa que todos os seus usuários criados com senha, ou com a senha alterada, vão tê-la com a criptografia apontada por esse parâmetro. O nosso padrão é scram-sha-256, porém fizemos alterações para exemplificar diferentes cenários;</p>



<ul class="wp-block-list">
<li class=""><kbd>ident</kbd>: usa o serviço de identificação do sistema operacional (<kbd>Ident</kbd> ou <kbd>identd</kbd>) para autenticar, confiando na informação que o SO passa, por isso requer que o cliente esteja em um servidor <kbd>ident</kbd> (mais comum em ambientes Linux, em que o serviço <kbd>Ident</kbd> já vem ativado por padrão);&nbsp;</li>



<li class=""><kbd>peer</kbd>: confia nas informações de usuários do SO local, ou seja, diferente do <kbd>ident</kbd>, não precisa de um serviço externo para isso e só funciona para redes locais. É esse o método de autenticação que costumamos usar para acessar o psql com usuário postgres (estando conectado ao usuário postgres do SO);</li>



<li class="">Além desses, o PostgreSQL suporta vários outros métodos, incluindo:
<ul class="wp-block-list">
<li class=""><kbd>reject</kbd>: rejeita todas as conexões, podendo ser usado para filtrar e impedir grupos;&nbsp;</li>



<li class=""><kbd>sspi</kbd>: autenticação nativa do Windows;</li>



<li class=""><kbd>ldap</kbd>: para autenticação via servidores LDAP;</li>



<li class=""><kbd>radius</kbd>: para autenticação via servidores RADIUS;</li>



<li class=""><kbd>cert</kbd>: usa certificados SSL do cliente para autenticação.</li>
</ul>
</li>
</ul>



<h3 class="wp-block-heading"><kbd>OPTIONS</kbd> (opções)</h3>



<p class="wp-block-paragraph">Além de todas as configurações que vimos, é possível ainda inserir mais opções para o método de autenticação, que devem ter o formato de nome=valor, e servem para especificar opções adicionais para o método escolhido. Algumas delas são:</p>



<ul class="wp-block-list">
<li class=""><kbd>clientcert</kbd>: além das opções específicas de cada método de autenticação, existe essa opção geral, que pode ser usada em qualquer entrada do tipo <kbd>hostssl</kbd>. Essa opção tem dois valores possíveis: <kbd>verify-ca</kbd> e <kbd>verify-full</kbd>, sendo que o primeiro exige que o cliente apresente um certificado SSL válido e confiável, e o segundo, além de exigir um certificado válido, também verifica se o <em>Common Name</em> (CN) no certificado do cliente corresponde ao nome de usuário ou a um mapeamento aplicável. Isso fornece um nível extra de segurança;</li>



<li class=""><kbd>clientname</kbd>: quando você está usando autenticação com certificado de cliente (usando o método <kbd>cert</kbd> ou a opção <kbd>clientcert</kbd>), você pode usar essa opção para especificar qual parte das credenciais do certificado do cliente deve ser comparada com o nome de usuário, sendo as subopções <kbd>clientname=CN</kbd>, em que o nome de usuário será comparado com o <em>Common Name</em> (CN) do certificado, e <kbd>clientname=DN</kbd>, em que o nome de usuário será comparado com o <em>Distinguished Name</em> (DN) completo do certificado, conforme o formato RFC 2253;</li>



<li class=""><kbd>include</kbd>, <kbd>include_if_exists</kbd> e <kbd>include_dir</kbd>: essas opções permitem definir suas regras de autenticação em um arquivo separado, sendo necessário passar o local do arquivo entre aspas simples. A diferença entre essas opções é que a primeira apenas checa o local do arquivo informado e tenta substituir as regras, a segunda faz isso apenas se o arquivo existir, caso contrário será exibida uma mensagem indicando que o arquivo não foi lido, e a última reconhece todos os arquivos de um diretório.</li>
</ul>



<h3 class="wp-block-heading">Exemplos</h3>



<h4 class="wp-block-heading">Conexão <kbd>local</kbd> de todos os usuários com <kbd>peer</kbd></h4>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">Arquivo pg_hba.conf: exemplo de configuração de conexão</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>local		all		all		peer</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #005CC5">local		all		all		peer</span></span></code></pre></div>



<p class="wp-block-paragraph">Este é o caso que possibilita o acesso ao psql pelo usuário <kbd>postgres</kbd> do SO, pulando a etapa de fornecimento de senha (acessamos o banco também chamado <kbd>postgres</kbd>):</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">Debian shell: exemplo de acesso ao psql sem inserção de senha</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>postgresdebian:~$ psql -U postgres -d postgres
psql (16.2 (Debian 16.2-1.pgdg120+2))
Type "help" for help.

postgres=#</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #6F42C1">postgresdebian:~</span><span style="color: #24292E">$ psql -U postgres -d postgres</span></span>
<span class="line"><span style="color: #005CC5">psql (16.2 (Debian 16.2-1.pgdg120+2))</span></span>
<span class="line"><span style="color: #005CC5">Type &quot;help&quot; for help.</span></span>
<span class="line"></span>
<span class="line"><span style="color: #005CC5">postgres=#</span></span></code></pre></div>



<p class="wp-block-paragraph">Além desse usuário, poderíamos repetir esse tipo de acesso com qualquer outro usuário que existisse tanto no banco de dados quanto no SO, claro, com o mesmo nome nos dois lugares:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">Debian shell: acessando o psql sem inserção de senha</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>ludmila@debian:~$ psql -U ludmila -d postgres
psql (16.2 (Debian 16.2-1.pgdg120+2))
Type "help" for help.

postgres=></textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #6F42C1">ludmila@debian:~</span><span style="color: #24292E">$ psql -U ludmila -d postgres</span></span>
<span class="line"><span style="color: #005CC5">psql (16.2 (Debian 16.2-1.pgdg120+2))</span></span>
<span class="line"><span style="color: #005CC5">Type &quot;help&quot; for help.</span></span>
<span class="line"></span>
<span class="line"><span style="color: #005CC5">postgres=&gt;</span></span></code></pre></div>



<p class="wp-block-paragraph">Além disso, conforme explicado, podemos aplicar as regras por banco de dados, então, se fosse especificado o método de conexão <kbd>peer</kbd> apenas para o banco <kbd>postgres</kbd>, não seria possível acessar sem senha em outros bancos.</p>



<h4 class="wp-block-heading">Conexão <kbd>host</kbd> com IP específico e senha sem criptografia</h4>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">Arquivo pg_hba.conf: exemplo de configuração de conexão</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>host		all		all		192.168.1.10/32		password</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #005CC5">host		all		all		192.168.1.10/32		password</span></span></code></pre></div>



<p class="wp-block-paragraph">Como você pode notar, foi solicitada a senha para acessar o banco de outro IP:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">Debian shell: acessando o psql com senha</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>fabio@debian-2:~$ psql -h 64.23.248.23 -p 5432 -U fabio -d postgres
Password for user fabio:
psql (16.4 (Debian 16.4-1.pgdg120+1), server 16.2 (Debian 16.2-1.pgdg120+2))
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)
Type "help" for help.

postgres=></textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #6F42C1">fabio@debian-2:~</span><span style="color: #24292E">$ psql -h 64.23.248.23 -p 5432 -U fabio -d postgres</span></span>
<span class="line"><span style="color: #005CC5">Password for user fabio:</span></span>
<span class="line"><span style="color: #005CC5">psql (16.4 (Debian 16.4-1.pgdg120+1), server 16.2 (Debian 16.2-1.pgdg120+2))</span></span>
<span class="line"><span style="color: #005CC5">SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)</span></span>
<span class="line"><span style="color: #005CC5">Type &quot;help&quot; for help.</span></span>
<span class="line"></span>
<span class="line"><span style="color: #005CC5">postgres=&gt;</span></span></code></pre></div>



<p class="wp-block-paragraph">Mas, se a tentativa de acessar fosse feita da <strong>rede local</strong> com o mesmo usuário <kbd>fabio</kbd>, considerando que temos no mesmo arquivo a linha de regras exemplificadas anteriormente, este seria o resultado:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">Debian shell: acessando o psql sem inserção de senha (com peer)_</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>fabio@debian:~$ psql -U fabio -d postgres
psql (16.2 (Debian 16.2-1.pgdg120+2))
Type "help" for help.

postgres=></textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #6F42C1">fabio@debian:~</span><span style="color: #24292E">$ psql -U fabio -d postgres</span></span>
<span class="line"><span style="color: #005CC5">psql (16.2 (Debian 16.2-1.pgdg120+2))</span></span>
<span class="line"><span style="color: #005CC5">Type &quot;help&quot; for help.</span></span>
<span class="line"></span>
<span class="line"><span style="color: #005CC5">postgres=&gt;</span></span></code></pre></div>



<h4 class="wp-block-heading">Conexão <kbd>host</kbd> para grupo de usuários com IP específico e <kbd>trust</kbd></h4>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">Arquivo pg_hba.conf: exemplo de configuração de conexão</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>host	    all	 +groupname	      192.168.1.20/32	trust</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #005CC5">host	    all	 +groupname	      192.168.1.20/32	trust</span></span></code></pre></div>



<p class="wp-block-paragraph">Esse cenário permite que os usuários pertencentes ao grupo editors se conectem de um IP específico sem a necessidade de informar senha. No nosso caso, o usuário ana está neste grupo:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">Debian shell: acessando o psql sem inserção de senha</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>ana@debian-2:~$ psql -h 64.23.248.23 -p 5432 -U ana -d postgres
psql (16.4 (Debian 16.4-1.pgdg120+1), server 16.2 (Debian 16.2-1.pgdg120+2))
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)
Type "help" for help.

postgres=></textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #6F42C1">ana@debian-2:~</span><span style="color: #24292E">$ psql -h 64.23.248.23 -p 5432 -U ana -d postgres</span></span>
<span class="line"><span style="color: #005CC5">psql (16.4 (Debian 16.4-1.pgdg120+1), server 16.2 (Debian 16.2-1.pgdg120+2))</span></span>
<span class="line"><span style="color: #005CC5">SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)</span></span>
<span class="line"><span style="color: #005CC5">Type &quot;help&quot; for help.</span></span>
<span class="line"></span>
<span class="line"><span style="color: #005CC5">postgres=&gt;</span></span></code></pre></div>



<h4 class="wp-block-heading">Conexão host para bancos de dados com o mesmo proprietário (<kbd>samerole</kbd>)</h4>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">Arquivo pg_hba.conf: exemplo de configuração de conexão</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>host    samerole    all     192.168.1.0/24    md5</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #005CC5">host    samerole    all     192.168.1.0/24    md5</span></span></code></pre></div>



<p class="wp-block-paragraph">Com essa configuração, se o usuário <kbd>user1</kbd> tentar acessar o banco de dados que ele mesmo possui, a senha será solicitada, porém, se ele tentar acessar um banco que pertence a outro usuário, como <kbd>user2</kbd>, ele não conseguirá, pois a regra só se aplica aos bancos que possuem o mesmo proprietário.</p>



<h3 class="wp-block-heading">Considerações importantes</h3>



<ul class="wp-block-list">
<li class="">As regras são aplicadas na ordem em que aparecem no arquivo;</li>



<li class="">As primeiras regras têm prioridade, então coloque as mais restritivas no início;</li>



<li class="">Após modificar o <kbd>pg_hba.conf</kbd>, recarregue as configurações com o comando <kbd>systemctl reload postgresql</kbd>;</li>



<li class="">Se não funcionar, deve-se checar os logs do banco ou então consultar a tabela <kbd>pg_hba_file_rule</kbd> do catálogo para entender onde está o erro dentro do <kbd>pg_hba.con</kbd>f ;</li>
</ul>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">Debian shell: logs do banco de dados exibindo erro no pg_hba.conf</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>$ tail postgresql-16-main.log
2024-11-13 17:29:31.029 UTC &#91;141035&#93; LOG:  received SIGHUP, reloading configuration files
2024-11-13 17:29:31.037 UTC &#91;141035&#93; LOG:  invalid connection type "hoost"
2024-11-13 17:29:31.037 UTC &#91;141035&#93; CONTEXT:  line 126 of configuration file "/etc/postgresql/16/main/pg_hba.conf"
2024-11-13 17:29:31.037 UTC &#91;141035&#93; LOG:  /etc/postgresql/16/main/pg_hba.conf was not reloaded</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #24292E">$ tail postgresql-16-main.log</span></span>
<span class="line"><span style="color: #005CC5">2024-11-13 17:29:31.029 UTC &#91;141035&#93; LOG:  received SIGHUP, reloading configuration files</span></span>
<span class="line"><span style="color: #005CC5">2024-11-13 17:29:31.037 UTC &#91;141035&#93; LOG:  invalid connection type &quot;hoost&quot;</span></span>
<span class="line"><span style="color: #005CC5">2024-11-13 17:29:31.037 UTC &#91;141035&#93; CONTEXT:  line 126 of configuration file &quot;/etc/postgresql/16/main/pg_hba.conf&quot;</span></span>
<span class="line"><span style="color: #005CC5">2024-11-13 17:29:31.037 UTC &#91;141035&#93; LOG:  /etc/postgresql/16/main/pg_hba.conf was not reloaded</span></span></code></pre></div>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">Debian shell: consulta na tabela pg_hba_file_rules com registro de erro</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>postgres=# select * from pg_hba_file_rules ;
 rule_number |              file_name              | line_number | type  |   database    | user_name  |  address  |                 netmask                 |  auth_method  | options |              error
-------------+-------------------------------------+-------------+-------+---------------+------------+-----------+-----------------------------------------+---------------+---------+---------------------------------
           1 | /etc/postgresql/16/main/pg_hba.conf |         118 | local | {all}         | {postgres} |           |                                         | peer          |         |
           2 | /etc/postgresql/16/main/pg_hba.conf |         125 | local | {all}         | {all}      |           |                                         | trust         |         |
             | /etc/postgresql/16/main/pg_hba.conf |         126 |       |               |            |           |                                         |               |         | invalid connection type "hoost"
           3 | /etc/postgresql/16/main/pg_hba.conf |         128 | host  | {all}         | {all}      | ::1       | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff | scram-sha-256 |         |
           4 | /etc/postgresql/16/main/pg_hba.conf |         131 | local | {replication} | {all}      |           |                                         | peer          |         |
           5 | /etc/postgresql/16/main/pg_hba.conf |         132 | host  | {replication} | {all}      | 127.0.0.1 | 255.255.255.255                         | scram-sha-256 |         |
           6 | /etc/postgresql/16/main/pg_hba.conf |         133 | host  | {replication} | {all}      | ::1       | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff | scram-sha-256 |         |
(7 rows)</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #005CC5">postgres=# select * from pg_hba_file_rules ;</span></span>
<span class="line"><span style="color: #005CC5"> rule_number |              file_name              | line_number | type  |   database    | user_name  |  address  |                 netmask                 |  auth_method  | options |              error</span></span>
<span class="line"><span style="color: #005CC5">-------------+-------------------------------------+-------------+-------+---------------+------------+-----------+-----------------------------------------+---------------+---------+---------------------------------</span></span>
<span class="line"><span style="color: #005CC5">           1 | /etc/postgresql/16/main/pg_hba.conf |         118 | local | {all}         | {postgres} |           |                                         | peer          |         |</span></span>
<span class="line"><span style="color: #005CC5">           2 | /etc/postgresql/16/main/pg_hba.conf |         125 | local | {all}         | {all}      |           |                                         | trust         |         |</span></span>
<span class="line"><span style="color: #005CC5">             | /etc/postgresql/16/main/pg_hba.conf |         126 |       |               |            |           |                                         |               |         | invalid connection type &quot;hoost&quot;</span></span>
<span class="line"><span style="color: #005CC5">           3 | /etc/postgresql/16/main/pg_hba.conf |         128 | host  | {all}         | {all}      | ::1       | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff | scram-sha-256 |         |</span></span>
<span class="line"><span style="color: #005CC5">           4 | /etc/postgresql/16/main/pg_hba.conf |         131 | local | {replication} | {all}      |           |                                         | peer          |         |</span></span>
<span class="line"><span style="color: #005CC5">           5 | /etc/postgresql/16/main/pg_hba.conf |         132 | host  | {replication} | {all}      | 127.0.0.1 | 255.255.255.255                         | scram-sha-256 |         |</span></span>
<span class="line"><span style="color: #005CC5">           6 | /etc/postgresql/16/main/pg_hba.conf |         133 | host  | {replication} | {all}      | ::1       | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff | scram-sha-256 |         |</span></span>
<span class="line"><span style="color: #005CC5">(7 rows)</span></span></code></pre></div>



<ul class="wp-block-list">
<li class="">Teste as configurações em um ambiente de desenvolvimento antes de aplicá-las em produção.</li>
</ul>



<h2 class="wp-block-heading">Ident file</h2>



<p class="wp-block-paragraph">O <strong>ident file</strong> é um arquivo utilizado pelo PostgreSQL para mapear nomes de usuários do sistema operacional para nomes de usuários do banco de dados. Ele é útil quando você usa o método de autenticação <kbd>ident</kbd>, que verifica a identidade do usuário que está tentando se conectar ao banco de dados com base no nome de usuário do sistema operacional.</p>



<p class="wp-block-paragraph">Para fazer essa autenticação baseada nos usuários do SO, o PostgreSQL consulta o <strong>ident file</strong> para mapear o nome de usuário do SO para o nome de usuário do banco de dados.</p>



<p class="wp-block-paragraph">Esse arquivo geralmente é chamado pg_ident.conf e está localizado no mesmo diretório que o arquivo <kbd>pg_hba.conf</kbd> (<kbd>/etc/postgresql/&lt;versão&gt;/&lt;cluster&gt;/pg_hba.conf</kbd> para sistemas de base Linux).&nbsp;</p>



<p class="wp-block-paragraph">Seu conteúdo é simples, com cada linha contendo três colunas:</p>



<ol class="wp-block-list">
<li class=""><strong>Mapa de identidade</strong>: nome de um grupo de mapeamento definido;</li>



<li class=""><strong>Nome de usuário do SO</strong>: nome do usuário no sistema operacional;</li>



<li class=""><strong>Nome de usuário do banco</strong>: nome do usuário no banco de dados que corresponde ao usuário do SO.&nbsp;</li>
</ol>



<p class="wp-block-paragraph">Após feita a configuração do arquivo <kbd>pg_ident.conf</kbd>, para utilizá-lo basta selecionar como método de autenticação no <kbd>pg_hba.conf</kbd> o <kbd>ident </kbd>e, então, como última opção da linha de regra, informar o nome do mapa definido no ident file. Exemplo:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">Arquivo pg_ident.conf: exemplo de conteúdo</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>mymap   seu_usuario_os   seu_usuario_db</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #005CC5">mymap   seu_usuario_os   seu_usuario_db</span></span></code></pre></div>



<p class="wp-block-paragraph">Nesse caso, <kbd>mymap</kbd> é o nome do seu mapeamento, <kbd>seu_usuario_os</kbd> é o nome do usuário no sistema operacional, e <kbd>seu_usuario_db</kbd> é o nome do usuário no banco de dados.</p>



<p class="wp-block-paragraph">Para aplicar isso no <kbd>pg_hba.conf</kbd>, poderíamos incluir essa linha nas regras do arquivo:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">Arquivo pg_hba.con:f: exemplo de configuração com ident file</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>host   all	all   192.168.1.10/32   ident   mymap</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #005CC5">host   all	all   192.168.1.10/32   ident   mymap</span></span></code></pre></div>



<p class="wp-block-paragraph">Sendo que <kbd>ident</kbd> é o método escolhido, e a opção extra <kbd>mymap</kbd> refere-se ao mapeamento que queremos utilizar (considerando que podemos mapear vários usuários no ident file).</p>



<h2 class="wp-block-heading">Conclusão</h2>



<p class="wp-block-paragraph">O <kbd>pg_hba.conf</kbd> é uma peça fundamental na definição de políticas de acesso ao banco de dados. Ele é relativamente simples de configurar e tem uma sintaxe bastante intuitiva se compararmos com outros bancos de dados por aí. No entanto, conhecer as opções disponíveis é uma condição indispensável para administrar um ambiente de produção de forma minimamente segura.&nbsp;</p>



<p class="wp-block-paragraph">Por padrão, as instalações do PostgreSQL vêm apenas habilitadas para permitir conexões locais, o que gera uma certa frustração em novatos. Algumas pessoas, na pressa de colocar o banco de dados no ar, acabam utilizando o método <kbd>TRUST</kbd> ou colocando faixas de IPs abertas para o mundo todo com <kbd>0.0.0.0/0</kbd>, o que deixa o servidor completamente vulnerável a ataques. Na mesma linha, você deve utilizar o <kbd>ALL</kbd> para usuários, e nomes de bancos de dados devem ser utilizados com moderação. Aqui vale a regra do &#8220;menor privilégio possível&#8221;. Você deve sempre colocar as regras mais restritas possíveis para permitir que as aplicações e os usuários acessem o banco de dados com segurança.&nbsp;</p>



<p class="wp-block-paragraph">Outra tendência forte é utilizar conexões com criptografia SSL para todas as conexões que não forem locais, evitando possíveis ataques de pessoas que ficam escutando o tráfego da sua rede. Isso é tão importante hoje que escrevemos um artigo só sobre isso, que você poderá conferir mais adiante. Portanto, seja cuidadoso e crie regras com prudência. Lembre-se, você pode alterá-las e adicionar quantas linhas forem necessárias depois; e recarregar o arquivo pg_hba.conf sem precisar reiniciar o serviço do PostgreSQL, apenas dando um <kbd>RELOAD</kbd>.</p><p>The post <a href="https://savepoint.blog.br/2024/10/16/pg_hba-conf/">pg_hba.conf</a> first appeared on <a href="https://savepoint.blog.br">Savepoint</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://savepoint.blog.br/2024/10/16/pg_hba-conf/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">8535</post-id>	</item>
		<item>
		<title>Tuning de SO (no Linux)</title>
		<link>https://savepoint.blog.br/2024/10/09/tuning-de-so-no-linux/</link>
					<comments>https://savepoint.blog.br/2024/10/09/tuning-de-so-no-linux/#respond</comments>
		
		<dc:creator><![CDATA[Savepoint]]></dc:creator>
		<pubDate>Wed, 09 Oct 2024 15:20:35 +0000</pubDate>
				<category><![CDATA[Instalação e Setup]]></category>
		<category><![CDATA[Internals e MVCC]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Performance e Tuning]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[tuning]]></category>
		<guid isPermaLink="false">https://savepoint.blog.br/?p=8528</guid>

					<description><![CDATA[<p>Aprenda técnicas de Tuning no Linux para otimizar o PostgreSQL: ajustes em systemctl, sistemas de arquivos, sysctl.conf e mais para desempenho superior.</p>
<p>The post <a href="https://savepoint.blog.br/2024/10/09/tuning-de-so-no-linux/">Tuning de SO (no Linux)</a> first appeared on <a href="https://savepoint.blog.br">Savepoint</a>.</p>]]></description>
										<content:encoded><![CDATA[<h2 class="wp-block-heading">Introdução</h2>



<p class="wp-block-paragraph">Tuning refere-se ao processo de ajustar e otimizar o desempenho de um sistema, software ou aplicação. A otimização do sistema operacional é uma etapa crucial para maximizar o desempenho e a eficiência do banco de dados PostgreSQL. Por meio do ajuste de algumas configurações do Linux, é possível melhorar a capacidade de resposta, a estabilidade e a escalabilidade dos serviços.&nbsp;</p>



<p class="wp-block-paragraph">Este artigo vai explorar áreas fundamentais para o tuning de sistemas Linux, focando em aspectos-chave como gerenciamento de serviços, sistemas de arquivos, particionamento e parâmetros de configuração do kernel, que impactam diretamente no uso do PostgreSQL.</p>



<p class="wp-block-paragraph">Roteiro:</p>



<ul class="wp-block-list">
<li class="">Systemctl</li>



<li class="">Sistemas de arquivos</li>



<li class="">Particionamento</li>



<li class="">Montagem de discos</li>



<li class="">sysctl.conf&nbsp;</li>



<li class="">Huge pages</li>



<li class="">Transparent Huge Pages (THP)</li>



<li class="">Limits</li>
</ul>



<h2 class="wp-block-heading">Systemctl&nbsp;</h2>



<p class="wp-block-paragraph">O <a href="https://www.man7.org/linux/man-pages/man1/systemctl.1.html"><kbd>systemctl</kbd></a> é uma ferramenta poderosa para o gerenciamento de serviços no Linux, sendo parte integrante do <a href="https://systemd.io/"><kbd>systemd</kbd></a>, o sistema de inicialização e gerenciamento de processos mais utilizado nas distribuições Linux modernas.&nbsp;</p>



<p class="wp-block-paragraph">Para DBAs que gerenciam o PostgreSQL, entender como configurar o serviço para iniciar e parar automaticamente durante o boot é essencial para garantir a disponibilidade contínua do banco de dados.</p>



<h3 class="wp-block-heading">Habilitando a inicialização automática</h3>



<p class="wp-block-paragraph">Para garantir que o serviço do PostgreSQL seja iniciado automaticamente após a reinicialização do sistema, utilizamos o comando <kbd>systemctl enable</kbd>. Esse comando cria links simbólicos nos diretórios apropriados, configurando o serviço para ser iniciado durante o processo de boot.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">Debian shell: habilitando inicialização automática</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>sudo systemctl enable postgresql</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #005CC5">sudo systemctl enable postgresql</span></span></code></pre></div>



<p class="wp-block-paragraph">Se por algum motivo você precisar desativar essa configuração, impedindo que o serviço inicie automaticamente, o comando <kbd>systemctl disable</kbd> pode ser utilizado:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">Debian shell: desabilitando inicialização automática</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>sudo systemctl disable postgresql</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #005CC5">sudo systemctl disable postgresql</span></span></code></pre></div>



<h3 class="wp-block-heading">Iniciando e parando serviços manualmente</h3>



<p class="wp-block-paragraph">Além da configuração automática, também é importante saber como iniciar ou parar manualmente o serviço do PostgreSQL. Para iniciá-lo manualmente, você pode usar o seguinte comando:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">Debian shell: iniciando a inicialização aumtomática manualmente</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>sudo systemctl start postgresql</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #005CC5">sudo systemctl start postgresql</span></span></code></pre></div>



<p class="wp-block-paragraph">Já se precisar parar o serviço, o comando é:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">Debian shell: parando a inicialização aumtomática manualmente</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>sudo systemctl stop postgresql</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #005CC5">sudo systemctl stop postgresql</span></span></code></pre></div>



<h3 class="wp-block-heading">Verificando o status do serviço</h3>



<p class="wp-block-paragraph">Para garantir que o serviço está funcionando corretamente, você pode verificar o status atual do PostgreSQL com o comando abaixo:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">ShellSession</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>sudo systemctl status postgresql</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #005CC5">sudo systemctl status postgresql</span></span></code></pre></div>



<p class="wp-block-paragraph">Esse comando retorna informações detalhadas, como se o serviço está ativo, inativo ou se houve falhas recentes, facilitando a administração do sistema.</p>



<h2 class="wp-block-heading">Sistemas de arquivos</h2>



<p class="wp-block-paragraph">A escolha e a configuração do sistema de arquivos são fundamentais para o desempenho e a confiabilidade de um banco de dados PostgreSQL. Cada sistema de arquivos tem características específicas que podem impactar diretamente na forma como o PostgreSQL gerencia seus dados, especialmente em termos de I/O (entrada/saída) e recuperação em caso de falhas. Confira a seguir alguns dos principais tipos.</p>



<h3 class="wp-block-heading">EXT4</h3>



<p class="wp-block-paragraph">O EXT4 é o mais recente e mais utilizado sistema de arquivo no Linux, tendo sido criado para superar seu antecessor, o EXT3. Ele é conhecido pela sua robustez e capacidade em termos de confiabilidade e velocidade. Algumas características desse sistema são:</p>



<ul class="wp-block-list">
<li class="">Utiliza journaling (mantém um registro das alterações antes de serem aplicadas ao sistema de arquivos, o que ajuda a proteger os dados em caso de falhas de energia ou outras interrupções inesperadas), facilitando a recuperação e minimizando a possibilidade de corrupção de dados;</li>



<li class="">Amplamente compatível com diferentes versões do Linux;</li>



<li class="">Oferece um bom desempenho geral, especialmente para operações de leitura e escrita comuns em ambientes de banco de dados;</li>



<li class="">É escalável, sendo capaz de lidar com volumes de até 1 exabyte e arquivos de até 16 terabytes, atendendo a diversos casos de uso.</li>
</ul>



<h3 class="wp-block-heading">XFS</h3>



<p class="wp-block-paragraph">O XFS é um sistema de arquivos mais antigo, porém também de alto desempenho e criado principalmente para lidar com grandes conjuntos de dados, sendo altamente escalável. As características dele são:</p>



<ul class="wp-block-list">
<li class="">Como citado, é otimizado para desempenho em sistemas com grandes quantidades de dados;</li>



<li class="">Especialmente eficaz em ambientes em que operações de I/O intensivas são comuns, como em servidores de banco de dados;</li>



<li class="">Também pode suportar sistemas de arquivos de até 16 terabytes;</li>



<li class="">Assim como o EXT4, o XFS também utiliza journaling para proteger a integridade dos dados. No entanto, o XFS possui um sistema de journaling mais sofisticado, que é projetado para minimizar o impacto no desempenho durante a recuperação de falhas.</li>
</ul>



<h3 class="wp-block-heading">Outros sistemas de arquivos</h3>



<p class="wp-block-paragraph">Existem inúmeros sistemas de arquivos disponíveis para o Linux, alguns utilizados em situações específicas, nem sempre adequadas para o uso com bancos de dados, por exemplo,&nbsp; sistemas de arquivos em cluster (como CFS, OCFS, UFS etc.) ou compartilhados (como CFS, OCFS ou GFS2). Outros sistemas são obsoletos, como o EXT2 e o EXT3, que deram lugar ao EXT4. Há também o ReiserFS, que já foi muito utilizado, mas é mais eficiente ao lidar com muitos arquivos pequenos, o que não é performático ao tratar com bancos de dados. Por fim, temos sistemas de arquivos mais modernos, como o BTRFS e o ZFS, que possuem vantagens interessantes, mas nos testes que conhecemos não oferecem uma performance e estabilidade tão boa quanto o EXT4 e o XFS, além de exigirem mais conhecimento para ajustar corretamente.</p>



<p class="wp-block-paragraph">Na prática, a diferença em termos de performance e segurança é mínima. Um tem pequenas vantagens aqui e ali sobre o outro, mas você pode escolher aquele que se sinta mais confortável de usar.&nbsp;</p>



<p class="wp-block-paragraph">O EXT4 é o sistema de arquivos padrão na maioria das distribuições Linux, incluindo o Debian e o Red Hat, mas todos costumam ter suporte para o XFS também.</p>



<h2 class="wp-block-heading">Particionamento</h2>



<p class="wp-block-paragraph">O particionamento de discos no Linux é uma prática essencial para otimizar o desempenho, a organização e a segurança dos dados em servidores que hospedam bancos de dados.&nbsp;</p>



<p class="wp-block-paragraph">Particionar adequadamente o disco pode ajudar a isolar diferentes tipos de dados, melhorar a eficiência de I/O e facilitar a recuperação de dados em caso de falhas.</p>



<p class="wp-block-paragraph">Existem alguns motivos pelos quais é interessante isolar um servidor de banco de dados em uma partição própria. Alguns deles são:</p>



<ul class="wp-block-list">
<li class="">Proteção contra falta de espaço em disco: se o banco de dados ficar na mesma partição do SO, em caso de falta de espaço, você pode ficar sem acesso ao servidor e precisar dar um boot no modo de recuperação, que é um processo bem delicado;</li>



<li class="">Desempenho: ao separar diferentes partes do banco de dados e do SO, você consegue fazer algumas otimizações de desempenho específicas para cada um. Além disso, você pode lidar com diferentes tipos de discos, com maior desempenho ou maior volume, para utilizar em lugares específicos;</li>



<li class="">Proteção contra perda de dados: se você armazenar os dados do servidor em um conjunto de discos, o WAL e seus arquivos de log em outro e tiver um backup físico em outro local, a perda completa dos discos onde os tablespaces estão não resultará em perda de dados. Separar os tablespaces do WAL e seus arquivos de log, além de manter um backup físico em um local separado (outro servidor, disco, fita etc.), é uma política de segurança eficaz para evitar perda de dados.</li>
</ul>



<p class="wp-block-paragraph">Quando você utiliza o PostgreSQL num servidor Linux dedicado, você tem diferentes opções de particionamento. Veja aqui algumas opções mais comuns:</p>



<ul class="wp-block-list">
<li class=""><strong>/</strong><strong> (root ou raiz)</strong>: todo Linux deve ter uma partição dedicada ao SO na raiz. Essa partição em geral não precisa ser muito grande, algo em torno de 20 GB num servidor dedicado costuma ser mais do que o suficiente;</li>



<li class=""><strong>/boot</strong>: a maioria das distribuições Linux costuma reservar uma pequena partição para o kernel do Linux. Isso já vem por padrão na sua distribuição, você não precisa se preocupar com isso. Apenas não altere nada aí;</li>



<li class=""><strong>/data</strong> (ou outro nome de diretório a sua escolha): num ambiente de produção, o local de armazenamento do seu banco de dados PostgreSQL (também temos a mania de chamá-lo pelo nome da variável de ambiente <kbd>$PGDATA</kbd>) deve ser criado numa partição separada. Essa partição deve ter um tamanho suficientemente grande para acomodar todos os dados pelos próximos anos (pelo menos 3 anos) e ainda ter uma folga de 20% de espaço livre. Nós ensinamos como fazer a instalação num diretório diferente do padrão nos nossos artigos sobre instalação do PostgreSQL no Debian e no Red Hat;&nbsp;</li>



<li class=""><strong>Logs</strong>: alguns servidores de produção podem gerar uma quantidade enorme de logs, especialmente se algum erro estranho começar a acontecer de repente ou se você quiser fazer um DEBUG das operações no banco de dados e logar todos os comandos executados nele. Isso pode ocupar um grande espaço em disco e também gerar muito I/O. Separar uma partição só para os logs do PostgreSQL e ajustar o parâmetro <kbd>log_directory</kbd> resolve a questão de forma elegante;</li>



<li class=""><strong>Backup e archives</strong>: você jamais deve guardar os seus backups e archives no mesmo disco físico do seu banco de dados. Na verdade, você não deveria sequer guardar eles no mesmo servidor. O certo seria armazenar esses arquivos num servidor de backup ou num serviço de block storage na nuvem, como a S3;</li>



<li class=""><strong>Tablespaces</strong>: todo banco de dados relacional armazena os dados em tablespaces. O PostgreSQL já cria por padrão dois tablespaces (o <kbd>pg_default</kbd> e o <kbd>pg_global</kbd>), que ficam dentro do diretório de dados do PostgreSQL: o <kbd>$PGDATA</kbd>. Logo, a maioria das pessoas jamais se preocupa com isso. No entanto, se você tiver discos com capacidades e velocidades distintas, talvez seja melhor separar um tablespace para utilizar apenas uma parte dos dados nesse disco diferente. Já se você tiver discos idênticos, em geral a melhor opção é sempre juntá-los num RAID.</li>
</ul>



<h3 class="wp-block-heading">Logical Volume Manager</h3>



<p class="wp-block-paragraph">Muitas pessoas optam no dia a dia pelo uso do <a href="https://sourceware.org/lvm2/">LVM2</a> para juntar diferentes discos em uma única partição e permitir a adição de novos discos no servidor sem ter que desmontar a partição atual. Em troca, você tem uma pequena perda de performance e um aumento na complexidade para gerenciar os discos. Se você tem um profissional competente para lidar com isso, e a flexibilidade é um fator importante para você, usar o LVM2 pode ser uma boa opção. Aqui não vamos demonstrar o seu uso, mas fica a dica como referência.</p>



<h2 class="wp-block-heading">Montagem de partições</h2>



<p class="wp-block-paragraph">Depois de particionar (utilizando o <kbd>fdisk</kbd> ou o <kbd>cfdisk</kbd>) e formatar a partição do seu disco (com o <kbd>mkfs</kbd>) usando o seu sistema de arquivos predileto (recomendamos anteriormente o EXT4 ou o XFS), chegou a hora de montar as suas partições. Para isso, você deve editar o arquivo <kbd>/etc/fstab</kbd>, que contém as configurações de montagem de sistemas de arquivos no Linux. Algumas recomendações são:</p>



<ul class="wp-block-list">
<li class="">Utilizar UUIDs (Identificadores Únicos Universais) em vez de nomes de dispositivos: é vantajoso porque UUIDs são imutáveis, mesmo que você adicione ou remova discos no sistema, memória etc., eles não vão mudar de forma inesperada, evitando falhas na montagem de sistemas de arquivos e até na inicialização do servidor;</li>



<li class="">Utilizar a opção <kbd>noatime</kbd> para montagem do disco: impede que o sistema atualize a data de acesso aos arquivos toda vez que eles são lidos, reduzindo a carga de I/O no disco e melhorando o desempenho, especialmente em servidores de banco de dados.</li>
</ul>



<p class="wp-block-paragraph">Para encontrar os UUIDs das suas partições, você pode consultar o diretório <kbd>by-uuid</kbd>:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">Debian shell: consultando UUIDs</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># ls -lha /dev/disk/by-uuid/
total 0
drwxr-xr-x 2 root root 120 Aug 26 17:06 .
drwxr-xr-x 8 root root 160 Aug 26 16:55 ..
lrwxrwxrwx 1 root root  10 Mar 28 06:01 0bcbad84-23f8-485b-9d66-513bb480a5cb -> ../../vda1
lrwxrwxrwx 1 root root   9 Aug 26 16:50 2024-03-27-15-36-35-00 -> ../../vdb
lrwxrwxrwx 1 root root  11 Mar 28 06:01 DB24-2355 -> ../../vda15
lrwxrwxrwx 1 root root  10 Aug 26 17:06 e59345d7-ea63-4625-98bf-037d425caa50 -> ../../sda1</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #24292E"># ls -lha /dev/disk/by-uuid/</span></span>
<span class="line"><span style="color: #005CC5">total 0</span></span>
<span class="line"><span style="color: #005CC5">drwxr-xr-x 2 root root 120 Aug 26 17:06 .</span></span>
<span class="line"><span style="color: #005CC5">drwxr-xr-x 8 root root 160 Aug 26 16:55 ..</span></span>
<span class="line"><span style="color: #005CC5">lrwxrwxrwx 1 root root  10 Mar 28 06:01 0bcbad84-23f8-485b-9d66-513bb480a5cb -&gt; ../../vda1</span></span>
<span class="line"><span style="color: #005CC5">lrwxrwxrwx 1 root root   9 Aug 26 16:50 2024-03-27-15-36-35-00 -&gt; ../../vdb</span></span>
<span class="line"><span style="color: #005CC5">lrwxrwxrwx 1 root root  11 Mar 28 06:01 DB24-2355 -&gt; ../../vda15</span></span>
<span class="line"><span style="color: #005CC5">lrwxrwxrwx 1 root root  10 Aug 26 17:06 e59345d7-ea63-4625-98bf-037d425caa50 -&gt; ../../sda1</span></span></code></pre></div>



<p class="wp-block-paragraph">Aqui, vamos montar a partição sda1. No diretório <kbd>/data</kbd>, adicionamos a última linha do nosso arquivo <kbd>/etc/fstab</kbd>:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">Debian shell: montando a partição</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># /etc/fstab: static file system information
UUID=0bcbad84-23f8-485b-9d66-513bb480a5cb / ext4 rw,discard,errors=remount-ro,x-systemd.growfs 0 1
UUID=DB24-2355 /boot/efi vfat defaults 0 0
UUID=e59345d7-ea63-4625-98bf-037d425caa50 /data ext4 noatime 0 0</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #24292E"># /etc/fstab: static file system information</span></span>
<span class="line"><span style="color: #005CC5">UUID=0bcbad84-23f8-485b-9d66-513bb480a5cb / ext4 rw,discard,errors=remount-ro,x-systemd.growfs 0 1</span></span>
<span class="line"><span style="color: #005CC5">UUID=DB24-2355 /boot/efi vfat defaults 0 0</span></span>
<span class="line"><span style="color: #005CC5">UUID=e59345d7-ea63-4625-98bf-037d425caa50 /data ext4 noatime 0 0</span></span></code></pre></div>



<p class="wp-block-paragraph">Nesse exemplo,&nbsp; a nova partição será montada em <kbd>/data</kbd> com o sistema de arquivos <kbd>ext4</kbd>, com a opção <kbd>noatime</kbd> e “<kbd>0 0</kbd>” representando não inclusão no backup automático e não verificação pelo <kbd>fsck</kbd> na inicialização.</p>



<h2 class="wp-block-heading">sysctl.conf</h2>



<p class="wp-block-paragraph">O arquivo <kbd>sysctl.conf</kbd> é uma ferramenta essencial para ajustar diversos parâmetros do kernel Linux. Para DBAs que administram servidores PostgreSQL, ajustar as configurações no <kbd>sysctl.conf</kbd> pode ajudar a otimizar o desempenho, a eficiência de I/O e a segurança do sistema.</p>



<p class="wp-block-paragraph">Por ele, podemos mexer em diversas configurações, como:</p>



<ul class="wp-block-list">
<li class="">Rede</li>



<li class="">Memória</li>



<li class="">Processos</li>



<li class="">Segurança</li>
</ul>



<p class="wp-block-paragraph">Esse arquivo está localizado em <kbd>/etc/sysctl.conf</kbd>, e esses parâmetros definem configurações que podem ser aplicadas durante a inicialização do sistema e também em tempo real. Para manipular esses parâmetros, existem duas opções:</p>



<ol class="wp-block-list">
<li class="">Alterar as linhas do arquivo utilizando um editor de texto, como <kbd>vi</kbd> ou <kbd>nano</kbd>. As alterações feitas diretamente no arquivo são permanentes;</li>



<li class="">Utilizar os comandos do <kbd>sysctl</kbd>. Nesse caso, as alterações são aplicadas apenas para a sessão atual e retornarão ao padrão após o encerramento da sessão.</li>
</ol>



<p class="wp-block-paragraph">Além dessas opções, uma abordagem mais moderna e modular é utilizar arquivos de configuração separados no diretório <kbd>/etc/sysctl.d/</kbd>. Por exemplo, você pode criar um arquivo chamado <kbd>/etc/sysctl.d/xx_postgresql.conf</kbd> para ajustes específicos do PostgreSQL (o <kbd>xx</kbd> representa algum número, que servirá para organizar e aplicar as configurações dos arquivos em ordem alfanumérica). Isso permite uma organização mais clara e evita a necessidade de modificar o sysctl.conf principal diretamente.</p>



<h3 class="wp-block-heading">Configurações gerais que melhoram a performance</h3>



<ul class="wp-block-list">
<li class=""><kbd>vm.dirty_ratio = 10:</kbd> limita a quantidade de memória que o sistema pode usar para guardar dados modificados que ainda não foram salvos no disco. Quando chega a 10%, o sistema começa a gravar esses dados no disco;</li>



<li class=""><kbd>vm.dirty_background_ratio = 5</kbd>: quando 5% da memória está cheia de dados não salvos, o sistema começa a gravar esses dados no disco, mas de forma mais tranquila e em segundo plano;</li>



<li class=""><kbd>vm.overcommit_ratio = 95</kbd>: informa a partir de qual porção da memória disponível (incluindo a RAM física e o swap em disco) o mecanismo de Out Of Memory Killer (OOM Killer para os íntimos) começará a ser utilizado. O valor padrão é de 50%, que consideramos muito baixo, por isso recomendamos utilizar 95%;</li>



<li class=""><kbd>vm.overcommit_memory = 2</kbd>: com essa configuração, o sistema operacional faz algumas checagens adicionais antes de matar um processo por falta de memória usando o OOM Killer. Esse é o nível mais seguro para se utilizar com o PostgreSQL;</li>



<li class=""><kbd>vm.swappiness = 1</kbd>: diz ao sistema para usar a memória RAM o máximo possível antes de começar a usar a área de swap (memória em disco), o que ajuda a manter o desempenho rápido.</li>
</ul>



<p class="wp-block-paragraph">Para aplicar as mudanças feitas diretamente no arquivo <kbd>sysctl.conf</kbd> ou no personalizado dentro do <kbd>/etc/sysctl.d/</kbd>, você pode usar o comando <kbd>sysctl -p</kbd>. Esse comando recarrega as configurações do <kbd>sysctl.conf</kbd>, aplicando as novas definições sem a necessidade de reiniciar o sistema.&nbsp;</p>



<p class="wp-block-paragraph">Já para aplicar temporariamente na sessão atual, você pode usar o comando <kbd>sysctl</kbd> diretamente, seguido do parâmetro e do valor que deseja configurar. Essas mudanças serão temporárias e durarão até que o sistema seja reiniciado ou a sessão atual seja encerrada.</p>



<p class="wp-block-paragraph">Exemplo:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">Debian shell: ajustando parâmetros de performance</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>sudo sysctl vm.dirty_ratio=10
sudo sysctl vm.dirty_background_ratio=5
sudo sysctl vm.overcommit_memory=2
sudo sysctl vm.overcommit_ratio=95
sudo sysctl vm.swappiness=1</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #005CC5">sudo sysctl vm.dirty_ratio=10</span></span>
<span class="line"><span style="color: #005CC5">sudo sysctl vm.dirty_background_ratio=5</span></span>
<span class="line"><span style="color: #005CC5">sudo sysctl vm.overcommit_memory=2</span></span>
<span class="line"><span style="color: #005CC5">sudo sysctl vm.overcommit_ratio=95</span></span>
<span class="line"><span style="color: #005CC5">sudo sysctl vm.swappiness=1</span></span></code></pre></div>



<h2 class="wp-block-heading">Huge pages</h2>



<p class="wp-block-paragraph">É um recurso do Linux que permite ao sistema operacional lidar com páginas (blocos) de memória maiores que o padrão de 4 KB. Com páginas maiores, o sistema precisa gerenciar menos páginas, o que reduz o trabalho do processador e melhora o desempenho. Em servidores com 32 GB de RAM ou mais, recomendamos configurar as huge pages.</p>



<p class="wp-block-paragraph">O PostgreSQL pode ser configurado para utilizar as huge pages, o que é indicado para controle total sobre a alocação de memória e a utilização mais eficiente da RAM. Para configurar o uso das huge pages, basta seguir estes passos:</p>



<ul class="wp-block-list">
<li class="">Checar o parâmetro <kbd>shared_buffers</kbd> (parâmetro que define a quantidade de RAM para armazenar dados temporários): basta rodar o comando abaixo no psql:</li>
</ul>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">SQL: consultando o parâmetro shared_buffers</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>SHOW shared_buffers;</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #24292E">SHOW shared_buffers;</span></span></code></pre></div>



<ul class="wp-block-list">
<li class="">Calcular o número de huge pages necessárias: precisamos definir o número de páginas, que pode ser calculado com base no valor de shared_buffers + 10%, dividido pelo tamanho da página. Então, o valor das huge pages deve ser = (shared_buffers(em MB) * 1,1)/ 2.</li>
</ul>



<p class="wp-block-paragraph">Exemplo:&nbsp;<br><kbd>shared_buffers</kbd> = 16 GB<br><kbd>hugepages</kbd> = (16 * 1024 *1,1) / 2 = 9011</p>



<ul class="wp-block-list">
<li class="">Aplicar o valor obtido: para isso, basta editar a linha <kbd>GRUB_CMDLINE_LINUX</kbd> no arquivo <kbd>/etc/default/grub</kbd>:</li>
</ul>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">Debian shell: aplicando novos valores em parâemtros no arquivo grub</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>GRUB_CMDLINE_LINUX="... hugepages=9011 hugepagesz=2M transparent_hugepage=never"</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #005CC5">GRUB_CMDLINE_LINUX=&quot;... hugepages=9011 hugepagesz=2M transparent_hugepage=never&quot;</span></span></code></pre></div>



<p class="wp-block-paragraph">É possível também ajustar o valor das huge pages no sysctl, mas em alguns casos (principalmente em servidores com mais de 256 GB de RAM) essa configuração pode falhar, como quando o SO não consegue alocar uma área contínua para as páginas após o boot. Logo, é mais seguro configurar as huge pages sempre no boot loader, nesse caso, o grub, que é o mais utilizado.</p>



<ul class="wp-block-list">
<li class="">Atualizar a alteração: é necessário executar como root ou sudo o comando <kbd>update-grub</kbd> e depois reiniciar o servidor com <kbd>reboot</kbd>.</li>
</ul>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">Debian shell: atualizando o servidor pós alterações em parâmetros</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>sudo update-grub
sudo reboot</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #005CC5">sudo update-grub</span></span>
<span class="line"><span style="color: #005CC5">sudo reboot</span></span></code></pre></div>



<h2 class="wp-block-heading">Transparent Huge Pages</h2>



<p class="wp-block-paragraph">Transparent Huge Pages é uma funcionalidade do kernel Linux que automaticamente gerencia e aloca as huge pages, ajudando o sistema a usar a memória de forma mais eficiente. O ajuste aqui também é recomendado para servidores com bastante RAM, de 32 GB ou mais.</p>



<p class="wp-block-paragraph"><strong>Vantagem:</strong> usar páginas maiores facilita o trabalho do sistema ao gerenciar a memória, evita o desperdício de espaço e pode deixar programas que usam muita memória mais rápidos.</p>



<p class="wp-block-paragraph"><strong>Desvantagem:</strong> o uso de páginas maiores pode causar problemas se o sistema precisar frequentemente converter páginas menores em páginas grandes. Esse processo de conversão pode gerar atrasos e sobrecarga adicional, especialmente em cargas de trabalho intensivas, o que pode prejudicar o desempenho em vez de melhorá-lo.&nbsp;</p>



<p class="wp-block-paragraph">Praticamente todos os bancos de dados relacionais, incluindo o PostgreSQL, sofrem uma piora na performance quando usam o THP, logo, é padrão desabilitá-lo.</p>



<p class="wp-block-paragraph"><strong>Configuração:</strong></p>



<p class="wp-block-paragraph">Para ver se o THP está ativado, você pode usar este comando:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">Debian shell: checando THP</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>~$ cat /sys/kernel/mm/transparent_hugepage/enabled
&#91;always&#93; madvise never</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #005CC5">~$ cat /sys/kernel/mm/transparent_hugepage/enabled</span></span>
<span class="line"><span style="color: #005CC5">&#91;always&#93; madvise never</span></span></code></pre></div>



<p class="wp-block-paragraph">Nessa saída, vemos que a funcionalidade está ativa de forma geral no sistema (pelo <kbd>always</kbd> selecionado). As outras duas opções representam:</p>



<ul class="wp-block-list">
<li class=""><kbd>madvise</kbd>: só é ativado para programas que solicitam explicitamente o uso de páginas grandes, através de uma chamada ao sistema madvise. Esse é um modo intermediário, no qual o THP não é usado em todas as situações, mas apenas quando recomendado;</li>



<li class=""><kbd>never</kbd>: o THP está desativado.</li>
</ul>



<p class="wp-block-paragraph">Se você quiser desativar o THP temporariamente (até reiniciar o sistema), use o seguinte comando:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">Debian shell: desativando THP temporariamente</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>echo "never" | sudo tee /sys/kernel/mm/transparent_hugepage/enabled</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #005CC5">echo &quot;never&quot; | sudo tee /sys/kernel/mm/transparent_hugepage/enabled</span></span></code></pre></div>



<p class="wp-block-paragraph">Já para desativá-lo permanentemente, o que traz um desempenho e uma performance mais consistentes e ideais para um servidor de banco de dados, basta adicionar o script abaixo no arquivo <kbd>/etc/rc.loca</kbd>l:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">Debian shell: desativando THP permanentemente</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
    echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi
if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
    echo never > /sys/kernel/mm/transparent_hugepage/defrag
fi</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #005CC5">if test -f /sys/kernel/mm/transparent_hugepage/enabled; then</span></span>
<span class="line"><span style="color: #005CC5">    echo never &gt; /sys/kernel/mm/transparent_hugepage/enabled</span></span>
<span class="line"><span style="color: #005CC5">fi</span></span>
<span class="line"><span style="color: #005CC5">if test -f /sys/kernel/mm/transparent_hugepage/defrag; then</span></span>
<span class="line"><span style="color: #005CC5">    echo never &gt; /sys/kernel/mm/transparent_hugepage/defrag</span></span>
<span class="line"><span style="color: #005CC5">fi</span></span></code></pre></div>



<h2 class="wp-block-heading">Limits</h2>



<p class="wp-block-paragraph">São configurações que determinam o uso máximo de recursos do sistema para processos e usuários. Os limits ajudam a controlar o consumo de recursos e a evitar que um único processo ou usuário sobrecarregue o sistema.</p>



<p class="wp-block-paragraph">Anteriormente, os limits de recursos eram configurados diretamente no arquivo <kbd>/etc/security/limits.conf</kbd>. No entanto, as versões mais recentes do sistema operacional Linux permitem que essas configurações sejam organizadas em arquivos específicos dentro do diretório <kbd>/etc/security/limits.d/</kbd>, o que facilita a gestão e a organização das configurações.</p>



<p class="wp-block-paragraph">Por exemplo, no caso do PostgreSQL, o arquivo <kbd>/etc/security/limits.d/90-postgresql.conf</kbd> pode ser utilizado para definir os limits de recursos específicos para o usuário <kbd>postgres</kbd>. Esses arquivos são organizados e aplicados por ordem alfanumérica, o que significa que faz diferença escolher um número (como o 90) no momento de nomear seu arquivo.</p>



<h3 class="wp-block-heading">Exemplo de configuração</h3>



<p class="wp-block-paragraph">Um parâmetro comum a ser configurado quando utilizamos grandes bancos de dados é o <kbd>nofile</kbd>, que define o número máximo de arquivos que um processo pode abrir ao mesmo tempo. No PostgreSQL, essa configuração é crucial para evitar erros relacionados ao excesso de arquivos abertos. Alguns dos erros comuns relacionados a esse parâmetro são:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">Debian shell: erro de carga de arquivos</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>LOG: out of file descriptors: Too many open files in system; release and retry 
PANIC: could not open file (...): Too many open files in system</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #005CC5">LOG: out of file descriptors: Too many open files in system; release and retry </span></span>
<span class="line"><span style="color: #005CC5">PANIC: could not open file (...): Too many open files in system</span></span></code></pre></div>



<p class="wp-block-paragraph">Para resolver, basta ajustar o parâmetro <kbd>nofile</kbd> dentro do arquivo <kbd>90-postgresql.conf</kbd>:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">Debian shell: ajustando parâmetro nofile</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>postgres soft nofile 65535
postgres hard nofile 65535</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #005CC5">postgres soft nofile 65535</span></span>
<span class="line"><span style="color: #005CC5">postgres hard nofile 65535</span></span></code></pre></div>



<p class="wp-block-paragraph">Na primeira linha, definimos o <em>soft limit</em> ou limite suave (valor que o sistema mantém, mas que pode ser alterado pelo próprio usuário, sem ultrapassar o <em>hard limit</em>) para o número de arquivos abertos pelo usuário postgres, como 65.535 arquivos.</p>



<p class="wp-block-paragraph">Já na segunda linha, foi definido o <em>hard limit</em> ou limite rígido (valor que só pode ser alterado por usuários com permissões elevadas) para o número de arquivos abertos pelo usuário <kbd>postgres</kbd>, também como 65.535 arquivos. Esse valor costuma ser adequado para a maioria dos bancos de dados grandes.</p>



<h2 class="wp-block-heading">Conclusão</h2>



<p class="wp-block-paragraph">Apesar da eficiência natural do PostgreSQL, ambientes críticos e pesados beneficiam-se muito de pequenos ajustes no Linux e melhoram o desempenho, a segurança e o bom uso dos recursos do hardware.&nbsp;</p>



<p class="wp-block-paragraph">Quanto mais você conhecer o tipo de carga do seu banco de dados, melhor poderá ajustar a arquitetura do seu servidor e as configurações do Linux. Este artigo mostra as opções mais comuns, utilizadas em todos os servidores de produção com os quais trabalhamos e recomendadas após uma longa experiência no assunto. No entanto, situações extremas podem se beneficiar de ajustes específicos que fogem do escopo deste artigo. De qualquer forma, com as sugestões apresentadas aqui, você certamente estará em boas mãos na maior parte dos casos.</p><p>The post <a href="https://savepoint.blog.br/2024/10/09/tuning-de-so-no-linux/">Tuning de SO (no Linux)</a> first appeared on <a href="https://savepoint.blog.br">Savepoint</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://savepoint.blog.br/2024/10/09/tuning-de-so-no-linux/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">8528</post-id>	</item>
		<item>
		<title>Escolhendo hardware para o seu servidor PostgreSQL</title>
		<link>https://savepoint.blog.br/2024/09/30/postgresql-hardware/</link>
					<comments>https://savepoint.blog.br/2024/09/30/postgresql-hardware/#respond</comments>
		
		<dc:creator><![CDATA[Savepoint]]></dc:creator>
		<pubDate>Mon, 30 Sep 2024 22:36:22 +0000</pubDate>
				<category><![CDATA[Instalação e Setup]]></category>
		<category><![CDATA[Internals e MVCC]]></category>
		<category><![CDATA[Performance e Tuning]]></category>
		<category><![CDATA[hardware]]></category>
		<category><![CDATA[PostgreSQL]]></category>
		<guid isPermaLink="false">https://savepoint.blog.br/?p=8517</guid>

					<description><![CDATA[<p>Introdução Agora que já falamos sobre cenários e seus tipos de cargas de dados, chegou o momento de sermos mais específicos e falarmos sobre hardware. A escolha do hardware correto é crucial para a performance e a segurança de um servidor de banco de dados. Neste artigo, abordaremos os aspectos mais importantes do hardware para bancos</p>
<p>The post <a href="https://savepoint.blog.br/2024/09/30/postgresql-hardware/">Escolhendo hardware para o seu servidor PostgreSQL</a> first appeared on <a href="https://savepoint.blog.br">Savepoint</a>.</p>]]></description>
										<content:encoded><![CDATA[<h2 class="wp-block-heading">Introdução</h2>



<p class="wp-block-paragraph">Agora que já falamos sobre cenários e seus tipos de cargas de dados, chegou o momento de sermos mais específicos e falarmos sobre hardware. A escolha do hardware correto é crucial para a performance e a segurança de um servidor de banco de dados. <br>Neste artigo, abordaremos os aspectos mais importantes do hardware para bancos de dados, considerando diferentes cenários de uso: aplicações web, OLTP e Data Warehouse.<br>Um ponto importante antes de começar a fuçar em diferentes possibilidades é, ao falar de <strong>bancos de dados em produção</strong>, ter uma postura um pouco mais conservadora. Ninguém gosta de arriscar demais quando falamos em bancos de dados. O prejuízo que se tem no caso de um desastre é alto demais. Então, lembre-se disso ao fazer as suas escolhas. Em ambientes de produção, evite a última moda, o lançamento mais recente, a tecnologia disruptiva, até que ela tenha sido testada e aprovada amplamente pelo mercado. Escolha componentes conhecidos, de fornecedores confiáveis e com robustez comprovada, sempre.</p>



<p class="wp-block-paragraph">Roteiro:</p>



<ul class="wp-block-list">
<li class="">Diferenças entre ambientes (teste, homologação e produção)</li>



<li class="">CPU</li>



<li class="">Memória RAM</li>



<li class="">Disco &amp; Cia</li>



<li class="">Rede</li>



<li class="">Aspectos importantes de hardware para banco de dados</li>



<li class="">Hardware para cenários específicos</li>
</ul>



<h2 class="wp-block-heading">Diferenças entre ambientes (testes, homologação e produção)</h2>



<p class="wp-block-paragraph">A escolha do hardware para servidores de bancos de dados varia significativamente de acordo com o ambiente em que ele vai rodar. Apesar de cada equipe usar um nome diferente, geralmente os ambientes são resumidos em três categorias:</p>



<ul class="wp-block-list">
<li class=""><strong>Testes ou desenvolvimento</strong>: algumas pessoas desenvolvem no seu próprio desktop ou possuem um servidor menor para testes e desenvolvimento. Geralmente, utilizam um hardware bem menor com menos poder de fogo e sem muitos requisitos de segurança. Aqui, o mais importante é a flexibilidade de subir novos ambientes para novas tarefas. É muito comum precisar subir um ambiente de teste novo isolado para desenvolver uma funcionalidade específica. O uso de contêineres também é bem comum;</li>



<li class=""><strong>Homologação ou QA</strong>: aqui os requisitos de desempenho geralmente são importantes. É comum utilizar uma cópia recente da base de produção, com o mesmo volume de dados, na hora de homologar uma nova funcionalidade ou simular um erro encontrado por um usuário. Nesse caso, não queremos apenas saber se alguma coisa funciona ou não, queremos saber se o desempenho é satisfatório, medir a velocidade, fazer testes com carga mais próxima possível da realidade, para evitar sustos na hora de colocar em produção. Por outro lado, os requisitos de segurança do hardware também não são importantes, de forma que não há uma preocupação com alta disponibilidade do hardware, por exemplo;</li>



<li class=""><strong>Produção</strong>: aqui é o nosso ponto focal do artigo. Precisamos tanto de desempenho como de segurança. Aí é que entra o problema da tríade: custo, segurança e desempenho. Você não consegue ter os três ao mesmo tempo, precisa escolher apenas dois! Focaremos boa parte do nosso artigo especificamente nesse ambiente, que é o mais crítico de todos e onde os custos chamam a atenção. Portanto, é importante saber onde investir o seu limitado orçamento para tirar o melhor proveito possível dele.&nbsp;</li>
</ul>



<h2 class="wp-block-heading">CPU</h2>



<p class="wp-block-paragraph">O primeiro ponto em que se pensa quando vamos adquirir um servidor (seja <em>on premise</em> ou na nuvem) para rodar um banco de dados em produção é a CPU. Talvez esse não seja o item mais importante de todos (vamos falar sobre isso adiante), mas certamente costuma ser o primeiro a ser lembrado.</p>



<h3 class="wp-block-heading">Desempenho&nbsp;</h3>



<p class="wp-block-paragraph">Do ponto de vista do desempenho, há três pontos importantes para se observar:</p>



<ul class="wp-block-list">
<li class=""><strong>Velocidade do clock da CPU</strong>. Quanto maior a velocidade da CPU, mais rapidamente ela vai processar as solicitações dos usuários do banco de dados. Isso é especialmente importante em ambientes com cálculos complexos como IA, Data Science e BI;</li>



<li class=""><strong>Número de processadores/cores/threads</strong>. Se você está num ambiente OLTP ou Web, entenda que cada requisição de usuário vai ocupar uma CPU. Se você possuir várias dezenas de requisições ao mesmo tempo, vai precisar de várias CPUs para processá-las rapidamente. Se o número de requisições for maior que a quantidade de CPUs disponíveis, as requisições vão ficar numa fila de espera e a aplicação terá de ficar aguardando. Num ambiente de Data Science ou BI, o PostgreSQL também poderá quebrar consultas complexas e pesadas em pedaços menores e utilizar uma CPU para cada um desses pedaços, paralisando a solicitação. Dessa forma, possuir mais CPUs irá agilizar solicitações complexas e pesadas através desse tipo de recurso;</li>



<li class=""><strong>Quantidade de cache L1, L2 e L3.</strong> Memória é sempre um bom investimento. A memória interna da CPU é mais rápida que a memória RAM externa que você mesmo instala no servidor. Bancos de dados costumam trabalhar com grandes volumes de dados, e geralmente quanto mais RAM, mais rápido você consegue processar as informações. Operações internas de consultas, como ordenações, hash joins etc., se beneficiam muito de um bom cache na CPU.</li>
</ul>



<h3 class="wp-block-heading">Segurança</h3>



<p class="wp-block-paragraph">Do ponto de vista da segurança, o mais importante é evitar processadores utilizados em desktops. Servidores de produção quase sempre operam em regime 24/7, não são desligados nunca. Então, processadores desenvolvidos para servidores têm uma vida útil maior e são feitos para rodar com carga ininterruptamente. Se você utilizar um processador de desktop para rodar no seu servidor 24/7, provavelmente a vida útil dele será menor do que a esperada. A mesma questão se aplica a outros componentes, como memória, discos etc.</p>



<h3 class="wp-block-heading">CPUs para servidores de produção no mercado hoje</h3>



<p class="wp-block-paragraph">Existem três grandes fornecedores de CPU para servidores no mercado:</p>



<ul class="wp-block-list">
<li class="">A <strong>Intel</strong>, fornecedora mais tradicional de CPUs. Esqueça as linhas i3, i5, i7 e i9 da Intel. Em servidores, ela oferece a linha <a href="https://www.intel.com.br/content/www/br/pt/products/details/processors/xeon.html">Xeon</a>, que domina o mercado de servidores há uns bons anos. Esses servidores são considerados robustos e rápidos, possuem versões com diferentes velocidades de clock, quantidades de cache e cores. No momento em que este artigo foi escrito, a linha Xeon está na sua 6<sup>a</sup> geração e possui processadores com até 144 cores, 3.2 GHz de frequência e 108 MB de cache (vale lembrar que existem vários tipos de cache dentro de uma CPU);</li>



<li class="">A <strong>AMD </strong>é a segunda fornecedora mais conhecida de CPUs, sendo mais popular no mercado de desktops, mas, de uns anos para cá, ela também tem se mostrado competitiva no segmento de servidores. Assim como a Intel, a AMD possui a linha Ryzen e Athlon para desktops, mas no segmento de servidores, vamos olhar para a linha <a href="https://www.amd.com/pt/products/processors/server/epyc.html">EPYC</a>. Os processadores EPYC, no momento em que este artigo foi escrito, estão na sua 4ª geração, e a Série 9004 possui hoje modelos com até 128 cores, 4.4 GHz de frequência e até 1 GB de cache L3;</li>



<li class="">A <strong>ARM</strong> é uma fabricante líder em processadores para dispositivos embarcados, mas que passou a ser muito utilizada na AWS, devido ao seu baixo custo e baixo consumo de energia, o que pesa consideravelmente quando pensamos num datacenter com milhares de servidores. A linha Neoverse N1 e N2 é dedicada a servidores com até 128 cores.</li>
</ul>



<h3 class="wp-block-heading">Memória RAM</h3>



<p class="wp-block-paragraph">Para manipular os dados do seu banco de dados, as informações contidas nas suas tabelas precisam estar na memória RAM antes de serem processadas pela CPU. Num cenário ideal, seria possível guardar todos os dados de todas as tabelas do seu banco de dados na RAM. Assim, todas as operações seriam muito mais rápidas. Infelizmente, isso não é possível na maioria das vezes. Hoje em dia, consideramos que um banco de dados com alguns TBs é de tamanho médio, e um servidor com 1 TB de RAM, embora seja possível e existam modelos assim no mercado, possui um custo nada acessível. Dessa forma, investir em memória costuma ser um ótimo benefício, pois quanto mais o seu banco de dados couber na RAM, maior a chance de você não precisar acessar o disco, que é muito mais lento.</p>



<h3 class="wp-block-heading">DDR DIMM</h3>



<p class="wp-block-paragraph">A RAM é vendida em módulos com chips colados em ambos os lados de uma pequena placa, chamada de DIMM (<em>Dual In-line Memory Module</em>). Existem vários modelos de memória RAM no mercado com diferentes características. A primeira e mais comum é a velocidade delas. No momento em que este artigo foi escrito, as memórias costumam utilizar o padrão DDR (<em>Double Data Rate</em>), que hoje estão na sua 5<sup>a</sup> geração, conhecidas como DDR5, lançadas em 2023 com velocidades entre 4000 MT/s e 8000 MT/s. O padrão DDR4, lançado em 2014, ainda se encontra no mercado e tem velocidades 1600 MT/s e 3200 MT/s. O padrão DDR6 tem lançamento previsto para 2026.</p>



<h3 class="wp-block-heading">UDIMM, RDIMM e LRDIMM</h3>



<p class="wp-block-paragraph">Existem também os padrões UDIMM, RDIMM e LRDIMM, que se diferenciam pelos mecanismos internos de buffer.</p>



<ul class="wp-block-list">
<li class="">Memórias <strong>UDIMM </strong>não possuem buffer (<em>Unbuffered</em> DIMM) e são mais baratas, mas consomem mais energia e são mais instáveis. Além disso, não é possível utilizar grandes quantidades de RAM UDIMM na mesma máquina. Logo, as memórias UDIMM são mais baratas e mais comuns de se encontrar em desktops. Não utilizamos memórias UDIMM em servidores de produção;</li>



<li class="">Memórias <strong>RDIMM </strong>possuem buffer (<em>Registred</em> DIMM), são mais estáveis e podem utilizar vários módulos de memória na mesma máquina com velocidades maiores também. São as mais comuns de se encontrar em servidores. É esse tipo de memória que você deve utilizar no seu ambiente de produção nos dias de hoje;</li>



<li class="">Memórias <strong>LRDIMM </strong>(<em>Load Reduced</em> DIMM) e outras versões proprietárias de fabricantes específicos prometem melhorias e tecnologias específicas para melhorar o desempenho ou o consumo de energia.&nbsp;</li>
</ul>



<h3 class="wp-block-heading">ECC</h3>



<p class="wp-block-paragraph">Memórias em servidores de bancos de dados devem sempre utilizar o padrão ECC (<em>Error Checking and Correcting</em>). Memórias sem ECC têm lá seus mecanismos de detecção de erros, mas não são tão eficientes quanto as que usam ECC. Esse é o padrão mais confiável hoje, utilizado e aprovado pelo mercado há um bom tempo. Não arrisque! Falhas de memória sem ECC podem levar a falhas catastróficas no seu banco de dados.</p>



<h2 class="wp-block-heading">Discos ou armazenamento não volátil</h2>



<p class="wp-block-paragraph">Os discos são dispositivos de armazenamento fundamentais para servidores de banco de dados, responsáveis por guardar e acessar dados de forma eficiente. Eles variam em tipo, desempenho e capacidade, influenciando diretamente a performance do banco de dados. Os discos são provavelmente o componente que você vai escolher com mais cuidado ao montar um servidor de banco de dados. Possivelmente, será a parte mais cara dele também. O problema fundamental é que, normalmente, as pessoas pensam em discos apenas pela sua capacidade. Aqui temos que pensar não apenas na capacidade (e espaço para acomodar o banco de dados, espaço para ele crescer nos próximos anos, backups etc.), mas também no desempenho, na segurança etc. Bancos de dados exigem muito dos discos, gravam constantemente, lêem o tempo todo e, se qualquer coisa der errado, o prejuízo é ainda maior do que se qualquer outro componente do servidor falhasse, pois pode envolver, além da indisponibilidade do banco de dados, a perda de dados.&nbsp;</p>



<p class="wp-block-paragraph">Ao pensar na “persistência dos dados”, temos que pensar em todo o conjunto envolvido no processo:&nbsp;</p>



<ul class="wp-block-list">
<li class="">Storages externos</li>



<li class="">Controladoras de discos</li>



<li class="">RAID</li>



<li class="">Discos</li>



<li class="">Particionamento de discos</li>
</ul>



<h3 class="wp-block-heading">Storages</h3>



<p class="wp-block-paragraph">Em vez de armazenar os dados do seu banco dentro do servidor, você pode ter discos físicos locais dentro do servidor apenas para o sistema operacional e armazenar todos os dados num servidor externo dedicado apenas para lidar com isso, conhecido como storage. Existem diversos tipos no mercado. Os mais caros e poderosos utilizam uma rede separada, a SAN (<em>Storage Area Network</em>), com uma tecnologia específica, como a <a href="https://en.wikipedia.org/wiki/Fibre_Channel">Fibre Channel</a> ou a <a href="https://en.wikipedia.org/wiki/InfiniBand">InfiniBand</a>, ou o protocolo TCP/IP com o <a href="https://en.wikipedia.org/wiki/ISCSI">iSCSI</a>. Nesse caso, você terá que utilizar duas placas adaptadoras para se comunicar com essa rede, conhecidas como HBA (<em>Host Bus Adapter</em>). Então existem duas possibilidades: é possível se conectar diretamente no storage, o que chamamos de DAS (<em>Direct Attached Storage</em>), ou numa SAN, utilizando switches e cabos especiais para conectar todos os servidores em um ou mais storages. Toda essa rede utiliza uma arquitetura chamada fabric, onde todos os componentes da rede têm redundância: HBAs, cabos, switches.<br>Outra opção mais simples, mais barata e bem menos robusta, segura e veloz é utilizar um NAS (<em>Network Attached Storage</em>), que é um storage plugado numa rede TCP/IP normal e que utiliza protocolos como o <a href="https://pt.wikipedia.org/wiki/Network_File_System">NFS </a>(<em>Network File System</em>) no Linux. O NAS é uma ótima opção para armazenamento de grandes volumes de dados que não precisam de muita confiabilidade e desempenho. Esse não é o caso dos nossos bancos de dados em produção. Não o utilize em ambientes críticos.</p>



<p class="wp-block-paragraph">Storages são componentes caros e complexos. Podem ter o tamanho de um simples servidor 4U num rack ou podem ocupar 2, 4, 8 racks full size inteiros. Quando você compra um brinquedinho desses, faz um contrato de suporte com o seu fornecedor por três a cinco anos. Seu equipamento será monitorado remotamente pelo fornecedor. Quando um disco falhar, ele irá bater na sua porta no dia seguinte com um técnico trazendo um disco novo debaixo do braço e vai trocar esse disco sem paralisar a sua operação. Sim, tudo utilizando hot swap e, claro, a tecnologia RAID, que vamos comentar a seguir. Quando acabar o período de contrato do suporte, você vai comprar um novo storage e substituir completamente o antigo, colocando-o para fazer coisas menos nobres, como no ambiente de homologação. Nenhum fornecedor de storage renova o contrato de suporte depois de vencido esse prazo de três a cinco anos. Entende como funciona? Além disso, um storage tem várias vantagens, como oferecer uma quantidade absurda de cache de gravação e leitura, baterias internas e redundantes que garantem o seu funcionamento em caso de falha de energia elétrica, controladoras robustas, capacidade de acomodar centenas de discos físicos e agregá-los de diferentes formas e, por fim, software caríssimo que oferece formas facilitadas de monitoramento, backup etc.</p>



<h3 class="wp-block-heading">RAID</h3>



<p class="wp-block-paragraph">Técnica que combina múltiplos discos físicos para aumentar a performance e/ou confiabilidade. Diferentes níveis de RAID (como RAID 0, 1, 5, 10) oferecem variações entre tolerância a falhas, velocidade e capacidade de armazenamento. Aqui está um resumo sobre os mais populares:</p>



<ul class="wp-block-list">
<li class=""><strong>JBOD (<em>Just a Bunch of Disks</em>)</strong>: é o que existia antes do RAID. Você colocava vários discos no servidor, e cada um aparecia com pelo menos uma partição separada. Você tinha que distribuir os dados em tablespaces mapeados para cada disco e sair distribuindo índices e tabelas em tablespaces distintos. Um verdadeiro show de horror e um trabalho interminável. Ninguém mais usa isso, ufa!;</li>



<li class=""><strong>RAID 0</strong>: aumenta o desempenho ao dividir os dados entre vários discos (conhecido como striping), mas não oferece proteção contra falhas. Se um disco falhar, todos os dados são perdidos. Ninguém usa RAID 0 no nível de hardware em produção. Não faça isso, sério! O risco é enorme. No entanto, na nuvem, é comum utilizar RAID 0 por software, uma vez que já se supõe que exista algum tipo de RAID (que ninguém sabe direito qual é) no hardware do fornecedor. Veja que estamos falando de um cenário bem específico, ok?;</li>



<li class=""><strong>RAID 1</strong>: duplica os dados em dois discos (espelhamento). Se um disco falhar, o outro tem uma cópia idêntica dos dados, oferecendo alta segurança, mas sem aumento de desempenho em leitura. Utilizamos o RAID 1 normalmente quando temos apenas dois discos idênticos. Em outros casos, utilizamos o RAID 10;</li>



<li class=""><strong>RAID 5</strong>: distribui os dados e a paridade (informação usada para recuperar dados) entre três ou mais discos. Oferece um certo equilíbrio entre desempenho de leitura, capacidade e segurança. No entanto, para gravação, o RAID 5 tem uma perda considerável de performance, não sendo recomendado para ambientes OLTP. A segurança do RAID 5 também é muito questionável, pois quando um dos discos falha, ao substituir por um novo, é comum que um segundo disco falhe junto. No entanto, se você tiver que lidar com um volume muito grande de dados estáticos e/ou históricos (em que você faz muita leitura e pouca gravação), um bom RAID 5 pode ser uma opção como um segundo RAID, separando os dados mais críticos em um RAID 1 ou RAID 10, por exemplo;</li>



<li class=""><strong>RAID 6</strong>: é como o RAID 5, porém requer pelo menos quatro discos, já que os dados são gravados em dois deles. Suporta falha em dois discos sem perder dados. Apesar de ser um pouco mais seguro que o RAID 5, possui os mesmos problemas que o RAID 5 em termos de desempenho;</li>



<li class=""><strong>RAID 10 ou RAID 1 + 0</strong>: é uma junção do RAID 0 com o RAID 1. Assim você tem a segurança do espelhamento do RAID 1 com a velocidade da distribuição de dados do RAID 0. Você precisa de, no mínimo, quatro discos para fazer um RAID 10 e deve aumentar o número de discos sempre em números pares: 6, 8, 10, 12 etc. </li>
</ul>



<p class="wp-block-paragraph">Se você tem um servidor muito pequeno, comece com um RAID 1. Se tem um servidor maior, pense no RAID 10. Se tem um volume muito grande de dados, pense numa combinação entre RAID 1 ou 10 com um RAID 5 ou 6.</p>



<p class="wp-block-paragraph">Importante frisar que a técnica RAID não substitui backups de rotina, pois não protege contra todos os tipos de falha, como erros humanos, e não oferece histórico de versões.</p>



<h3 class="wp-block-heading">Controladoras de disco</h3>



<p class="wp-block-paragraph">Trata-se de hardware dedicado que gerencia a comunicação entre o servidor e os discos. Controladoras RAID são específicas para implementar diferentes níveis de RAID, garantindo melhor desempenho e segurança dos dados. Se você utiliza um storage, ele já deve ter uma excelente controladora de discos embutida, então não precisa se preocupar com isso. Se está na nuvem, menos ainda. Mas se você vai guardar todos os seus discos físicos dentro do seu servidor… precisa, sim, pensar na controladora que vai utilizar. Todo servidor, em geral, tem uma controladora de discos embutida na placa-mãe. Essa controladora embutida é limitada em número de discos suportados, possibilidade de fazer RAID, cache e uso de bateria embutida.<br>Cada controladora suporta uma interface específica de discos. Desktops utilizavam discos SATA (Serial ATA), e servidores utilizavam o SCSI, Fibre Channel ou Serial Attached SCSI, até que os discos mecânicos passaram a dar lugar aos discos de estado sólido, os SSDs. Hoje em dia, quase ninguém usa mais discos mecânicos, e tudo isso virou de cabeça para baixo. Existem N formatos de discos SSDs e soluções que foram nascendo e morrendo com o tempo. Vale lembrar que os discos SSDs em servidores são bem diferentes dos discos utilizados em desktops. Servidores de grande porte utilizam os discos NVMe (<em>Non Volatile Memory Express</em>), que se conectam através do barramento PCI Express e substituem a arquitetura utilizada em discos mecânicos, a AHCI. </p>



<p class="wp-block-paragraph">Atualmente, boa parte das soluções se concentram em placas PCI Express com várias memórias SSD agrupadas e algumas capacidades embutidas de RAID e cache. Processadores para servidores de topo de linha também possuem controladoras embutidas NVMe com capacidade de gerenciar dezenas de discos SSDs. Hoje em dia, se você não vai utilizar um storage externo e quer utilizar vários discos SSDs, é melhor entrar em contato com o seu fornecedor de servidores e conversar com ele sobre as soluções disponíveis.&nbsp;</p>



<h3 class="wp-block-heading">Discos mecânicos</h3>



<p class="wp-block-paragraph">São um tanto ultrapassados, mas ainda utilizados em lugares onde se precisa de muito volume, pouco desempenho e baixo custo. Esse não costuma ser o lugar em que são utilizados bancos de dados. Apenas evite!</p>



<h3 class="wp-block-heading">Discos SSD</h3>



<p class="wp-block-paragraph">Já faz um tempinho (2008) quando <a href="https://savepoint.blog.br/2008/10/06/enterprise_ssd/">cantamos a bola de que os SSDs iriam substituir os discos magnéticos</a> mesmo em servidores de bancos de dados; 15 anos depois, eles viraram padrão de mercado.</p>



<p class="wp-block-paragraph">É um termo amplo que abrange qualquer dispositivo de armazenamento que tenha uma presença física tangível, incluindo discos magnéticos (HDDs), discos de estado sólido (SSDs), discos ópticos (como CDs e DVDs) e outros tipos de mídia de armazenamento. O termo &#8220;disco físico&#8221; é frequentemente usado para diferenciar esses dispositivos de discos virtuais ou na nuvem, que não têm uma presença física direta acessível ao usuário.</p>



<h3 class="wp-block-heading">Discos magnéticos</h3>



<p class="wp-block-paragraph">É um tipo específico de tecnologia de armazenamento, em que os dados são gravados em discos revestidos com material magnético. O HDD (<em>Hard Disk Drive</em>) é o exemplo mais comum de disco magnético. Esses discos são conhecidos por sua capacidade de armazenar grandes volumes de dados a um custo relativamente baixo, mas têm desempenho de leitura e escrita mais lento em comparação com outras tecnologias, como os SSDs.</p>



<h3 class="wp-block-heading">Discos SSD</h3>



<p class="wp-block-paragraph">Discos SSD definitivamente não são todos iguais. Uma enorme variedade de opções e formatos estão disponíveis no mercado. Temos três questões para se avaliar sobre discos: capacidade, desempenho e segurança. Capacidade é a parte mais simples. Diz respeito ao volume de dados que ele é capaz de armazenar. Nenhum mistério até aí. Velocidade já é um negócio mais manhoso, pois tem várias métricas diferentes. A primeira é a velocidade de transferência, quantos MB/s você consegue transferir. Mas não é tão simples. Essa capacidade muda se o acesso for sequencial ou aleatório. Também muda muito se for para leitura ou escrita. Outro ponto é o número de operações por segundo, medido por IOPS. Esse é um dos principais índices para medir o desempenho de um disco SSD. Novamente, varia bastante quando você está lendo ou gravando. Existem algumas outras métricas, mas essas são as principais.<br>Quando falamos de segurança em discos SSD, você precisa entender uma coisa importante: cada bit de um disco SSD suporta uma quantidade limitada de ciclos de gravação. Assim, quanto mais vezes você gravar no seu disco, menor será a sua vida útil. Sendo assim, quando você compra um disco SSD, ele vem com uma medida de MTBF (<em>Mean Time Between Failures</em>). Esses testes são feitos em um regime específico de trabalho, então esses números podem mudar muito se você pegar um SSD projetado para ser utilizado em um desktop e rodar um banco de dados 24/7 nele. Ele vai abrir o bico muito antes do esperado e vai deixar você na mão. É por isso que discos SSD para servidores são classificados em três tipos:</p>



<ul class="wp-block-list">
<li class="">Read intensive, em que o disco vai suportar operações de leitura 24/7 por um bom tempo, mas não vai durar muito tempo se você fizer muitas operações de gravação. Você deve evitar o uso desse tipo de disco em bancos de dados de produção;</li>



<li class="">Mixed use, que possui um desempenho melhor em gravação e uma durabilidade maior em ambientes com um volume razoável de escritas. Esse tipo é adequado para bancos de dados em produção em casos genéricos, mas pode ser insuficiente para ambientes OLTP, que sofrem muitas operações de gravação;</li>



<li class="">Write intensive: esse é o tipo de disco mais caro e com melhor desempenho e durabilidade em operações de gravação. São ideais para bancos de dados em operação crítica e ambientes OLTP pesados.</li>
</ul>



<h3 class="wp-block-heading">Discos na nuvem</h3>



<p class="wp-block-paragraph">Os discos na nuvem referem-se a soluções de armazenamento fornecidas por provedores de serviços em nuvem, como AWS, Azure ou Google Cloud. Esses discos são virtuais, ou seja, não há um hardware físico específico vinculado ao usuário. Eles oferecem alta flexibilidade, escalabilidade e fácil integração com outras soluções na nuvem. Além disso, são frequentemente replicados em diferentes locais geográficos para garantir alta disponibilidade e durabilidade dos dados.<br>Discos na nuvem são ideais para cenários em que a elasticidade e a gestão simplificada são importantes. Cada fornecedor de nuvem possui diferentes opções de discos ou &#8220;block storage&#8221; que você pode utilizar em diversas situações. Você vai ter que estudar um pouco sobre cada um e escolher o que melhor lhe atende de acordo com o seu ambiente, mas dificilmente vai saber que tipo de hardware está sendo utilizado embaixo do capô.</p>



<h3 class="wp-block-heading">Aspectos importantes de hardware para bancos de dados</h3>



<p class="wp-block-paragraph">Para garantir a eficiência e a performance de um banco de dados, é essencial considerar os seguintes componentes de hardware:</p>



<ul class="wp-block-list">
<li class=""><strong>CPU (Processador)</strong>
<ul class="wp-block-list">
<li class="">Número de núcleos: mais núcleos permitem processar mais transações simultaneamente;</li>



<li class="">Frequência: processadores com alta frequência são melhores para tarefas que requerem alto desempenho por núcleo.</li>
</ul>
</li>
</ul>



<ul class="wp-block-list">
<li class=""><strong>Memória RAM</strong>
<ul class="wp-block-list">
<li class="">Quantidade: deve ser suficiente para manter os dados frequentemente acessados na memória, reduzindo a necessidade de acesso ao disco;</li>



<li class="">Velocidade: RAM mais rápida melhora o tempo de resposta das operações.</li>
</ul>
</li>



<li class=""><strong>Armazenamento</strong></li>
</ul>



<ul class="wp-block-list">
<li class="">SSDs: oferecem alta velocidade de leitura e escrita, essencial para a performance do banco de dados;</li>



<li class="">IOPS (Operações de Entrada/Saída por Segundo): alta IOPS é crucial para sistemas com alta carga de transações.</li>
</ul>



<ol start="2" class="wp-block-list">
<li class=""><strong>Rede</strong>
<ul class="wp-block-list">
<li class="">Largura de banda: necessária para suportar múltiplos acessos simultâneos;</li>



<li class="">Latência: baixa latência garante respostas rápidas.</li>
</ul>
</li>
</ol>



<p class="wp-block-paragraph">Claro que a priorização desses componentes vai variar de acordo com o cenário e o tipo de carga de banco de dados, que exploraremos adiante.</p>



<h2 class="wp-block-heading">Hardware para cenários específicos</h2>



<h3 class="wp-block-heading">OLTP</h3>



<ul class="wp-block-list">
<li class=""><strong>Processador</strong>: você vai precisar de muitos núcleos para dar conta de muitas conexões simultâneas. Processadores rápidos com mais cache também vão ajudar no processamento de transações complexas, típicas de ambientes OLTP;</li>



<li class=""><strong>Memória RAM</strong>: quanto mais memória melhor, sempre. Quanto mais porcentagem do banco couber na RAM, melhor. Muitas conexões simultâneas também consomem memória para fazer suas operações de consulta, então seja generoso na quantidade de RAM;</li>



<li class=""><strong>Armazenamento</strong>: discos SSD NVMe Write intensive ou mixed use com RAID 1 ou RAID 10 são as melhores opções.&nbsp;</li>
</ul>



<h3 class="wp-block-heading">Web</h3>



<ul class="wp-block-list">
<li class=""><strong>Processador:</strong> ambientes web costumam lidar com uma quantidade absurda de requisições simultâneas. Foque aqui em ter muitas cores;</li>



<li class=""><strong>Memória RAM:</strong> aqui você com certeza quer cachear a maior parte do seu banco. Mais uma vez seja generoso na quantidade;</li>



<li class=""><strong>Armazenamento:</strong> aqui você deve ter uma quantidade menor de gravações em geral, discos SSD NVMe com RAID 1, 5 ou 10 do tipo read intensive ou mixed use devem resolver bem.</li>
</ul>



<h3 class="wp-block-heading">Data Warehouse / BI / Data Science</h3>



<ul class="wp-block-list">
<li class=""><strong>Processador</strong>: você precisa de mais cores para paralelizar as consultas, mas preste mais atenção na velocidade deles, pois esse tipo de carga costuma exigir cálculos mais complexos;</li>



<li class=""><strong>Memória RAM</strong>: esse tipo de ambiente costuma trabalhar com bases enormes, logo, vai precisar de uma boa quantidade de RAM para acompanhar;</li>



<li class=""><strong>Armazenamento</strong>: aqui a velocidade de gravação não é tão importante, você pode, às vezes, trabalhar com RAID 5 e discos read intensive ou mixed use. Vale a pena notar a frequência e o volume de cargas periódicas que você faz nesse ambiente para dosar melhor a importância das operações de gravação.</li>
</ul>



<h2 class="wp-block-heading">Conclusão</h2>



<p class="wp-block-paragraph">Aqui, apenas pincelamos algumas considerações sobre hardware na hora de montar o seu servidor. É claro que não temos uma fórmula mágica. Cada caso é um caso. Além disso, estamos falando de tecnologias em constante evolução, o que vale hoje pode não valer mais amanhã. Mesmo assim, lembre-se de ser conservador e se preocupe com a qualidade dos componentes, pensando em utilizar um hardware mais seguro, com fontes redundantes, ventoinhas redundantes, nobreaks, geradores de energia e até ar-condicionado redundantes.<br>Segurança é um tema extenso e complexo, mas começa em decisões simples como a de escolher componentes feitos para aguentar o tipo de carga que você espera, em vez de achar que qualquer desktop um pouco melhor vai dar conta do recado.</p><p>The post <a href="https://savepoint.blog.br/2024/09/30/postgresql-hardware/">Escolhendo hardware para o seu servidor PostgreSQL</a> first appeared on <a href="https://savepoint.blog.br">Savepoint</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://savepoint.blog.br/2024/09/30/postgresql-hardware/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">8517</post-id>	</item>
		<item>
		<title>Tipos de cargas dos bancos de dados</title>
		<link>https://savepoint.blog.br/2024/09/16/tipos-de-cargas-dos-bancos-de-dados/</link>
					<comments>https://savepoint.blog.br/2024/09/16/tipos-de-cargas-dos-bancos-de-dados/#respond</comments>
		
		<dc:creator><![CDATA[Savepoint]]></dc:creator>
		<pubDate>Mon, 16 Sep 2024 14:32:16 +0000</pubDate>
				<category><![CDATA[Internals e MVCC]]></category>
		<category><![CDATA[Performance e Tuning]]></category>
		<category><![CDATA[Banco de Dados]]></category>
		<guid isPermaLink="false">https://savepoint.blog.br/?p=8513</guid>

					<description><![CDATA[<p>Introdução Cargas de dados referem-se aos diferentes tipos de operações e transações que um banco de dados deve processar. Essas cargas variam conforme o tipo de aplicação e o uso do banco de dados, influenciando a forma como os dados são armazenados, acessados e manipulados. Compreender os diferentes tipos de cargas de dados ajuda a</p>
<p>The post <a href="https://savepoint.blog.br/2024/09/16/tipos-de-cargas-dos-bancos-de-dados/">Tipos de cargas dos bancos de dados</a> first appeared on <a href="https://savepoint.blog.br">Savepoint</a>.</p>]]></description>
										<content:encoded><![CDATA[<h2 class="wp-block-heading">Introdução</h2>



<p class="wp-block-paragraph">Cargas de dados referem-se aos diferentes tipos de operações e transações que um banco de dados deve processar. Essas cargas variam conforme o tipo de aplicação e o uso do banco de dados, influenciando a forma como os dados são armazenados, acessados e manipulados. Compreender os diferentes tipos de cargas de dados ajuda a otimizar o desempenho e a eficiência do sistema, já que através disso surge a possibilidade de tomar as melhores escolhas em relação a hardware e parâmetros de otimização do seu banco, tornando-o mais rápido e eficiente. Então, neste artigo veremos:</p>



<ul class="wp-block-list">
<li class="">Tipos de cargas
<ul class="wp-block-list">
<li class="">OLTP</li>



<li class="">DW</li>



<li class="">WEB</li>



<li class="">Mixed</li>



<li class="">Desktop</li>
</ul>
</li>
</ul>



<h2 class="wp-block-heading">Tipos de cargas</h2>



<h3 class="wp-block-heading">OLTP (<em>Online Transaction Processing</em> ou Processamento de Transação Online)</h3>



<h4 class="wp-block-heading">Características</h4>



<ul class="wp-block-list">
<li class="">Alta concorrência (muitas conexões simultâneas) e baixa latência: precisa ser rápido e acontece muitas vezes e ao mesmo tempo;</li>



<li class="">Alto volume de pequenas transações: inserção, atualização ou exclusão de pequenas quantidades de dados;</li>



<li class="">Necessita de alta disponibilidade e consistência: deve estar sempre disponível para transações a qualquer momento, garantindo que os dados estejam sempre corretos e íntegros, mesmo em caso de falhas;</li>



<li class="">Também pode incluir rotinas de transações longas e complexas.</li>
</ul>



<h4 class="wp-block-heading">Recursos de hardware importantes</h4>



<ul class="wp-block-list">
<li class="">CPU: processadores de alta performance com muitos núcleos para lidar com múltiplas transações simultâneas;</li>



<li class="">Memória: quantidade suficiente de RAM para manter os dados frequentemente acessados em memória;</li>



<li class="">Disco: armazenamento SSD veloz para garantir acesso rápido aos dados e alta IOPS (<em>Input/Output Operations Per Second</em>);</li>



<li class="">Rede: conectividade de rede rápida e confiável para suportar múltiplos acessos simultâneos.</li>
</ul>



<h4 class="wp-block-heading">Exemplos de sistema OLTP</h4>



<ul class="wp-block-list">
<li class="">Sistemas bancários: processamento de transações financeiras, como depósitos, retiradas, transferências de fundos, pagamentos de contas e consultas de saldo;</li>



<li class="">E-commerce (lojas virtuais): transação de compra, como adição ao carrinho, finalização de compra, atualização de estoque, processamento de entradas de pedidos;</li>



<li class="">Sistema de reservas: reservas de passagens aéreas, hotéis, aluguel de carros e ingressos para eventos, garantindo disponibilidade em tempo real e atualizações instantâneas.</li>
</ul>



<h3 class="wp-block-heading">Data Warehouse (DW)</h3>



<h4 class="wp-block-heading">Características</h4>



<ul class="wp-block-list">
<li class="">Focado em consultas complexas e análise de dados: o principal aqui é leitura, pois guarda dados históricos que são consultados com certa frequência;</li>



<li class="">Integração de dados: consolida dados de diferentes fontes em um formato consistente;</li>



<li class="">Não volatilidade dos dados: diferente do OLTP, aqui os dados inseridos não são alterados ou apagados, proporcionando uma visão estável (e histórica) da informação;</li>



<li class="">Prioriza leituras e agregações: justamente para consulta de dados históricos, conforme citamos, permitindo análises de tendências ao longo do tempo;</li>



<li class="">Tolerância à latência maior em comparação ao OLTP.</li>
</ul>



<p class="wp-block-paragraph">Quando falamos sobre DW, existem outros termos que se relacionam e são frequentemente vistos:</p>



<ul class="wp-block-list">
<li class="">Data lake: armazena dados brutos e não processados, incluindo dados estruturados, semiestruturados e não estruturados. A diferença para o DW é que lá temos dados processados e estrutura fixa. Os propósitos também se diferem: o datalake armazena grandes volumes de dados variados para análise futura, sendo adequado para big data, machine learning e análises avançadas, enquanto o DW atende mais a análises de negócios, geração de relatórios e suporte à tomada de decisões estratégicas;</li>



<li class="">Data frame: uma estrutura de dados em memória e tabular, semelhante a uma tabela em uma base de dados ou a uma planilha em Excel, com linhas e colunas. É comumente utilizado em linguagens de programação como Python (com pandas) e R para manipulação, análise e visualização de dados; é fácil de usar para operações de filtragem, agregação e transformação de dados.</li>



<li class="">Data mart: subconjunto de um DW, focado em um departamento específico ou área de negócio, como vendas, marketing ou finanças. Então, diferente de um DW que abrangeria toda a organização que guarda os dados, o datamart é focado e limitado a um departamento.</li>
</ul>



<h4 class="wp-block-heading">Recursos de hardware importantes</h4>



<ul class="wp-block-list">
<li class="">CPU: processadores poderosos para lidar com consultas complexas e operações de agregação;</li>



<li class="">Memória: grande quantidade de RAM para suportar grandes conjuntos de dados em operações analíticas;</li>



<li class="">Disco: armazenamento de grande capacidade e alta performance, preferencialmente SSDs;</li>



<li class="">Rede: conectividade robusta para transferência eficiente de grandes volumes de dados.</li>
</ul>



<h4 class="wp-block-heading">Exemplos de uso de um DW</h4>



<p class="wp-block-paragraph">Um Data Warehouse pode atender empresas de diversos setores que necessitam consultar e analisar seus dados históricos. Confira algumas das áreas em que essa estrutura é frequentemente utilizada:</p>



<ul class="wp-block-list">
<li class="">Finanças: bancos e instituições financeiras utilizam DWs para consolidar dados de transações, analisar riscos, detectar fraudes e gerar relatórios de conformidade regulatória;</li>



<li class="">Varejo: empresas de varejo empregam DWs para analisar padrões de compras, gerenciar inventários, personalizar campanhas de marketing e monitorar o desempenho das vendas;</li>



<li class="">Saúde: organizações de saúde usam DWs para consolidar registros de pacientes, analisar tratamentos e resultados clínicos e gerar relatórios para pesquisa e conformidade regulatória.</li>
</ul>



<h3 class="wp-block-heading">Web</h3>



<h4 class="wp-block-heading">Características</h4>



<ul class="wp-block-list">
<li class="">Muita leitura: é destinado a aplicações web que envolvem transações rápidas (como consultas) durante a navegação do usuário;</li>



<li class="">Alta concorrência (muitas conexões simultâneas): por atender a usuários online, lida com transações de vários usuários ao mesmo tempo;</li>



<li class="">Necessidade de escalabilidade: é crucial que a infraestrutura seja escalável para lidar com picos de acesso sem comprometer a performance ou a disponibilidade do sistema.</li>
</ul>



<h4 class="wp-block-heading">Recursos de hardware importantes</h4>



<ul class="wp-block-list">
<li class="">CPU: processadores com bom desempenho multi-core para lidar com múltiplas requisições simultâneas;</li>



<li class="">Memória: quantidade moderada a alta de RAM para suportar cache de sessões e dados frequentemente acessados;</li>



<li class="">Disco: armazenamento SSD para melhorar o tempo de resposta;</li>



<li class="">Rede: alta largura de banda e baixa latência para garantir tempo de resposta rápido.</li>
</ul>



<h4 class="wp-block-heading">Exemplos de sistemas web</h4>



<ul class="wp-block-list">
<li class="">Redes sociais: onde usuários interagem simultaneamente com postagens, atualizações de status, fotos e vídeos, gerando um grande volume de transações e consultas;</li>



<li class="">Streaming: onde usuários acessam conteúdo (vídeos, música) sob demanda, resultando em alta demanda de acesso durante horários de pico;</li>



<li class="">Portais de notícias: sites que experimentam picos de acesso durante eventos de grande importância ou notícias de última hora.</li>
</ul>



<h3 class="wp-block-heading">Mixed (misturado)</h3>



<h4 class="wp-block-heading">Características</h4>



<ul class="wp-block-list">
<li class="">Combina características de diferentes tipos de carga: OLTP e DW, por exemplo;</li>



<li class="">Envolve tanto transações rápidas quanto consultas complexas: rápidas como inserções, atualizações e exclusões de dados e complexas como análise e recuperação de dados históricos;</li>



<li class="">Otimiza recursos e custo: o objetivo aqui é usar de forma eficiente os recursos computacionais e de armazenamento, adaptando-se dinamicamente às necessidades da carga de trabalho mista para reduzir custos operacionais.</li>
</ul>



<h4 class="wp-block-heading">Recursos de hardware importantes</h4>



<ul class="wp-block-list">
<li class="">CPU: processadores com muitos núcleos e alta frequência para suportar diversidade de operações;</li>



<li class="">Memória: grande quantidade de RAM para suportar tanto operações transacionais quanto analíticas;</li>



<li class="">Disco: armazenamento SSD de alta capacidade para suportar tanto leitura quanto escrita intensivas;</li>



<li class="">Rede: alta capacidade de rede para lidar com diferentes tipos de carga de dados.</li>
</ul>



<h4 class="wp-block-heading">Exemplos de sistemas mixed</h4>



<ul class="wp-block-list">
<li class="">Sistemas ERP (<em>Enterprise Resource Planning</em> ou Gestão empresarial): sistemas que suportam processos empresariais como finanças, recursos humanos, cadeia de suprimentos e vendas. Eles lidam com transações diárias (como pedidos de compra, faturamento) e consultas analíticas (relatórios financeiros, análise de vendas);</li>



<li class="">Aplicações CRM (<em>Customer Relation Management</em> ou Gerenciamento de relação com o cliente): ferramentas que gerenciam interações com clientes, incluindo vendas, marketing e suporte ao cliente. Elas processam transações de atualização de dados do cliente e também consultas para análise de comportamento e tendências de vendas.</li>
</ul>



<h3 class="wp-block-heading">Desktop</h3>



<p class="wp-block-paragraph">Características:</p>



<ul class="wp-block-list">
<li class="">Uso doméstico e individual: voltado para um único usuário ou um pequeno grupo de usuários em um ambiente residencial;</li>



<li class="">Gerenciamento de dados: inclui armazenamento e gerenciamento de dados localmente ou na nuvem para suportar atividades pessoais, como processamento de texto, planilhas, gerenciamento de fotos e vídeos, entre outros;</li>



<li class="">Pode ser utilizado para ambiente de testes e desenvolvimento.</li>
</ul>



<p class="wp-block-paragraph">Recursos de hardware importantes:</p>



<ul class="wp-block-list">
<li class="">Processador: múltiplos núcleos e alta frequência para multitarefas, processamento complexo e jogos;</li>



<li class="">Memória: no mínimo 8 GB de RAM para executar diversos programas sem lentidão;</li>



<li class="">Disco: armazenamento SSD para melhorar o tempo de resposta.</li>
</ul>



<p class="wp-block-paragraph">Exemplos de uso de desktop</p>



<ul class="wp-block-list">
<li class="">Usuários comuns: qualquer um que queira usar um computador para as mais diversificadas tarefas, como trabalho, jogos etc.</li>



<li class="">Programadores: profissionais que trabalham com um desktop individual e tanto desenvolvem programas quanto rodam testes nele.</li>
</ul>



<h2 class="wp-block-heading">Conclusão</h2>



<p class="wp-block-paragraph">Vimos que existem diversos tipos de cargas de dados que podem ser utilizadas com diversas finalidades. Na hora de montar um servidor de banco de dados, é importante conhecer sobre seu negócio, para saber como seu banco será utilizado e, assim, escolher a carga mais adequada, impactando positivamente no funcionamento e na performance do seu sistema/aplicação.</p>



<p class="wp-block-paragraph">Além disso, recomendamos o site <a href="https://www.tpc.org/default5.asp">TPC</a>, que traz diversos testes de benchmarking, das mais variadas situações de cargas de dados, o que pode ser útil para pesquisas de recursos antes de fazer algum investimento.</p><p>The post <a href="https://savepoint.blog.br/2024/09/16/tipos-de-cargas-dos-bancos-de-dados/">Tipos de cargas dos bancos de dados</a> first appeared on <a href="https://savepoint.blog.br">Savepoint</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://savepoint.blog.br/2024/09/16/tipos-de-cargas-dos-bancos-de-dados/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">8513</post-id>	</item>
		<item>
		<title>Catálogo do sistema (pg_catalog)</title>
		<link>https://savepoint.blog.br/2024/09/09/catalogo-do-sistema-pg_catalog/</link>
					<comments>https://savepoint.blog.br/2024/09/09/catalogo-do-sistema-pg_catalog/#respond</comments>
		
		<dc:creator><![CDATA[Savepoint]]></dc:creator>
		<pubDate>Mon, 09 Sep 2024 16:27:59 +0000</pubDate>
				<category><![CDATA[Extensões e Ferramentas]]></category>
		<category><![CDATA[Internals e MVCC]]></category>
		<category><![CDATA[Monitoramento]]></category>
		<category><![CDATA[postgres]]></category>
		<category><![CDATA[PostgreSQL]]></category>
		<guid isPermaLink="false">https://savepoint.blog.br/?p=8501</guid>

					<description><![CDATA[<p>Introdução O pg_catalog é um schema especial no PostgreSQL que guarda todos os segredos do seu banco de dados. Quer saber como suas tabelas são organizadas? Lá podemos encontrar essa e outras respostas. Neste artigo, vamos dar uma olhada nesse recurso, descobrindo como ele funciona, o que você pode encontrar nele e como pode ser</p>
<p>The post <a href="https://savepoint.blog.br/2024/09/09/catalogo-do-sistema-pg_catalog/">Catálogo do sistema (pg_catalog)</a> first appeared on <a href="https://savepoint.blog.br">Savepoint</a>.</p>]]></description>
										<content:encoded><![CDATA[<h2 class="wp-block-heading">Introdução</h2>



<p class="wp-block-paragraph">O pg_catalog é um schema especial no PostgreSQL que guarda todos os segredos do seu banco de dados. Quer saber como suas tabelas são organizadas? Lá podemos encontrar essa e outras respostas.</p>



<p class="wp-block-paragraph">Neste artigo, vamos dar uma olhada nesse recurso, descobrindo como ele funciona, o que você pode encontrar nele e como pode ser útil para você.<br></p>



<p class="wp-block-paragraph"><strong>Roteiro</strong>:</p>



<ul class="wp-block-list">
<li class="">O que é o pg_catalog?</li>



<li class="">Principais tabelas e views do cátalogo;</li>



<li class="">Exemplos de junções de tabelas do catálogo;</li>



<li class="">Information schema;</li>



<li class="">Objetos físicos e lógicos;</li>



<li class="">Objetos globais e locais.</li>
</ul>



<h2 class="wp-block-heading">O que é?</h2>



<p class="wp-block-paragraph">Como dito anteriormente, o <kbd>pg_catalog</kbd> é um schema interno e padrão do PostgreSQL que guarda o catálogo do sistema, que nada mais é do que um conjunto de tabelas que contém metadados sobre o banco de dados. Essas tabelas registram informações cruciais, como a estrutura das tabelas, índices, tipos de dados, usuários e permissões.</p>



<p class="wp-block-paragraph">Todos os bancos de dados do PostgreSQL possuem essas tabelas, pois, no momento da criação de um novo banco, elas são copiadas de um template (modelo), que vem dos bancos padrão <kbd>template0</kbd> e <kbd>template1</kbd> (existem dois desses, pois em um é possível fazer modificações, e no outro, não, o que garante uma cópia de segurança do template).</p>



<p class="wp-block-paragraph">Abaixo seguem visualizações de consultas dos bancos de dados existentes, em que podemos ver o <kbd>template0</kbd> e <kbd>template1</kbd>. Primeiro, vamos consultar de uma forma já ensinada no artigo de <a href="https://www.postgresql.org/docs/current/app-psql.html">psql</a>, com o comando <kbd>\l</kbd> (as três últimas colunas da saída foram ocultadas para melhor visualização):</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">psql shell: consultando os bancos de dados pelo comando \l</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>postgres@postgres# \l
                                   List of databases
     Name      |    Owner     | Encoding | Locale Provider | Collate |  Ctype  |   
---------------+--------------+----------+-----------------+---------+---------+
 aplicacao     | app_admin    | UTF8     | libc            | C.UTF-8 | C.UTF-8 |             
 pagila        | admin_pagila | UTF8     | libc            | C.UTF-8 | C.UTF-8 |
 postgres      | postgres     | UTF8     | libc            | C.UTF-8 | C.UTF-8 |
 template0     | postgres     | UTF8     | libc            | C.UTF-8 | C.UTF-8 |
 template1     | postgres     | UTF8     | libc            | C.UTF-8 | C.UTF-8 | 
(5 rows)</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #24292E">postgres@postgres# \l</span></span>
<span class="line"><span style="color: #24292E">                                   List of databases</span></span>
<span class="line"><span style="color: #24292E">     </span><span style="color: #D73A49">Name</span><span style="color: #24292E">      |    </span><span style="color: #D73A49">Owner</span><span style="color: #24292E">     | </span><span style="color: #D73A49">Encoding</span><span style="color: #24292E"> | Locale </span><span style="color: #D73A49">Provider</span><span style="color: #24292E"> | </span><span style="color: #D73A49">Collate</span><span style="color: #24292E"> |  Ctype  |   </span></span>
<span class="line"><span style="color: #6A737D">---------------+--------------+----------+-----------------+---------+---------+</span></span>
<span class="line"><span style="color: #24292E"> aplicacao     | app_admin    | UTF8     | libc            | </span><span style="color: #005CC5">C</span><span style="color: #24292E">.</span><span style="color: #005CC5">UTF</span><span style="color: #D73A49">-</span><span style="color: #005CC5">8</span><span style="color: #24292E"> | </span><span style="color: #005CC5">C</span><span style="color: #24292E">.</span><span style="color: #005CC5">UTF</span><span style="color: #D73A49">-</span><span style="color: #005CC5">8</span><span style="color: #24292E"> |             </span></span>
<span class="line"><span style="color: #24292E"> pagila        | admin_pagila | UTF8     | libc            | </span><span style="color: #005CC5">C</span><span style="color: #24292E">.</span><span style="color: #005CC5">UTF</span><span style="color: #D73A49">-</span><span style="color: #005CC5">8</span><span style="color: #24292E"> | </span><span style="color: #005CC5">C</span><span style="color: #24292E">.</span><span style="color: #005CC5">UTF</span><span style="color: #D73A49">-</span><span style="color: #005CC5">8</span><span style="color: #24292E"> |</span></span>
<span class="line"><span style="color: #24292E"> postgres      | postgres     | UTF8     | libc            | </span><span style="color: #005CC5">C</span><span style="color: #24292E">.</span><span style="color: #005CC5">UTF</span><span style="color: #D73A49">-</span><span style="color: #005CC5">8</span><span style="color: #24292E"> | </span><span style="color: #005CC5">C</span><span style="color: #24292E">.</span><span style="color: #005CC5">UTF</span><span style="color: #D73A49">-</span><span style="color: #005CC5">8</span><span style="color: #24292E"> |</span></span>
<span class="line"><span style="color: #24292E"> template0     | postgres     | UTF8     | libc            | </span><span style="color: #005CC5">C</span><span style="color: #24292E">.</span><span style="color: #005CC5">UTF</span><span style="color: #D73A49">-</span><span style="color: #005CC5">8</span><span style="color: #24292E"> | </span><span style="color: #005CC5">C</span><span style="color: #24292E">.</span><span style="color: #005CC5">UTF</span><span style="color: #D73A49">-</span><span style="color: #005CC5">8</span><span style="color: #24292E"> |</span></span>
<span class="line"><span style="color: #24292E"> template1     | postgres     | UTF8     | libc            | </span><span style="color: #005CC5">C</span><span style="color: #24292E">.</span><span style="color: #005CC5">UTF</span><span style="color: #D73A49">-</span><span style="color: #005CC5">8</span><span style="color: #24292E"> | </span><span style="color: #005CC5">C</span><span style="color: #24292E">.</span><span style="color: #005CC5">UTF</span><span style="color: #D73A49">-</span><span style="color: #005CC5">8</span><span style="color: #24292E"> | </span></span>
<span class="line"><span style="color: #24292E">(</span><span style="color: #005CC5">5</span><span style="color: #24292E"> </span><span style="color: #D73A49">rows</span><span style="color: #24292E">)</span></span></code></pre></div>



<p class="wp-block-paragraph">Agora, vamos consultar pela tabela <kbd>pg_database</kbd>, a qual compõe o catálogo do sistema:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">psql shell: consultando os bancos de dados pela tabela pg_database</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&#91;local&#93;: postgres@postgres=# SELECT datname FROM pg_database;
  datname
-----------
 postgres
 template1
 template0
 pagila
 aplicacao
(5 rows)</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #24292E">&#91;local&#93;: postgres@postgres</span><span style="color: #D73A49">=</span><span style="color: #24292E"># </span><span style="color: #D73A49">SELECT</span><span style="color: #24292E"> datname </span><span style="color: #D73A49">FROM</span><span style="color: #24292E"> pg_database;</span></span>
<span class="line"><span style="color: #24292E">  datname</span></span>
<span class="line"><span style="color: #6A737D">-----------</span></span>
<span class="line"><span style="color: #24292E"> postgres</span></span>
<span class="line"><span style="color: #24292E"> template1</span></span>
<span class="line"><span style="color: #24292E"> template0</span></span>
<span class="line"><span style="color: #24292E"> pagila</span></span>
<span class="line"><span style="color: #24292E"> aplicacao</span></span>
<span class="line"><span style="color: #24292E">(</span><span style="color: #005CC5">5</span><span style="color: #24292E"> </span><span style="color: #D73A49">rows</span><span style="color: #24292E">)</span></span></code></pre></div>



<p class="wp-block-paragraph">Apesar de, na prática, parecerem comandos diferentes, por baixo dos panos ambos fazem a mesma coisa, que é a consulta da tabela <kbd>pg_database</kbd>. Para observar isso, podemos ativar a variável <kbd>ECHO_HIDDEN</kbd>, que mostra as consultas realizadas nos comandos do psql. Para ativar, basta rodar:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">psql shell: ativando a variável ECHO_HIDDEN</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&#91;local&#93;: postgres@postgres=# \set ECHO_HIDDEN on</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #24292E">&#91;local&#93;: postgres@postgres</span><span style="color: #D73A49">=</span><span style="color: #24292E"># \</span><span style="color: #D73A49">set</span><span style="color: #24292E"> ECHO_HIDDEN </span><span style="color: #D73A49">on</span></span></code></pre></div>



<p class="wp-block-paragraph">E, então, executar o <kbd>\l</kbd> novamente e, assim, vermos o que é feito de forma oculta para nos trazer a listagem de banco de dados:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">psql shell: consultando os bancos de dados com o comando \l e visualizando a query executada</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&#91;local&#93;: postgres@postgres=# \l
********* QUERY **********
SELECT
  d.datname as "Name",
  pg_catalog.pg_get_userbyid(d.datdba) as "Owner",
  pg_catalog.pg_encoding_to_char(d.encoding) as "Encoding",
  CASE d.datlocprovider WHEN 'c' THEN 'libc' WHEN 'i' THEN 'icu' END AS "Locale Provider",
  d.datcollate as "Collate",
  d.datctype as "Ctype",
  d.daticulocale as "ICU Locale",
  d.daticurules as "ICU Rules",
  pg_catalog.array_to_string(d.datacl, E'\n') AS "Access privileges"
FROM pg_catalog.pg_database d
ORDER BY 1;
**************************
                                                      List of databases
   Name    |    Owner     | Encoding | Locale Provider | Collate |  Ctype  | 
 ---------+--------------+----------+-----------------+---------+----------+
 aplicacao | app_admin    | UTF8     | libc            | C.UTF-8 | C.UTF-8 |
 pagila    | admin_pagila | UTF8     | libc            | C.UTF-8 | C.UTF-8 |
 postgres  | postgres     | UTF8     | libc            | C.UTF-8 | C.UTF-8 | 
 template0 | postgres     | UTF8     | libc            | C.UTF-8 | C.UTF-8 |
 template1 | postgres     | UTF8     | libc            | C.UTF-8 | C.UTF-8 |
(5 rows)</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #24292E">&#91;local&#93;: postgres@postgres</span><span style="color: #D73A49">=</span><span style="color: #24292E"># \l</span></span>
<span class="line"><span style="color: #D73A49">*********</span><span style="color: #24292E"> QUERY </span><span style="color: #D73A49">**********</span></span>
<span class="line"><span style="color: #D73A49">SELECT</span></span>
<span class="line"><span style="color: #24292E">  </span><span style="color: #005CC5">d</span><span style="color: #24292E">.</span><span style="color: #005CC5">datname</span><span style="color: #24292E"> </span><span style="color: #D73A49">as</span><span style="color: #24292E"> </span><span style="color: #032F62">&quot;Name&quot;</span><span style="color: #24292E">,</span></span>
<span class="line"><span style="color: #24292E">  </span><span style="color: #005CC5">pg_catalog</span><span style="color: #24292E">.</span><span style="color: #005CC5">pg_get_userbyid</span><span style="color: #24292E">(</span><span style="color: #005CC5">d</span><span style="color: #24292E">.</span><span style="color: #005CC5">datdba</span><span style="color: #24292E">) </span><span style="color: #D73A49">as</span><span style="color: #24292E"> </span><span style="color: #032F62">&quot;Owner&quot;</span><span style="color: #24292E">,</span></span>
<span class="line"><span style="color: #24292E">  </span><span style="color: #005CC5">pg_catalog</span><span style="color: #24292E">.</span><span style="color: #005CC5">pg_encoding_to_char</span><span style="color: #24292E">(</span><span style="color: #005CC5">d</span><span style="color: #24292E">.</span><span style="color: #005CC5">encoding</span><span style="color: #24292E">) </span><span style="color: #D73A49">as</span><span style="color: #24292E"> </span><span style="color: #032F62">&quot;Encoding&quot;</span><span style="color: #24292E">,</span></span>
<span class="line"><span style="color: #24292E">  </span><span style="color: #D73A49">CASE</span><span style="color: #24292E"> </span><span style="color: #005CC5">d</span><span style="color: #24292E">.</span><span style="color: #005CC5">datlocprovider</span><span style="color: #24292E"> </span><span style="color: #D73A49">WHEN</span><span style="color: #24292E"> </span><span style="color: #032F62">&#39;c&#39;</span><span style="color: #24292E"> </span><span style="color: #D73A49">THEN</span><span style="color: #24292E"> </span><span style="color: #032F62">&#39;libc&#39;</span><span style="color: #24292E"> </span><span style="color: #D73A49">WHEN</span><span style="color: #24292E"> </span><span style="color: #032F62">&#39;i&#39;</span><span style="color: #24292E"> </span><span style="color: #D73A49">THEN</span><span style="color: #24292E"> </span><span style="color: #032F62">&#39;icu&#39;</span><span style="color: #24292E"> </span><span style="color: #D73A49">END</span><span style="color: #24292E"> </span><span style="color: #D73A49">AS</span><span style="color: #24292E"> </span><span style="color: #032F62">&quot;Locale Provider&quot;</span><span style="color: #24292E">,</span></span>
<span class="line"><span style="color: #24292E">  </span><span style="color: #005CC5">d</span><span style="color: #24292E">.</span><span style="color: #005CC5">datcollate</span><span style="color: #24292E"> </span><span style="color: #D73A49">as</span><span style="color: #24292E"> </span><span style="color: #032F62">&quot;Collate&quot;</span><span style="color: #24292E">,</span></span>
<span class="line"><span style="color: #24292E">  </span><span style="color: #005CC5">d</span><span style="color: #24292E">.</span><span style="color: #005CC5">datctype</span><span style="color: #24292E"> </span><span style="color: #D73A49">as</span><span style="color: #24292E"> </span><span style="color: #032F62">&quot;Ctype&quot;</span><span style="color: #24292E">,</span></span>
<span class="line"><span style="color: #24292E">  </span><span style="color: #005CC5">d</span><span style="color: #24292E">.</span><span style="color: #005CC5">daticulocale</span><span style="color: #24292E"> </span><span style="color: #D73A49">as</span><span style="color: #24292E"> </span><span style="color: #032F62">&quot;ICU Locale&quot;</span><span style="color: #24292E">,</span></span>
<span class="line"><span style="color: #24292E">  </span><span style="color: #005CC5">d</span><span style="color: #24292E">.</span><span style="color: #005CC5">daticurules</span><span style="color: #24292E"> </span><span style="color: #D73A49">as</span><span style="color: #24292E"> </span><span style="color: #032F62">&quot;ICU Rules&quot;</span><span style="color: #24292E">,</span></span>
<span class="line"><span style="color: #24292E">  </span><span style="color: #005CC5">pg_catalog</span><span style="color: #24292E">.</span><span style="color: #005CC5">array_to_string</span><span style="color: #24292E">(</span><span style="color: #005CC5">d</span><span style="color: #24292E">.</span><span style="color: #005CC5">datacl</span><span style="color: #24292E">, E</span><span style="color: #032F62">&#39;\n&#39;</span><span style="color: #24292E">) </span><span style="color: #D73A49">AS</span><span style="color: #24292E"> </span><span style="color: #032F62">&quot;Access privileges&quot;</span></span>
<span class="line"><span style="color: #D73A49">FROM</span><span style="color: #24292E"> </span><span style="color: #005CC5">pg_catalog</span><span style="color: #24292E">.</span><span style="color: #005CC5">pg_database</span><span style="color: #24292E"> d</span></span>
<span class="line"><span style="color: #D73A49">ORDER BY</span><span style="color: #24292E"> </span><span style="color: #005CC5">1</span><span style="color: #24292E">;</span></span>
<span class="line"><span style="color: #D73A49">**************************</span></span>
<span class="line"><span style="color: #24292E">                                                      List of databases</span></span>
<span class="line"><span style="color: #24292E">   </span><span style="color: #D73A49">Name</span><span style="color: #24292E">    |    </span><span style="color: #D73A49">Owner</span><span style="color: #24292E">     | </span><span style="color: #D73A49">Encoding</span><span style="color: #24292E"> | Locale </span><span style="color: #D73A49">Provider</span><span style="color: #24292E"> | </span><span style="color: #D73A49">Collate</span><span style="color: #24292E"> |  Ctype  | </span></span>
<span class="line"><span style="color: #24292E"> </span><span style="color: #6A737D">---------+--------------+----------+-----------------+---------+----------+</span></span>
<span class="line"><span style="color: #24292E"> aplicacao | app_admin    | UTF8     | libc            | </span><span style="color: #005CC5">C</span><span style="color: #24292E">.</span><span style="color: #005CC5">UTF</span><span style="color: #D73A49">-</span><span style="color: #005CC5">8</span><span style="color: #24292E"> | </span><span style="color: #005CC5">C</span><span style="color: #24292E">.</span><span style="color: #005CC5">UTF</span><span style="color: #D73A49">-</span><span style="color: #005CC5">8</span><span style="color: #24292E"> |</span></span>
<span class="line"><span style="color: #24292E"> pagila    | admin_pagila | UTF8     | libc            | </span><span style="color: #005CC5">C</span><span style="color: #24292E">.</span><span style="color: #005CC5">UTF</span><span style="color: #D73A49">-</span><span style="color: #005CC5">8</span><span style="color: #24292E"> | </span><span style="color: #005CC5">C</span><span style="color: #24292E">.</span><span style="color: #005CC5">UTF</span><span style="color: #D73A49">-</span><span style="color: #005CC5">8</span><span style="color: #24292E"> |</span></span>
<span class="line"><span style="color: #24292E"> postgres  | postgres     | UTF8     | libc            | </span><span style="color: #005CC5">C</span><span style="color: #24292E">.</span><span style="color: #005CC5">UTF</span><span style="color: #D73A49">-</span><span style="color: #005CC5">8</span><span style="color: #24292E"> | </span><span style="color: #005CC5">C</span><span style="color: #24292E">.</span><span style="color: #005CC5">UTF</span><span style="color: #D73A49">-</span><span style="color: #005CC5">8</span><span style="color: #24292E"> | </span></span>
<span class="line"><span style="color: #24292E"> template0 | postgres     | UTF8     | libc            | </span><span style="color: #005CC5">C</span><span style="color: #24292E">.</span><span style="color: #005CC5">UTF</span><span style="color: #D73A49">-</span><span style="color: #005CC5">8</span><span style="color: #24292E"> | </span><span style="color: #005CC5">C</span><span style="color: #24292E">.</span><span style="color: #005CC5">UTF</span><span style="color: #D73A49">-</span><span style="color: #005CC5">8</span><span style="color: #24292E"> |</span></span>
<span class="line"><span style="color: #24292E"> template1 | postgres     | UTF8     | libc            | </span><span style="color: #005CC5">C</span><span style="color: #24292E">.</span><span style="color: #005CC5">UTF</span><span style="color: #D73A49">-</span><span style="color: #005CC5">8</span><span style="color: #24292E"> | </span><span style="color: #005CC5">C</span><span style="color: #24292E">.</span><span style="color: #005CC5">UTF</span><span style="color: #D73A49">-</span><span style="color: #005CC5">8</span><span style="color: #24292E"> |</span></span>
<span class="line"><span style="color: #24292E">(</span><span style="color: #005CC5">5</span><span style="color: #24292E"> </span><span style="color: #D73A49">rows</span><span style="color: #24292E">)</span></span></code></pre></div>



<p class="wp-block-paragraph">A variável <kbd>ECHO_HIDDEN</kbd> também pode ser usada dessa forma para os diversos outros comandos do psql, possibilitando a visibilidade da importância dos dados presentes nas tabelas do catálogo do sistema. Recomendamos que teste sem moderação!</p>



<h2 class="wp-block-heading">Principais tabelas e views do catálogo</h2>



<h3 class="wp-block-heading"><kbd>pg_authid</kbd></h3>



<p class="wp-block-paragraph">Essa tabela armazena informações sobre os usuários de autenticação (no PostgreSQL utilizamos o termo &#8220;roles&#8221; em inglês tanto para usuários como para grupos de usuários). Ela contém detalhes como nome de usuário, tipo de papel (usuário ou grupo), senha criptografada (se aplicável) e outras informações relacionadas à autenticação e a permissões de acesso. Você pode acessar a documentação dessa tabela por <a href="https://www.postgresql.org/docs/current/catalog-pg-authid.html">aqui</a>. Entre as principais colunas, temos:</p>



<ul class="wp-block-list">
<li class=""><kbd>rolname</kbd>: nome do usuário ou grupo de usuários;</li>



<li class=""><kbd>rolsuper</kbd>: indica se o usuário tem privilégios de superusuário;</li>



<li class=""><kbd>rolcreaterole</kbd>: indica se o usuário tem o privilégio para criar outros usuários ou grupos;</li>



<li class=""><kbd>rolcreatedb</kbd>: indica se o usuário pode criar bancos de dados;</li>



<li class=""><kbd>rolcanlogin</kbd>: mostra se o usuário pode efetuar login como um usuário ou se apenas se comporta como um grupo de usuários;</li>



<li class=""><kbd>rolreplication</kbd>: indica se o usuário pode ser usado para replicação de dados.</li>
</ul>



<h3 class="wp-block-heading">pg_roles</h3>



<p class="wp-block-paragraph">Essa view do sistema também usa dados da tabela <a href="https://www.postgresql.org/docs/current/catalog-pg-authid.html"><kbd>pg_authid</kbd></a> para fornecer informações sobre todas as roles (usuários e grupo de usuários) do banco de dados, a diferença é a ocultação completa da senha (na outra vemos ela criptografada). A documentação oficial pode ser acessada <a href="https://www.postgresql.org/docs/current/view-pg-roles.html">aqui</a>.</p>



<h3 class="wp-block-heading"><kbd>pg_database</kbd></h3>



<p class="wp-block-paragraph">Essa tabela contém uma linha para cada banco de dados no sistema PostgreSQL. Ela armazena várias informações importantes sobre cada banco, incluindo seu nome, dono e configurações específicas. Sua documentação oficial pode ser encontrada <a href="https://www.postgresql.org/docs/current/catalog-pg-database.html">aqui</a>. As principais colunas são:</p>



<ul class="wp-block-list">
<li class=""><kbd>datname</kbd>: nome do banco de dados;</li>



<li class=""><kbd>datdba</kbd>: OID (<em>Object Identifier</em> ou Identificador de Objeto) do dono do banco de dados (esse OID fica na tabela <a href="https://docs.google.com/document/d/12scjxMsXbVEARJx3r-DmmxmaitWKfdE8oNcDxzafOKM/edit#heading=h.jenjcs5dtqvl"><kbd>pg_authid</kbd></a>, que vimos anteriormente);</li>



<li class=""><kbd>encoding</kbd>: codificação de caracteres do banco de dados;</li>



<li class=""><kbd>datctype</kbd>: tipo de caracteres padrão do banco de dados;</li>



<li class=""><kbd>datistemplate</kbd>: indica se o banco de dados pode ser usado como um template (modelo), conforme os bancos <kbd>template0</kbd> e <kbd>template1</kbd>;</li>



<li class=""><kbd>datallowconn</kbd>: indica se conexões ao banco de dados são permitidas, uma vez que, por padrão, não são permitidas conexões no <kbd>template0</kbd>;</li>



<li class=""><kbd>datconnlimit</kbd>: limite máximo de conexões ao banco de dados;</li>



<li class=""><kbd>dattablespace</kbd>: OID da tablespace em que o banco está;</li>



<li class=""><kbd>datacl</kbd>: lista de controle de acesso do banco de dados.</li>
</ul>



<h3 class="wp-block-heading">pg_namespace&nbsp;</h3>



<p class="wp-block-paragraph">Essa tabela armazena informações sobre os schemas no banco de dados. Os schemas são usados para organizar objetos como tabelas, índices, funções etc. no PostgreSQL, fornecendo uma estrutura lógica de organização e controle de permissões como se fosse pastas no banco de dados. A documentação oficial pode ser conferida <a href="https://www.postgresql.org/docs/current/catalog-pg-namespace.html">aqui</a>. As colunas dessa tabela são:</p>



<ul class="wp-block-list">
<li class=""><kbd>oid</kbd>: identificador do schema;</li>



<li class=""><kbd>nspname</kbd>: nome do schema;</li>



<li class=""><kbd>nspowner</kbd>: OID do usuário dono do schema (faz ponte com a tabela <kbd>pg_authid</kbd>);</li>



<li class=""><kbd>nspacl</kbd>: lista o controle de acesso do schema.</li>
</ul>



<h3 class="wp-block-heading"><kbd>pg_class</kbd></h3>



<p class="wp-block-paragraph">Nessa tabela, temos diversas informações sobre tabelas e outros objetos similares (como views, índices etc.). É possível ver uma descrição de cada coluna dessa tabela <a href="https://www.postgresql.org/docs/current/catalog-pg-class.html">aqui</a> na documentação oficial. Algumas das colunas que destacamos são:&nbsp;&nbsp;</p>



<ul class="wp-block-list">
<li class=""><kbd>oid</kbd>: número identificador do objeto;</li>



<li class=""><kbd>relname</kbd>: nome do objeto;</li>



<li class=""><kbd>relnamespace</kbd>: OID (identificador) do schema ao qual esse objeto pertence (referência pg_namespace);</li>



<li class=""><kbd>relowner</kbd>: OID do dono do objeto (referência pg_authid);</li>



<li class=""><kbd>relfilenode</kbd>: número identificador do arquivo físico que armazena o objeto em questão (que geralmente é igual ao OID, citado no início da lista. Citaremos adiante um caso em que eles não são iguais);</li>



<li class=""><kbd>reltablespace</kbd>: OID do tablespace onde o objeto está armazenado. Se for 0, o objeto está no tablespace padrão do banco de dados (referência <a href="https://www.postgresql.org/docs/current/catalog-pg-tablespace.html">pg_tablespace</a>);</li>



<li class=""><kbd>relpages</kbd>: número de páginas de disco usado pelo objeto (cada página tem por padrão 8 kb, e se o objeto for maior do que isso, ocupará múltiplos desse valor em número de páginas. Por exemplo, um objeto de 36 kb ocupará 5 páginas, não 4,5);</li>



<li class=""><kbd>reltuples</kbd>: número de linhas na tabela;</li>



<li class=""><kbd>relkind</kbd>: uma letra que indica o tipo do objeto:
<ul class="wp-block-list">
<li class=""><kbd>r</kbd> = tabela,&nbsp;</li>



<li class=""><kbd>i</kbd> = índice&nbsp;</li>



<li class=""><kbd>s</kbd> = sequência etc.</li>
</ul>
</li>



<li class=""><kbd>relacl</kbd>: lista de controle de acesso do objeto, ou seja, mostra os usuários e suas permissões de acesso ao objeto;</li>



<li class=""><kbd>reloptions</kbd>: opções de ajustes para otimização de objetos.</li>
</ul>



<h3 class="wp-block-heading">pg_attribute</h3>



<p class="wp-block-paragraph">Armazena informações sobre cada atributo, ou seja, a coluna, de todas as tabelas do banco de dados, incluindo nome das colunas, tipo de dados, restrições etc. A documentação oficial está <a href="https://www.postgresql.org/docs/current/catalog-pg-attribute.html">aqui</a>. Suas principais colunas são:</p>



<ul class="wp-block-list">
<li class=""><kbd>attrelid</kbd>: o OID da tabela ao qual essa coluna pertence (referência <a href="https://docs.google.com/document/d/12scjxMsXbVEARJx3r-DmmxmaitWKfdE8oNcDxzafOKM/edit#heading=h.i6cjup9p0f7w">pg_class</a>);</li>



<li class=""><kbd>attname</kbd>: o nome da coluna;</li>



<li class=""><kbd>attypid</kbd>: o OID do tipo de dado dessa coluna (referência <a href="https://docs.google.com/document/d/12scjxMsXbVEARJx3r-DmmxmaitWKfdE8oNcDxzafOKM/edit#heading=h.5c581ewmd4qn"><kbd>pg_type</kbd></a>);</li>



<li class=""><kbd>attnotnull</kbd>: indica se a coluna foi definida como ‘<kbd>NOT NULL</kbd>’;</li>



<li class=""><kbd>atthasdef</kbd>: indica se a coluna tem valor padrão definido.</li>
</ul>



<h3 class="wp-block-heading">pg_type</h3>



<p class="wp-block-paragraph">Nessa tabela, encontramos informações sobre os tipos de dados do banco, que podem ser de tabelas, colunas etc. Sua documentação está <a href="https://www.postgresql.org/docs/current/catalog-pg-type.html">nessa página</a>. As principais colunas são:</p>



<ul class="wp-block-list">
<li class=""><kbd>typname</kbd>: nome do tipo de dado;</li>



<li class=""><kbd>typnamespace</kbd>: OID do schema que contém o tipo de dado em questão (referência <a href="https://docs.google.com/document/d/12scjxMsXbVEARJx3r-DmmxmaitWKfdE8oNcDxzafOKM/edit#heading=h.dihdv4lenyap"><kbd>pg_namespace</kbd></a>);</li>



<li class=""><kbd>typlen</kbd>: tamanho em bytes do tipo de dado;</li>



<li class=""><kbd>typtype</kbd>: indica o tipo de dado, ou seja, muda conforme o objeto ao qual está se referenciando, sendo b para tipo base, c para tipo composto (o caso das tabelas), d para domínio etc.</li>
</ul>



<h3 class="wp-block-heading">pg_constraints</h3>



<p class="wp-block-paragraph">Essa tabela armazena informações sobre as restrições (constraints) definidas em diferentes objetos do banco de dados, como tabelas. As restrições são regras que impõem integridade de dados e outras condições para garantir que os dados no banco de dados estejam consistentes e de acordo com as regras de negócio. A documentação oficial está <a href="https://www.postgresql.org/docs/current/catalog-pg-constraint.html">aqui</a>. Principais colunas:</p>



<ul class="wp-block-list">
<li class=""><kbd>conname</kbd>: nome da constraint;</li>



<li class=""><kbd>connamespace</kbd>: OID do esquema ao qual a constraint pertence (referente a <a href="https://docs.google.com/document/d/12scjxMsXbVEARJx3r-DmmxmaitWKfdE8oNcDxzafOKM/edit#heading=h.dihdv4lenyap">pg_namespace</a>);</li>



<li class=""><kbd>contype</kbd>: tipo da restrição, como <kbd>PRIMARY KEY</kbd>, <kbd>FOREIGN KEY</kbd>, <kbd>UNIQUE</kbd>, <kbd>CHECK</kbd> etc.;</li>



<li class=""><kbd>conrelid</kbd>: OID da tabela à qual a restrição está associada (referente a <a href="https://docs.google.com/document/d/12scjxMsXbVEARJx3r-DmmxmaitWKfdE8oNcDxzafOKM/edit#heading=h.i6cjup9p0f7w"><kbd>pg_class</kbd></a>).</li>
</ul>



<h3 class="wp-block-heading">pg_proc</h3>



<p class="wp-block-paragraph">Essa tabela armazena informações sobre as funções e os procedimentos (functions e procedures em inglês) definidos no banco de dados. Sua documentação está <a href="https://www.postgresql.org/docs/current/catalog-pg-proc.html">aqui</a>. Algumas das principais colunas são:</p>



<ul class="wp-block-list">
<li class=""><kbd>proname</kbd>: nome da função;</li>



<li class=""><kbd>prolang</kbd>: linguagem na qual a função é escrita (referente a <a href="https://www.postgresql.org/docs/current/catalog-pg-language.html"><kbd>pg_language</kbd></a>);</li>



<li class=""><kbd>prorettype</kbd>: tipo de retorno da função (referente a <a href="https://docs.google.com/document/d/12scjxMsXbVEARJx3r-DmmxmaitWKfdE8oNcDxzafOKM/edit#heading=h.5c581ewmd4qn"><kbd>pg_type</kbd></a>);</li>



<li class=""><kbd>proargtypes</kbd>: tipos dos argumentos da função (referente a <a href="https://docs.google.com/document/d/12scjxMsXbVEARJx3r-DmmxmaitWKfdE8oNcDxzafOKM/edit#heading=h.5c581ewmd4qn"><kbd>pg_type</kbd></a>).</li>
</ul>



<h3 class="wp-block-heading">pg_sequence</h3>



<p class="wp-block-paragraph">Armazena informações sobre as sequências definidas no banco de dados. Sequências são objetos especiais usados para gerar números únicos e sequenciais, frequentemente utilizados para colunas de chave primária artificiais. A documentação pode ser achada <a href="https://www.postgresql.org/docs/current/catalog-pg-sequence.html">aqui</a>. Suas colunas são:</p>



<ul class="wp-block-list">
<li class=""><kbd>seqrelid</kbd>: OID (identificador) do objeto da sequência em questão (referente a <a href="https://docs.google.com/document/d/12scjxMsXbVEARJx3r-DmmxmaitWKfdE8oNcDxzafOKM/edit#heading=h.i6cjup9p0f7w"><kbd>pg_class</kbd></a>);</li>



<li class=""><kbd>seqtypid</kbd>: tipo de dados da sequência, por exemplo, integer, bigint etc. (referente a <a href="https://docs.google.com/document/d/12scjxMsXbVEARJx3r-DmmxmaitWKfdE8oNcDxzafOKM/edit#heading=h.5c581ewmd4qn"><kbd>pg_type</kbd></a>);</li>



<li class=""><kbd>seqstart</kbd>: valor inicial da sequência;</li>



<li class=""><kbd>seqincrement</kbd>: incremento da sequência;</li>



<li class=""><kbd>seqcache</kbd>: número de valores da sequência a serem cacheados (colocados em cache);</li>



<li class=""><kbd>seqcycle</kbd>: indica se a sequência cicla ao atingir o valor máximo/mínimo (<kbd>t</kbd> para TRUE/<kbd>f</kbd> para FALSE).</li>
</ul>



<h3 class="wp-block-heading">pg_stats</h3>



<p class="wp-block-paragraph">Essa view fornece um acesso mais amigável às estatísticas armazenadas na tabela <kbd>pg_statistic</kbd>, que conta com estatísticas sobre o conteúdo de cada coluna de cada tabela do banco. Essas estatísticas são usadas pelo otimizador de consultas para gerar planos de execução eficientes. A documentação oficial está nesta <a href="https://www.postgresql.org/docs/current/view-pg-stats.html">página</a>, já a página da <kbd>pg_statistic</kbd> você encontra <a href="https://www.postgresql.org/docs/current/catalog-pg-statistic.html">aqui</a>. As principais colunas da <kbd>pg_stats</kbd> são:</p>



<ul class="wp-block-list">
<li class=""><kbd>schemaname</kbd>: nome do esquema da tabela;</li>



<li class=""><kbd>tablename</kbd>: nome da tabela;</li>



<li class=""><kbd>attname</kbd>: nome da coluna;</li>



<li class=""><kbd>avg_width</kbd>: largura média dos valores da coluna (em bytes);</li>



<li class=""><kbd>most_common_vals</kbd>: valores mais comuns na coluna;</li>



<li class=""><kbd>most_common_freqs</kbd>: frequências dos valores mais comuns.</li>
</ul>



<h3 class="wp-block-heading">pg_settings</h3>



<p class="wp-block-paragraph">Essa view nos permite visualizar parâmetros de tempo de execução do servidor, ou seja, nos permite visualizar e modificar parâmetros de configuração em tempo real. A documentação pode ser encontrada <a href="https://www.postgresql.org/docs/current/view-pg-settings.html">aqui</a>. Além disso, temos um <a href="https://savepoint.blog.br/2015/01/14/aprenda-a-trabalhar-com-as-configuracoes-do-postgresql/">artigo</a> antigo sobre configurações do PostgreSQL citando essa tabela, podendo ser interessante para ver exemplos.<br>Suas principais colunas são:</p>



<ul class="wp-block-list">
<li class=""><kbd>name</kbd>: nome do parâmetro;</li>



<li class=""><kbd>setting</kbd>: valor atual do parâmetro;</li>



<li class=""><kbd>category</kbd>: grupo lógico do parâmetro;</li>



<li class=""><kbd>short_desc</kbd>: descrição resumida do parâmetro.</li>
</ul>



<h2 class="wp-block-heading">Exemplos de junção (JOIN) de tabelas do catálogo</h2>



<h3 class="wp-block-heading">Tabelas <kbd>pg_database</kbd> e <kbd>pg_authid</kbd></h3>



<p class="wp-block-paragraph">Abaixo temos um exemplo que nos mostra os seguintes dados:</p>



<ul class="wp-block-list">
<li class="">Tabela <kbd>pg_database</kbd>:
<ul class="wp-block-list">
<li class="">OID e nome do banco;</li>



<li class="">OID do usuário dono do banco.</li>
</ul>
</li>



<li class="">Tabela <kbd>pg_authid</kbd>:
<ul class="wp-block-list">
<li class="">Nome do usuário em questão.</li>
</ul>
</li>
</ul>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">psql shell: consultando dados das tabelas pg_database e pg_authid</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&#91;local&#93;: postgres@postgres=# SELECT 
d.oid, 
d.datname, 
d.datdba, 
a.rolname 
FROM pg_database d 
JOIN pg_authid a ON d.datdba = a.oid;

  oid  |      datname      | datdba |   rolname
-------+-------------------+--------+--------------
 18206 | readme_to_recover |     10 | postgres
 18203 | banco_tblspc      |     10 | postgres
     4 | template0         |     10 | postgres
     1 | template1         |     10 | postgres
     5 | postgres          |     10 | postgres
 16539 | aplicacao         |  16520 | app_admin
 17660 | pagila            |  17189 | admin_pagila
(7 rows)</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #24292E">&#91;local&#93;: postgres@postgres</span><span style="color: #D73A49">=</span><span style="color: #24292E"># </span><span style="color: #D73A49">SELECT</span><span style="color: #24292E"> </span></span>
<span class="line"><span style="color: #005CC5">d</span><span style="color: #24292E">.</span><span style="color: #005CC5">oid</span><span style="color: #24292E">, </span></span>
<span class="line"><span style="color: #005CC5">d</span><span style="color: #24292E">.</span><span style="color: #005CC5">datname</span><span style="color: #24292E">, </span></span>
<span class="line"><span style="color: #005CC5">d</span><span style="color: #24292E">.</span><span style="color: #005CC5">datdba</span><span style="color: #24292E">, </span></span>
<span class="line"><span style="color: #005CC5">a</span><span style="color: #24292E">.</span><span style="color: #005CC5">rolname</span><span style="color: #24292E"> </span></span>
<span class="line"><span style="color: #D73A49">FROM</span><span style="color: #24292E"> pg_database d </span></span>
<span class="line"><span style="color: #D73A49">JOIN</span><span style="color: #24292E"> pg_authid a </span><span style="color: #D73A49">ON</span><span style="color: #24292E"> </span><span style="color: #005CC5">d</span><span style="color: #24292E">.</span><span style="color: #005CC5">datdba</span><span style="color: #24292E"> </span><span style="color: #D73A49">=</span><span style="color: #24292E"> </span><span style="color: #005CC5">a</span><span style="color: #24292E">.</span><span style="color: #005CC5">oid</span><span style="color: #24292E">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #24292E">  </span><span style="color: #D73A49">oid</span><span style="color: #24292E">  |      datname      | datdba |   rolname</span></span>
<span class="line"><span style="color: #6A737D">-------+-------------------+--------+--------------</span></span>
<span class="line"><span style="color: #24292E"> </span><span style="color: #005CC5">18206</span><span style="color: #24292E"> | readme_to_recover |     </span><span style="color: #005CC5">10</span><span style="color: #24292E"> | postgres</span></span>
<span class="line"><span style="color: #24292E"> </span><span style="color: #005CC5">18203</span><span style="color: #24292E"> | banco_tblspc      |     </span><span style="color: #005CC5">10</span><span style="color: #24292E"> | postgres</span></span>
<span class="line"><span style="color: #24292E">     </span><span style="color: #005CC5">4</span><span style="color: #24292E"> | template0         |     </span><span style="color: #005CC5">10</span><span style="color: #24292E"> | postgres</span></span>
<span class="line"><span style="color: #24292E">     </span><span style="color: #005CC5">1</span><span style="color: #24292E"> | template1         |     </span><span style="color: #005CC5">10</span><span style="color: #24292E"> | postgres</span></span>
<span class="line"><span style="color: #24292E">     </span><span style="color: #005CC5">5</span><span style="color: #24292E"> | postgres          |     </span><span style="color: #005CC5">10</span><span style="color: #24292E"> | postgres</span></span>
<span class="line"><span style="color: #24292E"> </span><span style="color: #005CC5">16539</span><span style="color: #24292E"> | aplicacao         |  </span><span style="color: #005CC5">16520</span><span style="color: #24292E"> | app_admin</span></span>
<span class="line"><span style="color: #24292E"> </span><span style="color: #005CC5">17660</span><span style="color: #24292E"> | pagila            |  </span><span style="color: #005CC5">17189</span><span style="color: #24292E"> | admin_pagila</span></span>
<span class="line"><span style="color: #24292E">(</span><span style="color: #005CC5">7</span><span style="color: #24292E"> </span><span style="color: #D73A49">rows</span><span style="color: #24292E">)</span></span></code></pre></div>



<h3 class="wp-block-heading">Tabelas <kbd>pg_class</kbd>, <kbd>pg_attribute</kbd> e <kbd>pg_type</kbd></h3>



<p class="wp-block-paragraph">Agora, vamos ver uma junção com os dados de tabelas, colunas da tabela e tipos de dados:</p>



<ul class="wp-block-list">
<li class="">Tabela <kbd>pg_class</kbd>:
<ul class="wp-block-list">
<li class="">OID e nome do objeto;</li>



<li class="">OID do tipo de dado na tabela <kbd>pg_type</kbd>.</li>
</ul>
</li>



<li class="">Tabela <kbd>pg_attribute</kbd>:
<ul class="wp-block-list">
<li class="">Número da coluna (posição dela em relação à tabela);</li>



<li class="">Nome da coluna.</li>
</ul>
</li>



<li class="">Tabela <kbd>pg_type</kbd>:
<ul class="wp-block-list">
<li class="">Nome do tipo de dado;</li>



<li class="">Tipo de dado do dado, que varia conforme o objeto em questão. Aqui vamos utilizar a cláusula <kbd>CASE WHEN</kbd> para nomear os objetos tipo <em>base</em> explicitamente.</li>
</ul>
</li>
</ul>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">psql shell: consultando dados das tabelas pg_class, pg_attribute e pg_type</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>SELECT
    c.oid AS oid_tab,
    c.relname AS nome_tab,
    a.attnum AS num_col,
    a.attname AS nome_col,
    t.oid AS oid_tipo,
    t.typname AS nome_tipo,
    CASE
        WHEN t.typtype = 'b' THEN 'tipo base'
        END AS tipo
FROM pg_class c
JOIN pg_attribute a ON c.oid = a.attrelid
JOIN pg_type t ON a.atttypid = t.oid
WHERE 
c.relname = 'pg_class' 
AND a.attnum > 0
ORDER BY 
c.relname, 
a.attnum;

    oid_tab |   nome_tab  | num_col  |   nome_col  | oid_tipo |nome_tipo |   tipo
------------+-------------+------------+---------------------+----------+------------+
       1259 | pg_class    |        1 | oid         |       26 | oid      | tipo base
       1259 | pg_class    |        2 | relname     |       19 | name     | tipo base
       1259 | pg_class    |        3 |relnamespace |       26 | oid      | tipo base
       1259 | pg_class    |        4 | reltype     |       26 | oid      | tipo base
       1259 | pg_class    |        5 | reloftype   |       26 | oid      | tipo base
       1259 | pg_class    |        6 | relowner    |       26 | oid      | tipo base
       1259 | pg_class    |        7 | relam       |       26 | oid      | tipo base
       1259 | pg_class    |        8 | relfilenode |       26 | oid      | tipo base
       1259 | pg_class    |        9 |reltablespace|       26 | oid      | tipo base
       ...</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #D73A49">SELECT</span></span>
<span class="line"><span style="color: #24292E">    </span><span style="color: #005CC5">c</span><span style="color: #24292E">.</span><span style="color: #005CC5">oid</span><span style="color: #24292E"> </span><span style="color: #D73A49">AS</span><span style="color: #24292E"> oid_tab,</span></span>
<span class="line"><span style="color: #24292E">    </span><span style="color: #005CC5">c</span><span style="color: #24292E">.</span><span style="color: #005CC5">relname</span><span style="color: #24292E"> </span><span style="color: #D73A49">AS</span><span style="color: #24292E"> nome_tab,</span></span>
<span class="line"><span style="color: #24292E">    </span><span style="color: #005CC5">a</span><span style="color: #24292E">.</span><span style="color: #005CC5">attnum</span><span style="color: #24292E"> </span><span style="color: #D73A49">AS</span><span style="color: #24292E"> num_col,</span></span>
<span class="line"><span style="color: #24292E">    </span><span style="color: #005CC5">a</span><span style="color: #24292E">.</span><span style="color: #005CC5">attname</span><span style="color: #24292E"> </span><span style="color: #D73A49">AS</span><span style="color: #24292E"> nome_col,</span></span>
<span class="line"><span style="color: #24292E">    </span><span style="color: #005CC5">t</span><span style="color: #24292E">.</span><span style="color: #005CC5">oid</span><span style="color: #24292E"> </span><span style="color: #D73A49">AS</span><span style="color: #24292E"> oid_tipo,</span></span>
<span class="line"><span style="color: #24292E">    </span><span style="color: #005CC5">t</span><span style="color: #24292E">.</span><span style="color: #005CC5">typname</span><span style="color: #24292E"> </span><span style="color: #D73A49">AS</span><span style="color: #24292E"> nome_tipo,</span></span>
<span class="line"><span style="color: #24292E">    </span><span style="color: #D73A49">CASE</span></span>
<span class="line"><span style="color: #24292E">        </span><span style="color: #D73A49">WHEN</span><span style="color: #24292E"> </span><span style="color: #005CC5">t</span><span style="color: #24292E">.</span><span style="color: #005CC5">typtype</span><span style="color: #24292E"> </span><span style="color: #D73A49">=</span><span style="color: #24292E"> </span><span style="color: #032F62">&#39;b&#39;</span><span style="color: #24292E"> </span><span style="color: #D73A49">THEN</span><span style="color: #24292E"> </span><span style="color: #032F62">&#39;tipo base&#39;</span></span>
<span class="line"><span style="color: #24292E">        </span><span style="color: #D73A49">END</span><span style="color: #24292E"> </span><span style="color: #D73A49">AS</span><span style="color: #24292E"> tipo</span></span>
<span class="line"><span style="color: #D73A49">FROM</span><span style="color: #24292E"> pg_class c</span></span>
<span class="line"><span style="color: #D73A49">JOIN</span><span style="color: #24292E"> pg_attribute a </span><span style="color: #D73A49">ON</span><span style="color: #24292E"> </span><span style="color: #005CC5">c</span><span style="color: #24292E">.</span><span style="color: #005CC5">oid</span><span style="color: #24292E"> </span><span style="color: #D73A49">=</span><span style="color: #24292E"> </span><span style="color: #005CC5">a</span><span style="color: #24292E">.</span><span style="color: #005CC5">attrelid</span></span>
<span class="line"><span style="color: #D73A49">JOIN</span><span style="color: #24292E"> pg_type t </span><span style="color: #D73A49">ON</span><span style="color: #24292E"> </span><span style="color: #005CC5">a</span><span style="color: #24292E">.</span><span style="color: #005CC5">atttypid</span><span style="color: #24292E"> </span><span style="color: #D73A49">=</span><span style="color: #24292E"> </span><span style="color: #005CC5">t</span><span style="color: #24292E">.</span><span style="color: #005CC5">oid</span></span>
<span class="line"><span style="color: #D73A49">WHERE</span><span style="color: #24292E"> </span></span>
<span class="line"><span style="color: #005CC5">c</span><span style="color: #24292E">.</span><span style="color: #005CC5">relname</span><span style="color: #24292E"> </span><span style="color: #D73A49">=</span><span style="color: #24292E"> </span><span style="color: #032F62">&#39;pg_class&#39;</span><span style="color: #24292E"> </span></span>
<span class="line"><span style="color: #D73A49">AND</span><span style="color: #24292E"> </span><span style="color: #005CC5">a</span><span style="color: #24292E">.</span><span style="color: #005CC5">attnum</span><span style="color: #24292E"> </span><span style="color: #D73A49">&gt;</span><span style="color: #24292E"> </span><span style="color: #005CC5">0</span></span>
<span class="line"><span style="color: #D73A49">ORDER BY</span><span style="color: #24292E"> </span></span>
<span class="line"><span style="color: #005CC5">c</span><span style="color: #24292E">.</span><span style="color: #005CC5">relname</span><span style="color: #24292E">, </span></span>
<span class="line"><span style="color: #005CC5">a</span><span style="color: #24292E">.</span><span style="color: #005CC5">attnum</span><span style="color: #24292E">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #24292E">    oid_tab |   nome_tab  | num_col  |   nome_col  | oid_tipo |nome_tipo |   tipo</span></span>
<span class="line"><span style="color: #6A737D">------------+-------------+------------+---------------------+----------+------------+</span></span>
<span class="line"><span style="color: #24292E">       </span><span style="color: #005CC5">1259</span><span style="color: #24292E"> | pg_class    |        </span><span style="color: #005CC5">1</span><span style="color: #24292E"> | </span><span style="color: #D73A49">oid</span><span style="color: #24292E">         |       </span><span style="color: #005CC5">26</span><span style="color: #24292E"> | </span><span style="color: #D73A49">oid</span><span style="color: #24292E">      | tipo base</span></span>
<span class="line"><span style="color: #24292E">       </span><span style="color: #005CC5">1259</span><span style="color: #24292E"> | pg_class    |        </span><span style="color: #005CC5">2</span><span style="color: #24292E"> | relname     |       </span><span style="color: #005CC5">19</span><span style="color: #24292E"> | </span><span style="color: #D73A49">name</span><span style="color: #24292E">     | tipo base</span></span>
<span class="line"><span style="color: #24292E">       </span><span style="color: #005CC5">1259</span><span style="color: #24292E"> | pg_class    |        </span><span style="color: #005CC5">3</span><span style="color: #24292E"> |relnamespace |       </span><span style="color: #005CC5">26</span><span style="color: #24292E"> | </span><span style="color: #D73A49">oid</span><span style="color: #24292E">      | tipo base</span></span>
<span class="line"><span style="color: #24292E">       </span><span style="color: #005CC5">1259</span><span style="color: #24292E"> | pg_class    |        </span><span style="color: #005CC5">4</span><span style="color: #24292E"> | reltype     |       </span><span style="color: #005CC5">26</span><span style="color: #24292E"> | </span><span style="color: #D73A49">oid</span><span style="color: #24292E">      | tipo base</span></span>
<span class="line"><span style="color: #24292E">       </span><span style="color: #005CC5">1259</span><span style="color: #24292E"> | pg_class    |        </span><span style="color: #005CC5">5</span><span style="color: #24292E"> | reloftype   |       </span><span style="color: #005CC5">26</span><span style="color: #24292E"> | </span><span style="color: #D73A49">oid</span><span style="color: #24292E">      | tipo base</span></span>
<span class="line"><span style="color: #24292E">       </span><span style="color: #005CC5">1259</span><span style="color: #24292E"> | pg_class    |        </span><span style="color: #005CC5">6</span><span style="color: #24292E"> | relowner    |       </span><span style="color: #005CC5">26</span><span style="color: #24292E"> | </span><span style="color: #D73A49">oid</span><span style="color: #24292E">      | tipo base</span></span>
<span class="line"><span style="color: #24292E">       </span><span style="color: #005CC5">1259</span><span style="color: #24292E"> | pg_class    |        </span><span style="color: #005CC5">7</span><span style="color: #24292E"> | relam       |       </span><span style="color: #005CC5">26</span><span style="color: #24292E"> | </span><span style="color: #D73A49">oid</span><span style="color: #24292E">      | tipo base</span></span>
<span class="line"><span style="color: #24292E">       </span><span style="color: #005CC5">1259</span><span style="color: #24292E"> | pg_class    |        </span><span style="color: #005CC5">8</span><span style="color: #24292E"> | relfilenode |       </span><span style="color: #005CC5">26</span><span style="color: #24292E"> | </span><span style="color: #D73A49">oid</span><span style="color: #24292E">      | tipo base</span></span>
<span class="line"><span style="color: #24292E">       </span><span style="color: #005CC5">1259</span><span style="color: #24292E"> | pg_class    |        </span><span style="color: #005CC5">9</span><span style="color: #24292E"> |reltablespace|       </span><span style="color: #005CC5">26</span><span style="color: #24292E"> | </span><span style="color: #D73A49">oid</span><span style="color: #24292E">      | tipo base</span></span>
<span class="line"><span style="color: #24292E">       ...</span></span></code></pre></div>



<h2 class="wp-block-heading"><kbd>information_schema</kbd></h2>



<p class="wp-block-paragraph">O <kbd>information_schema</kbd> é um schema padronizado definido pelo <a href="https://en.wikipedia.org/wiki/ISO/IEC_9075">ISO</a> que fornece uma maneira portável e independente do fornecedor do banco de dados para se obter informações sobre os objetos do banco de dados, assim como o <kbd>pg_catalog</kbd>, rodando, na verdade, em cima dele, utilizando-o como fonte de dados. Esse schema é também suportado por muitos outros sistemas de gerenciamento de banco de dados (SGBDs). A documentação oficial do PostgreSQL pode ser encontrada <a href="https://www.postgresql.org/docs/current/information-schema.html">aqui</a>.</p>



<p class="wp-block-paragraph">Assim como através das tabelas do catálogo, aqui podemos listar todas as tabelas de um determinado schema utilizando uma tabela do <kbd>information_schema</kbd>:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">psql shell: consultando dados do information_schema</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>localhost: dba@aplicacao=# SELECT 
table_schema, 
table_name 
FROM information_schema.tables 
ORDER BY table_schema;

    table_schema    |              table_name
--------------------+---------------------------------------
 information_schema | collations
 information_schema | information_schema_catalog_name
 information_schema | applicable_roles
 information_schema | domain_constraints
 information_schema | administrable_role_authorizations
 information_schema | collation_character_set_applicability
 information_schema | attributes
 information_schema | character_sets
 information_schema | column_udt_usage
 information_schema | check_constraint_routine_usage
 information_schema | column_column_usage
...</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #24292E">localhost: dba@aplicacao</span><span style="color: #D73A49">=</span><span style="color: #24292E"># </span><span style="color: #D73A49">SELECT</span><span style="color: #24292E"> </span></span>
<span class="line"><span style="color: #24292E">table_schema, </span></span>
<span class="line"><span style="color: #24292E">table_name </span></span>
<span class="line"><span style="color: #D73A49">FROM</span><span style="color: #24292E"> </span><span style="color: #005CC5">information_schema</span><span style="color: #24292E">.</span><span style="color: #005CC5">tables</span><span style="color: #24292E"> </span></span>
<span class="line"><span style="color: #D73A49">ORDER BY</span><span style="color: #24292E"> table_schema;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #24292E">    table_schema    |              table_name</span></span>
<span class="line"><span style="color: #6A737D">--------------------+---------------------------------------</span></span>
<span class="line"><span style="color: #24292E"> information_schema | collations</span></span>
<span class="line"><span style="color: #24292E"> information_schema | information_schema_catalog_name</span></span>
<span class="line"><span style="color: #24292E"> information_schema | applicable_roles</span></span>
<span class="line"><span style="color: #24292E"> information_schema | domain_constraints</span></span>
<span class="line"><span style="color: #24292E"> information_schema | administrable_role_authorizations</span></span>
<span class="line"><span style="color: #24292E"> information_schema | collation_character_set_applicability</span></span>
<span class="line"><span style="color: #24292E"> information_schema | attributes</span></span>
<span class="line"><span style="color: #24292E"> information_schema | character_sets</span></span>
<span class="line"><span style="color: #24292E"> information_schema | column_udt_usage</span></span>
<span class="line"><span style="color: #24292E"> information_schema | check_constraint_routine_usage</span></span>
<span class="line"><span style="color: #24292E"> information_schema | column_column_usage</span></span>
<span class="line"><span style="color: #24292E">...</span></span></code></pre></div>



<p class="wp-block-paragraph">As principais diferenças entre o <kbd>information_schema</kbd> e o <kbd>pg_catalog</kbd> são:</p>



<ul class="wp-block-list">
<li class="">Padrão: conforme citado, o <kbd>information_schema</kbd> segue o padrão ISO SQL e é compatível com diversos outros servidores, já o <kbd>pg_catalog</kbd> é específico do PostgreSQL;</li>



<li class="">Nomenclaturas: como o <kbd>information_schema</kbd> segue o padrão ISO SQL, é notável que seus objetos têm nomenclaturas mais simples e explícitas, diferente do <kbd>pg_catalog</kbd>, em que há termos mais técnicos e específicos do Postgres;</li>



<li class="">Nível de detalhe: o <kbd>information_schema</kbd> fornece uma visão mais simplificada dos metadados do banco, enquanto o <kbd>pg_catalog</kbd> traz informações mais específicas e de baixo nível sobre os objetos do banco de dados;</li>



<li class="">Informações sensíveis: no <kbd>pg_catalog</kbd> é possível encontrar informações sensíveis, por isso é um schema mais utilizado pelos DBAs, ao passo que o <kbd>information_schema</kbd> foi projetado para acesso público, ocultando informações sensíveis como senhas.</li>
</ul>



<p class="wp-block-paragraph">A seguir, está uma maneira de listar todas as tabelas do <kbd>information_schema</kbd> (informação que pode ser encontrada na documentação disponibilizada anteriormente) utilizando o <kbd>pg_catalog</kbd>:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">psql shell: consultando informações do information_schema por tabelas do catálogo (pg_class e pg_namespace)</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>localhost: dba@aplicacao=# SELECT 
c.relname AS table_name 
FROM pg_class c 
JOIN pg_namespace n ON n.oid = c.relnamespace 
WHERE 
n.nspname = 'information_schema' 
AND c.relkind = 'v' 
ORDER BY c.relname;

              table_name
---------------------------------------
 administrable_role_authorizations
 applicable_roles
 attributes
 character_sets
 check_constraint_routine_usage
 check_constraints
 collation_character_set_applicability
 collations
 column_column_usage
 column_domain_usage
 column_options
 column_privileges
 column_udt_usage
 columns
 constraint_column_usage
 constraint_table_usage
 data_type_privileges
...</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #24292E">localhost: dba@aplicacao</span><span style="color: #D73A49">=</span><span style="color: #24292E"># </span><span style="color: #D73A49">SELECT</span><span style="color: #24292E"> </span></span>
<span class="line"><span style="color: #005CC5">c</span><span style="color: #24292E">.</span><span style="color: #005CC5">relname</span><span style="color: #24292E"> </span><span style="color: #D73A49">AS</span><span style="color: #24292E"> table_name </span></span>
<span class="line"><span style="color: #D73A49">FROM</span><span style="color: #24292E"> pg_class c </span></span>
<span class="line"><span style="color: #D73A49">JOIN</span><span style="color: #24292E"> pg_namespace n </span><span style="color: #D73A49">ON</span><span style="color: #24292E"> </span><span style="color: #005CC5">n</span><span style="color: #24292E">.</span><span style="color: #005CC5">oid</span><span style="color: #24292E"> </span><span style="color: #D73A49">=</span><span style="color: #24292E"> </span><span style="color: #005CC5">c</span><span style="color: #24292E">.</span><span style="color: #005CC5">relnamespace</span><span style="color: #24292E"> </span></span>
<span class="line"><span style="color: #D73A49">WHERE</span><span style="color: #24292E"> </span></span>
<span class="line"><span style="color: #005CC5">n</span><span style="color: #24292E">.</span><span style="color: #005CC5">nspname</span><span style="color: #24292E"> </span><span style="color: #D73A49">=</span><span style="color: #24292E"> </span><span style="color: #032F62">&#39;information_schema&#39;</span><span style="color: #24292E"> </span></span>
<span class="line"><span style="color: #D73A49">AND</span><span style="color: #24292E"> </span><span style="color: #005CC5">c</span><span style="color: #24292E">.</span><span style="color: #005CC5">relkind</span><span style="color: #24292E"> </span><span style="color: #D73A49">=</span><span style="color: #24292E"> </span><span style="color: #032F62">&#39;v&#39;</span><span style="color: #24292E"> </span></span>
<span class="line"><span style="color: #D73A49">ORDER BY</span><span style="color: #24292E"> </span><span style="color: #005CC5">c</span><span style="color: #24292E">.</span><span style="color: #005CC5">relname</span><span style="color: #24292E">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #24292E">              table_name</span></span>
<span class="line"><span style="color: #6A737D">---------------------------------------</span></span>
<span class="line"><span style="color: #24292E"> administrable_role_authorizations</span></span>
<span class="line"><span style="color: #24292E"> applicable_roles</span></span>
<span class="line"><span style="color: #24292E"> attributes</span></span>
<span class="line"><span style="color: #24292E"> character_sets</span></span>
<span class="line"><span style="color: #24292E"> check_constraint_routine_usage</span></span>
<span class="line"><span style="color: #24292E"> check_constraints</span></span>
<span class="line"><span style="color: #24292E"> collation_character_set_applicability</span></span>
<span class="line"><span style="color: #24292E"> collations</span></span>
<span class="line"><span style="color: #24292E"> column_column_usage</span></span>
<span class="line"><span style="color: #24292E"> column_domain_usage</span></span>
<span class="line"><span style="color: #24292E"> column_options</span></span>
<span class="line"><span style="color: #24292E"> column_privileges</span></span>
<span class="line"><span style="color: #24292E"> column_udt_usage</span></span>
<span class="line"><span style="color: #24292E"> columns</span></span>
<span class="line"><span style="color: #24292E"> constraint_column_usage</span></span>
<span class="line"><span style="color: #24292E"> constraint_table_usage</span></span>
<span class="line"><span style="color: #24292E"> data_type_privileges</span></span>
<span class="line"><span style="color: #24292E">...</span></span></code></pre></div>



<h2 class="wp-block-heading">Objetos físicos e lógicos</h2>



<p class="wp-block-paragraph">Objetos físicos referem-se aos componentes do banco de dados que têm representação física no sistema de arquivos do PostgreSQL, ou seja, além de estarem presentes no banco, também são representados por arquivos em disco. Alguns dos principais objetos físicos são:</p>



<ul class="wp-block-list">
<li class="">Tabelas (incluindo, portanto, as do catálogo);</li>



<li class="">Ínidices;</li>



<li class="">Tablespaces;</li>



<li class="">Databases etc.</li>
</ul>



<p class="wp-block-paragraph">Podemos encontrar esses objetos nas pastas nomeadas <kbd>base</kbd> e <kbd>global</kbd>, a depender de serem globais ou locais. Mas não se preocupe, no próximo tópico do artigo, explicaremos mais sobre objetos globais e locais.<br>Abaixo, seguem exemplos de arquivos de objetos, que são nomeados com números, presentes no diretório <kbd>global</kbd> no <kbd>PGDATA</kbd>:&nbsp;</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">Debain shell: listando arquivos e diretórios do diretório global</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>$ ls -lha $PGDATA/global
total 644K
drwx------  2 postgres postgres 4.0K May 23 17:56 .
drwx------ 19 postgres postgres 4.0K Apr  9 18:41 ..
...
-rw-------  1 postgres postgres 8.0K May 16 14:44 1260
-rw-------  1 postgres postgres  24K Mar 27 15:39 1260_fsm
-rw-------  1 postgres postgres 8.0K Mar 27 15:49 1260_vm
-rw-------  1 postgres postgres 8.0K May 13 19:14 1261
-rw-------  1 postgres postgres  24K Mar 27 15:39 1261_fsm
-rw-------  1 postgres postgres 8.0K Apr 22 15:11 1261_vm
-rw-------  1 postgres postgres 8.0K Jun  4 19:45 1262
...
-rw-------  1 postgres postgres 8.0K Jun  4 19:45 pg_control
-rw-------  1 postgres postgres  524 Mar 27 15:39 pg_filenode.map
-rw-------  1 postgres postgres  29K May 23 17:56 pg_internal.init</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #24292E">$ ls -lha $PGDATA/global</span></span>
<span class="line"><span style="color: #005CC5">total 644K</span></span>
<span class="line"><span style="color: #005CC5">drwx------  2 postgres postgres 4.0K May 23 17:56 .</span></span>
<span class="line"><span style="color: #005CC5">drwx------ 19 postgres postgres 4.0K Apr  9 18:41 ..</span></span>
<span class="line"><span style="color: #005CC5">...</span></span>
<span class="line"><span style="color: #005CC5">-rw-------  1 postgres postgres 8.0K May 16 14:44 1260</span></span>
<span class="line"><span style="color: #005CC5">-rw-------  1 postgres postgres  24K Mar 27 15:39 1260_fsm</span></span>
<span class="line"><span style="color: #005CC5">-rw-------  1 postgres postgres 8.0K Mar 27 15:49 1260_vm</span></span>
<span class="line"><span style="color: #005CC5">-rw-------  1 postgres postgres 8.0K May 13 19:14 1261</span></span>
<span class="line"><span style="color: #005CC5">-rw-------  1 postgres postgres  24K Mar 27 15:39 1261_fsm</span></span>
<span class="line"><span style="color: #005CC5">-rw-------  1 postgres postgres 8.0K Apr 22 15:11 1261_vm</span></span>
<span class="line"><span style="color: #005CC5">-rw-------  1 postgres postgres 8.0K Jun  4 19:45 1262</span></span>
<span class="line"><span style="color: #005CC5">...</span></span>
<span class="line"><span style="color: #005CC5">-rw-------  1 postgres postgres 8.0K Jun  4 19:45 pg_control</span></span>
<span class="line"><span style="color: #005CC5">-rw-------  1 postgres postgres  524 Mar 27 15:39 pg_filenode.map</span></span>
<span class="line"><span style="color: #005CC5">-rw-------  1 postgres postgres  29K May 23 17:56 pg_internal.init</span></span></code></pre></div>



<p class="wp-block-paragraph">A seguir, estão os arquivos dos objetos que se encontram no diretório base, também no <kbd>PGDATA</kbd>:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">Debian shell: listando arquivos e diretórios do diretório base</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># ls -lha $PGDATA/base
total 76K
drwx------ 11 postgres postgres 4.0K Jun  4 19:40 .
drwx------ 19 postgres postgres 4.0K Apr  9 18:41 ..
drwx------  2 postgres postgres 4.0K May 13 18:50 1
drwx------  2 postgres postgres 4.0K Apr  9 19:11 16398
drwx------  2 postgres postgres  12K Apr 15 18:50 16449
drwx------  2 postgres postgres  12K May 23 17:55 16539
drwx------  2 postgres postgres 4.0K May  8 13:46 16645
drwx------  2 postgres postgres  12K May 16 12:37 17660
drwx------  2 postgres postgres 4.0K Mar 27 15:39 4
drwx------  2 postgres postgres  12K May 23 18:05 5
drwx------  2 postgres postgres 4.0K May 23 17:55 pgsql_tmp</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #24292E"># ls -lha $PGDATA/base</span></span>
<span class="line"><span style="color: #005CC5">total 76K</span></span>
<span class="line"><span style="color: #005CC5">drwx------ 11 postgres postgres 4.0K Jun  4 19:40 .</span></span>
<span class="line"><span style="color: #005CC5">drwx------ 19 postgres postgres 4.0K Apr  9 18:41 ..</span></span>
<span class="line"><span style="color: #005CC5">drwx------  2 postgres postgres 4.0K May 13 18:50 1</span></span>
<span class="line"><span style="color: #005CC5">drwx------  2 postgres postgres 4.0K Apr  9 19:11 16398</span></span>
<span class="line"><span style="color: #005CC5">drwx------  2 postgres postgres  12K Apr 15 18:50 16449</span></span>
<span class="line"><span style="color: #005CC5">drwx------  2 postgres postgres  12K May 23 17:55 16539</span></span>
<span class="line"><span style="color: #005CC5">drwx------  2 postgres postgres 4.0K May  8 13:46 16645</span></span>
<span class="line"><span style="color: #005CC5">drwx------  2 postgres postgres  12K May 16 12:37 17660</span></span>
<span class="line"><span style="color: #005CC5">drwx------  2 postgres postgres 4.0K Mar 27 15:39 4</span></span>
<span class="line"><span style="color: #005CC5">drwx------  2 postgres postgres  12K May 23 18:05 5</span></span>
<span class="line"><span style="color: #005CC5">drwx------  2 postgres postgres 4.0K May 23 17:55 pgsql_tmp</span></span></code></pre></div>



<p class="wp-block-paragraph">Já os objetos lógicos são abstrações que não têm uma representação física direta no sistema de arquivos, mas são gerenciadas pelo PostgreSQL. Alguns desses objetos são schemas, views, funções etc.</p>



<h2 class="wp-block-heading">Objetos globais e locais</h2>



<p class="wp-block-paragraph">Objetos globais são aqueles que não pertencem a um banco de dados específico e podem ser acessados por qualquer banco de dados de uma instância no PostgreSQL. É possível encontrá-los no diretório <kbd>global</kbd> no <kbd>PGDATA</kbd>, que vimos antes:&nbsp;</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">Debian shell: listando arquivos e diretórios do diretório global, com ênfase no arquivo 1262</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>$ ls -lha $PGDATA/global
total 644K
drwx------  2 postgres postgres 4.0K May 23 17:56 .
drwx------ 19 postgres postgres 4.0K Apr  9 18:41 ..
...
-rw-------  1 postgres postgres 8.0K May 16 14:44 1260
-rw-------  1 postgres postgres  24K Mar 27 15:39 1260_fsm
-rw-------  1 postgres postgres 8.0K Mar 27 15:49 1260_vm
-rw-------  1 postgres postgres 8.0K May 13 19:14 1261
-rw-------  1 postgres postgres  24K Mar 27 15:39 1261_fsm
-rw-------  1 postgres postgres 8.0K Apr 22 15:11 1261_vm
-rw-------  1 postgres postgres 8.0K Jun  4 19:45 1262
...
-rw-------  1 postgres postgres 8.0K Jun  4 19:45 pg_control
-rw-------  1 postgres postgres  524 Mar 27 15:39 pg_filenode.map
-rw-------  1 postgres postgres  29K May 23 17:56 pg_internal.init</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #24292E">$ ls -lha $PGDATA/global</span></span>
<span class="line"><span style="color: #005CC5">total 644K</span></span>
<span class="line"><span style="color: #005CC5">drwx------  2 postgres postgres 4.0K May 23 17:56 .</span></span>
<span class="line"><span style="color: #005CC5">drwx------ 19 postgres postgres 4.0K Apr  9 18:41 ..</span></span>
<span class="line"><span style="color: #005CC5">...</span></span>
<span class="line"><span style="color: #005CC5">-rw-------  1 postgres postgres 8.0K May 16 14:44 1260</span></span>
<span class="line"><span style="color: #005CC5">-rw-------  1 postgres postgres  24K Mar 27 15:39 1260_fsm</span></span>
<span class="line"><span style="color: #005CC5">-rw-------  1 postgres postgres 8.0K Mar 27 15:49 1260_vm</span></span>
<span class="line"><span style="color: #005CC5">-rw-------  1 postgres postgres 8.0K May 13 19:14 1261</span></span>
<span class="line"><span style="color: #005CC5">-rw-------  1 postgres postgres  24K Mar 27 15:39 1261_fsm</span></span>
<span class="line"><span style="color: #005CC5">-rw-------  1 postgres postgres 8.0K Apr 22 15:11 1261_vm</span></span>
<span class="line"><span style="color: #005CC5">-rw-------  1 postgres postgres 8.0K Jun  4 19:45 1262</span></span>
<span class="line"><span style="color: #005CC5">...</span></span>
<span class="line"><span style="color: #005CC5">-rw-------  1 postgres postgres 8.0K Jun  4 19:45 pg_control</span></span>
<span class="line"><span style="color: #005CC5">-rw-------  1 postgres postgres  524 Mar 27 15:39 pg_filenode.map</span></span>
<span class="line"><span style="color: #005CC5">-rw-------  1 postgres postgres  29K May 23 17:56 pg_internal.init</span></span></code></pre></div>



<p class="wp-block-paragraph">É importante notar que os nomes dos arquivos não são números aleatórios: geralmente eles são o mesmo número OID do objeto em questão. Por exemplo, nesta saída temos o arquivo 1262 e, através de uma consulta a uma tabela do catálogo do sistema no psql, a <kbd>pg_class</kbd> (nela é possível encontrar informações de alguns objetos do banco de dados, como tabelas, índices, views etc.), e buscando pelo OID 1262, é possível descobrir que esse arquivo representa a tabela <kbd>pg_database</kbd>, conforme saída da consulta a seguir:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">psql shell: consultando informações do objeto global 1262</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>postgres@postgres=# SELECT 
oid,
relname 
FROM pg_class 
WHERE oid = 1262;

 oid  |   relname
------+-------------
 1262 | pg_database
(1 row)</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #24292E">postgres@postgres</span><span style="color: #D73A49">=</span><span style="color: #24292E"># </span><span style="color: #D73A49">SELECT</span><span style="color: #24292E"> </span></span>
<span class="line"><span style="color: #D73A49">oid</span><span style="color: #24292E">,</span></span>
<span class="line"><span style="color: #24292E">relname </span></span>
<span class="line"><span style="color: #D73A49">FROM</span><span style="color: #24292E"> pg_class </span></span>
<span class="line"><span style="color: #D73A49">WHERE</span><span style="color: #24292E"> </span><span style="color: #D73A49">oid</span><span style="color: #24292E"> </span><span style="color: #D73A49">=</span><span style="color: #24292E"> </span><span style="color: #005CC5">1262</span><span style="color: #24292E">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #24292E"> </span><span style="color: #D73A49">oid</span><span style="color: #24292E">  |   relname</span></span>
<span class="line"><span style="color: #6A737D">------+-------------</span></span>
<span class="line"><span style="color: #24292E"> </span><span style="color: #005CC5">1262</span><span style="color: #24292E"> | pg_database</span></span>
<span class="line"><span style="color: #24292E">(</span><span style="color: #005CC5">1</span><span style="color: #24292E"> </span><span style="color: #D73A49">row</span><span style="color: #24292E">)</span></span></code></pre></div>



<p class="wp-block-paragraph">Nessa consulta, utilizamos as colunas <kbd>relisshared</kbd> e <kbd>relkind</kbd> como filtro para encontrar as tabelas do catálogo na tabela <kbd>pg_class</kbd>. Isso porque a coluna <kbd>relisshared</kbd> é de valor booleano, sendo verdadeira para indicar uma tabela global (do catálogo do sistema), e a coluna <kbd>relkind</kbd> traz o tipo de objeto, sendo ‘<kbd>r</kbd>’ representativo de tabelas. A seguir podemos ver outras tabelas globais do catálogo pela <kbd>pg_class</kbd>:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">psql shell: consultando as tabelas do catálogo utilizando a tabela pg_class</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>postgres@postgres=# SELECT 
oid,
relname 
FROM pg_class 
WHERE 
relisshared 
AND relkind = 'r';

 oid  |        relname
------+-----------------------
 1260 | pg_authid
 6100 | pg_subscription
 1262 | pg_database
 2964 | pg_db_role_setting
 1213 | pg_tablespace
 1261 | pg_auth_members
 1214 | pg_shdepend
 2396 | pg_shdescription
 6000 | pg_replication_origin
 3592 | pg_shseclabel
 6243 | pg_parameter_acl
(11 rows)</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #24292E">postgres@postgres</span><span style="color: #D73A49">=</span><span style="color: #24292E"># </span><span style="color: #D73A49">SELECT</span><span style="color: #24292E"> </span></span>
<span class="line"><span style="color: #D73A49">oid</span><span style="color: #24292E">,</span></span>
<span class="line"><span style="color: #24292E">relname </span></span>
<span class="line"><span style="color: #D73A49">FROM</span><span style="color: #24292E"> pg_class </span></span>
<span class="line"><span style="color: #D73A49">WHERE</span><span style="color: #24292E"> </span></span>
<span class="line"><span style="color: #24292E">relisshared </span></span>
<span class="line"><span style="color: #D73A49">AND</span><span style="color: #24292E"> relkind </span><span style="color: #D73A49">=</span><span style="color: #24292E"> </span><span style="color: #032F62">&#39;r&#39;</span><span style="color: #24292E">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #24292E"> </span><span style="color: #D73A49">oid</span><span style="color: #24292E">  |        relname</span></span>
<span class="line"><span style="color: #6A737D">------+-----------------------</span></span>
<span class="line"><span style="color: #24292E"> </span><span style="color: #005CC5">1260</span><span style="color: #24292E"> | pg_authid</span></span>
<span class="line"><span style="color: #24292E"> </span><span style="color: #005CC5">6100</span><span style="color: #24292E"> | pg_subscription</span></span>
<span class="line"><span style="color: #24292E"> </span><span style="color: #005CC5">1262</span><span style="color: #24292E"> | pg_database</span></span>
<span class="line"><span style="color: #24292E"> </span><span style="color: #005CC5">2964</span><span style="color: #24292E"> | pg_db_role_setting</span></span>
<span class="line"><span style="color: #24292E"> </span><span style="color: #005CC5">1213</span><span style="color: #24292E"> | pg_tablespace</span></span>
<span class="line"><span style="color: #24292E"> </span><span style="color: #005CC5">1261</span><span style="color: #24292E"> | pg_auth_members</span></span>
<span class="line"><span style="color: #24292E"> </span><span style="color: #005CC5">1214</span><span style="color: #24292E"> | pg_shdepend</span></span>
<span class="line"><span style="color: #24292E"> </span><span style="color: #005CC5">2396</span><span style="color: #24292E"> | pg_shdescription</span></span>
<span class="line"><span style="color: #24292E"> </span><span style="color: #005CC5">6000</span><span style="color: #24292E"> | pg_replication_origin</span></span>
<span class="line"><span style="color: #24292E"> </span><span style="color: #005CC5">3592</span><span style="color: #24292E"> | pg_shseclabel</span></span>
<span class="line"><span style="color: #24292E"> </span><span style="color: #005CC5">6243</span><span style="color: #24292E"> | pg_parameter_acl</span></span>
<span class="line"><span style="color: #24292E">(</span><span style="color: #005CC5">11</span><span style="color: #24292E"> </span><span style="color: #D73A49">rows</span><span style="color: #24292E">)</span></span></code></pre></div>



<p class="wp-block-paragraph">Outro exemplo de objeto global são as tablespaces, que são locais de armazenamento que contêm dados de bancos PostgreSQL fora do diretório base, o PGDATA. Aqui criamos uma chamada <kbd>novaTablespace</kbd> e um banco de dados dentro dela, chamado <kbd>banco_tblspc</kbd>.</p>



<p class="wp-block-paragraph">Além do local onde a tablespace foi criada, também podemos encontrá-la via link simbólico no caminho <kbd>$PGDATA/pg_tblspc/</kbd>:&nbsp;</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">Debian shell: listando a tablespace criada</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># ls -l $PGDATA/pg_tblspc/
total 0
lrwxrwxrwx 1 postgres postgres 26 Jun 11 17:22 18202 -> /var/lib/postgresql/tblspc</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #24292E"># ls -l $PGDATA/pg_tblspc/</span></span>
<span class="line"><span style="color: #005CC5">total 0</span></span>
<span class="line"><span style="color: #005CC5">lrwxrwxrwx 1 postgres postgres 26 Jun 11 17:22 18202 -&gt; /var/lib/postgresql/tblspc</span></span></code></pre></div>



<p class="wp-block-paragraph">Dentro dela, temos mais um diretório, que abriga o nosso banco recém-criado:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">Debian shell: listandso os diretórios da tablespace criada</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># ls -lha $PGDATA/pg_tblspc/18202
drwx------ 3 postgres postgres 4.0K Jun 11 17:22 .
drwxr-xr-x 6 postgres postgres 4.0K Jun 11 17:34 ..
drwx------ 3 postgres postgres 4.0K Jun 11 17:34 PG_16_202307071</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #24292E"># ls -lha $PGDATA/pg_tblspc/18202</span></span>
<span class="line"><span style="color: #005CC5">drwx------ 3 postgres postgres 4.0K Jun 11 17:22 .</span></span>
<span class="line"><span style="color: #005CC5">drwxr-xr-x 6 postgres postgres 4.0K Jun 11 17:34 ..</span></span>
<span class="line"><span style="color: #005CC5">drwx------ 3 postgres postgres 4.0K Jun 11 17:34 PG_16_202307071</span></span></code></pre></div>



<p class="wp-block-paragraph">Então, chegamos no diretório oficial do banco, que vai abrigar os objetos criados nele:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">Debian shell: listando dados do diretório do banco criado</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># ls -lha $PGDATA/pg_tblspc/18202/PG_16_202307071/
total 12K
drwx------ 3 postgres postgres 4.0K Jun 11 17:34 .
drwx------ 3 postgres postgres 4.0K Jun 11 17:22 ..
drwx------ 2 postgres postgres 4.0K Jun 11 17:34 18203</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #24292E"># ls -lha $PGDATA/pg_tblspc/18202/PG_16_202307071/</span></span>
<span class="line"><span style="color: #005CC5">total 12K</span></span>
<span class="line"><span style="color: #005CC5">drwx------ 3 postgres postgres 4.0K Jun 11 17:34 .</span></span>
<span class="line"><span style="color: #005CC5">drwx------ 3 postgres postgres 4.0K Jun 11 17:22 ..</span></span>
<span class="line"><span style="color: #005CC5">drwx------ 2 postgres postgres 4.0K Jun 11 17:34 18203</span></span></code></pre></div>



<p class="wp-block-paragraph">O número que nomeia o arquivo do banco também é o OID desse objeto, o que facilita encontrá-lo na <kbd>pg_database</kbd>, por exemplo:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">psql shell: consultando dados do objeto que representa o banco criado no catálogo do sistema</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&#91;local&#93;: postgres@postgres=# SELECT * FROM pg_database WHERE oid = 18203;
-&#91; RECORD 1 &#93;--+-------------
oid            | 18203
datname        | banco_tblspc
datdba         | 10
encoding       | 6
datlocprovider | c
datistemplate  | f
datallowconn   | t
datconnlimit   | -1
datfrozenxid   | 722
datminmxid     | 1
dattablespace  | 18202
datcollate     | C.UTF-8
datctype       | C.UTF-8
daticulocale   | (null)
daticurules    | (null)
datcollversion | (null)
datacl         | (null)</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #24292E">&#91;local&#93;: postgres@postgres</span><span style="color: #D73A49">=</span><span style="color: #24292E"># </span><span style="color: #D73A49">SELECT</span><span style="color: #24292E"> </span><span style="color: #D73A49">*</span><span style="color: #24292E"> </span><span style="color: #D73A49">FROM</span><span style="color: #24292E"> pg_database </span><span style="color: #D73A49">WHERE</span><span style="color: #24292E"> </span><span style="color: #D73A49">oid</span><span style="color: #24292E"> </span><span style="color: #D73A49">=</span><span style="color: #24292E"> </span><span style="color: #005CC5">18203</span><span style="color: #24292E">;</span></span>
<span class="line"><span style="color: #D73A49">-</span><span style="color: #24292E">&#91; RECORD 1 &#93;</span><span style="color: #6A737D">--+-------------</span></span>
<span class="line"><span style="color: #D73A49">oid</span><span style="color: #24292E">            | </span><span style="color: #005CC5">18203</span></span>
<span class="line"><span style="color: #24292E">datname        | banco_tblspc</span></span>
<span class="line"><span style="color: #24292E">datdba         | </span><span style="color: #005CC5">10</span></span>
<span class="line"><span style="color: #D73A49">encoding</span><span style="color: #24292E">       | </span><span style="color: #005CC5">6</span></span>
<span class="line"><span style="color: #24292E">datlocprovider | c</span></span>
<span class="line"><span style="color: #24292E">datistemplate  | f</span></span>
<span class="line"><span style="color: #24292E">datallowconn   | t</span></span>
<span class="line"><span style="color: #24292E">datconnlimit   | </span><span style="color: #D73A49">-</span><span style="color: #005CC5">1</span></span>
<span class="line"><span style="color: #24292E">datfrozenxid   | </span><span style="color: #005CC5">722</span></span>
<span class="line"><span style="color: #24292E">datminmxid     | </span><span style="color: #005CC5">1</span></span>
<span class="line"><span style="color: #24292E">dattablespace  | </span><span style="color: #005CC5">18202</span></span>
<span class="line"><span style="color: #24292E">datcollate     | </span><span style="color: #005CC5">C</span><span style="color: #24292E">.</span><span style="color: #005CC5">UTF</span><span style="color: #D73A49">-</span><span style="color: #005CC5">8</span></span>
<span class="line"><span style="color: #24292E">datctype       | </span><span style="color: #005CC5">C</span><span style="color: #24292E">.</span><span style="color: #005CC5">UTF</span><span style="color: #D73A49">-</span><span style="color: #005CC5">8</span></span>
<span class="line"><span style="color: #24292E">daticulocale   | (</span><span style="color: #D73A49">null</span><span style="color: #24292E">)</span></span>
<span class="line"><span style="color: #24292E">daticurules    | (</span><span style="color: #D73A49">null</span><span style="color: #24292E">)</span></span>
<span class="line"><span style="color: #24292E">datcollversion | (</span><span style="color: #D73A49">null</span><span style="color: #24292E">)</span></span>
<span class="line"><span style="color: #24292E">datacl         | (</span><span style="color: #D73A49">null</span><span style="color: #24292E">)</span></span></code></pre></div>



<p class="wp-block-paragraph">E também podemos encontrar nossa tablespace na tabela <kbd>pg_tablespace</kbd>:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">psql shell: consultando a tablespace criada no catálogo do sistema</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&#91;local&#93;: postgres@postgres=# select * from pg_tablespace;
  oid  |    spcname     | spcowner | spcacl | spcoptions
-------+----------------+----------+--------+------------
  1663 | pg_default     |       10 | (null) | (null)
  1664 | pg_global      |       10 | (null) | (null)
 18202 | novatablespace |       10 | (null) | (null)
(3 rows)</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #24292E">&#91;local&#93;: postgres@postgres</span><span style="color: #D73A49">=</span><span style="color: #24292E"># </span><span style="color: #D73A49">select</span><span style="color: #24292E"> </span><span style="color: #D73A49">*</span><span style="color: #24292E"> </span><span style="color: #D73A49">from</span><span style="color: #24292E"> pg_tablespace;</span></span>
<span class="line"><span style="color: #24292E">  </span><span style="color: #D73A49">oid</span><span style="color: #24292E">  |    spcname     | spcowner | spcacl | spcoptions</span></span>
<span class="line"><span style="color: #6A737D">-------+----------------+----------+--------+------------</span></span>
<span class="line"><span style="color: #24292E">  </span><span style="color: #005CC5">1663</span><span style="color: #24292E"> | pg_default     |       </span><span style="color: #005CC5">10</span><span style="color: #24292E"> | (</span><span style="color: #D73A49">null</span><span style="color: #24292E">) | (</span><span style="color: #D73A49">null</span><span style="color: #24292E">)</span></span>
<span class="line"><span style="color: #24292E">  </span><span style="color: #005CC5">1664</span><span style="color: #24292E"> | pg_global      |       </span><span style="color: #005CC5">10</span><span style="color: #24292E"> | (</span><span style="color: #D73A49">null</span><span style="color: #24292E">) | (</span><span style="color: #D73A49">null</span><span style="color: #24292E">)</span></span>
<span class="line"><span style="color: #24292E"> </span><span style="color: #005CC5">18202</span><span style="color: #24292E"> | novatablespace |       </span><span style="color: #005CC5">10</span><span style="color: #24292E"> | (</span><span style="color: #D73A49">null</span><span style="color: #24292E">) | (</span><span style="color: #D73A49">null</span><span style="color: #24292E">)</span></span>
<span class="line"><span style="color: #24292E">(</span><span style="color: #005CC5">3</span><span style="color: #24292E"> </span><span style="color: #D73A49">rows</span><span style="color: #24292E">)</span></span></code></pre></div>



<p class="wp-block-paragraph">Já os locais são objetos pertencentes a um banco de dados específico e só podem ser acessados dentro desse banco. Ficam no diretório base, no <kbd>PGDATA</kbd>. A seguir, podemos ver a listagem de arquivos desse diretório:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">Debian shell: listando objetos locais no diretório base</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># ls -lha $PGDATA/base
total 72K
drwx------ 10 postgres postgres 4.0K Jun  6 03:44 .
drwx------ 19 postgres postgres 4.0K Apr  9 18:41 ..
drwx------  2 postgres postgres 4.0K May 13 18:50 1
drwx------  2 postgres postgres  12K Apr 15 18:50 16449
drwx------  2 postgres postgres  12K May 23 17:55 16539
drwx------  2 postgres postgres 4.0K May  8 13:46 16645
drwx------  2 postgres postgres  12K May 16 12:37 17660
drwx------  2 postgres postgres 4.0K Mar 27 15:39 4
drwx------  2 postgres postgres  12K May 23 18:05 5
drwx------  2 postgres postgres 4.0K May 23 17:55 pgsql_tmp</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #24292E"># ls -lha $PGDATA/base</span></span>
<span class="line"><span style="color: #005CC5">total 72K</span></span>
<span class="line"><span style="color: #005CC5">drwx------ 10 postgres postgres 4.0K Jun  6 03:44 .</span></span>
<span class="line"><span style="color: #005CC5">drwx------ 19 postgres postgres 4.0K Apr  9 18:41 ..</span></span>
<span class="line"><span style="color: #005CC5">drwx------  2 postgres postgres 4.0K May 13 18:50 1</span></span>
<span class="line"><span style="color: #005CC5">drwx------  2 postgres postgres  12K Apr 15 18:50 16449</span></span>
<span class="line"><span style="color: #005CC5">drwx------  2 postgres postgres  12K May 23 17:55 16539</span></span>
<span class="line"><span style="color: #005CC5">drwx------  2 postgres postgres 4.0K May  8 13:46 16645</span></span>
<span class="line"><span style="color: #005CC5">drwx------  2 postgres postgres  12K May 16 12:37 17660</span></span>
<span class="line"><span style="color: #005CC5">drwx------  2 postgres postgres 4.0K Mar 27 15:39 4</span></span>
<span class="line"><span style="color: #005CC5">drwx------  2 postgres postgres  12K May 23 18:05 5</span></span>
<span class="line"><span style="color: #005CC5">drwx------  2 postgres postgres 4.0K May 23 17:55 pgsql_tmp</span></span></code></pre></div>



<p class="wp-block-paragraph">Ao entrar nesse diretório, diferente da <kbd>global</kbd> em que já vemos os arquivos dos objetos, temos mais um nível de diretórios representando cada banco de dados existente na instância do PostgreSQL, e é dentro de cada um deles que estão armazenados os objetos locais do banco. É possível checar a qual banco de dados cada diretório é referente consultando a tabela <kbd>pg_database</kbd>, novamente usando os OIDs de cada objeto para identificá-los:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">psql shell: consultando dados dos bancos de dados</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>postgres@postgres=# SELECT oid, datname FROM pg_database;
  oid  |  datname
-------+-----------
     5 | postgres
     1 | template1
     4 | template0
 17660 | pagila
 16539 | aplicacao
(5 rows)</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #24292E">postgres@postgres</span><span style="color: #D73A49">=</span><span style="color: #24292E"># </span><span style="color: #D73A49">SELECT</span><span style="color: #24292E"> </span><span style="color: #D73A49">oid</span><span style="color: #24292E">, datname </span><span style="color: #D73A49">FROM</span><span style="color: #24292E"> pg_database;</span></span>
<span class="line"><span style="color: #24292E">  </span><span style="color: #D73A49">oid</span><span style="color: #24292E">  |  datname</span></span>
<span class="line"><span style="color: #6A737D">-------+-----------</span></span>
<span class="line"><span style="color: #24292E">     </span><span style="color: #005CC5">5</span><span style="color: #24292E"> | postgres</span></span>
<span class="line"><span style="color: #24292E">     </span><span style="color: #005CC5">1</span><span style="color: #24292E"> | template1</span></span>
<span class="line"><span style="color: #24292E">     </span><span style="color: #005CC5">4</span><span style="color: #24292E"> | template0</span></span>
<span class="line"><span style="color: #24292E"> </span><span style="color: #005CC5">17660</span><span style="color: #24292E"> | pagila</span></span>
<span class="line"><span style="color: #24292E"> </span><span style="color: #005CC5">16539</span><span style="color: #24292E"> | aplicacao</span></span>
<span class="line"><span style="color: #24292E">(</span><span style="color: #005CC5">5</span><span style="color: #24292E"> </span><span style="color: #D73A49">rows</span><span style="color: #24292E">)</span></span></code></pre></div>



<p class="wp-block-paragraph">Vamos listar os arquivos do diretório do banco criado há alguns artigos, o <kbd>aplicacao</kbd>, diretório 16539:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">Debian shell: listando arquivos do diretório do objeto 16539</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># ls -lha $PGDATA/base/16539/
total 7.9M
drwx------ 2 postgres postgres  12K May 23 17:55 .
drwx------ 8 postgres postgres 4.0K Jun  6 03:56 ..
-rw------- 1 postgres postgres 8.0K Apr 22 15:41 112
...
-rw------- 1 postgres postgres 8.0K May 10 12:49 16649
-rw------- 1 postgres postgres 8.0K May  8 17:43 16656
-rw------- 1 postgres postgres  16K May  8 17:43 16660
-rw------- 1 postgres postgres 8.0K May 16 12:14 16662
-rw------- 1 postgres postgres 8.0K May 16 12:14 16663
-rw------- 1 postgres postgres  16K May 16 12:14 16667
-rw------- 1 postgres postgres 8.0K May  8 17:43 16690
-rw------- 1 postgres postgres 8.0K May  9 13:44 16691
-rw------- 1 postgres postgres  16K May  8 17:43 16695
-rw------- 1 postgres postgres 8.0K May  8 17:43 16697
-rw------- 1 postgres postgres 8.0K May  8 17:43 16698
-rw------- 1 postgres postgres  16K May  8 17:43 16702
-rw------- 1 postgres postgres 8.0K May  8 17:43 16704
-rw------- 1 postgres postgres 8.0K May  8 17:43 16705
-rw------- 1 postgres postgres  16K May  8 17:43 16709
-rw------- 1 postgres postgres 8.0K Apr 22 15:41 174
-rw------- 1 postgres postgres 8.0K Apr 22 15:41 175
-rw------- 1 postgres postgres 8.0K May 16 12:39 18131
-rw------- 1 postgres postgres 8.0K May 16 12:39 18132
-rw------- 1 postgres postgres  16K May 16 12:39 18136
-rw------- 1 postgres postgres 8.0K May 16 12:44 18140
-rw------- 1 postgres postgres 8.0K May 16 12:44 18141
-rw------- 1 postgres postgres  16K May 16 12:44 18145
-rw------- 1 postgres postgres 8.0K May 16 14:39 18148
-rw------- 1 postgres postgres 8.0K May 16 14:39 18149
-rw------- 1 postgres postgres  16K May 16 14:39 18153
...
-rw------- 1 postgres postgres    3 Apr 22 15:40 PG_VERSION
-rw------- 1 postgres postgres  524 Apr 22 15:40 pg_filenode.map
-rw------- 1 postgres postgres 156K May 23 17:55 pg_internal.init</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #24292E"># ls -lha $PGDATA/base/16539/</span></span>
<span class="line"><span style="color: #005CC5">total 7.9M</span></span>
<span class="line"><span style="color: #005CC5">drwx------ 2 postgres postgres  12K May 23 17:55 .</span></span>
<span class="line"><span style="color: #005CC5">drwx------ 8 postgres postgres 4.0K Jun  6 03:56 ..</span></span>
<span class="line"><span style="color: #005CC5">-rw------- 1 postgres postgres 8.0K Apr 22 15:41 112</span></span>
<span class="line"><span style="color: #005CC5">...</span></span>
<span class="line"><span style="color: #005CC5">-rw------- 1 postgres postgres 8.0K May 10 12:49 16649</span></span>
<span class="line"><span style="color: #005CC5">-rw------- 1 postgres postgres 8.0K May  8 17:43 16656</span></span>
<span class="line"><span style="color: #005CC5">-rw------- 1 postgres postgres  16K May  8 17:43 16660</span></span>
<span class="line"><span style="color: #005CC5">-rw------- 1 postgres postgres 8.0K May 16 12:14 16662</span></span>
<span class="line"><span style="color: #005CC5">-rw------- 1 postgres postgres 8.0K May 16 12:14 16663</span></span>
<span class="line"><span style="color: #005CC5">-rw------- 1 postgres postgres  16K May 16 12:14 16667</span></span>
<span class="line"><span style="color: #005CC5">-rw------- 1 postgres postgres 8.0K May  8 17:43 16690</span></span>
<span class="line"><span style="color: #005CC5">-rw------- 1 postgres postgres 8.0K May  9 13:44 16691</span></span>
<span class="line"><span style="color: #005CC5">-rw------- 1 postgres postgres  16K May  8 17:43 16695</span></span>
<span class="line"><span style="color: #005CC5">-rw------- 1 postgres postgres 8.0K May  8 17:43 16697</span></span>
<span class="line"><span style="color: #005CC5">-rw------- 1 postgres postgres 8.0K May  8 17:43 16698</span></span>
<span class="line"><span style="color: #005CC5">-rw------- 1 postgres postgres  16K May  8 17:43 16702</span></span>
<span class="line"><span style="color: #005CC5">-rw------- 1 postgres postgres 8.0K May  8 17:43 16704</span></span>
<span class="line"><span style="color: #005CC5">-rw------- 1 postgres postgres 8.0K May  8 17:43 16705</span></span>
<span class="line"><span style="color: #005CC5">-rw------- 1 postgres postgres  16K May  8 17:43 16709</span></span>
<span class="line"><span style="color: #005CC5">-rw------- 1 postgres postgres 8.0K Apr 22 15:41 174</span></span>
<span class="line"><span style="color: #005CC5">-rw------- 1 postgres postgres 8.0K Apr 22 15:41 175</span></span>
<span class="line"><span style="color: #005CC5">-rw------- 1 postgres postgres 8.0K May 16 12:39 18131</span></span>
<span class="line"><span style="color: #005CC5">-rw------- 1 postgres postgres 8.0K May 16 12:39 18132</span></span>
<span class="line"><span style="color: #005CC5">-rw------- 1 postgres postgres  16K May 16 12:39 18136</span></span>
<span class="line"><span style="color: #005CC5">-rw------- 1 postgres postgres 8.0K May 16 12:44 18140</span></span>
<span class="line"><span style="color: #005CC5">-rw------- 1 postgres postgres 8.0K May 16 12:44 18141</span></span>
<span class="line"><span style="color: #005CC5">-rw------- 1 postgres postgres  16K May 16 12:44 18145</span></span>
<span class="line"><span style="color: #005CC5">-rw------- 1 postgres postgres 8.0K May 16 14:39 18148</span></span>
<span class="line"><span style="color: #005CC5">-rw------- 1 postgres postgres 8.0K May 16 14:39 18149</span></span>
<span class="line"><span style="color: #005CC5">-rw------- 1 postgres postgres  16K May 16 14:39 18153</span></span>
<span class="line"><span style="color: #005CC5">...</span></span>
<span class="line"><span style="color: #005CC5">-rw------- 1 postgres postgres    3 Apr 22 15:40 PG_VERSION</span></span>
<span class="line"><span style="color: #005CC5">-rw------- 1 postgres postgres  524 Apr 22 15:40 pg_filenode.map</span></span>
<span class="line"><span style="color: #005CC5">-rw------- 1 postgres postgres 156K May 23 17:55 pg_internal.init</span></span></code></pre></div>



<p class="wp-block-paragraph">A consulta realizada para encontrar o objeto correspondente no catálogo do psql (conectando agora no próprio banco de dados <kbd>aplicacao</kbd>) foi:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">psql shell: consultando dados dos objetos do banco aplicacao (16539)</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>dba@aplicacao=#  SELECT 
oid,
relname 
FROM pg_class 
WHERE NOT relisshared AND relkind = 'r' AND relname LIKE '%tabela%';

  oid  |   relname
-------+--------------
 18149 | tabela6_app1
 16691 | tabela1_app2
 16656 | tabela2_app1
 16663 | tabela3_app1
 16698 | tabela2_app2
 16705 | tabela3_app2
 16649 | tabela1_app1
 18132 | tabela4_app1
 18141 | tabela5_app1
(9 rows)</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #24292E">dba@aplicacao</span><span style="color: #D73A49">=</span><span style="color: #24292E">#  </span><span style="color: #D73A49">SELECT</span><span style="color: #24292E"> </span></span>
<span class="line"><span style="color: #D73A49">oid</span><span style="color: #24292E">,</span></span>
<span class="line"><span style="color: #24292E">relname </span></span>
<span class="line"><span style="color: #D73A49">FROM</span><span style="color: #24292E"> pg_class </span></span>
<span class="line"><span style="color: #D73A49">WHERE</span><span style="color: #24292E"> </span><span style="color: #D73A49">NOT</span><span style="color: #24292E"> relisshared </span><span style="color: #D73A49">AND</span><span style="color: #24292E"> relkind </span><span style="color: #D73A49">=</span><span style="color: #24292E"> </span><span style="color: #032F62">&#39;r&#39;</span><span style="color: #24292E"> </span><span style="color: #D73A49">AND</span><span style="color: #24292E"> relname </span><span style="color: #D73A49">LIKE</span><span style="color: #24292E"> </span><span style="color: #032F62">&#39;%tabela%&#39;</span><span style="color: #24292E">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #24292E">  </span><span style="color: #D73A49">oid</span><span style="color: #24292E">  |   relname</span></span>
<span class="line"><span style="color: #6A737D">-------+--------------</span></span>
<span class="line"><span style="color: #24292E"> </span><span style="color: #005CC5">18149</span><span style="color: #24292E"> | tabela6_app1</span></span>
<span class="line"><span style="color: #24292E"> </span><span style="color: #005CC5">16691</span><span style="color: #24292E"> | tabela1_app2</span></span>
<span class="line"><span style="color: #24292E"> </span><span style="color: #005CC5">16656</span><span style="color: #24292E"> | tabela2_app1</span></span>
<span class="line"><span style="color: #24292E"> </span><span style="color: #005CC5">16663</span><span style="color: #24292E"> | tabela3_app1</span></span>
<span class="line"><span style="color: #24292E"> </span><span style="color: #005CC5">16698</span><span style="color: #24292E"> | tabela2_app2</span></span>
<span class="line"><span style="color: #24292E"> </span><span style="color: #005CC5">16705</span><span style="color: #24292E"> | tabela3_app2</span></span>
<span class="line"><span style="color: #24292E"> </span><span style="color: #005CC5">16649</span><span style="color: #24292E"> | tabela1_app1</span></span>
<span class="line"><span style="color: #24292E"> </span><span style="color: #005CC5">18132</span><span style="color: #24292E"> | tabela4_app1</span></span>
<span class="line"><span style="color: #24292E"> </span><span style="color: #005CC5">18141</span><span style="color: #24292E"> | tabela5_app1</span></span>
<span class="line"><span style="color: #24292E">(</span><span style="color: #005CC5">9</span><span style="color: #24292E"> </span><span style="color: #D73A49">rows</span><span style="color: #24292E">)</span></span></code></pre></div>



<p class="wp-block-paragraph">Aqui, podemos ver os OIDs de todas as tabelas desse banco, que também são identificáveis como arquivos na nossa consulta no diretório 16539 (banco <kbd>aplicacao</kbd>).<br>Entre os demais arquivos nesse diretório, temos outras tabelas do catálogo, índices, schemas etc.</p>



<p class="wp-block-paragraph">Mas e quando os OIDs de tabelas não são iguais aos números que nomeiam seus arquivos? Um dos casos é quando utilizamos o comando <kbd>TRUNCATE</kbd>, que serve para remover todas as linhas de uma tabela e também pode mudar o <kbd>relfilenode</kbd>, já que o PostgreSQL pode optar por recriar fisicamente a tabela para otimização da operação.</p>



<p class="wp-block-paragraph">Confira uma consulta dos dados da tabela na <kbd>pg_class</kbd> antes do <kbd>TRUNCATE</kbd>:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">psql shell: consultando dados de uma tabela na pg_class</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>localhost: dba@aplicacao=# SELECT 
oid, 
relname, 
relfilenode 
FROM pg_class 
WHERE relname = 'tabela1_app1';

  oid  |   relname    | relfilenode
-------+--------------+-------------
 16649 | tabela1_app1 |       16649
(1 row)</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #24292E">localhost: dba@aplicacao</span><span style="color: #D73A49">=</span><span style="color: #24292E"># </span><span style="color: #D73A49">SELECT</span><span style="color: #24292E"> </span></span>
<span class="line"><span style="color: #D73A49">oid</span><span style="color: #24292E">, </span></span>
<span class="line"><span style="color: #24292E">relname, </span></span>
<span class="line"><span style="color: #24292E">relfilenode </span></span>
<span class="line"><span style="color: #D73A49">FROM</span><span style="color: #24292E"> pg_class </span></span>
<span class="line"><span style="color: #D73A49">WHERE</span><span style="color: #24292E"> relname </span><span style="color: #D73A49">=</span><span style="color: #24292E"> </span><span style="color: #032F62">&#39;tabela1_app1&#39;</span><span style="color: #24292E">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #24292E">  </span><span style="color: #D73A49">oid</span><span style="color: #24292E">  |   relname    | relfilenode</span></span>
<span class="line"><span style="color: #6A737D">-------+--------------+-------------</span></span>
<span class="line"><span style="color: #24292E"> </span><span style="color: #005CC5">16649</span><span style="color: #24292E"> | tabela1_app1 |       </span><span style="color: #005CC5">16649</span></span>
<span class="line"><span style="color: #24292E">(</span><span style="color: #005CC5">1</span><span style="color: #24292E"> </span><span style="color: #D73A49">row</span><span style="color: #24292E">)</span></span></code></pre></div>



<p class="wp-block-paragraph">Execução do <kbd>TRUNCATE</kbd>:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">psql shell: executando TRUNCATE na tabela tabela1_app1</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>localhost: dba@aplicacao=# TRUNCATE TABLE aplicacao1.tabela1_app1;
TRUNCATE TABLE</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #24292E">localhost: dba@aplicacao</span><span style="color: #D73A49">=</span><span style="color: #24292E"># </span><span style="color: #D73A49">TRUNCATE</span><span style="color: #24292E"> </span><span style="color: #D73A49">TABLE</span><span style="color: #24292E"> </span><span style="color: #005CC5">aplicacao1</span><span style="color: #24292E">.</span><span style="color: #005CC5">tabela1_app1</span><span style="color: #24292E">;</span></span>
<span class="line"><span style="color: #D73A49">TRUNCATE</span><span style="color: #24292E"> </span><span style="color: #D73A49">TABLE</span></span></code></pre></div>



<p class="wp-block-paragraph">Nova consulta dos dados da tabela na <kbd>pg_class</kbd>, após o <kbd>TRUNCATE</kbd>:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">psql shell: consultando dados de uma tabela no pg_class após TRUNCATE</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>localhost: dba@aplicacao=# SELECT 
oid, 
relname, 
relfilenode 
FROM pg_class 
WHERE relname = 'tabela1_app1';

  oid  |   relname    | relfilenode
-------+--------------+-------------
 16649 | tabela1_app1 |       18204
(1 row)</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #24292E">localhost: dba@aplicacao</span><span style="color: #D73A49">=</span><span style="color: #24292E"># </span><span style="color: #D73A49">SELECT</span><span style="color: #24292E"> </span></span>
<span class="line"><span style="color: #D73A49">oid</span><span style="color: #24292E">, </span></span>
<span class="line"><span style="color: #24292E">relname, </span></span>
<span class="line"><span style="color: #24292E">relfilenode </span></span>
<span class="line"><span style="color: #D73A49">FROM</span><span style="color: #24292E"> pg_class </span></span>
<span class="line"><span style="color: #D73A49">WHERE</span><span style="color: #24292E"> relname </span><span style="color: #D73A49">=</span><span style="color: #24292E"> </span><span style="color: #032F62">&#39;tabela1_app1&#39;</span><span style="color: #24292E">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #24292E">  </span><span style="color: #D73A49">oid</span><span style="color: #24292E">  |   relname    | relfilenode</span></span>
<span class="line"><span style="color: #6A737D">-------+--------------+-------------</span></span>
<span class="line"><span style="color: #24292E"> </span><span style="color: #005CC5">16649</span><span style="color: #24292E"> | tabela1_app1 |       </span><span style="color: #005CC5">18204</span></span>
<span class="line"><span style="color: #24292E">(</span><span style="color: #005CC5">1</span><span style="color: #24292E"> </span><span style="color: #D73A49">row</span><span style="color: #24292E">)</span></span></code></pre></div>



<p class="wp-block-paragraph">Isso implica termos um novo arquivo para representar essa tabela no diretório do banco de dados, nomeado com a numeração do novo <kbd>relfilenode</kbd>:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">Debian shell: listando arquivos do diretório do banco de dados após TRUNCATE (novo arquivo 18204)</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>$ ls -lha $PGDATA/base/16539/
total 7.9M
drwx------ 2 postgres postgres  12K Jun 11 18:28 .
drwx------ 8 postgres postgres 4.0K Jun  6 03:56 ..
...
-rw------- 1 postgres postgres    0 Jun 11 18:25 18204
...
-rw------- 1 postgres postgres    3 Apr 22 15:40 PG_VERSION
-rw------- 1 postgres postgres  524 Apr 22 15:40 pg_filenode.map
-rw------- 1 postgres postgres 156K Jun 11 18:27 pg_internal.init</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #24292E">$ ls -lha $PGDATA/base/16539/</span></span>
<span class="line"><span style="color: #005CC5">total 7.9M</span></span>
<span class="line"><span style="color: #005CC5">drwx------ 2 postgres postgres  12K Jun 11 18:28 .</span></span>
<span class="line"><span style="color: #005CC5">drwx------ 8 postgres postgres 4.0K Jun  6 03:56 ..</span></span>
<span class="line"><span style="color: #005CC5">...</span></span>
<span class="line"><span style="color: #005CC5">-rw------- 1 postgres postgres    0 Jun 11 18:25 18204</span></span>
<span class="line"><span style="color: #005CC5">...</span></span>
<span class="line"><span style="color: #005CC5">-rw------- 1 postgres postgres    3 Apr 22 15:40 PG_VERSION</span></span>
<span class="line"><span style="color: #005CC5">-rw------- 1 postgres postgres  524 Apr 22 15:40 pg_filenode.map</span></span>
<span class="line"><span style="color: #005CC5">-rw------- 1 postgres postgres 156K Jun 11 18:27 pg_internal.init</span></span></code></pre></div>



<h2 class="wp-block-heading">Conclusão</h2>



<p class="wp-block-paragraph">Exploramos o <kbd>pg_catalog</kbd>, um componente crucial do PostgreSQL que armazena metadados essenciais para a administração do banco de dados. Compreender tabelas e views como <kbd>pg_authid</kbd>, <kbd>pg_database</kbd> e <kbd>pg_class</kbd> permite realizar auditorias, otimizações e controle de acessos com eficácia.</p>



<p class="wp-block-paragraph">O uso de comandos como <kbd>\l</kbd> e a variável <kbd>ECHO_HIDDEN</kbd> desmistifica operações internas, proporcionando maior controle e entendimento. O <kbd>pg_catalog</kbd> é uma ferramenta poderosa que garante a integridade e a performance do seu sistema de banco de dados, o que é essencial para qualquer DBA ou desenvolvedor.</p><p>The post <a href="https://savepoint.blog.br/2024/09/09/catalogo-do-sistema-pg_catalog/">Catálogo do sistema (pg_catalog)</a> first appeared on <a href="https://savepoint.blog.br">Savepoint</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://savepoint.blog.br/2024/09/09/catalogo-do-sistema-pg_catalog/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">8501</post-id>	</item>
		<item>
		<title>Arquivos, diretórios e processos no PostgreSQL</title>
		<link>https://savepoint.blog.br/2024/09/02/arquivos-diretorios-e-processos/</link>
					<comments>https://savepoint.blog.br/2024/09/02/arquivos-diretorios-e-processos/#respond</comments>
		
		<dc:creator><![CDATA[Savepoint]]></dc:creator>
		<pubDate>Mon, 02 Sep 2024 18:11:23 +0000</pubDate>
				<category><![CDATA[Instalação e Setup]]></category>
		<category><![CDATA[Internals e MVCC]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[postgres]]></category>
		<category><![CDATA[PostgreSQL]]></category>
		<guid isPermaLink="false">https://savepoint.blog.br/?p=8486</guid>

					<description><![CDATA[<p>Introdução No PostgreSQL, a organização de arquivos e diretórios, bem como a gestão de processos, são componentes fundamentais para entender o seu funcionamento. Este artigo fornecerá uma visão geral de como o PostgreSQL estrutura seus dados e controla seus processos. Roteiro: Arquivos e diretórios dos dados no PostgreSQL O PostgreSQL organiza seus dados e configurações</p>
<p>The post <a href="https://savepoint.blog.br/2024/09/02/arquivos-diretorios-e-processos/">Arquivos, diretórios e processos no PostgreSQL</a> first appeared on <a href="https://savepoint.blog.br">Savepoint</a>.</p>]]></description>
										<content:encoded><![CDATA[<h2 class="wp-block-heading">Introdução</h2>



<p class="wp-block-paragraph">No PostgreSQL, a organização de arquivos e diretórios, bem como a gestão de processos, são componentes fundamentais para entender o seu funcionamento. Este artigo fornecerá uma visão geral de como o PostgreSQL estrutura seus dados e controla seus processos.</p>



<p class="wp-block-paragraph"><strong>Roteiro</strong>:</p>



<ul class="wp-block-list">
<li class="">Arquivos e diretórios dos dados no PostgreSQL:
<ul class="wp-block-list">
<li class="">Binários</li>



<li class="">Arquivos de configuração</li>



<li class="">Arquivos de logs</li>



<li class="">Subdiretórios</li>
</ul>
</li>



<li class="">Processos</li>
</ul>



<h2 class="wp-block-heading">Arquivos e diretórios dos dados no PostgreSQL</h2>



<p class="wp-block-paragraph">O PostgreSQL organiza seus dados e configurações em uma estrutura de diretórios específica. A localização desses diretórios pode variar dependendo da instalação, mas geralmente segue um padrão. O diretório principal que contém todos os dados do PostgreSQL é o <em>Base Directory</em> (também conhecido pela variável de ambiente <kbd>$PGDATA</kbd>), que é definido durante a inicialização do cluster PostgreSQL com o comando <kbd>initdb</kbd>. Para sistemas Linux, o endereço de PGDATA pode variar conforme a distribuição:</p>



<ul class="wp-block-list">
<li class="">Debian: <kbd>/var/lib/postgresql/&lt;versão&gt;/&lt;nome_do_cluster&gt;</kbd></li>



<li class="">Red Hat: <kbd>/var/lib/pgsql/&lt;versão&gt;/data</kbd></li>
</ul>



<p class="wp-block-paragraph">Claro, você pode definir qualquer diretório/disco/partição para colocar seus dados, como demonstramos nos artigos anteriores sobre instalação. Portanto é uma boa ideia usar a variável de ambiente <kbd>$PGDATA</kbd> (que, a depender da distribuição, já vem setada para o usuário postgres) ou então descobrir esse diretório pelo comando no psql <kbd>SHOW data_directory</kbd>:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">psql shell: consultando o diretório de dados</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>$ psql -c 'SHOW data_directory;'
       data_directory
-----------------------------
 /var/lib/postgresql/16/main
(1 row)</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #24292E">$ psql </span><span style="color: #D73A49">-</span><span style="color: #24292E">c </span><span style="color: #032F62">&#39;SHOW data_directory;&#39;</span></span>
<span class="line"><span style="color: #24292E">       data_directory</span></span>
<span class="line"><span style="color: #6A737D">-----------------------------</span></span>
<span class="line"><span style="color: #24292E"> </span><span style="color: #D73A49">/</span><span style="color: #24292E">var</span><span style="color: #D73A49">/</span><span style="color: #24292E">lib</span><span style="color: #D73A49">/</span><span style="color: #24292E">postgresql</span><span style="color: #D73A49">/</span><span style="color: #005CC5">16</span><span style="color: #D73A49">/</span><span style="color: #24292E">main</span></span>
<span class="line"><span style="color: #24292E">(</span><span style="color: #005CC5">1</span><span style="color: #24292E"> </span><span style="color: #D73A49">row</span><span style="color: #24292E">)</span></span></code></pre></div>



<p class="wp-block-paragraph">Nesse diretório, temos arquivos e subdiretórios importantes para o programa, que veremos a seguir.</p>



<h3 class="wp-block-heading">Binários</h3>



<p class="wp-block-paragraph">Dentre os principais arquivos do PostgreSQL, temos os binários, que são executáveis responsáveis por iniciar e interagir com o banco de dados. Eles estão em diferentes diretórios, que mudam conforme o sistema operacional. Considerando essas três distribuições Linux, podemos encontrar os principais binários em:</p>



<ul class="wp-block-list">
<li class="">Debian:
<ul class="wp-block-list">
<li class=""><kbd>/usr/share/postgresql-common</kbd>: contém arquivos e scripts comuns utilizados por várias versões do PostgreSQL, por exemplo, <kbd>pg_ctlcluster</kbd> e <kbd>pg_createcluster</kbd>;</li>



<li class=""><kbd>/usr/lib/postgresql/&lt;sua_versão&gt;/bin</kbd>: neste diretório, você pode encontrar os binários específicos da versão do PostgreSQL, como o próprio psql, os utilitários <kbd>createdb</kbd>, <kbd>initdb</kbd> etc.</li>
</ul>
</li>



<li class="">Red Hat:
<ul class="wp-block-list">
<li class=""><kbd>/usr/pgsql/&lt;versão&gt;/bin/</kbd>: guarda binários e executáveis específicos de cada versão do PostgreSQL.</li>
</ul>
</li>



<li class="">Instalação via compilação:
<ul class="wp-block-list">
<li class=""><kbd>/usr/local/pgsql/bin/</kbd></li>
</ul>
</li>
</ul>



<h3 class="wp-block-heading">Arquivos de configuração</h3>



<ul class="wp-block-list">
<li class=""><kbd>postgresql.conf</kbd>: principal arquivo de configuração do servidor PostgreSQL. Contém parâmetros para ajustar o desempenho, a segurança, o comportamento e outras opções do servidor. Em distribuições Debian e derivados, este arquivo está em outro local, num diretório que agrega todos os arquivos de configuração: <kbd>/etc/postgresql/&lt;versão&gt;/&lt;nome_do_cluster&gt;</kbd>;</li>



<li class=""><kbd>pg_hba.conf</kbd>: configurações de autenticação do host. Define quem pode conectar-se ao banco de dados e como as conexões são autenticadas. Assim como antes, em distribuições Debian e derivados, este arquivo fica em outro local;</li>



<li class=""><kbd>pg_ident.conf</kbd>: mapeamentos para autenticação do tipo ident no <kbd>pg_hba.conf</kbd>. Usado para mapear nomes de usuários do sistema operacional para nomes de usuários do PostgreSQL. Mais uma vez, em distribuições Debian e derivados, este arquivo fica em outro local, vide acima;</li>



<li class=""><kbd>postgresql.auto.conf</kbd>: armazena as configurações definidas dinamicamente através do comando <kbd>ALTER SYSTEM SET</kbd>, bem como outras configurações definidas automaticamente pelo próprio PostgreSQL. Você não deve editar este arquivo manualmente!;</li>



<li class=""><kbd>PG_VERSION</kbd>: contém a versão do PostgreSQL em uso no cluster (major version);</li>



<li class=""><kbd>postmaster.pid</kbd>: contém o ID do processo (PID) do servidor PostgreSQL em execução e outras informações, como diretório de dados do cluster, data de início do processo etc.;</li>



<li class=""><kbd>postmaster.opts</kbd>: arquivo que registra as opções de linha de comando usadas por último na inicialização do servidor PostgreSQL.</li>
</ul>



<h3 class="wp-block-heading">Arquivos de logs</h3>



<p class="wp-block-paragraph">Dentro do <kbd>$PGDATA</kbd>, temos outros diretórios importantes que guardam arquivos do PostgreSQL, como os arquivos de log. Normalmente, os logs ficam em <kbd>$PGDATA/logs</kbd>, mas em distribuições Debian e derivadas eles estão localizados em <kbd>/var/log/postgresql</kbd>, como podemos ver na saída abaixo.&nbsp;</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">Debian shell: logs do PostgreSQL</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># ls -lh /var/log/postgresql/*
total 6.6M
drwxrwxr-t  2 root     postgres 4.0K May 19 00:00 .
drwxr-xr-x 10 root     root     4.0K May  1 00:00 ..
-rw-r-----  1 postgres adm      123K May 23 09:40 postgresql-16-main.log
-rw-r-----  1 postgres adm      6.0M May 19 00:00 postgresql-16-main.log.1
-rw-r-----  1 postgres adm      254K May 12 00:00 postgresql-16-main.log.2.gz
-rw-r-----  1 postgres adm       18K May  5 00:00 postgresql-16-main.log.3.gz
-rw-r-----  1 postgres adm      125K Apr 28 00:00 postgresql-16-main.log.4.gz
-rw-r-----  1 postgres adm       27K Apr 21 00:00 postgresql-16-main.log.5.gz
-rw-r-----  1 postgres adm       36K Apr 14 00:00 postgresql-16-main.log.6.gz
-rw-r-----  1 postgres adm      1.1K Apr  7 00:00 postgresql-16-main.log.7.gz
-rw-r-----  1 postgres adm      2.0K Mar 31 00:00 postgresql-16-main.log.8.gz</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #24292E"># ls -lh /var/log/postgresql/</span><span style="color: #D73A49">*</span></span>
<span class="line"><span style="color: #005CC5">total 6.6M</span></span>
<span class="line"><span style="color: #005CC5">drwxrwxr-t  2 root     postgres 4.0K May 19 00:00 .</span></span>
<span class="line"><span style="color: #005CC5">drwxr-xr-x 10 root     root     4.0K May  1 00:00 ..</span></span>
<span class="line"><span style="color: #005CC5">-rw-r-----  1 postgres adm      123K May 23 09:40 postgresql-16-main.log</span></span>
<span class="line"><span style="color: #005CC5">-rw-r-----  1 postgres adm      6.0M May 19 00:00 postgresql-16-main.log.1</span></span>
<span class="line"><span style="color: #005CC5">-rw-r-----  1 postgres adm      254K May 12 00:00 postgresql-16-main.log.2.gz</span></span>
<span class="line"><span style="color: #005CC5">-rw-r-----  1 postgres adm       18K May  5 00:00 postgresql-16-main.log.3.gz</span></span>
<span class="line"><span style="color: #005CC5">-rw-r-----  1 postgres adm      125K Apr 28 00:00 postgresql-16-main.log.4.gz</span></span>
<span class="line"><span style="color: #005CC5">-rw-r-----  1 postgres adm       27K Apr 21 00:00 postgresql-16-main.log.5.gz</span></span>
<span class="line"><span style="color: #005CC5">-rw-r-----  1 postgres adm       36K Apr 14 00:00 postgresql-16-main.log.6.gz</span></span>
<span class="line"><span style="color: #005CC5">-rw-r-----  1 postgres adm      1.1K Apr  7 00:00 postgresql-16-main.log.7.gz</span></span>
<span class="line"><span style="color: #005CC5">-rw-r-----  1 postgres adm      2.0K Mar 31 00:00 postgresql-16-main.log.8.gz</span></span></code></pre></div>



<p class="wp-block-paragraph">Na verdade, você pode escolher outros lugares arbitrários para colocar seus logs, como em um disco separado (pode ser útil em servidores com muita carga), ajustando a variável <kbd>log_directory</kbd>. Abaixo vemos um exemplo da localização do diretório de logs na AWS RDS:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">psql: consultando o diretório de logs em um banco AWS RDS</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>SHOW log_directory;
    log_directory
----------------------
 /rdsdbdata/log/error</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #24292E">SHOW log_directory;</span></span>
<span class="line"><span style="color: #24292E">    log_directory</span></span>
<span class="line"><span style="color: #6A737D">----------------------</span></span>
<span class="line"><span style="color: #24292E"> </span><span style="color: #D73A49">/</span><span style="color: #24292E">rdsdbdata</span><span style="color: #D73A49">/log/</span><span style="color: #24292E">error</span></span></code></pre></div>



<p class="wp-block-paragraph">O valor do <kbd>log_directory</kbd> pode ser absoluto, com o path completo ou relativo ao diretório do <kbd>$PGDATA</kbd>.</p>



<h3 class="wp-block-heading">Subdiretórios</h3>



<ul class="wp-block-list">
<li class=""><kbd>base/</kbd>: contém um subdiretório para cada banco de dados individual no cluster;
<ul class="wp-block-list">
<li class="">Dentro desses subdiretórios de cada banco que são identificados com números (16390, por exemplo) temos com os dados de cada objeto no banco, como tabelas e índice. Estes arquivos possuem eventualmente outros com o mesmo número e um sufixo <kbd>_fsm</kbd> (free space map) e <code>_vm</code> (visibility map), que são essenciais para manutenção e otimização e controle de transações. Além disso, temos um diretório chamado <kbd>pgsql_tmp</kbd> com arquivos temporários como tabelas temporárias. Eventualmente é possível armazenar estes arquivos temporários em outros tablespaces, ajustando a configuração <kbd>temp_tablespaces</kbd>;</li>
</ul>
</li>



<li class=""><kbd>global/</kbd>: contém tabelas e dados globais, como informações sobre usuários e grupos, por exemplo, as tabelas <kbd>pg_database</kbd> e <kbd>pg_control</kbd>;
<ul class="wp-block-list">
<li class="">Aqui também temos os arquivos <kbd>_fsm</kbd> e <kbd>_vm</kbd>, mas a nível global, ou seja, que se aplicam a todos os bancos de dados em um cluster;</li>
</ul>
</li>



<li class=""><kbd>pg_xlog/</kbd> ou <kbd>pg_wal/</kbd>: contém os arquivos de log de transação (WAL &#8211; Write-Ahead Logging), essenciais para a recuperação de dados;</li>



<li class=""><kbd>pg_clog/</kbd> ou <kbd>pg_commit_ts/</kbd>: mantém informações sobre o estado das transações atuais;</li>



<li class=""><code>pg_stat/</code>: armazena dados estatísticos permanentes utilizados para otimização de consultas;</li>



<li class=""><kbd>pg_stat_tmp/</kbd>: armazena dados estatísticos temporários utilizados para otimização de consultas;</li>



<li class=""><code>pg_tblspc/</code>: pontos de montagem de tablespaces, que permitem a administração de locais de armazenamento adicionais.</li>
</ul>



<h3 class="wp-block-heading">Processos</h3>



<p class="wp-block-paragraph">PostgreSQL é um sistema de gerenciamento de banco de dados do tipo cliente-servidor. Diferente de outros modelos, ele utiliza uma arquitetura multiprocesso para rodar em um único host. Imagine uma equipe trabalhando em conjunto para cuidar do seu banco de dados: esse é o conceito por trás dessa arquitetura.</p>



<p class="wp-block-paragraph">Essa &#8220;equipe&#8221; é composta por diversos processos, cada um com uma função específica:</p>



<ul class="wp-block-list">
<li class=""><kbd>postmaster</kbd> (server process): o processo principal do PostgreSQL. É responsável por iniciar, parar e supervisionar todos os processos de servidor do PostgreSQL. Ele recebe conexão de apenas uma porta (a 5432 por padrão), porém podemos ter mais de uma instância do PostgreSQL rodando no mesmo servidor, especificando uma porta para cada instância. Podemos ter, por exemplo, um PostgreSQL na versão 16 na porta 5432 e outro na versão 15 na porta 5433;</li>



<li class=""><kbd>postgres</kbd> (backend process): cada conexão ao banco de dados é gerenciada por um processo postgres dedicado. Esse processo é responsável por receber e executar as consultas e comandos enviados pelos clientes, garantindo uma experiência personalizada para cada um;</li>



<li class=""><kbd>autovacuum launcher</kbd> (background process): processo responsável pela limpeza automática do banco de dados, removendo registros obsoletos gerados por operações de UPDATE e DELETE;</li>



<li class=""><kbd>wal writer</kbd> (background process): gerencia a gravação dos logs de transação (WAL) no disco, garantindo a durabilidade das transações, o que permite a recuperação do banco de dados;</li>



<li class=""><kbd>wal sender</kbd> (background process): responsável por enviar os registros do WAL (Write-Ahead Logging) do servidor primário para um ou mais servidores de réplica (standby). Este processo é fundamental para a replicação em tempo real e a alta disponibilidade;</li>



<li class=""><kbd>wal receiver</kbd> (background process): é executado em servidores de réplica e recebe os registros do WAL enviados pelo processo WAL sender do servidor primário;</li>



<li class=""><kbd>statistics collector</kbd> (background process): é responsável por coletar e agrupar estatísticas sobre a operação do banco de dados, como contagem de linhas lidas, inseridas, atualizadas ou deletadas;</li>



<li class=""><kbd>logging collector</kbd> (background process): coleta e armazena mensagens de log do servidor PostgreSQL em arquivos de log;</li>



<li class=""><kbd>archiver</kbd> (background process): copia os arquivos do WAL para um local de arquivamento seguro após eles serem preenchidos;</li>



<li class=""><kbd>bgwriter</kbd> (background process): é o &#8220;background writer&#8221;, que periodicamente escreve páginas sujas da memória para o disco, ajudando a manter a consistência dos dados;</li>



<li class=""><kbd>checkpointer</kbd> (background process): periodicamente cria pontos de verificação (checkpoints) que ajudam na recuperação de falhas;</li>



<li class=""><kbd>IPC</kbd> (background process): os processos do PostgreSQL se comunicam usando IPC (Inter-Process Communication), que inclui sinais (signals), memória compartilhada (shared memory) e semáforos (semaphores). Estes mecanismos permitem a coordenação entre os processos, garantindo a consistência e a integridade dos dados.</li>
</ul>



<p class="wp-block-paragraph">Abaixo segue o comando <kbd>ps faux | grep postgres</kbd> executado como root, que é um comando para mostrar todos os processos relacionados ao postgres, de todos os usuários, e sua saída:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">Debian shell: consultando processos postgres</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># ps faux | grep postgres
postgres  171711  0.0  1.7 217608 17460 ?        Ss   Apr09   7:52 /usr/lib/postgresql/16/bin/postgres -D /var/lib/postgresql/16/main -c config_file=/etc/postgresql/16/main/postgresql.conf
postgres  171712  0.0  7.8 218036 77644 ?        Ss   Apr09   0:02  \_ postgres: 16/main: checkpointer
postgres  171713  0.0  0.7 217756  7468 ?        Ss   Apr09   0:41  \_ postgres: 16/main: background writer
postgres  171715  0.0  0.6 217608  6796 ?        Ss   Apr09   0:44  \_ postgres: 16/main: walwriter
postgres  171716  0.0  0.7 219208  7108 ?        Ss   Apr09   1:45  \_ postgres: 16/main: autovacuum launcher
postgres  171717  0.0  0.4 219184  4340 ?        Ss   Apr09   0:02  \_ postgres: 16/main: logical replication launcher</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #24292E"># ps faux </span><span style="color: #D73A49">|</span><span style="color: #24292E"> </span><span style="color: #6F42C1">grep</span><span style="color: #24292E"> </span><span style="color: #032F62">postgres</span></span>
<span class="line"><span style="color: #005CC5">postgres  171711  0.0  1.7 217608 17460 ?        Ss   Apr09   7:52 /usr/lib/postgresql/16/bin/postgres -D /var/lib/postgresql/16/main -c config_file=/etc/postgresql/16/main/postgresql.conf</span></span>
<span class="line"><span style="color: #005CC5">postgres  171712  0.0  7.8 218036 77644 ?        Ss   Apr09   0:02  \_ postgres: 16/main: checkpointer</span></span>
<span class="line"><span style="color: #005CC5">postgres  171713  0.0  0.7 217756  7468 ?        Ss   Apr09   0:41  \_ postgres: 16/main: background writer</span></span>
<span class="line"><span style="color: #005CC5">postgres  171715  0.0  0.6 217608  6796 ?        Ss   Apr09   0:44  \_ postgres: 16/main: walwriter</span></span>
<span class="line"><span style="color: #005CC5">postgres  171716  0.0  0.7 219208  7108 ?        Ss   Apr09   1:45  \_ postgres: 16/main: autovacuum launcher</span></span>
<span class="line"><span style="color: #005CC5">postgres  171717  0.0  0.4 219184  4340 ?        Ss   Apr09   0:02  \_ postgres: 16/main: logical replication launcher</span></span></code></pre></div>



<p class="wp-block-paragraph">Como um exemplo adicional, fizemos um teste com o <kbd>pg_bench</kbd> (com escala 10x maior do que a padrão, 50 clientes e quatro threads, com duração de 120 segundos) e rodamos, desta vez, o comando <kbd>top -c</kbd>, que fornece a visualização dinâmica e interativa dos processos. Este é um trecho da saída:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="" style="font-size:.75rem;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#ffffff"><span style="background:#2f363c;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#ffffff">Debian shell: consultando processos com teste do pg_bench</span></span><span role="button" tabindex="0" style="color:#24292e;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># top -c
top - 18:01:38 up 57 days,  2:24,  2 users,  load average: 19.95, 5.63, 1.93
Tasks: 135 total,  32 running, 103 sleeping,   0 stopped,   0 zombie
%Cpu(s): 64.7 us, 34.3 sy,  0.0 ni,  0.0 id,  1.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :    961.0 total,     77.9 free,    505.3 used,    679.6 buff/cache
MiB Swap:      0.0 total,      0.0 free,      0.0 used.    455.7 avail Mem

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
1219997 postgres  20   0  239676   7792   6412 S  17.5   0.8   0:09.62 /usr/lib/postgresql/16/bin/pgbench -c 50 -j 4 -T 120 postgres
1220014 postgres  20   0  219816  84068  80660 R   2.3   8.5   0:00.92 postgres: 16/main: postgres postgres &#91;local&#93; idle in transaction
1220040 postgres  20   0  219820  82300  78888 S   2.0   8.4   0:00.90 postgres: 16/main: postgres postgres &#91;local&#93; UPDATE waiting
1220050 postgres  20   0  219820  83928  80516 R   2.0   8.5   0:00.90 postgres: 16/main: postgres postgres &#91;local&#93; UPDATE waiting
1220005 postgres  20   0  219816  80776  77376 R   1.7   8.2   0:00.90 postgres: 16/main: postgres postgres &#91;local&#93; COMMIT
1220007 postgres  20   0  219816  82044  78636 S   1.7   8.3   0:00.90 postgres: 16/main: postgres postgres &#91;local&#93; UPDATE waiting
1220009 postgres  20   0  219816  82604  79204 R   1.7   8.4   0:00.90 postgres: 16/main: postgres postgres &#91;local&#93; idle
1220010 postgres  20   0  219816  82204  78804 S   1.7   8.4   0:00.90 postgres: 16/main: postgres postgres &#91;local&#93; UPDATE waiting
1220011 postgres  20   0  219816  81988  78588 R   1.7   8.3   0:00.90 postgres: 16/main: postgres postgres &#91;local&#93; idle in transaction
1220012 postgres  20   0  219816  82944  79544 S   1.7   8.4   0:00.90 postgres: 16/main: postgres postgres &#91;local&#93; UPDATE waiting
1220013 postgres  20   0  219816  83216  79800 R   1.7   8.5   0:00.90 postgres: 16/main: postgres postgres &#91;local&#93; idle in transaction
1220015 postgres  20   0  219816  84092  80692 S   1.7   8.5   0:00.90 postgres: 16/main: postgres postgres &#91;local&#93; UPDATE waiting
1220017 postgres  20   0  219816  80868  77468 R   1.7   8.2   0:00.90 postgres: 16/main: postgres postgres &#91;local&#93; UPDATE waiting
1220018 postgres  20   0  219816  83108  79708 R   1.7   8.4   0:00.90 postgres: 16/main: postgres postgres &#91;local&#93; idle in transaction
1220021 postgres  20   0  219816  83968  80568 S   1.7   8.5   0:00.90 postgres: 16/main: postgres postgres &#91;local&#93; UPDATE waiting
1220022 postgres  20   0  219816  79704  76304 S   1.7   8.1   0:00.90 postgres: 16/main: postgres postgres &#91;local&#93; UPDATE waiting
1220023 postgres  20   0  219816  82652  79252 R   1.7   8.4   0:00.90 postgres: 16/main: postgres postgres &#91;local&#93; idle in transaction
1220024 postgres  20   0  219820  82452  79036 S   1.7   8.4   0:00.90 postgres: 16/main: postgres postgres &#91;local&#93; UPDATE waiting
1220025 postgres  20   0  219820  80704  77292 R   1.7   8.2   0:00.90 postgres: 16/main: postgres postgres &#91;local&#93; COMMIT
1220026 postgres  20   0  219820  79340  75928 R   1.7   8.1   0:00.90 postgres: 16/main: postgres postgres &#91;local&#93; idle in transaction</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-light" style="background-color: #fff" tabindex="0"><code><span class="line"><span style="color: #24292E"># top -c</span></span>
<span class="line"><span style="color: #005CC5">top - 18:01:38 up 57 days,  2:24,  2 users,  load average: 19.95, 5.63, 1.93</span></span>
<span class="line"><span style="color: #005CC5">Tasks: 135 total,  32 running, 103 sleeping,   0 stopped,   0 zombie</span></span>
<span class="line"><span style="color: #005CC5">%Cpu(s): 64.7 us, 34.3 sy,  0.0 ni,  0.0 id,  1.0 wa,  0.0 hi,  0.0 si,  0.0 st</span></span>
<span class="line"><span style="color: #005CC5">MiB Mem :    961.0 total,     77.9 free,    505.3 used,    679.6 buff/cache</span></span>
<span class="line"><span style="color: #005CC5">MiB Swap:      0.0 total,      0.0 free,      0.0 used.    455.7 avail Mem</span></span>
<span class="line"></span>
<span class="line"><span style="color: #005CC5">    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND</span></span>
<span class="line"><span style="color: #005CC5">1219997 postgres  20   0  239676   7792   6412 S  17.5   0.8   0:09.62 /usr/lib/postgresql/16/bin/pgbench -c 50 -j 4 -T 120 postgres</span></span>
<span class="line"><span style="color: #005CC5">1220014 postgres  20   0  219816  84068  80660 R   2.3   8.5   0:00.92 postgres: 16/main: postgres postgres &#91;local&#93; idle in transaction</span></span>
<span class="line"><span style="color: #005CC5">1220040 postgres  20   0  219820  82300  78888 S   2.0   8.4   0:00.90 postgres: 16/main: postgres postgres &#91;local&#93; UPDATE waiting</span></span>
<span class="line"><span style="color: #005CC5">1220050 postgres  20   0  219820  83928  80516 R   2.0   8.5   0:00.90 postgres: 16/main: postgres postgres &#91;local&#93; UPDATE waiting</span></span>
<span class="line"><span style="color: #005CC5">1220005 postgres  20   0  219816  80776  77376 R   1.7   8.2   0:00.90 postgres: 16/main: postgres postgres &#91;local&#93; COMMIT</span></span>
<span class="line"><span style="color: #005CC5">1220007 postgres  20   0  219816  82044  78636 S   1.7   8.3   0:00.90 postgres: 16/main: postgres postgres &#91;local&#93; UPDATE waiting</span></span>
<span class="line"><span style="color: #005CC5">1220009 postgres  20   0  219816  82604  79204 R   1.7   8.4   0:00.90 postgres: 16/main: postgres postgres &#91;local&#93; idle</span></span>
<span class="line"><span style="color: #005CC5">1220010 postgres  20   0  219816  82204  78804 S   1.7   8.4   0:00.90 postgres: 16/main: postgres postgres &#91;local&#93; UPDATE waiting</span></span>
<span class="line"><span style="color: #005CC5">1220011 postgres  20   0  219816  81988  78588 R   1.7   8.3   0:00.90 postgres: 16/main: postgres postgres &#91;local&#93; idle in transaction</span></span>
<span class="line"><span style="color: #005CC5">1220012 postgres  20   0  219816  82944  79544 S   1.7   8.4   0:00.90 postgres: 16/main: postgres postgres &#91;local&#93; UPDATE waiting</span></span>
<span class="line"><span style="color: #005CC5">1220013 postgres  20   0  219816  83216  79800 R   1.7   8.5   0:00.90 postgres: 16/main: postgres postgres &#91;local&#93; idle in transaction</span></span>
<span class="line"><span style="color: #005CC5">1220015 postgres  20   0  219816  84092  80692 S   1.7   8.5   0:00.90 postgres: 16/main: postgres postgres &#91;local&#93; UPDATE waiting</span></span>
<span class="line"><span style="color: #005CC5">1220017 postgres  20   0  219816  80868  77468 R   1.7   8.2   0:00.90 postgres: 16/main: postgres postgres &#91;local&#93; UPDATE waiting</span></span>
<span class="line"><span style="color: #005CC5">1220018 postgres  20   0  219816  83108  79708 R   1.7   8.4   0:00.90 postgres: 16/main: postgres postgres &#91;local&#93; idle in transaction</span></span>
<span class="line"><span style="color: #005CC5">1220021 postgres  20   0  219816  83968  80568 S   1.7   8.5   0:00.90 postgres: 16/main: postgres postgres &#91;local&#93; UPDATE waiting</span></span>
<span class="line"><span style="color: #005CC5">1220022 postgres  20   0  219816  79704  76304 S   1.7   8.1   0:00.90 postgres: 16/main: postgres postgres &#91;local&#93; UPDATE waiting</span></span>
<span class="line"><span style="color: #005CC5">1220023 postgres  20   0  219816  82652  79252 R   1.7   8.4   0:00.90 postgres: 16/main: postgres postgres &#91;local&#93; idle in transaction</span></span>
<span class="line"><span style="color: #005CC5">1220024 postgres  20   0  219820  82452  79036 S   1.7   8.4   0:00.90 postgres: 16/main: postgres postgres &#91;local&#93; UPDATE waiting</span></span>
<span class="line"><span style="color: #005CC5">1220025 postgres  20   0  219820  80704  77292 R   1.7   8.2   0:00.90 postgres: 16/main: postgres postgres &#91;local&#93; COMMIT</span></span>
<span class="line"><span style="color: #005CC5">1220026 postgres  20   0  219820  79340  75928 R   1.7   8.1   0:00.90 postgres: 16/main: postgres postgres &#91;local&#93; idle in transaction</span></span></code></pre></div>



<p class="wp-block-paragraph">O primeiro processo pgbench é o que está executando o teste de benchmarking e consome 17,5% da CPU, sendo o responsável pela maior carga no sistema.</p>



<p class="wp-block-paragraph">Também é possível observar vários processos em estado <kbd>R</kbd> (running) ou <kbd>S</kbd> (sleeping), o que é esperado em um ambiente de testes. Também temos os status <kbd>idle in transaction</kbd> e <kbd>UPDATE waiting</kbd>, indicando que estão aguardando a conclusão de transações ou de operações de atualização.</p>



<h2 class="wp-block-heading">Conclusão</h2>



<p class="wp-block-paragraph">O PostgreSQL tem uma organização relativamente simples de arquivos, diretórios e processos. Para o desenvolvedor ou usuário final do banco de dados, essas informações podem ser mera curiosidade, mas para quem pretende ser um DBA, a história é bem diferente. É fundamental entender o que cada um faz e onde fica cada informação. Enquanto tudo estiver funcionando bem, você provavelmente não vai se preocupar muito com isso, mas quando problemas ocorrerem, como falhas de hardware, bugs etc., entender esses conceitos básicos será fundamental para resolver os problemas.&nbsp;<br>Mais informações podem ser encontradas na documentação oficial, <a href="https://www.postgresql.org/docs/current/bgworker.html">aqui</a>.</p>



<p class="wp-block-paragraph">No próximo artigo, vamos entender um pouco melhor como os objetos do banco são organizados logicamente no catálogo interno e fisicamente nos diretórios <kbd>$PGDATA/base</kbd>, <kbd>$PGDATA/global</kbd> e <kbd>$PGDATA/pg_tblspace</kbd>.</p><p>The post <a href="https://savepoint.blog.br/2024/09/02/arquivos-diretorios-e-processos/">Arquivos, diretórios e processos no PostgreSQL</a> first appeared on <a href="https://savepoint.blog.br">Savepoint</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://savepoint.blog.br/2024/09/02/arquivos-diretorios-e-processos/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">8486</post-id>	</item>
	</channel>
</rss>
