Salin dan Bagikan
Cara Setup PostgreSQL Database di Linux - Panduan lengkap instalasi dan konfigurasi PostgreSQL database di Linux

Cara Setup PostgreSQL Database di Linux

PostgreSQL adalah database relasional open-source yang powerful. Mari pelajari cara setup dan menggunakannya.

Install PostgreSQL

Ubuntu/Debian

# Update package list
sudo apt update

# Install PostgreSQL
sudo apt install postgresql postgresql-contrib

# Check status
sudo systemctl status postgresql

# Start service
sudo systemctl start postgresql
sudo systemctl enable postgresql

Fedora/RHEL

# Install PostgreSQL
sudo dnf install postgresql-server postgresql-contrib

# Initialize database
sudo postgresql-setup --initdb

# Start service
sudo systemctl start postgresql
sudo systemctl enable postgresql

Initial Configuration

Access PostgreSQL

# Switch to postgres user
sudo -i -u postgres

# Access PostgreSQL prompt
psql

# Atau langsung
sudo -u postgres psql

Create Database and User

-- Create user
CREATE USER myuser WITH PASSWORD 'mypassword';

-- Create database
CREATE DATABASE mydb;

-- Grant privileges
GRANT ALL PRIVILEGES ON DATABASE mydb TO myuser;

-- Make user superuser (optional)
ALTER USER myuser WITH SUPERUSER;

-- List databases
\l

-- List users
\du

-- Exit
\q

Basic SQL Commands

Connect to Database

# Connect as specific user
psql -U myuser -d mydb -h localhost

# Or with connection string
psql "postgresql://myuser:mypassword@localhost:5432/mydb"

Create Tables

-- Create table
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    nama VARCHAR(100) NOT NULL,
    email VARCHAR(255) UNIQUE NOT NULL,
    umur INTEGER,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- Create table with foreign key
