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

Các tiện ích mở rộng PostgreSQL yêu thích của tôi - Phần một

Đây là phần tiếp theo của mục blog trước đây của tôi, trong đó tôi đã đề cập đến một chủ đề về Phần mở rộng PostgreSQL. Phần mở rộng PostgreSQL là một tập hợp các tính năng bổ sung plug and play bổ sung thêm một bộ tính năng bổ sung cho một cụm PostgreSQL. Một số tính năng này đơn giản như đọc hoặc ghi vào cơ sở dữ liệu bên ngoài trong khi những tính năng khác có thể là một giải pháp phức tạp để thực hiện sao chép, giám sát cơ sở dữ liệu, v.v.

PostgreSQL đã phát triển trong nhiều năm từ một ORDBMS mã nguồn mở đơn giản thành một hệ thống cơ sở dữ liệu mạnh mẽ với hơn 30 năm phát triển tích cực cung cấp độ tin cậy, hiệu suất và tất cả các tính năng tuân thủ ACID. Với PostgreSQL 12 được phát hành vài tháng trước, phần mềm cơ sở dữ liệu này ngày càng lớn hơn, tốt hơn và nhanh hơn.

Đôi khi, các tiện ích mở rộng cần được thêm vào cụm PostgreSQL để đạt được chức năng nâng cao không có sẵn trong mã gốc, vì chúng không được phát triển do hạn chế về thời gian hoặc do không đủ bằng chứng về cơ sở dữ liệu trường hợp cạnh các vấn đề. Tôi sẽ thảo luận về một số tiện ích mở rộng yêu thích của tôi không theo thứ tự cụ thể, với một số bản trình diễn được các nhà phát triển và DBA sử dụng.

Một số tiện ích mở rộng này có thể yêu cầu được đưa vào tham số máy chủ shared_preload_libraries dưới dạng danh sách được phân tách bằng dấu phẩy để tải trước khi khởi động máy chủ. Mặc dù hầu hết các tiện ích mở rộng được bao gồm trong mô-đun đóng góp của mã nguồn, một số tiện ích mở rộng phải được tải xuống từ một trang web bên ngoài chỉ dành riêng cho các tiện ích mở rộng PostgreSQL được gọi là Mạng mở rộng PostgreSQL.

Trong loạt bài blog hai phần này, chúng ta sẽ thảo luận về các tiện ích mở rộng được sử dụng để truy cập dữ liệu (postgres_fwd) và thu nhỏ hoặc lưu trữ cơ sở dữ liệu (pg_partman). Các phần mở rộng bổ sung sẽ được thảo luận trong phần thứ hai.

postgres_fdw

Postgres_fdw là một phần mở rộng trình bao bọc dữ liệu nước ngoài có thể được sử dụng để truy cập dữ liệu được lưu trữ trong các máy chủ PostgreSQL bên ngoài. Tiện ích mở rộng này tương tự như một tiện ích mở rộng cũ hơn được gọi là dblink nhưng nó khác với người tiền nhiệm của nó bằng cách cung cấp cú pháp tuân thủ tiêu chuẩn và hiệu suất tốt hơn.

Các thành phần quan trọng của postgres_fdw là máy chủ, ánh xạ người dùng và bảng ngoại. Có một chi phí nhỏ được thêm vào chi phí thực tế của việc thực hiện các truy vấn đối với các máy chủ từ xa là chi phí truyền thông. Phần mở rộng postgres_fdw cũng có khả năng giao tiếp với máy chủ từ xa có phiên bản lên tới PostgreSQL 8.3, do đó tương thích ngược với các phiên bản trước đó.

Bản trình diễn

Bản trình diễn sẽ thể hiện kết nối từ PostgreSQL 12 đến cơ sở dữ liệu PostgreSQL 11. Cài đặt pg_hba.conf đã được định cấu hình để các máy chủ giao tiếp với nhau. Các tệp điều khiển tiện ích mở rộng phải được tải vào thư mục chính được chia sẻ PostgreSQL trước khi tạo tiện ích mở rộng từ Bên trong một cụm PostgreSQL.

Máy chủ Từ xa:

