<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Dimas Adiputro</title>
    <description>The latest articles on Forem by Dimas Adiputro (@hujan).</description>
    <link>https://forem.com/hujan</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1692461%2F80f3b3dd-519e-4f29-8f30-21c6719542b6.jpeg</url>
      <title>Forem: Dimas Adiputro</title>
      <link>https://forem.com/hujan</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/hujan"/>
    <language>en</language>
    <item>
      <title>Install XAMPP in linux</title>
      <dc:creator>Dimas Adiputro</dc:creator>
      <pubDate>Sun, 05 Oct 2025 11:30:27 +0000</pubDate>
      <link>https://forem.com/hujan/install-xampp-in-linux-2c04</link>
      <guid>https://forem.com/hujan/install-xampp-in-linux-2c04</guid>
      <description>&lt;p&gt;download the binary using wget or upload to the server manually.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[root@single ~]# wget https://sourceforge.net/projects/xampp/files/XAMPP%20Linux/8.0.30/xampp-linux-x64-8.0.30-0-installer.run

[root@single ~]# chmod +x  xampp-linux-x64-8.0.30-0-installer.run

[root@single ~]# [root@single ~]# ./xampp-linux-x64-8.0.30-0-installer.run 
----------------------------------------------------------------------------
Welcome to the XAMPP Setup Wizard.

----------------------------------------------------------------------------
Select the components you want to install; clear the components you do not want 
to install. Click Next when you are ready to continue.

XAMPP Core Files : Y (Cannot be edited)

XAMPP Developer Files [Y/n] :n

Is the selection above correct? [Y/n]: Y

----------------------------------------------------------------------------
Installation Directory

XAMPP will be installed to /opt/lampp
Press [Enter] to continue:

----------------------------------------------------------------------------
Setup is now ready to begin installing XAMPP on your computer.

Do you want to continue? [Y/n]: Y

----------------------------------------------------------------------------
Please wait while Setup installs XAMPP on your computer.

 Installing
 0% ______________ 50% ______________ 100%
 #########################################

----------------------------------------------------------------------------
Setup has finished installing XAMPP on your computer.

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;after installation completed run the lampp&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[root@single]#cd /opt/lampp
[root@single lampp]# ./lampp start
Starting XAMPP for Linux 8.0.30-0...
XAMPP: Starting Apache...ok.
XAMPP: Starting MySQL...already running.
XAMPP: Starting ProFTPD...already running.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;the open the browser and access &lt;a href="http://127.0.0.1" rel="noopener noreferrer"&gt;http://127.0.0.1&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Configure pgstattuple</title>
      <dc:creator>Dimas Adiputro</dc:creator>
      <pubDate>Thu, 14 Aug 2025 13:44:00 +0000</pubDate>
      <link>https://forem.com/hujan/configure-pgstattuple-3pnf</link>
      <guid>https://forem.com/hujan/configure-pgstattuple-3pnf</guid>
      <description>&lt;p&gt;pgstattuple is part of PostgreSQL's contrib modules—a collection of officially supported but optional extensions.&lt;br&gt;
1) download and install the rpm from postgresql official website - &lt;a href="https://download.postgresql.org/pub/repos/yum/15/redhat/rhel-8.10-x86_64/" rel="noopener noreferrer"&gt;https://download.postgresql.org/pub/repos/yum/15/redhat/rhel-8.10-x86_64/&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo yum install postgresql&amp;lt;version&amp;gt;-contrib
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2) upload the rpm  using sudo / root and&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo rpm -ivh postgresql&amp;lt;version&amp;gt;-contrib
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;3) login to psql&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CREATE EXTENSION pgstattuple;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;4) to check the dead tuple table use below command&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT * FROM pgstattuple('joe.this_my_table_name');
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;5) below is the result.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mydb=# SELECT * FROM pgstattuple('joe.this_my_table_name');
 table_len | tuple_count | tuple_len | tuple_percent | dead_tuple_count | dead_tuple_len | dead_tuple_percent | free_space | free_percent
-----------+-------------+-----------+---------------+------------------+----------------+--------------------+------------+--------------
      8192 |           5 |       463 |          5.65 |                0 |              0 |                  0 |       7656 |        93.46