CREATE TABLE posts (
    id SERIAL PRIMARY KEY,
    title VARCHAR(255) NOT NULL,
    content TEXT,
    user_id INTEGER REFERENCES users(id),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CRUD Operations

-- Insert data
INSERT INTO users (nama, email, umur)
VALUES ('Budi', 'budi@email.com', 25);

INSERT INTO users (nama, email, umur)
VALUES
    ('Ani', 'ani@email.com', 23),
    ('Citra', 'citra@email.com', 28);

-- Select data
SELECT * FROM users;
SELECT nama, email FROM users WHERE umur > 24;
SELECT * FROM users ORDER BY nama ASC;
SELECT * FROM users LIMIT 10 OFFSET 0;

-- Update data
UPDATE users SET umur = 26 WHERE nama = 'Budi';

-- Delete data
DELETE FROM users WHERE id = 1;

Advanced Queries

Joins

-- Inner join
SELECT users.nama, posts.title
FROM users
INNER JOIN posts ON users.id = posts.user_id;

-- Left join
SELECT users.nama, posts.title
FROM users
LEFT JOIN posts ON users.id = posts.user_id;

-- Count with group
SELECT users.nama, COUNT(posts.id) as total_posts
FROM users
LEFT JOIN posts ON users.id = posts.user_id
GROUP BY users.nama;

Aggregate Functions

-- Count
SELECT COUNT(*) FROM users;

-- Sum, Avg, Min, Max
SELECT
    SUM(umur) as total,
    AVG(umur) as rata_rata,
    MIN(umur) as termuda,
    MAX(umur) as tertua
FROM users;

-- Group by
SELECT umur, COUNT(*) FROM users GROUP BY umur;

PostgreSQL Specific Features

JSON Support

-- Create table with JSON column
CREATE TABLE products (
    id SERIAL PRIMARY KEY,
    name VARCHAR(255),
    metadata JSONB
);

-- Insert JSON data
INSERT INTO products (name, metadata)
VALUES ('Laptop', '{"brand": "Dell", "specs": {"ram": "16GB", "storage": "512GB"}}');

-- Query JSON
SELECT name, metadata->>'brand' as brand FROM products;
SELECT * FROM products WHERE metadata->>'brand' = 'Dell';
SELECT metadata->'specs'->>'ram' as ram FROM products;

Array Type

-- Create table with array
CREATE TABLE articles (
    id SERIAL PRIMARY KEY,
    title VARCHAR(255),
    tags TEXT[]
);

-- Insert array
INSERT INTO articles (title, tags)
VALUES ('PostgreSQL Guide', ARRAY['database', 'sql', 'tutorial']);

-- Query array
SELECT * FROM articles WHERE 'database' = ANY(tags);
SELECT * FROM articles WHERE tags @> ARRAY['sql'];

User Management

Create Roles

-- Create role
CREATE ROLE readonlyuser WITH LOGIN PASSWORD 'password';

-- Grant read-only access
GRANT CONNECT ON DATABASE mydb TO readonlyuser;
GRANT USAGE ON SCHEMA public TO readonlyuser;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonlyuser;

-- For future tables
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT SELECT ON TABLES TO readonlyuser;

Revoke Privileges

-- Revoke privileges
REVOKE ALL PRIVILEGES ON DATABASE mydb FROM someuser;
REVOKE ALL ON ALL TABLES IN SCHEMA public FROM someuser;

-- Drop user
DROP USER someuser;

Configuration

postgresql.conf

# Edit config file
sudo nano /etc/postgresql/16/main/postgresql.conf

# Common settings
listen_addresses = 'localhost'  # atau '*' untuk remote
port = 5432
max_connections = 100
shared_buffers = 256MB
work_mem = 4MB

pg_hba.conf (Authentication)

# Edit authentication config
sudo nano /etc/postgresql/16/main/pg_hba.conf

# Allow local connections
# TYPE  DATABASE  USER  ADDRESS       METHOD
local   all       all                 peer
host    all       all   127.0.0.1/32  md5
host    all       all   ::1/128       md5

# Allow remote (hati-hati!)
host    all       all   0.0.0.0/0     md5

Apply Changes

# Reload config
sudo systemctl reload postgresql

# Restart service
sudo systemctl restart postgresql

Backup and Restore

Backup Database

# Backup single database
pg_dump -U postgres mydb > mydb_backup.sql

# Backup with compression
pg_dump -U postgres -Fc mydb > mydb_backup.dump

# Backup all databases
pg_dumpall -U postgres > all_databases.sql

# Backup specific tables
pg_dump -U postgres -t users mydb > users_table.sql

Restore Database

# Restore from SQL file
psql -U postgres -d mydb < mydb_backup.sql

# Restore from dump
pg_restore -U postgres -d mydb mydb_backup.dump

# Create database then restore
createdb -U postgres newdb
pg_restore -U postgres -d newdb mydb_backup.dump

Useful Commands

psql Meta-Commands

-- List databases
\l

-- Connect to database
\c mydb

-- List tables
\dt

-- Describe table
\d users

-- List schemas
\dn

-- List functions
\df

-- Show current user
\conninfo

-- Execute SQL file
\i /path/to/file.sql

-- Export to CSV
\copy users TO '/tmp/users.csv' WITH CSV HEADER;

-- Help
\?

Performance Commands

-- Explain query plan
EXPLAIN SELECT * FROM users WHERE umur > 25;
EXPLAIN ANALYZE SELECT * FROM users WHERE umur > 25;

-- Create index
CREATE INDEX idx_users_umur ON users(umur);
CREATE INDEX idx_users_email ON users(email);

-- Check table size
SELECT pg_size_pretty(pg_total_relation_size('users'));

-- Check database size
SELECT pg_size_pretty(pg_database_size('mydb'));

Kesimpulan

PostgreSQL adalah database yang powerful dengan banyak fitur advanced. Mulai dengan basic setup lalu explore fitur seperti JSON, arrays, dan full-text search.

Artikel Terkait

Link Postingan : https://www.tirinfo.com/cara-setup-postgresql-database/

Hendra WIjaya
Tirinfo
4 minutes.
7 January 2026