PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Memulai Dengan PostgreSQL 11 di Ubuntu 18.04

PostgreSQL, meskipun merupakan RDBMS yang modern dan serbaguna, bukanlah yang paling mudah untuk disiapkan dan dijalankan saat Anda ingin mengembangkan aplikasi. Baca terus untuk mengetahui tentang bagaimana Anda dapat memulai dengan PostgreSQL versi terbaru pada versi LTS dari Ubuntu.

Instalasi

Ubuntu 18.04 hadir dengan PostgreSQL 10, tetapi sebagai gantinya kita dapat menggunakan repositori APT yang dihosting oleh tim PostgreSQL untuk menginstal versi terbaru, PostgreSQL 11.

Anda dapat mengatur repositori menggunakan perintah ini:

# add the repository
sudo tee /etc/apt/sources.list.d/pgdg.list <<END
deb http://apt.postgresql.org/pub/repos/apt/ bionic-pgdg main
END

# get the signing key and import it
wget https://www.postgresql.org/media/keys/ACCC4CF8.asc
sudo apt-key add ACCC4CF8.asc

# fetch the metadata from the new repo
sudo apt-get update

Dan kemudian instal perangkat lunak itu sendiri, menggunakan:

sudo apt-get install postgresql-11

Instalasi melakukan beberapa hal:

  • Ini menginstal server PostgreSQL, utilitas, dan klien baris perintah yang disebutpsql .
  • Ini membuat pengguna sistem Linux bernama postgres . Semua file data dimiliki oleh pengguna ini, dan semua proses dijalankan sebagai pengguna ini.
  • Ini membuat satu database, juga disebut postgres .
  • Ini membuat satu pengguna PostgreSQL (bukan pengguna sistem Linux), juga disebutpostgres .

Anda dapat melihat ini mulai membingungkan!

Cluster Basis Data

Server PostgreSQL Anda yang baru diinstal terdiri dari serangkaian proses yang mengelola apa yang dikenal sebagai "klaster basis data". Anda dapat melihat prosesnya di sini:

alice@devbox:~$ ps axfww | grep postgres
 4737 ?        S      0:00 /usr/lib/postgresql/11/bin/postgres -D /var/lib/postgresql/11/main -c config_file=/etc/postgresql/11/main/postgresql.conf
 4749 ?        Ss     0:00  \_ postgres: 11/main: checkpointer
 4750 ?        Ss     0:00  \_ postgres: 11/main: background writer
 4751 ?        Ss     0:00  \_ postgres: 11/main: walwriter
 4752 ?        Ss     0:00  \_ postgres: 11/main: autovacuum launcher
 4753 ?        Ss     0:00  \_ postgres: 11/main: stats collector
 4754 ?        Ss     0:00  \_ postgres: 11/main: logical replication launcher  

Proses utama (di sini dengan PID 4737) adalah proses utama yang selanjutnya memunculkan proses anak – ini secara konvensional disebut proses “postmaster”.

Penggunaan PostgreSQL untuk istilah "cluster" mendahului jargon clustering terdistribusi modern yang mewah – di sini itu hanya berarti satu set database yang dikelola pada satu mesin oleh satu postmaster. Baca lebih lanjut tentang cluster di sini.

Sebuah cluster berisi database (untuk saat ini kami hanya memiliki satu, "postgres") dan pengguna PostgreSQL (sekali lagi, hanya satu untuk saat ini, juga disebut "postgres"). Asal tahu saja, cluster dikaitkan dengan sejumlah besar file data, yang semuanya berada di bawah satu direktori – dalam hal ini di bawah/var/lib/postgresql/11/main . Apakah Anda memperhatikan jalur ini di baris perintah postmaster di atas?

Saat aplikasi Anda, atau psql, terhubung ke Postgres, itu harus dilakukan dalam konteks pengguna PostgreSQL. Ada selalu pengguna PostgreSQL yang terkait dengan koneksi. Namun, seperti yang mungkin sudah Anda duga sekarang, pengguna PostgreSQL mungkin berhubungan atau tidak dengan pengguna sistem.

Pengguna Sistem dan Pengguna PostgreSQL

Pengguna PostgreSQL dapat dibuat menggunakan perintah SQL seperti CREATE ROLEatau alat yang dibundel seperti Createdb.