(1 row)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Description :&lt;/strong&gt;&lt;br&gt;
table_len: Total size of the table on disk in bytes.&lt;br&gt;
tuple_count: Number of live (visible) tuples.&lt;br&gt;
tuple_len: Total length of live tuples in bytes.&lt;br&gt;
tuple_percent: Percentage of space occupied by live tuples.&lt;br&gt;
dead_tuple_count: Number of dead tuples (not yet vacuumed).&lt;br&gt;
dead_tuple_len: Total length of dead tuples in bytes.&lt;br&gt;
dead_tuple_percent: Percentage of space occupied by dead tuples. This is a direct indicator of bloat due to dead rows.&lt;br&gt;
free_space: Total free space available within allocated pages in bytes (usable for future INSERTs/UPDATEs without extending the table).&lt;br&gt;
free_percent: Percentage of total table space that is free.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Shell Script to automate Create User and timestamps in PostgreSQL</title>
      <dc:creator>Dimas Adiputro</dc:creator>
      <pubDate>Fri, 25 Jul 2025 09:27:46 +0000</pubDate>
      <link>https://forem.com/hujan/shell-script-to-automate-create-user-and-timestamps-in-postgresql-1f0l</link>
      <guid>https://forem.com/hujan/shell-script-to-automate-create-user-and-timestamps-in-postgresql-1f0l</guid>
      <description>&lt;p&gt;Every quarter, the audit team requests a list of users and the timestamps of when they were created. So, I created a simple shell script to automate user creation and log the details into a table.&lt;br&gt;
in this case I store the table in the &lt;code&gt;testdb&lt;/code&gt; database&lt;/p&gt;

&lt;p&gt;1) Create the table for store the data&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CREATE TABLE user_log (
  username TEXT,
  created_at TIMESTAMP
);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2) This is the shell script (&lt;code&gt;create_pg_user.sh&lt;/code&gt;)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#!/bin/bash

# Check if a username was provided
if [ -z "$1" ]; then
  echo "Usage: $0 &amp;lt;username&amp;gt;"
  exit 1
fi

USERNAME=$1
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')

PGUSER="postgres"
PGDATABASE="testdb"
PGHOST="localhost"
PGPORT="5432"

psql -U $PGUSER -d $PGDATABASE -h $PGHOST -p $PGPORT -c "CREATE USER $USERNAME;"

psql -U $PGUSER -d $PGDATABASE -h $PGHOST -p $PGPORT -c \
"INSERT INTO user_log (username, created_at) VALUES ('$USERNAME', '$TIMESTAMP');"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;3) Execute the shell script.  here I just put the username and the password will be auto generated.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sh create_pg_user.sh myuser
CREATE ROLE
INSERT 0 1
User created successfully!
Username: myuser
Password: k4EM99fNRdCC2spj
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;4) Let's check user created date&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;postgres=# \du
                                       List of roles
   Role name   |                         Attributes                         |  Member of
---------------+------------------------------------------------------------+--------------
 myuser           |                                                            | {}


testdb=# select * from user_log;
 username |     created_at
----------+---------------------
 myuser   | 2025-06-20 12:13:23

(2 rows)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;so whenever the audit team asks when a user was created, we can provide the information by selecting &lt;code&gt;user_log&lt;/code&gt; table&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Enable Huge Pages in PostgreSQL</title>
      <dc:creator>Dimas Adiputro</dc:creator>
      <pubDate>Fri, 27 Jun 2025 07:23:00 +0000</pubDate>
      <link>https://forem.com/hujan/enable-huge-pages-in-postgresql-p7p</link>
      <guid>https://forem.com/hujan/enable-huge-pages-in-postgresql-p7p</guid>
      <description>&lt;p&gt;PostgreSQL are recommend to enable Huge Pages.&lt;br&gt;
I am using Redhat Family&lt;/p&gt;

&lt;p&gt;if run this command &lt;strong&gt;HugePages_Total&lt;/strong&gt; and &lt;strong&gt;HugePages_Free&lt;/strong&gt; value are 0  it means that huge page is not enable.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[postgres@pg1]$  cat /proc/meminfo | grep -i huge
AnonHugePages:     49152 kB
ShmemHugePages:        0 kB
FileHugePages:         0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
Hugetlb:               0 kB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I am using &lt;em&gt;Ibrar Ahmed&lt;/em&gt; from percona for the formula&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#!/bin/bash
pid=`head -1 $PGDATA/postmaster.pid`
echo "Pid:            $pid"
peak=`grep ^VmPeak /proc/$pid/status | awk '{ print $2 }'`
echo "VmPeak:            $peak kB"
hps=`grep ^Hugepagesize /proc/meminfo | awk '{ print $2 }'`
echo "Hugepagesize:   $hps kB"
hp=$((peak/hps))
echo Set Huge Pages:     $hp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;we can run and the output like below&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[postgres@pg1 ~]$ sh hg.sh
Pid:            1631
VmPeak:            8921740 kB
Hugepagesize:   2048 kB
Set Huge Pages:     4356
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;we can set in /etc/sysctl.conf to apply we can use sysctl -p using root user&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;vm.nr_hugepages = 4356
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;apply after changing&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo sysctl -p
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After hugepages is set, however we need to restart the server to get the effect in postgresql&lt;br&gt;
Below is the output once huge page is enable succefully.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cat /proc/meminfo | grep -i huge
AnonHugePages:     30720 kB
ShmemHugePages:        0 kB
FileHugePages:         0 kB
HugePages_Total:    4356
HugePages_Free:     4238
HugePages_Rsvd:     4100
HugePages_Surp:        0
Hugepagesize:       2048 kB
Hugetlb:         8921088 kB

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;we can set &lt;em&gt;huge_page&lt;/em&gt; to on or keep as try in &lt;em&gt;postgresql.conf&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Controls whether huge pages are requested for the main shared memory area. Valid values are try (the default), on, and off. With huge_pages set to try, the server will try to request huge pages, but fall back to the default if that fails. With on, failure to request huge pages will prevent the server from starting up. With off, huge pages will not be requested. The actual state of huge pages is indicated by the server variable huge_pages_status. &lt;a href="https://www.postgresql.org/docs/17/runtime-config-resource.html#GUC-HUGE-PAGES" rel="noopener noreferrer"&gt;https://www.postgresql.org/docs/17/runtime-config-resource.html#GUC-HUGE-PAGES&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I prefer to set huge_pages to be on;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;postgres=# show huge_pages;
 huge_pages
