PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Bắt đầu với PostgreSQL 11 trên Ubuntu 18.04

PostgreSQL, mặc dù là một RDBMS hiện đại và linh hoạt, nhưng không phải là điều dễ dàng nhất để thiết lập và bắt đầu trong khi bạn đang tìm cách phát triển một ứng dụng. Hãy đọc để tìm hiểu về cách bạn có thể bắt đầu với phiên bản mới nhất củaPostgreSQL trên phiên bản LTS của Ubuntu.

Cài đặt

Ubuntu 18.04 đi kèm với PostgreSQL 10, nhưng thay vào đó chúng ta có thể sử dụng kho lưu trữ APT do nhóm PostgreSQL lưu trữ để cài đặt phiên bản mới nhất, PostgreSQL 11.

Bạn có thể thiết lập kho lưu trữ bằng các lệnh sau:

# 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

Và sau đó cài đặt phần mềm bằng cách sử dụng:

sudo apt-get install postgresql-11

Quá trình cài đặt thực hiện một số điều sau:

  • Nó cài đặt máy chủ PostgreSQL, các tiện ích và ứng dụng khách dòng lệnh có tên psql .
  • Nó tạo ra một người dùng hệ thống Linux có tên là postgres . Tất cả các tệp dữ liệu thuộc sở hữu của người dùng này và tất cả các quy trình đều chạy với tư cách người dùng này.
  • Nó tạo một cơ sở dữ liệu, còn được gọi là postgres .
  • Nó tạo ra một người dùng PostgreSQL ( không người dùng hệ thống Linux), còn được gọi là postgres .

Bạn có thể thấy điều này đang bắt đầu trở nên khó hiểu!

Cụm cơ sở dữ liệu

Máy chủ PostgreSQL mới được cài đặt của bạn bao gồm một tập hợp các quy trình quản lý những gì được gọi là “cụm cơ sở dữ liệu”. Bạn có thể xem các quy trình tại đây:

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  

Quy trình chính (ở đây với PID 4737) là quy trình chính tiếp tục sinh ra các quy trình con - quy trình này thường được gọi là quy trình “quản trị viên bưu điện”.

Việc sử dụng thuật ngữ “cluster” của PostgreSQL có trước thuật ngữ phân tán phân tán ưa thích ngày nay - ở đây nó chỉ có nghĩa là một tập hợp các cơ sở dữ liệu được quản lý trên máy asingle bởi một quản trị viên bưu điện. Đọc thêm về các cụm tại đây.

Một cụm chứa cơ sở dữ liệu (hiện tại chúng tôi chỉ có một người dùng, “postgres”) vàPostgreSQL (một lần nữa, bây giờ chỉ một cơ sở dữ liệu, còn được gọi là “postgres”) trong số những thứ khác. Bạn biết đấy, cụm được liên kết với một loạt tệp dữ liệu, tất cả đều nằm trong một thư mục duy nhất - trong trường hợp này là / var / lib / postgresql / 11 / main . Bạn có nhận thấy đường dẫn này trong dòng lệnh quản trị viên bưu điện ở trên không?

Khi ứng dụng của bạn, hoặc psql, kết nối với Postgres, nó phải làm như vậy trong ngữ cảnh của một người dùng PostgreSQL. Luôn luôn có một người dùng PostgreSQL được liên kết với aconnection. Tuy nhiên, như bạn có thể đoán bây giờ, một người dùng PostgreSQL có thể có hoặc không tương ứng với một người dùng hệ thống.

Người dùng Hệ thống và Người dùng PostgreSQL

Người dùng PostgreSQL có thể được tạo bằng các lệnh SQL như CREATE ROLE hoặc các công cụ đi kèm như createb.

Khi bất kỳ ứng dụng nào cố gắng kết nối với Postgres, nó cần cung cấp tên người dùng aPostgreSQL. Hãy xem điều gì sẽ xảy ra khi bạn khởi chạy PostgreSQLclient như psql:

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