$ /usr/local/pgsql-11.3/bin/psql -p 5432 -d db_replica postgres

psql (11.3)

Type "help" for help.



db_replica=# create table t1 (sno integer, emp_id text);

CREATE TABLE



db_replica=# \dt t1

        List of relations

 Schema | Name | Type  |  Owner

--------+------+-------+----------

 public | t1   | table | postgres



db_replica=# insert into t1 values (1, 'emp_one');

INSERT 0 1

db_replica=# select * from t1;

 sno | emp_id

-----+---------

   1 | emp_one

(1 row)

Máy chủ Nguồn:

$ /database/pgsql-12.0/bin/psql -p 5732 postgres

psql (12.0)

Type "help" for help.

postgres=# CREATE EXTENSION postgres_fdw;

CREATE EXTENSION



postgres=# CREATE SERVER remote_server

postgres-# FOREIGN DATA WRAPPER postgres_fdw

postgres-# OPTIONS (host '192.168.1.107', port '5432', dbname 'db_replica');

CREATE SERVER



postgres=# CREATE USER MAPPING FOR postgres

postgres-# SERVER remote_server

postgres-# OPTIONS (user 'postgres', password 'admin123');

CREATE USER MAPPING



postgres=# CREATE FOREIGN TABLE remote_t1

postgres-# (sno integer, emp_id text)

postgres-# server remote_server

postgres-# options (schema_name 'public', table_name 't1');

CREATE FOREIGN TABLE



postgres=# select * from remote_t1;

 sno | emp_id

-----+---------

   1 | emp_one

(1 row)



postgres=# insert into remote_t1 values (2,'emp_two');

INSERT 0 1



postgres=# select * from remote_t1;

 sno | emp_id

-----+---------

   1 | emp_one

   2 | emp_two

(2 rows)

Thao tác WRITE từ máy chủ nguồn phản ánh bảng máy chủ từ xa ngay lập tức. Một phần mở rộng tương tự được gọi là oracle_fdw cũng tồn tại cho phép truy cập ĐỌC và VIẾT giữa các bảng PostgreSQL và Oracle. Ngoài ra, có một phần mở rộng khác được gọi là file_fdw cho phép truy cập dữ liệu từ các tệp phẳng trên đĩa. Vui lòng tham khảo tài liệu chính thức của postgres_fdw được xuất bản tại đây, để biết thêm thông tin và chi tiết.

pg_partman

Khi cơ sở dữ liệu và bảng phát triển, luôn có nhu cầu thu nhỏ cơ sở dữ liệu, lưu trữ dữ liệu không cần thiết hoặc ít nhất là phân vùng bảng thành nhiều phần nhỏ hơn khác nhau. Vì vậy, trình tối ưu hóa truy vấn chỉ truy cập các phần của bảng thỏa mãn các điều kiện truy vấn, thay vì quét toàn bộ đống bảng.

PostgreSQL đã cung cấp các tính năng phân vùng trong một thời gian dài bao gồm kỹ thuật Range, List, Hash và Sub-Partitioning. Tuy nhiên, nó đòi hỏi rất nhiều nỗ lực quản trị và quản lý chẳng hạn như xác định bảng con kế thừa các thuộc tính của bảng mẹ để trở thành phân vùng của nó, tạo các hàm kích hoạt để chuyển hướng dữ liệu vào một phân vùng và tiếp tục tạo các trình kích hoạt để gọi các hàm đó, v.v. Đây là khi pg_partman phát huy tác dụng, trong đó tất cả những vấn đề phức tạp này sẽ được giải quyết tự động.

Bản trình diễn

Tôi sẽ hiển thị bản trình diễn nhanh về cách thiết lập mọi thứ và chèn dữ liệu mẫu. Bạn sẽ thấy cách dữ liệu được chèn vào bảng chính được tự động chuyển hướng đến các phân vùng chỉ bằng cách thiết lập pg_partman. Điều quan trọng là cột khóa phân vùng không được rỗng.

db_replica=# show shared_preload_libraries;

 shared_preload_libraries

--------------------------

 pg_partman_bgw

(1 row)