------------
 on
(1 row)

postgres=# \q
[postgres@pg1 ]$ 
[postgres@pg1 ]$ cat /proc/meminfo | grep -i huge
AnonHugePages:     30720 kB
ShmemHugePages:        0 kB
FileHugePages:         0 kB
HugePages_Total:    4356
HugePages_Free:     4247
HugePages_Rsvd:     4109
HugePages_Surp:        0
Hugepagesize:       2048 kB
Hugetlb:         8921088 kB
[postgres@pg1 ]$

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
    <item>
      <title>PostgreSQL Disable THP - transparent_hugepage on RHEL</title>
      <dc:creator>Dimas Adiputro</dc:creator>
      <pubDate>Fri, 27 Jun 2025 07:02:34 +0000</pubDate>
      <link>https://forem.com/hujan/postgresql-disable-transparenthugepage-on-rhel-3oo3</link>
      <guid>https://forem.com/hujan/postgresql-disable-transparenthugepage-on-rhel-3oo3</guid>
      <description>&lt;p&gt;PostgreSQL are recommend to disable transparent_hugepage. &lt;/p&gt;

&lt;h2&gt;
  
  
  1. using tuned
&lt;/h2&gt;

&lt;p&gt;The default value of &lt;em&gt;transparent_hugepage&lt;/em&gt;  is &lt;em&gt;always&lt;/em&gt;. however we need to disable (never)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;this command is to disabled but temporary. if the server rebooted then transparent_hugepage will be revert to default value&lt;br&gt;
&lt;code&gt;echo never &amp;gt; /sys/kernel/mm/transparent_hugepage/enabled&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;here I am use tuned-adm to disable permanently.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[vm]
transparent_hugepages=never
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;after change then reboot the server and check this command again&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. the second way to disable the THP
&lt;/h2&gt;

&lt;p&gt;Append transparent_hugepage=never to kernel command line in /boot/grub/grub.conf file&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kernel /vmlinuz-2.6.32-642.3.1.el6.x86_64 ro root=/dev/mapper/vg_&amp;lt;hostname&amp;gt;-lv_root rd_NO_LUKS LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_LVM_LV=vg_&amp;lt;hostname&amp;gt;/lv_swap rd_LVM_LV=vg_&amp;lt;hostname&amp;gt;/lv_root KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet numa=off transparent_hugepage=never fnic.fnic_max_qdepth=256

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reboot the server and check if  /sys/kernel/mm/transparent_hugepage/enabled changed&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
    <item>
      <title>enable sudo in rhel</title>
      <dc:creator>Dimas Adiputro</dc:creator>
      <pubDate>Thu, 05 Jun 2025 03:17:30 +0000</pubDate>
      <link>https://forem.com/hujan/enable-sudo-in-rhel-3oa9</link>
      <guid>https://forem.com/hujan/enable-sudo-in-rhel-3oa9</guid>
      <description>&lt;p&gt;this is very useful and simple but some times I forgot.&lt;br&gt;
