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

Bắt đầu với Postgres 13 trên Ubuntu 20.04

PostgreSQL 13, phiên bản mới nhất của phần mềm cơ sở dữ liệu Postgres, đi kèm với nhiều cải tiến ngầm. Đọc tiếp để tìm hiểu cách bạn có thể sử dụng phiên bản Postgres mới nhất trên phiên bản LTS mới nhất của Ubuntuserver.

Cài đặt

Ubuntu 20.04 đi kèm với Postgres 12 từ it’s vũ trụ kho. Kể từ khi có phiên bản 13, chúng ta có thể sử dụng trực tiếp kho lưu trữ APT chính thức của dự án PostgreSQL. Kho lưu trữ này chứa các tệp nhị phân cho Ubuntu 20.04 và cũng bao gồm các gói cho các tiện ích mở rộng khác nhau mà bạn có thể muốn cài đặt sau này.

Hãy thiết lập kho lưu trữ như thế này (lưu ý rằng “tiêu điểm” là tên mã của Ubuntu 20.04):

# add the repository
sudo tee /etc/apt/sources.list.d/pgdg.list <<END
deb http://apt.postgresql.org/pub/repos/apt/ focal-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

Bây giờ chúng ta có thể cài đặt máy chủ PostgreSQL và các công cụ dòng lệnh khác bằng cách sử dụng:

sudo apt-get install -y postgresql-13

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 ra một cụm cơ sở dữ liệu (xem bên dưới). Trong cụm này, nó tạo cơ sở dữ liệu quảng cáo, 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 . Người dùng PostgreSQL này có đặc quyền siêu người dùng.

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

Theo thuật ngữ Postgres, chúng ta hiện có một cụm cơ sở dữ liệu duy nhất đang hoạt động. Cụm cơ sở dữ liệu Asingle có thể chứa một hoặc nhiều cơ sở dữ liệu. Trong databasecluster mà chúng ta hiện có, có một cơ sở dữ liệu được gọi là “postgres”. (Cũng có một số cơ sở dữ liệu "mẫu" mà chúng ta có thể bỏ qua ngay bây giờ.)

Một cụm cơ sở dữ liệu được quản lý bởi một quy trình postgres chính được gọi là postmaster . Nó sinh ra các quy trình con khác nhau thực hiện các tác vụ hệ thống khác nhau hoặc xử lý các kết nối máy khách đến. Hãy xem các quy trình hiện đang chạy:

alice@ubu:~$ ps -o uname,pid,ppid,cmd -H -U postgres
USER         PID    PPID CMD
postgres    4880       1 /usr/lib/postgresql/13/bin/postgres -D /var/lib/postgresql/13/main -c config_file=/etc/postgresql/13/main/postgresql.conf
postgres    4882    4880   postgres: 13/main: checkpointer
postgres    4883    4880   postgres: 13/main: background writer
postgres    4884    4880   postgres: 13/main: walwriter
postgres    4885    4880   postgres: 13/main: autovacuum launcher
postgres    4886    4880   postgres: 13/main: stats collector
postgres    4887    4880   postgres: 13/main: logical replication launcher

Ở đây, quy trình quản trị viên bưu điện là 4880 và nó đã sinh ra 6 quy trình con xử lý các hoạt động dọn phòng khác nhau. Bạn cũng có thể thấy vị trí của cụm (/var/lib/postgresql/13/main ) và vị trí của cấu hình (/etc/postgresql/13/main/postgresql.conf ).

Tải lại và Khởi động lại

Vào những thời điểm khác nhau, bạn có thể cần phải tải lại hoặc khởi động lại máy chủ Postgres của bạn.Reloading khiến Postgres kiểm tra lại các tệp cấu hình của nó và áp dụng các thay đổi. Nếu không có thay đổi nào đối với các tệp cấu hình, không có gì xấu xảy ra. Việc tải xuống không làm phiền các máy khách hiện đang kết nối. Để tải lại máy chủPostgres của bạn, bạn có thể thực hiện:

sudo systemctl reload postgresql

Một số thay đổi cấu hình sẽ chỉ có hiệu lực sau khi bạn khởi động lại máy chủ. Điều này gây rối hơn và sẽ ngắt kết nối tất cả các máy khách được kết nối. Để khởi động lại, bạn có thể:

sudo systemctl restart postgresql

Tệp nhật ký

Như bạn thấy, có một dịch vụ systemd được gọi là postgresql mà bạn có thể sử dụng để kiểm soát người quản lý bưu điện. Nếu dịch vụ không khởi động, bạn có thể kiểm tra trạng thái của nó để kiểm tra thông báo lỗi:

alice@ubu:~$ sudo systemctl status postgresql
● postgresql.service - PostgreSQL RDBMS
     Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled)
     Active: active (exited) since Thu 2020-10-29 04:52:29 UTC; 25min ago
   Main PID: 4557 (code=exited, status=0/SUCCESS)
      Tasks: 0 (limit: 1075)
     Memory: 0B
     CGroup: /system.slice/postgresql.service