Ketika aplikasi apa pun mencoba untuk terhubung ke Postgres, itu perlu menyediakan nama pengguna aPostgreSQL. Mari kita lihat apa yang terjadi ketika Anda meluncurkan klien PostgreSQL seperti psql:

alice@devbox:~$ psql
psql: FATAL:  role "alice" does not exist

Di sini, "alice" adalah nama pengguna sistem Linux Anda. psql mengambil nama ini dan menggunakan itas nama pengguna Postgres. Peran (peran adalah semacam nama generik untuk "pengguna" atau "grup", BTW) dengan nama itu tidak ada, itulah yang dikeluhkan Postgres.

Kita tahu bahwa ada peran dengan nama "postgres", jadi mari kita coba. Kita dapat menggunakan parameter “-U” psql untuk menentukan nama pengguna:

alice@devbox:~$ psql -U postgres
psql: FATAL:  Peer authentication failed for user "postgres"

Oke, kita semakin dekat – peran/pengguna “postgres” ada, tetapi “peerauthentication” gagal. Apa yang dimaksud dengan “otentikasi rekan” ini?

Otentikasi Peer dan Kata Sandi

Klien PostgreSQL seperti psql atau aplikasi Anda dapat terhubung ke server PostgreSQL melalui salah satu mekanisme IPC berikut:

  • Soket domain Unix
  • Soket TCP

Tidak seperti soket TCP, soket domain Unix menawarkan kemungkinan untuk memvalidasi id pengguna sistem koneksi klien. Server Postgres dapat memeriksa koneksi masuk melalui soket domain Unix dan menentukan ID pengguna sistem klien, lalu memutuskan apakah akan memberikan akses atau tidak.

Secara default, server Anda hanya mendengarkan koneksi melalui soket domain unix dan bukan TCP/IP.

Mari kita lihat apa yang terjadi jika kita mencoba memulai psql sebagai pengguna sistem postgres:

alice@devbox:~$ sudo -u postgres psql
psql (11.0 (Ubuntu 11.0-1.pgdg18.04+2))
Type "help" for help.

postgres=#

Itu berhasil! (Gunakan “\q”, “\quit” atau ^D untuk keluar dari psql, BTW.)

Dalam otentikasi rekan, jika koneksi klien dibuat menggunakan soket domain Unix dan proses klien memiliki nama pengguna sistem yang sama dengan pengguna PostgreSQL yang coba disambungkan, maka otentikasi dianggap berhasil.

Pengguna PostgreSQL juga dapat diberi kata sandi secara opsional, dan Anda dapat meminta PostgreSQL untuk memvalidasi koneksi masuk menggunakan kata sandi. Tapi bagaimana caranya? Itulah potongan teka-teki berikutnya.

pg_hba.conf

Sekarang saatnya untuk membuka file konfigurasi pg_hba.conf (di) yang terkenal, terletak di/etc/postgresql/11/main/pg_hba.conf :

sudo vim /etc/postgresql/11/main/pg_hba.conf

HBA adalah singkatan dari otentikasi berbasis host. Pada dasarnya, file ini digunakan untuk mengontrol bagaimana pengguna PostgreSQL diautentikasi. File ini mungkin adalah bagian yang paling tidak intuitif dari kurva pembelajaran PostgreSQL. Dokumentasi referensi ada di sini, Anda harus membacanya nanti.

Baris pertama (non-komentar) di sini adalah:

local all postgres peer

yang memberi tahu Postgres untuk menerima koneksi "lokal" (domain unix) ke database "semua", mengautentikasi sebagai pengguna "postgres" menggunakan otentikasi "peer". Inilah sebabnya mengapa menghubungkan sebagai "postgres" pengguna sistem bekerja di luar kotak.

Urutan baris dalam file ini penting, baris pertama yang cocok menang. Mari kita lihat baris lain:

host all all 127.0.0.1/32 md5

Baris ini memungkinkan "semua" pengguna untuk login menggunakan TCP/IP ("host") dari host lokal ("127.0.0.1/32") ke database "semua", jika mereka berhasil dalam otentikasi kata sandi menggunakan metode "md5".

Ada lebih banyak metode otentikasi kata sandi (md5, scram-sha-256, gss,ldap, ...) daripada yang dapat kita bahas, jadi mari kita kembali ke contoh yang lebih sederhana.

Tapi pertama-tama, kita perlu memastikan PostgreSQL juga menerima koneksi TCP/IP. Untuk itu, kita perlu mengedit file konfigurasi utama.

postgresql.conf