login as root and type &lt;code&gt;visudo&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;## The COMMANDS section may have other options added to it.
##
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
sysadmin ALL=(ALL) NOPASSWD: ALL
oracle ALL=(ALL) NOPASSWD: ALL
grid ALL=(ALL) NOPASSWD: ALL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
    <item>
      <title>using postgres_fdw</title>
      <dc:creator>Dimas Adiputro</dc:creator>
      <pubDate>Fri, 25 Apr 2025 02:46:42 +0000</pubDate>
      <link>https://forem.com/hujan/using-postgresfdw-29n9</link>
      <guid>https://forem.com/hujan/using-postgresfdw-29n9</guid>
      <description>&lt;p&gt;Here I want to share to configure &lt;code&gt;postgres_fdw&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;the postgres_fdw extension in PostgreSQL is included in the contrib package and I will write how to install contrib here. &lt;/p&gt;

&lt;p&gt;I have &lt;code&gt;pg1 - 10.10.1.9&lt;/code&gt;  and &lt;code&gt;pg2 - 10.10.1.10&lt;/code&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  on pg1
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;\c testdb;

CREATE EXTENSION IF NOT EXISTS postgres_fdw;

CREATE SERVER tonewdatabase
FOREIGN DATA WRAPPER postgres_fdw
OPTIONS (
  host '10.10.1.10',
  dbname 'mydb',
  port '5432'
);

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;tonewdatabase = name Foreign-data wrapper&lt;/code&gt;&lt;br&gt;
&lt;code&gt;host = hostname or ip destination&lt;/code&gt;&lt;br&gt;
&lt;code&gt;dbname = database name destination&lt;/code&gt;&lt;br&gt;
&lt;code&gt;port = database port destionation&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;use below command to list &lt;code&gt;FOREIGN DATA WRAPPER&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;postgres=# \des
             List of foreign servers
     Name      |  Owner   | Foreign-data wrapper