Ở đây, “alice” là tên người dùng hệ thống Linux của bạn. psql lấy tên này và sử dụng nó làm tên người dùng Postgres. Một vai trò (vai trò là một tên chung sắp xếp cho “người dùng” hoặc “nhóm”, BTW) theo tên đó không tồn tại, đó là những gì Postgres đang phàn nàn.

Chúng tôi biết rằng có một vai trò có tên “postgres”, vì vậy hãy thử xem. Chúng tôi có thể sử dụng tham số “-U” của psql để chỉ định tên người dùng:

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

Được rồi, chúng ta đang tiến gần hơn - vai trò / người dùng “postgres” tồn tại, nhưng “xác thực cấp bậc” không thành công. "Xác thực ngang hàng" này là gì?

Xác thực ngang hàng và mật khẩu

Các ứng dụng khách PostgreSQL như psql hoặc ứng dụng của bạn có thể kết nối với máy chủ phục vụ PostgreSQL một trong các cơ chế IPC sau:

  • Các ổ cắm miền Unix
  • Các ổ cắm TCP

Không giống như các ổ cắm TCP, các ổ cắm miền Unix cung cấp khả năng xác thực id người dùng hệ thống của kết nối phòng khám. Máy chủ Postgres có thể kiểm tra kết nối đến qua ổ cắm miền Unix và xác định ID người dùng hệ thống của khách hàng và sau đó quyết định có cấp quyền truy cập hay không.

Theo mặc định, máy chủ của bạn chỉ lắng nghe các kết nối qua các ổ cắm miền unix chứ không phải TCP / IP.

Hãy xem điều gì sẽ xảy ra nếu chúng tôi cố gắng bắt đầu psql với tư cách là người dùng hệ thống postgres:

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

postgres=#

Điều đó đã hiệu quả! (Sử dụng “\ q”, “\ bỏ” hoặc ^D để thoát psql, BTW.)

Trong xác thực ngang hàng, nếu kết nối máy khách được thực hiện bằng tập hợp miền Unix và quy trình máy khách có cùng tên người dùng hệ thống với PostgreSQLuser mà nó đang cố gắng kết nối, thì xác thực được coi là không thành công.

Người dùng PostgreSQL cũng có thể được chỉ định mật khẩu theo tùy chọn và bạn có thể yêu cầuPostgreSQL xác thực các kết nối đến bằng mật khẩu. Nhưng bằng cách nào? Đó là phần tiếp theo của câu đố.

pg_hba.conf

Bây giờ là lúc mở tệp cấu hình pg_hba.conf (trong) nổi tiếng, nằm tại /etc/postgresql/11/main/pg_hba.conf :

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

HBA là viết tắt của xác thực dựa trên máy chủ. Về cơ bản, tệp này được sử dụng để kiểm soát cách xác thực người dùng PostgreSQL. Tệp này có lẽ là phần không phức tạp nhất của đường cong học tập PostgreSQL. Các tài liệu tham khảo ở đây, bạn nên đọc nó sau.

Dòng đầu tiên (không phải bình luận) ở đây là:

local all postgres peer

yêu cầu Postgres chấp nhận các kết nối “cục bộ” (miền unix) với cơ sở dữ liệu “tất cả”, xác thực với tư cách người dùng “postgres” bằng xác thực “ngang hàng”. Đây là lý do tại sao kết nối với tư cách người dùng hệ thống “postgres” hoạt động hiệu quả.

Thứ tự các dòng trong tệp này rất quan trọng, dòng phù hợp đầu tiên sẽ thắng. Hãy xem một dòng khác:

host all all 127.0.0.1/32 md5

Dòng này cho phép “tất cả” người dùng đăng nhập bằng TCP / IP (“máy chủ”) từ máy chủ cục bộ (“127.0.0.1/32”) đến cơ sở dữ liệu “tất cả”, nếu họ xác thực mật khẩu thành công bằng phương pháp “md5”.

Có nhiều phương pháp xác thực mật khẩu (md5, scram-sha-256, gss, ldap,…) hơn chúng ta có thể đề cập, vì vậy hãy quay lại với các ví dụ đơn giản hơn.