Oct 29 04:52:29 ubu systemd[1]: Starting PostgreSQL RDBMS...
Oct 29 04:52:29 ubu systemd[1]: Finished PostgreSQL RDBMS.

Máy chủ PostgreSQL ghi một tệp nhật ký mà bạn có thể kiểm tra các thông báo lỗi chi tiết hơn. Tệp này nằm tại /var/log/postgresql/postgresql-13-main.log :

alice@ubu:~$ cat /var/log/postgresql/postgresql-13-main.log
2020-10-29 04:52:34.096 UTC [4880] LOG:  starting PostgreSQL 13.0 (Ubuntu 13.0-1.pgdg20.04+1) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 9.3.0-10ubuntu2) 9.3.0, 64-bit
2020-10-29 04:52:34.097 UTC [4880] LOG:  listening on IPv4 address "127.0.0.1", port 5432
2020-10-29 04:52:34.099 UTC [4880] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
2020-10-29 04:52:34.106 UTC [4881] LOG:  database system was shut down at 2020-10-29 04:52:31 UTC
2020-10-29 04:52:34.112 UTC [4880] LOG:  database system is ready to accept connections

Kết nối với Máy chủ Postgres của bạn

Bây giờ chúng tôi đã thiết lập và chạy máy chủ của mình, hãy thử kết nối với nó. Theo mặc định, máy chủ chỉ lắng nghe:

  • Kết nối TCP từ 127.0.0.1 trên cổng 5432 và
  • Các ổ cắm miền Unix trong / var / run / postgresql

Do cấu hình mặc định, cách duy nhất để kết nối với quyền máy chủ bây giờ là thông qua ổ cắm Unix từ một quy trình đang chạy với tư cách người dùng hệ thống postgres . Hãy chạy ứng dụng khách tương tác tiêu chuẩn psql likethis:

alice@ubu:~$ sudo -u postgres psql postgres
psql (13.0 (Ubuntu 13.0-1.pgdg20.04+1))
Type "help" for help.

postgres=#

Ở đây chúng tôi đang chạy psql dưới dạng postgres của người dùng hệ thống (“sudo -u postgres psql”) và kết nối với cơ sở dữ liệu có tên “postgres” (“postgres” cuối cùng trên dòng lệnh.) Lời nhắc “postgres =#” cho biết tên của cơ sở dữ liệu hiện được kết nối (“postgres”) và chúng tôi có các đặc quyền của người dùng siêu cấp (“#” trái ngược với “$”).

Kết nối xảy ra thông qua các ổ cắm Unix (đây là phương thức mặc định trong psql). Vì theo mặc định, người dùng postgres không có mật khẩu và cấu hình mặc định yêu cầu xác thực mật khẩu cho các kết nối TCP, không thể chấp nhận được kết nối trên 127.0.0.1:5432 ngay bây giờ .

Cho phép Kết nối Đến từ Mạng Nội bộ

Trước tiên, hãy thay đổi cấu hình để cho phép các kết nối từ mạng nội bộ. Giả sử IP của máy chủ của chúng tôi trên mạng này là 10.1.2.3, chúng tôi có thể chỉnh sửa tệp cấu hình chính tại /etc/postgresql/13/main/postgresql.conf và thay đổi các dòng:

#listen_addresses = 'localhost'         # what IP address(es) to listen on;
                                        # comma-separated list of addresses;
                                        # defaults to 'localhost'; use '*' for all

tới:

listen_addresses = 'localhost,10.1.2.3'

Chúng tôi cũng cần yêu cầu Postgres sử dụng xác thực mật khẩu cho các kết nối đến từ các mạng này. Đối với điều này, hãy chỉnh sửa một tệp cấu hình khác có tên là /etc/postgresql/13/main/pg_hba.conf và thay đổi dòng:

host    all             all             127.0.0.1/32            md5

tới:

host    all             all             127.0.0.1/32            scram-sha-256
host    all             all             10.1.0.0/16             scram-sha-256

(Giả sử mạng nội bộ là 10.1.0.0/16.)

Chúng tôi cũng đã thay đổi md5 mặc định đến scram-sha-256 mới hơn và an toàn hơn . Tất cả các lần xuất hiện khác của md5 trong tệp cũng phải được đặt bằng scram-sha-256 . Nếu ứng dụng hoặc trình điều khiển cơ sở dữ liệu của bạn không hỗ trợ phương pháp này, hãy tiếp tục sử dụng md5 thay vào đó.

Để những thay đổi này có hiệu lực, bạn cần khởi động lại máy chủ:

sudo systemctl restart postgresql

Tạo Người dùng Thông thường và Cơ sở dữ liệu

Chúng ta sắp đến rồi!

Bây giờ chúng tôi có thể tạo một người dùng thông thường mà ứng dụng của chúng tôi có thể kết nối và cơ sở dữ liệu quảng cáo mà nó có toàn quyền kiểm soát. Kết nối với tư cách là siêu người dùng postgres cục bộ từ máy chủ để thực hiện việc này:

