Create a Second PostgreSQL Instance on the Same Linux Server
Table of Contents
0. Verify existing setup
[postgres@pgdb02 ~]$ ps -ef | grep postgres
root 3641 3561 0 16:57 pts/1 00:00:00 su - postgres
postgres 3642 3641 0 16:57 pts/1 00:00:00 -bash
postgres 3711 1 0 17:03 ? 00:00:00 /pgBin/pgsql/17.4/bin/postgres -D /pgData/pgsql/17.4
postgres 3712 3711 0 17:03 ? 00:00:00 postgres: PGDB_SIT: checkpointer
postgres 3713 3711 0 17:03 ? 00:00:00 postgres: PGDB_SIT: background writer
postgres 3715 3711 0 17:03 ? 00:00:00 postgres: PGDB_SIT: walwriter
postgres 3716 3711 0 17:03 ? 00:00:00 postgres: PGDB_SIT: autovacuum launcher
postgres 3717 3711 0 17:03 ? 00:00:00 postgres: PGDB_SIT: logical replication launcher
postgres 3731 3642 0 17:03 pts/1 00:00:00 psql
postgres 3732 3711 0 17:03 ? 00:00:00 postgres: PGDB_SIT: postgres postgres [local] idle
root 3748 3164 0 17:09 pts/0 00:00:00 su - postgres
postgres 3749 3748 0 17:09 pts/0 00:00:00 -bash
postgres 3911 3749 0 17:59 pts/0 00:00:00 ps -ef
postgres 3912 3749 0 17:59 pts/0 00:00:00 grep --color=auto postgres
[postgres@pgdb02 ~]$
1. Create new directories
[root@pgdb02 ~]# mkdir -p /pgData/pgsql/17.4/dev
[root@pgdb02 ~]# mkdir -p /pgWal/pgsql/17.4/dev
[root@pgdb02 ~]# chown -R postgres:postgres /pgData /pgWal
[root@pgdb02 ~]#
2. Initialize second cluster
# As postgres user
[postgres@pgdb02 ~]$ /pgBin/pgsql/17.4/bin/initdb -D /pgData/pgsql/17.4/dev --waldir=/pgWal/pgsql/17.4/dev --wal-segsize=128
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.
The database cluster will be initialized with locale "en_SG.UTF-8".
The default database encoding has accordingly been set to "UTF8".
The default text search configuration will be set to "english".
Data page checksums are disabled.
fixing permissions on existing directory /pgData/pgsql/17.4/dev ... ok
fixing permissions on existing directory /pgWal/pgsql/17.4/dev ... ok
creating subdirectories ... ok
selecting dynamic shared memory implementation ... posix
selecting default "max_connections" ... 100
selecting default "shared_buffers" ... 128MB
selecting default time zone ... Asia/Singapore
creating configuration files ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... ok
syncing data to disk ... ok
initdb: warning: enabling "trust" authentication for local connections
initdb: hint: You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb.
Success. You can now start the database server using:
/pgBin/pgsql/17.4/bin/pg_ctl -D /pgData/pgsql/17.4/dev -l logfile start
[postgres@pgdb02 ~]$
[postgres@pgdb02 ~]$ ls -ld /pgData/pgsql/17.4/dev
drwx------. 18 postgres postgres 4096 Jun 20 18:03 /pgData/pgsql/17.4/dev
[postgres@pgdb02 ~]$
[postgres@pgdb02 ~]$ ls -ltr /pgData/pgsql/17.4/dev
total 56
lrwxrwxrwx. 1 postgres postgres 21 Jun 20 18:03 pg_wal -> /pgWal/pgsql/17.4/dev
drwx------. 2 postgres postgres 6 Jun 20 18:03 pg_commit_ts
drwx------. 2 postgres postgres 6 Jun 20 18:03 pg_dynshmem
drwx------. 2 postgres postgres 6 Jun 20 18:03 pg_twophase
drwx------. 2 postgres postgres 6 Jun 20 18:03 pg_tblspc
drwx------. 2 postgres postgres 6 Jun 20 18:03 pg_stat_tmp
drwx------. 2 postgres postgres 6 Jun 20 18:03 pg_snapshots
drwx------. 2 postgres postgres 6 Jun 20 18:03 pg_serial
drwx------. 2 postgres postgres 6 Jun 20 18:03 pg_replslot
drwx------. 2 postgres postgres 6 Jun 20 18:03 pg_notify
drwx------. 4 postgres postgres 36 Jun 20 18:03 pg_multixact
-rw-------. 1 postgres postgres 3 Jun 20 18:03 PG_VERSION
-rw-------. 1 postgres postgres 30718 Jun 20 18:03 postgresql.conf
-rw-------. 1 postgres postgres 88 Jun 20 18:03 postgresql.auto.conf
-rw-------. 1 postgres postgres 5711 Jun 20 18:03 pg_hba.conf
-rw-------. 1 postgres postgres 2640 Jun 20 18:03 pg_ident.conf
drwx------. 2 postgres postgres 18 Jun 20 18:03 pg_xact
drwx------. 2 postgres postgres 18 Jun 20 18:03 pg_subtrans
drwx------. 2 postgres postgres 4096 Jun 20 18:03 global
drwx------. 5 postgres postgres 33 Jun 20 18:03 base
drwx------. 4 postgres postgres 68 Jun 20 18:03 pg_logical
drwx------. 2 postgres postgres 25 Jun 20 18:03 pg_stat
[postgres@pgdb02 ~]$
**** we can see here 700 permission set by initdb command.3. Edit second instance config
[postgres@pgdb02 ~]$ egrep "^(#)?(port|cluster_name)" /pgData/pgsql/17.4/dev/postgresql.conf
#port = 5432 # (change requires restart)
#cluster_name = '' # added to process titles if nonempty
[postgres@pgdb02 ~]$
[postgres@pgdb02 ~]$ cp /pgData/pgsql/17.4/dev/postgresql.conf /pgData/pgsql/17.4/dev/postgresql.conf.bkp
[postgres@pgdb02 ~]$
[postgres@pgdb02 ~]$ sed -i "s/^#port = 5432.*/port = 5433/" /pgData/pgsql/17.4/dev/postgresql.conf
[postgres@pgdb02 ~]$ sed -i "s/^#cluster_name = ''.*/cluster_name = 'PGDB_UAT'/" /pgData/pgsql/17.4/dev/postgresql.conf
[postgres@pgdb02 ~]$
[postgres@pgdb02 ~]$ egrep "^(#)?(port|cluster_name)" /pgData/pgsql/17.4/dev/postgresql.conf
port = 5433
cluster_name = 'PGDB_UAT'
[postgres@pgdb02 ~]$
4. Start PostgreSQL Service
[postgres@pgdb02 ~]$ /pgBin/pgsql/17.4/bin/pg_ctl -D /pgData/pgsql/17.4/dev -l logfile start
waiting for server to start.... done
server started
[postgres@pgdb02 ~]$
5. Connect to second instance
[postgres@pgdb02 ~]$ psql -p 5433
psql (17.4)
Type "help" for help.
postgres=# SHOW port;
port
------
5433 <-----------
(1 row)
postgres=# SHOW cluster_name;
cluster_name
--------------
PGDB_UAT <---------------
(1 row)
postgres=#\q
[postgres@pgdb02 ~]$ pg_ctl stop -D /pgData/pgsql/17.4/dev
waiting for server to shut down.... done
server stopped
[postgres@pgdb02 ~]$
6. Create second systemd service
[root@pgdb02 ~]# cp /etc/systemd/system/postgresql-17.service /etc/systemd/system/postgresql-17-dev.service
[root@pgdb02 ~]#
[root@pgdb02 ~]# grep -i Environment=PGDATA /etc/systemd/system/postgresql-17-dev.service
Environment=PGDATA=/pgData/pgsql/17.4
[root@pgdb02 ~]#
[root@pgdb02 ~]# sed -i 's|Environment=PGDATA=/pgData/pgsql/17.4|Environment=PGDATA=/pgData/pgsql/17.4/dev|' /etc/systemd/system/postgresql-17-dev.service
[root@pgdb02 ~]# grep -i Environment=PGDATA /etc/systemd/system/postgresql-17-dev.service
Environment=PGDATA=/pgData/pgsql/17.4/dev
[root@pgdb02 ~]#
[root@pgdb02 ~]# systemctl daemon-reload
[root@pgdb02 ~]# systemctl start postgresql-17-dev
[root@pgdb02 ~]# systemctl enable postgresql-17-dev
Created symlink /etc/systemd/system/multi-user.target.wants/postgresql-17-dev.service → /etc/systemd/system/postgresql-17-dev.service.
[root@pgdb02 ~]#
[root@pgdb02 ~]# systemctl status postgresql-17-dev
● postgresql-17-dev.service - PostgreSQL 17 Database Server
Loaded: loaded (/etc/systemd/system/postgresql-17-dev.service; enabled; preset: disabled)
Active: active (running) since Sat 2026-06-20 18:25:39 +08; 12s ago
Docs: https://www.postgresql.org/docs/17/
Main PID: 4106 (postgres)
Tasks: 6 (limit: 15700)
Memory: 15.2M
CPU: 62ms
CGroup: /system.slice/postgresql-17-dev.service
├─4106 /pgBin/pgsql/17.4/bin/postgres -D /pgData/pgsql/17.4/dev
├─4107 "postgres: PGDB_UAT: checkpointer "
├─4108 "postgres: PGDB_UAT: background writer "
├─4110 "postgres: PGDB_UAT: walwriter "
├─4111 "postgres: PGDB_UAT: autovacuum launcher "
└─4112 "postgres: PGDB_UAT: logical replication launcher "
Jun 20 18:25:39 pgdb02 systemd[1]: Starting PostgreSQL 17 Database Server...
Jun 20 18:25:39 pgdb02 pg_ctl[4103]: waiting for server to start.... done
Jun 20 18:25:39 pgdb02 pg_ctl[4103]: server started
Jun 20 18:25:39 pgdb02 systemd[1]: Started PostgreSQL 17 Database Server.
[root@pgdb02 ~]#
7. Verify instances
[postgres@pgdb02 ~]$ ps -ef | grep postgres
postgres 3711 1 0 17:03 ? 00:00:00 /pgBin/pgsql/17.4/bin/postgres -D /pgData/pgsql/17.4
postgres 3712 3711 0 17:03 ? 00:00:00 postgres: PGDB_SIT: checkpointer
postgres 3713 3711 0 17:03 ? 00:00:00 postgres: PGDB_SIT: background writer
postgres 3715 3711 0 17:03 ? 00:00:00 postgres: PGDB_SIT: walwriter
postgres 3716 3711 0 17:03 ? 00:00:00 postgres: PGDB_SIT: autovacuum launcher
postgres 3717 3711 0 17:03 ? 00:00:00 postgres: PGDB_SIT: logical replication launcher
root 3748 3164 0 17:09 pts/0 00:00:00 su - postgres
postgres 3749 3748 0 17:09 pts/0 00:00:00 -bash
postgres 4106 1 0 18:25 ? 00:00:00 /pgBin/pgsql/17.4/bin/postgres -D /pgData/pgsql/17.4/dev
postgres 4107 4106 0 18:25 ? 00:00:00 postgres: PGDB_UAT: checkpointer
postgres 4108 4106 0 18:25 ? 00:00:00 postgres: PGDB_UAT: background writer
postgres 4110 4106 0 18:25 ? 00:00:00 postgres: PGDB_UAT: walwriter
postgres 4111 4106 0 18:25 ? 00:00:00 postgres: PGDB_UAT: autovacuum launcher
postgres 4112 4106 0 18:25 ? 00:00:00 postgres: PGDB_UAT: logical replication launcher
postgres 4157 3749 99 18:26 pts/0 00:00:00 ps -ef
postgres 4158 3749 0 18:26 pts/0 00:00:00 grep --color=auto postgres
[postgres@pgdb02 ~]$
[postgres@pgdb02 ~]$ ss -tulpn | grep 543
tcp LISTEN 0 200 127.0.0.1:5433 0.0.0.0:* users:(("postgres",pid=4106,fd=7))
tcp LISTEN 0 200 127.0.0.1:5432 0.0.0.0:* users:(("postgres",pid=3711,fd=7))
tcp LISTEN 0 200 [::1]:5432 [::]:* users:(("postgres",pid=3711,fd=6))
tcp LISTEN 0 200 [::1]:5433 [::]:* users:(("postgres",pid=4106,fd=6))
[postgres@pgdb02 ~]$
Caution: Your use of any information or materials on this website is entirely at your own risk. It is provided for educational purposes only. It has been tested internally, however, we do not guarantee that it will work for you. Ensure that you run it in your test environment before using.
Thank you,
Rajasekhar Amudala
Email: br8dba@gmail.com
Linkedin: https://www.linkedin.com/in/rajasekhar-amudala/