File /etc/postgresql/11/main/postgresql.conf adalah file konfigurasi utama untuk cluster PostgreSQL Anda. File ini berisi banyak pengaturan, dan memahami apa arti semua itu bukanlah tugas yang mudah sama sekali. Untuk saat ini, mari kita lihat pengaturan pertama:

#listen_addresses = 'localhost'

Baris ini dikomentari secara default, mari batalkan komentar untuk membuatnya terbaca:

listen_addresses = 'localhost'

Ini akan membiarkan PostgreSQL mendengarkan koneksi TCP/IP yang masuk di localhost, port 5432 (default). Simpan perubahan (Anda harus menjadi "root" untuk melakukan ini), dan mulai ulang server Postgres agar perubahan diterapkan:

sudo systemctl restart postgresql

(Perhatikan bahwa untuk sebagian besar perubahan setelan, Anda hanya perlu "memuat ulang", bukan "memulai ulang", tetapi ini memerlukan "memulai ulang").

Sekarang kita dapat melihat Postgres mendengarkan pada port 5432, terikat ke 127.0.0.1:

alice@devbox:~$ sudo netstat -tnlp | grep 5432
tcp        0      0 127.0.0.1:5432          0.0.0.0:*               LISTEN      8408/postgres

Sekarang mari kita siapkan pengguna dan database baru untuk digunakan oleh aplikasi.

Penyiapan Aplikasi

Mari terhubung sebagai pengguna super “postgres” untuk membuat perubahan:

alice@devbox:~$ sudo -u postgres psql
psql (11.0 (Ubuntu 11.0-1.pgdg18.04+2))
Type "help" for help.

postgres=# create user myapp_user password 's3cr3t';
CREATE ROLE
postgres=# create database myapp owner myapp_user;
CREATE DATABASE
postgres=#

Kami sekarang telah membuat database bernama myapp dan pengguna bernama myapp_user , dengan kata sandi s3cr3t . Basis data kosong, dan akan dimiliki oleh penggunamyapp_user , yang berarti dengan menghubungkan sebagai myapp_user klien akan dapat melakukan hampir semua perintah DDL/DML.

Mari terhubung ke database aplikasi sebagai pengguna aplikasi ini sekarang:

alice@devbox:~$ psql -h 127.0.0.1 -d myapp -U myapp_user
Password for user myapp_user:
psql (11.0 (Ubuntu 11.0-1.pgdg18.04+2))
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.

myapp=>

Itu berhasil! Anda sekarang terhubung ke "myapp" (lihat prompt), menggunakan SSL melalui koneksi aTCP/IP ke 127.0.0.1. Perhatikan bahwa kami menetapkan nama database juga pada baris perintah untuk psql. Untuk alasan historis, jika ini dihilangkan, nama database juga dianggap sama dengan nama pengguna sistem (“alice”di sini), yang bukan yang kita inginkan. Nama pengguna PostgreSQL juga ditentukan ("-U myapp_user").

Jika Anda perlu terhubung dari komputer lain, Anda harus mengedit pg_hba.conf untuk menambahkan baris seperti ini:

# existing entry, allows connections from localhost
host all   all        127.0.0.1/32 md5

# new entry to allow connections from 10.1.2.0/24 subnet,
# only to myapp database for myapp_user
host myapp myapp_user 10.1.2.0/24  md5

dan muat ulang PostgreSQL (“Sudo systemctl reload postgresql”) agar perubahan dapat diterapkan.

Dengan ini, Anda sekarang dapat menggunakan string koneksi database seperti ini di aplikasi Anda:

# URL format
postgresql://myapp_user:[email protected]/myapp

# connection string format
host=127.0.0.1 user=myapp_user dbname=myapp password=s3cr3t

Siap!

Ini akan membuat Anda menyiapkan database dan pengguna khusus untuk aplikasi Anda. Kerangka kerja pengembangan aplikasi Anda (seperti Django, Drupal, dll.) harus mampu membuat objek (seperti tabel, tampilan) dan mengelola data dalam database ini.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. psql perintah tidak valid \N saat memulihkan sql

  2. Dapatkan nama tabel sumber baris saat menanyakan induk yang diwarisinya

  3. Cara mengganti basis data menggunakan PostgreSQL

  4. Bidang model unik yang tidak peka huruf besar-kecil di Django?

  5. PostgreSQL menghitung berapa kali substring muncul dalam teks