alice@ubu:~$ sudo -u postgres psql postgres
psql (13.0 (Ubuntu 13.0-1.pgdg20.04+1))
Type "help" for help.

postgres=# SET password_encryption = 'scram-sha-256';
SET
postgres=# CREATE USER alice PASSWORD 's3cr3tp@ss';
CREATE ROLE
postgres=#

(Bỏ qua lệnh đầu tiên nếu bạn muốn sử dụng md5 thay vào đó.) Điều này đã tạo ra một alice sử dụng với mật khẩu s3cr3tp @ ss . Cũng hãy tạo một cơ sở dữ liệu mà người dùng này sẽ sở hữu:

postgres=# CREATE DATABASE app1 OWNER alice;
CREATE DATABASE
postgres=#

Cơ sở dữ liệu được gọi là app1 . Kể từ khi alice sở hữu cơ sở dữ liệu này, tất cả các hoạt động trong cơ sở dữ liệu (như tạo bảng, chèn hàng) đều được phép nếu ứng dụng kết nối với tư cách người dùng alice .

Hãy thử kết nối với tư cách là alice , qua mạng:

~$ psql -h 10.1.2.3 -U alice app1
Password for user alice:
psql (13.0 (Ubuntu 13.0-1.pgdg20.04+1))
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
Type "help" for help.

app1=>

Ngầu! Hiện chúng tôi đã kết nối với cơ sở dữ liệu app1 với tư cách là người dùng alice .

Xóa cơ sở dữ liệu, sao lưu và khôi phục

Dưới đây là một số thủ thuật có thể hữu ích khi bạn tiếp tục làm việc với Máy chủ đăng của mình:

Xóa cơ sở dữ liệu

Bạn có thể xóa cơ sở dữ liệu bạn vừa tạo (“app1”), như sau:

alice@ubu:~$ psql -h 127.0.0.1 -U alice app1
Password for user alice:
psql (13.0 (Ubuntu 13.0-1.pgdg20.04+1))
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
Type "help" for help.

app1=> \c postgres
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
You are now connected to database "postgres" as user "alice".
postgres=> DROP DATABASE app1;
DROP DATABASE
postgres=>

Lưu ý rằng trước tiên bạn cần chuyển sang cơ sở dữ liệu khác bằng lệnh “\ c” của psql.

Để tạo một cơ sở dữ liệu khác hoặc để tạo lại app1 , kết nối với tư cách người dùng cấp cao và thực hiện “TẠO CƠ SỞ DỮ LIỆU” như trước đây.

Sao lưu cơ sở dữ liệu

Cách dễ nhất để sao lưu dữ liệu trong cơ sở dữ liệu của bạn là sử dụng pg_dump likethis:

alice@ubu:~$ pg_dump -h 127.0.0.1 -U alice -f backup.sql app1
Password:

Thao tác này tạo một tệp SQL có tên “backup.sql” chứa tất cả các lệnh SQL được yêu cầu để tạo lại lược đồ và dữ liệu trong cơ sở dữ liệu app1 , ở định dạng văn bản. Bạn có thể thực hiện các lệnh này trong bất kỳ cơ sở dữ liệu nào, lược đồ và dữ liệu sẽ được đưa vào cơ sở dữ liệu đó.

Đọc thêm về pg_dump tại đây.

Khôi phục dữ liệu

Tệp lệnh SQL bạn đã tạo ở trên có thể được khôi phục như sau:

alice@ubu:~$ psql -h 127.0.0.1 -U alice app2
Password for user alice:
psql (13.0 (Ubuntu 13.0-1.pgdg20.04+1))
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
Type "help" for help.

app2=> \i backup.sql
SET
SET
(..snip..)

Lưu ý rằng chúng tôi đã khôi phục giản đồ và dữ liệu vào một cơ sở dữ liệu khác, app2 . Lệnh “\ i” của psql cho phép bạn thực thi các lệnh SQL từ một tệp.

Các bước tiếp theo

Có rất nhiều bài viết, hướng dẫn, video và khóa học trên mạng để giúp bạn thành thạo hơn với PostgreSQL. Tuy nhiên, hãy dành một chút thời gian với tài liệu chính thức ở đây, cung cấp phạm vi bao quát có thẩm quyền và rộng rãi về tất cả các tính năng, cú pháp và tiện ích đi kèm của PostgreSQL.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. pg_dump cơ sở dữ liệu postgres từ máy chủ từ xa khi cổng 5432 bị chặn

  2. Cách khai báo biến trong PostgreSQL

  3. Làm cách nào để ngăn việc xóa hàng đầu tiên trong bảng (PostgreSQL)?

  4. Đo điểm chuẩn Giải pháp đám mây PostgreSQL được quản lý:Phần thứ hai - Amazon RDS

  5. Làm cách nào để thay đổi định dạng ngày trong Postgres?