db_replica=# CREATE SCHEMA partman;

CREATE SCHEMA

db_replica=# CREATE EXTENSION pg_partman SCHEMA partman;

CREATE EXTENSION

db_replica=# CREATE ROLE partman WITH LOGIN;

CREATE ROLE

db_replica=# GRANT ALL ON SCHEMA partman TO partman;

GRANT

db_replica=# GRANT ALL ON ALL TABLES IN SCHEMA partman TO partman;

GRANT

db_replica=# GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA partman TO partman;

GRANT

db_replica=# GRANT EXECUTE ON ALL PROCEDURES IN SCHEMA partman TO partman;

GRANT

db_replica=# GRANT ALL ON SCHEMA PUBLIC TO partman;

GRANT

db_replica=# create table t1  (sno integer, emp_id varchar, date_of_join date not null);

db_replica=# \d

        List of relations

 Schema | Name | Type  |  Owner

--------+------+-------+----------

 public | t1   | table | postgres

(1 row)



db_replica=# \d t1

                         Table "public.t1"

    Column    |       Type        | Collation | Nullable | Default

--------------+-------------------+-----------+----------+---------

 sno          | integer           |           |          |

 emp_id       | character varying |           |          |

 date_of_join | date              |           | not null |

db_replica=# SELECT partman.create_parent('public.t1', 'date_of_join', 'partman', 'yearly');

 create_parent

---------------

 t

(1 row)



db_replica=# \d+ t1

                                             Table "public.t1"

    Column    |       Type        | Collation | Nullable | Default | Storage  | Stats target | Description

--------------+-------------------+-----------+----------+---------+----------+--------------+-------------

 sno          | integer           |           |          |         | plain    |              |

 emp_id       | character varying |           |          |         | extended |              |

 date_of_join | date              |           | not null |         | plain    |              |

Triggers:

    t1_part_trig BEFORE INSERT ON t1 FOR EACH ROW EXECUTE PROCEDURE t1_part_trig_func()

Child tables: t1_p2015,

              t1_p2016,

              t1_p2017,

              t1_p2018,

              t1_p2019,

              t1_p2020,

              t1_p2021,

              t1_p2022,

              t1_p2023



db_replica=# select * from t1;

 sno | emp_id | date_of_join

-----+--------+--------------

(0 rows)



db_replica=# select * from t1_p2019;

 sno | emp_id | date_of_join

-----+--------+--------------

(0 rows)



db_replica=# select * from t1_p2020;

 sno | emp_id | date_of_join

-----+--------+--------------

(0 rows)



db_replica=# insert into t1 values (1,'emp_one','01-06-2019');

INSERT 0 0

db_replica=# insert into t1 values (2,'emp_two','01-06-2020');

INSERT 0 0

db_replica=# select * from t1;

 sno | emp_id  | date_of_join

-----+---------+--------------

   1 | emp_one | 2019-01-06

   2 | emp_two | 2020-01-06

(2 rows)



db_replica=# select * from t1_p2019;

 sno | emp_id  | date_of_join

-----+---------+--------------

   1 | emp_one | 2019-01-06

(1 row)



db_replica=# select * from t1_p2020;

 sno | emp_id  | date_of_join

-----+---------+--------------

   2 | emp_two | 2020-01-06

(1 row)

Đây là một kỹ thuật phân vùng đơn giản nhưng mỗi phân vùng đơn giản ở trên có thể được chia thành các phân vùng con. Vui lòng kiểm tra tài liệu chính thức của pg_partman được xuất bản tại đây để biết thêm các tính năng và chức năng mà nó cung cấp.

Kết luận

Phần hai của blog này sẽ thảo luận về các phần mở rộng PostgreSQL khác như pgAudit, pg_repack và HypoPG.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để định dạng trường bigint thành ngày tháng trong Postgresql?

  2. Cách hiểu một PHÂN TÍCH GIẢI THÍCH

  3. Pandas cập nhật sql

  4. Làm cách nào để chuyển mật khẩu vào pg_dump?

  5. Tự động chuyển đổi dự phòng cơ sở dữ liệu Moodle PostgreSQL