Nhưng trước tiên, chúng ta cần đảm bảo rằng PostgreSQL cũng đang chấp nhận các kết nối TCP / IP. Vì vậy, chúng ta cần chỉnh sửa tệp cấu hình chính.

postgresql.conf

Tệp /etc/postgresql/11/main/postgresql.conf là cấu hình chính cho cụm PostgreSQL của bạn. Tệp này chứa một cài đặt và hiểu tất cả những điều đó có nghĩa là gì không phải là nhiệm vụ dễ dàng. Bây giờ, hãy cùng tìm hiểu cài đặt đầu tiên:

#listen_addresses = 'localhost'

Dòng này được nhận xét theo mặc định, hãy bỏ ghi chú để dòng này đọc:

listen_addresses = 'localhost'

Điều này sẽ cho phép PostgreSQL lắng nghe các kết nối TCP / IP đến trên máy chủ cục bộ, cổng 5432 (mặc định). Lưu các thay đổi (bạn phải là "root" để thực hiện việc này) và khởi động lại máy chủ Postgres để các thay đổi có hiệu lực:

sudo systemctl restart postgresql

(Lưu ý rằng đối với hầu hết các thay đổi cài đặt, bạn chỉ phải "tải lại", không phải "khởi động lại", nhưng điều này yêu cầu "khởi động lại").

Bây giờ chúng ta có thể thấy Postgres đang nghe trên cổng 5432, được liên kết với 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

Bây giờ, hãy thiết lập một người dùng và cơ sở dữ liệu mới để ứng dụng sử dụng.

Thiết lập ứng dụng

Hãy kết nối với tư cách là “postgres” siêu người dùng để thực hiện các thay đổi:

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=#

Bây giờ chúng tôi đã tạo một cơ sở dữ liệu có tên là myapp và một người dùng được gọi là myapp_user , với mật khẩu s3cr3t . Cơ sở dữ liệu trống và sẽ thuộc sở hữu của người dùng myapp_user , có nghĩa là bằng cách kết nối với tên myapp_user máy khách sẽ có thể thực hiện hầu hết tất cả các lệnh DDL / DML.

Hãy kết nối với cơ sở dữ liệu ứng dụng với tư cách là người dùng ứng dụng này ngay bây giờ:

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=>

Nó đã làm việc! Bạn hiện đã kết nối với “myapp” (xem lời nhắc), sử dụng SSL qua kết nối aTCP / IP tới 127.0.0.1. Lưu ý rằng chúng tôi cũng đã chỉ định tên cơ sở dữ liệu trên dòng lệnh cho psql. Vì lý do lịch sử, nếu điều này được bỏ qua, tên cơ sở dữ liệu cũng được giả định giống với tên người dùng hệ thống (ở đây là “alice”), điều này không phải là những gì chúng tôi muốn. Tên người dùng PostgreSQL cũng được chỉ định (“- U myapp_user”).

Nếu bạn cần kết nối từ các máy khác, bạn sẽ cần chỉnh sửa pg_hba.conf để thêm các dòng như vậy:

# 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

và tải lại PostgreSQL (“sudo systemctl tải lại postgresql”) để thay đổi hiệu quả.

Với điều này tại chỗ, bây giờ bạn có thể sử dụng các chuỗi kết nối cơ sở dữ liệu như các ứng dụng bên trong của bạn:

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

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

Sẵn sàng!

Điều này sẽ giúp bạn thiết lập cơ sở dữ liệu và người dùng chuyên dụng cho ứng dụng của bạn. Khung phát triển ứng dụng của bạn (như Django, Drupal, v.v.) phải có khả năng tạo các đối tượng (như bảng, dạng xem) và quản lý dữ liệu trong cơ sở dữ liệu này.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hợp nhất bảng và nhật ký thay đổi thành một dạng xem trong PostgreSQL

  2. Cách hoạt động của hàm Ln () trong PostgreSQL

  3. Rownum trong postgresql

  4. PgBouncer giúp tăng tốc Django như thế nào

  5. Có thể thực hiện các truy vấn cơ sở dữ liệu chéo với PostgreSQL không?