---------------+----------+----------------------
 tonewdatabase | postgres | postgres_fdw
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;now we create user mapping&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CREATE USER MAPPING FOR andi
SERVER tonewdatabase 
OPTIONS (user 'joe', password 'joe123);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;andi = username on pg1&lt;/code&gt;&lt;br&gt;
&lt;code&gt;joe = username on pg2&lt;/code&gt;&lt;br&gt;
&lt;code&gt;joe123= joe's password on pg2&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;login to pg1 as joe user and connect to mydb then run below query.&lt;/p&gt;
&lt;h3&gt;
  
  
  Select t1 on pg2 from pg1
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
IMPORT FOREIGN SCHEMA public
LIMIT TO (t1)
FROM SERVER tonewdatabase 
INTO public;


select * from public.t1 ;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;code&gt;t1 = tablename on pg1&lt;/code&gt;&lt;br&gt;
&lt;code&gt;the IMPORT FOREIGN SCHEMA (or manually creating a FOREIGN TABLE) does not copy any rows locally. It simply creates table definitions on pg1 that point at the real data on pg2. Every time you run&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;below how to create new table&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CREATE FOREIGN TABLE public.t1(
  id INT,
  amount NUMERIC
)
SERVER tonewdatabase 
OPTIONS (schema_name 'public', table_name 't2');
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;this statement will create table on pg2 from pg1.&lt;/p&gt;

&lt;p&gt;Import ALL tables from pg2's 'public' schema:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;IMPORT FOREIGN SCHEMA public
FROM SERVER tonewdatabase
INTO public;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or just a few selected tables:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;IMPORT FOREIGN SCHEMA public
LIMIT TO (table1, table2, table3)
FROM SERVER tonewdatabase
INTO public;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
    <item>
      <title>PgBouncer Simple Configuration</title>
      <dc:creator>Dimas Adiputro</dc:creator>
      <pubDate>Mon, 07 Apr 2025 08:06:21 +0000</pubDate>
      <link>https://forem.com/hujan/pgbouncer-simple-configuration-23d8</link>
      <guid>https://forem.com/hujan/pgbouncer-simple-configuration-23d8</guid>
      <description>&lt;p&gt;Below are the pgbouncer files configuration&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ls -l /etc/pgbouncer
-rwx------. 1 postgres postgres   824 Jan 10 05:59 mkauth.py
-rw-r--r--. 1 postgres postgres   361 Apr  7 14:46 pgbouncer.ini
-rw-r--r--. 1 postgres postgres   825 Apr  7 14:40 userlist.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;edit pgbouncer.ini with below parameter&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[databases]
powerfulldb = port=5432 dbname=powerfulldb

[pgbouncer]
listen_addr = 0.0.0.0
listen_port = 6432
auth_type = md5
auth_file = /etc/pgbouncer/userlist.txt
pool_mode = transaction
max_client_conn = 100
default_pool_size = 20
logfile = /var/log/pgbouncer/pgbouncer.log
pidfile = /var/run/pgbouncer/pgbouncer.pid
unix_socket_dir = /tmp
unix_socket_mode = 0777
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;login to psql and run below statment&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;postgresql 12 below&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;SELECT '"' || rolname || '" "' || rolpassword || '"'  as userlist&lt;br&gt;
FROM pg_shadow&lt;br&gt;
WHERE rolpassword IS NOT NULL;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;postgresql 13+ version&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;SELECT '"' || usename || '" "' || passwd || '"' as userlist&lt;br&gt;
FROM pg_shadow&lt;br&gt;
WHERE passwd IS NOT NULL;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Below is the example result and must to paste to this file /etc/pgbouncer/userlist.txt&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                        userlist
--------------------------------------------------------
 "admin1" "md5c1d7c7825caaac2441xc633a274b45ea"
 "admin2" "md525e4b33435daa2f8ebx1664dd7df2aab"
 "admin3" "md5a99ea413e7dea3bd19xd760507bcec00"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;restart the pgbouncer service &lt;br&gt;
&lt;code&gt;systemctl restart pgbouncer.service&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;then login to the database using pgboncher port&lt;br&gt;
&lt;code&gt;psql -p 6432 -U admin1 -h 10.10.20.100 -d powerfulldb&lt;/code&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>create user in postgresql</title>
      <dc:creator>Dimas Adiputro</dc:creator>
      <pubDate>Wed, 19 Mar 2025 07:50:31 +0000</pubDate>
      <link>https://forem.com/hujan/create-user-in-postgresql-acm</link>
      <guid>https://forem.com/hujan/create-user-in-postgresql-acm</guid>
      <description>&lt;p&gt;Basic things to create and check user attributes&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CREATE USER my_mate_user WITH PASSWORD 'thisisStrongPassword';
ALTER ROLE my_mate_user SET work_mem = '64MB';
ALTER USER my_mate_user WITH CONNECTION LIMIT 10;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;here is the attribute&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT rolname, rolsuper, rolinherit, rolcreaterole, rolcreatedb, rolcanlogin
FROM pg_roles where rolname ='my_mate_user' ;

          rolname       | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcanlogin |    rolconfig
---------------------+----------+------------+---------------+-------------+-------------+-----------------
 my_mate_user | f        | t          | f             | f           | t           | {work_mem=64MB}

(1 row)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;\du
       Role name        |                         Attributes                         |     Member of               
------------------------+------------------------------------------------------------+-----------------------------
        my_mate_user    | 10 connections                                             |       {} 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
    <item>
      <title>PGBackRest Configuration from Standby Database</title>
      <dc:creator>Dimas Adiputro</dc:creator>
      <pubDate>Mon, 10 Mar 2025 22:38:17 +0000</pubDate>
      <link>https://forem.com/hujan/pgbackrest-configuration-from-standby-database-iho</link>
      <guid>https://forem.com/hujan/pgbackrest-configuration-from-standby-database-iho</guid>
      <description>&lt;p&gt;pgbackrest is the faster backup tools and the completed feature for backup. I choose pgbackrest because barman cannot handle in high wal generated. &lt;br&gt;
My Database have 22.000 until 40.000 wal per hours (1 wal = 1mb). &lt;br&gt;
Here I have 3 servers. &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;10.10.10.1 - pg1 as master postgresql&lt;/li&gt;
&lt;li&gt;10.10.10.2 - pg2 as standby postgresql&lt;/li&gt;
&lt;li&gt;10.10.10.3 - pg3 as backup server&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;since my master databases very busy I will backup the database from standby.&lt;/p&gt;

&lt;p&gt;here is my configuration. &lt;/p&gt;

&lt;p&gt;&lt;code&gt;master database - /etc/pgbackrest.conf&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[global]
repo1-host=10.10.10.3
repo1-host-user=postgres
repo1-path=/pgbackuprest
start-fast=y
log-level-console=info
log-level-file=detail
compress-level=1
process-max=4
compress-type=lz4
archive-async=y
spool-path=/archspool
archive-push-queue-max=5GiB

[mycluster]
pg1-path=/data
pg1-port=5432

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;run this in master only&lt;br&gt;
&lt;code&gt;pgbackrest --stanza=mypgback  stanza-create&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;standby database - /etc/pgbackrest.conf&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[global]
repo1-host=10.10.10.3
repo1-host-user=postgres
repo1-path=/pgbackuprest
start-fast=y
log-level-console=info
log-level-file=detail
compress-level=1
process-max=12
archive-async=y
spool-path=/arc_temp
archive-get-queue-max=5GiB
compress-type=lz4

[mypgback]
pg1-path=/data
pg1-port=5432
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Don't forget to change in master and standby to push the archive&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;postgres=# show archive_command ;
                archive_command
-----------------------------------------------
 pgbackrest --stanza=mypgback archive-push %p
(1 row)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;this is for restore wal&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;postgres=# show restore_command ;
                  restore_command
---------------------------------------------------
 pgbackrest --stanza=mypgback archive-get %f "%p"
(1 row)


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;pg3 - /etc/pgbackrest.conf&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[global]
repo1-path=/pgbackuprest
repo1-retention-full=1
start-fast=y
log-level-console=info
log-level-file=detail
process-max=12
archive-timeout=1h
compress-level=1
backup-standby=y
log-path=/pgbackuprest/log
compress-type=lz4

[mypgback]
pg1-host=10.10.10.1
pg1-host-user=postgres
pg1-port=5432
pg1-path=/data
pg2-host=10.10.10.2
pg2-host-user=postgres
pg2-port=5432
pg2-path=/data
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Set the pgbackrest on crontab&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;5 17 * * 6 /usr/bin/pgbackrest --stanza=mypgback backup --type=full&lt;br&gt;
5 18 * * 0-5 /usr/bin/pgbackrest --stanza=mypgback backup --type=incr&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Here is the result from pgbackrest backup &lt;br&gt;
&lt;code&gt;pgbackest info&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;stanza: mypgback 
    status: ok
    cipher: none

    db (current)
        wal archive min/max (12): 000000090002877600000046/00000009000289F100000097

        full backup: 20241210-180000F
            timestamp start/stop: 2024-12-10 18:00:55+08 / 2025-03-10 22:09:09+08
            wal start/stop: 000000090002877600000046 / 00000009000287E10000000B
            database size: 21821.5GB, database backup size: 21821.5GB
            repo1: backup set size: 3395.6GB, backup size: 3395.6GB

 incr backup: 20241211-170452F_20241212-180451I
            timestamp start/stop: 2024-12-11 18:04:51+08 / 2024-11-11 18:43:46+08
            wal start/stop: 000000090002902900000075 / 000000090002904800000007
            database size: 22697.6GB, database backup size: 3198.1GB
            repo1: backup set size: 3591GB, backup size: 534.7GB
            backup reference list: 20241210-180000F


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;as we can see from the result my database size is &lt;strong&gt;21821.5GB&lt;/strong&gt; but the back size &lt;strong&gt;33395.6GB&lt;/strong&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>pg_class in postgreSQL</title>
      <dc:creator>Dimas Adiputro</dc:creator>
      <pubDate>Thu, 19 Dec 2024 14:09:50 +0000</pubDate>
      <link>https://forem.com/hujan/pgclass-in-postgresql-5eik</link>
      <guid>https://forem.com/hujan/pgclass-in-postgresql-5eik</guid>
      <description>&lt;p&gt;The &lt;code&gt;pg_class&lt;/code&gt; system catalog in PostgreSQL contains metadata about the tables, indexes, sequences, views, and other relations in the database. It is a central part of PostgreSQL's internal architecture, and you can query &lt;code&gt;pg_class&lt;/code&gt; to obtain detailed information about the structure of your database.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;List All Relations (Tables, Views, Sequences)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;This query will give you a list of all relations (tables, views, sequences, etc.) in the current database:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; 
    &lt;span class="n"&gt;relname&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;relation_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="n"&gt;relkind&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;relation_type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;CASE&lt;/span&gt; 
        &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="n"&gt;relkind&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'r'&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt; &lt;span class="s1"&gt;'Table'&lt;/span&gt;
        &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="n"&gt;relkind&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'v'&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt; &lt;span class="s1"&gt;'View'&lt;/span&gt;
        &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="n"&gt;relkind&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'i'&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt; &lt;span class="s1"&gt;'Index'&lt;/span&gt;
        &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="n"&gt;relkind&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'S'&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt; &lt;span class="s1"&gt;'Sequence'&lt;/span&gt;
        &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="n"&gt;relkind&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'t'&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt; &lt;span class="s1"&gt;'TOAST table'&lt;/span&gt;
        &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="n"&gt;relkind&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'c'&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt; &lt;span class="s1"&gt;'Composite type'&lt;/span&gt;
        &lt;span class="k"&gt;ELSE&lt;/span&gt; &lt;span class="s1"&gt;'Other'&lt;/span&gt;
    &lt;span class="k"&gt;END&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;relation_type_description&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; 
    &lt;span class="n"&gt;pg_class&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; 
    &lt;span class="n"&gt;relnamespace&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;oid&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;pg_namespace&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;nspname&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'public'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;-- limit to 'public' schema&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; 
    &lt;span class="n"&gt;relname&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. &lt;strong&gt;Get Table Size&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;If you want to find the size of a specific table (including its TOAST table, indexes, etc.), you can use &lt;code&gt;pg_class&lt;/code&gt; along with the &lt;code&gt;pg_total_relation_size()&lt;/code&gt; function:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; 
    &lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;relname&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="k"&gt;table_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;pg_size_pretty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pg_total_relation_size&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;oid&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;total_size&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; 
    &lt;span class="n"&gt;pg_class&lt;/span&gt; &lt;span class="k"&gt;c&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; 
    &lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;relkind&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'r'&lt;/span&gt;  &lt;span class="c1"&gt;-- 'r' stands for regular tables&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; 
    &lt;span class="n"&gt;pg_total_relation_size&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;oid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. &lt;strong&gt;Find Tables with Most Indexes&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;To find which tables have the most indexes, you can join &lt;code&gt;pg_class&lt;/code&gt; with &lt;code&gt;pg_index&lt;/code&gt; and group by the table OID:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; 
    &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;relname&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="k"&gt;table_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;COUNT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;indexrelid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;index_count&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; 
    &lt;span class="n"&gt;pg_class&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;
&lt;span class="k"&gt;JOIN&lt;/span&gt; 
    &lt;span class="n"&gt;pg_index&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;oid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;indrelid&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; 
    &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;relkind&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'r'&lt;/span&gt; &lt;span class="c1"&gt;-- only tables&lt;/span&gt;
&lt;span class="k"&gt;GROUP&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; 
    &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;relname&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; 
    &lt;span class="n"&gt;index_count&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. &lt;strong&gt;List All Indexes and Their Associated Tables&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;If you're interested in finding all indexes in the database and the tables they are associated with, use the following query:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; 
    &lt;span class="n"&gt;idx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;relname&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;index_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;tbl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;relname&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="k"&gt;table_name&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; 
    &lt;span class="n"&gt;pg_class&lt;/span&gt; &lt;span class="n"&gt;tbl&lt;/span&gt;
&lt;span class="k"&gt;JOIN&lt;/span&gt; 
    &lt;span class="n"&gt;pg_index&lt;/span&gt; &lt;span class="n"&gt;ix&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;tbl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;oid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ix&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;indrelid&lt;/span&gt;
&lt;span class="k"&gt;JOIN&lt;/span&gt; 
    &lt;span class="n"&gt;pg_class&lt;/span&gt; &lt;span class="n"&gt;idx&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;ix&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;indexrelid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;idx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;oid&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; 
    &lt;span class="n"&gt;tbl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;relkind&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'r'&lt;/span&gt;  &lt;span class="c1"&gt;-- only tables&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; 
    &lt;span class="n"&gt;tbl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;relname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;idx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;relname&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5. &lt;strong&gt;Get Column Count for Each Table&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;To get the number of columns for each table, you can join &lt;code&gt;pg_class&lt;/code&gt; with &lt;code&gt;pg_attribute&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; 
    &lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;relname&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="k"&gt;table_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;COUNT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;attname&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;column_count&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; 
    &lt;span class="n"&gt;pg_class&lt;/span&gt; &lt;span class="k"&gt;c&lt;/span&gt;
&lt;span class="k"&gt;JOIN&lt;/span&gt; 
    &lt;span class="n"&gt;pg_attribute&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;oid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;attrelid&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; 
    &lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;relkind&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'r'&lt;/span&gt; &lt;span class="c1"&gt;-- only tables&lt;/span&gt;
    &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;attnum&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;  &lt;span class="c1"&gt;-- exclude system columns&lt;/span&gt;
&lt;span class="k"&gt;GROUP&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; 
    &lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;relname&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; 
    &lt;span class="n"&gt;column_count&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  6. &lt;strong&gt;List All Constraints on a Table&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;To list all constraints on a table (e.g., primary keys, foreign keys, unique constraints), you can query the &lt;code&gt;pg_constraint&lt;/code&gt; catalog:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; 
    &lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;conname&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="k"&gt;constraint_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;contype&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;constraint_type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;relname&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="k"&gt;table_name&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; 
    &lt;span class="n"&gt;pg_constraint&lt;/span&gt; &lt;span class="k"&gt;c&lt;/span&gt;
&lt;span class="k"&gt;JOIN&lt;/span&gt; 
    &lt;span class="n"&gt;pg_class&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;conrelid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;oid&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; 
    &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;relname&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'your_table_name'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;-- Replace with the table you're interested in&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  7. &lt;strong&gt;Find Tables with Foreign Keys&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;To find tables with foreign keys, you can query &lt;code&gt;pg_constraint&lt;/code&gt; and &lt;code&gt;pg_class&lt;/code&gt; as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; 
    &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;relname&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="k"&gt;table_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;conname&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;foreign_key_name&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; 
    &lt;span class="n"&gt;pg_constraint&lt;/span&gt; &lt;span class="k"&gt;c&lt;/span&gt;
&lt;span class="k"&gt;JOIN&lt;/span&gt; 
    &lt;span class="n"&gt;pg_class&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;conrelid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;oid&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; 
    &lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;contype&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'f'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;-- 'f' for foreign keys&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;contype = 'f'&lt;/code&gt;: Filters for foreign key constraints.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  8. &lt;strong&gt;Find Tables with No Indexes&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;You can also identify tables that do not have any indexes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; 
    &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;relname&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="k"&gt;table_name&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; 
    &lt;span class="n"&gt;pg_class&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;
&lt;span class="k"&gt;LEFT&lt;/span&gt; &lt;span class="k"&gt;JOIN&lt;/span&gt; 
    &lt;span class="n"&gt;pg_index&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;oid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;indrelid&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; 
    &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;relkind&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'r'&lt;/span&gt;  &lt;span class="c1"&gt;-- only tables&lt;/span&gt;
    &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;indexrelid&lt;/span&gt; &lt;span class="k"&gt;IS&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; 
    &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;relname&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  9. &lt;strong&gt;Find Large Tables (by Size)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;To identify the largest tables in terms of total size, you can use &lt;code&gt;pg_class&lt;/code&gt; together with &lt;code&gt;pg_total_relation_size()&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; 
    &lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;relname&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="k"&gt;table_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;pg_size_pretty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pg_total_relation_size&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;oid&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;total_size&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; 
    &lt;span class="n"&gt;pg_class&lt;/span&gt; &lt;span class="k"&gt;c&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; 
    &lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;relkind&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'r'&lt;/span&gt; &lt;span class="c1"&gt;-- only tables&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; 
    &lt;span class="n"&gt;pg_total_relation_size&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;oid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;
&lt;span class="k"&gt;LIMIT&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;This query retrieves the 10 largest tables based on their total size.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  10. &lt;strong&gt;Show Tables with Their OIDs&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;To get the OID (Object Identifier) of tables, you can query &lt;code&gt;pg_class&lt;/code&gt; directly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; 
    &lt;span class="n"&gt;oid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;relname&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="k"&gt;table_name&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; 
    &lt;span class="n"&gt;pg_class&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; 
    &lt;span class="n"&gt;relkind&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'r'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;-- only tables&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;oid&lt;/code&gt;: A unique identifier for each object in PostgreSQL (including tables).&lt;/li&gt;
&lt;/ul&gt;




</description>
    </item>
    <item>
      <title>Barman vs pgbackrest</title>
      <dc:creator>Dimas Adiputro</dc:creator>
      <pubDate>Thu, 19 Dec 2024 14:02:52 +0000</pubDate>
      <link>https://forem.com/hujan/barman-vs-pgbackrest-2bi6</link>
      <guid>https://forem.com/hujan/barman-vs-pgbackrest-2bi6</guid>
      <description>&lt;p&gt;Barman vs pgbackrest :&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;pgBackRest&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Barman&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Backup Types&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Full, Incremental, Differential&lt;/td&gt;
&lt;td&gt;Full, Incremental (via WAL archiving)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Parallel Backups&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Compression&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Encryption&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No (Requires external encryption)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Point-in-Time Recovery&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Performance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;High performance, parallel processing&lt;/td&gt;
&lt;td&gt;Good, but not as optimized as pgBackRest&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ease of Use&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Moderate (some complexity)&lt;/td&gt;
&lt;td&gt;Easy to set up and use&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Restore Process&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Flexible, with automatic WAL recovery&lt;/td&gt;
&lt;td&gt;Simple, but less feature-rich&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cross-Platform&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Primarily Linux-based&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Centralized Management&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Retention Policies&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Limited (manual management)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Community Support&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Strong community and active development&lt;/td&gt;
&lt;td&gt;Active community support&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  When to Use pgBackRest:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Large Scale Systems:&lt;/strong&gt; If you have large databases or need to backup large volumes of data with high performance and efficiency, pgBackRest is ideal due to its parallelism and delta backups.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Advanced Features:&lt;/strong&gt; If you need features like encryption, compression, and fine-tuned backup configurations, pgBackRest excels in these areas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;High Availability and Replication:&lt;/strong&gt; If you are using streaming replication or other advanced PostgreSQL features, pgBackRest integrates well into these environments.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  When to Use Barman:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Small to Medium Systems:&lt;/strong&gt; Barman is well-suited for smaller to medium-sized PostgreSQL environments where simplicity and ease of use are the primary concerns.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Centralized Management:&lt;/strong&gt; If you have multiple PostgreSQL instances and need centralized backup management, Barman is a good choice.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Basic Backup and Recovery Needs:&lt;/strong&gt; If you don't require advanced features like parallel backups or encryption, Barman provides a straightforward solution for backup and recovery tasks.&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
  </channel>
</rss>
