Trong một blog gần đây về những tính năng mới trong PostgreSQL 13, chúng tôi đã xem xét một số tính năng mới của phiên bản này, nhưng bây giờ, hãy xem cách nâng cấp để có thể tận dụng tất cả các chức năng đã đề cập. .
Nâng cấp lên PostgreSQL 13
Nếu bạn muốn nâng cấp phiên bản PostgreSQL hiện tại của mình lên phiên bản mới này, bạn có ba tùy chọn gốc chính để thực hiện tác vụ này.
-
Pg_dump / pg_dumpall:Đây là một công cụ sao lưu hợp lý cho phép bạn kết xuất dữ liệu của mình và khôi phục nó trong phiên bản PostgreSQL mới. Ở đây bạn sẽ có một khoảng thời gian ngừng hoạt động sẽ thay đổi tùy theo kích thước dữ liệu của bạn. Bạn cần dừng hệ thống hoặc tránh dữ liệu mới trong nút chính, chạy pg_dump, di chuyển kết xuất đã tạo sang nút cơ sở dữ liệu mới và khôi phục nó. Trong thời gian này, bạn không thể ghi vào cơ sở dữ liệu PostgreSQL chính của mình để tránh dữ liệu không nhất quán.
-
Pg_upgrade:Đây là một công cụ PostgreSQL để nâng cấp phiên bản PostgreSQL của bạn tại chỗ. Nó có thể nguy hiểm trong môi trường sản xuất và chúng tôi không khuyến khích phương pháp này trong trường hợp đó. Sử dụng phương pháp này, bạn cũng sẽ có thời gian chết, nhưng có lẽ nó sẽ ít hơn đáng kể so với sử dụng phương pháp pg_dump trước đó.
-
Logical Replication:Kể từ PostgreSQL 10, bạn có thể sử dụng phương pháp nhân rộng này, cho phép bạn thực hiện các nâng cấp phiên bản lớn với không (hoặc gần như bằng không) thời gian chết. Bằng cách này, bạn có thể thêm một nút dự phòng trong phiên bản PostgreSQL cuối cùng và khi bản sao được cập nhật, bạn có thể thực hiện quá trình chuyển đổi dự phòng để quảng bá nút PostgreSQL mới.
Vì vậy, chúng ta hãy xem từng phương pháp này.
Sử dụng pg_dump / pg_dumpall
Trong trường hợp thời gian ngừng hoạt động không phải là vấn đề đối với bạn, phương pháp này là một cách dễ dàng để nâng cấp.
Để tạo kết xuất, bạn có thể chạy:
$ pg_dumpall > dump_pg12.out
Hoặc để tạo kết xuất của một cơ sở dữ liệu duy nhất:
$ pg_dump world > dump_world_pg12.out
Sau đó, bạn có thể sao chép kết xuất này vào máy chủ với phiên bản PostgreSQL mới và khôi phục nó:
$ psql -f dump_pg12.out postgres
Hãy nhớ rằng bạn cần phải dừng ứng dụng của mình hoặc tránh ghi vào cơ sở dữ liệu của mình trong quá trình này, nếu không, bạn sẽ có dữ liệu không nhất quán hoặc có khả năng mất dữ liệu.
Sử dụng pg_upgrade
Trước tiên, bạn cần cài đặt cả phiên bản PostgreSQL mới và cũ trên máy chủ.
$ rpm -qa |grep postgres
postgresql13-contrib-13.3-2PGDG.rhel8.x86_64
postgresql13-server-13.3-2PGDG.rhel8.x86_64
postgresql13-libs-13.3-2PGDG.rhel8.x86_64
postgresql13-13.3-2PGDG.rhel8.x86_64
postgresql12-libs-12.7-2PGDG.rhel8.x86_64
postgresql12-server-12.7-2PGDG.rhel8.x86_64
postgresql12-12.7-2PGDG.rhel8.x86_64
postgresql12-contrib-12.7-2PGDG.rhel8.x86_64
Sau đó, trước tiên, bạn có thể chạy pg_upgrade để kiểm tra nâng cấp bằng cách thêm cờ -c:
$ /usr/pgsql-13/bin/pg_upgrade -b /usr/pgsql-12/bin -B /usr/pgsql-13/bin -d /var/lib/pgsql/12/data -D /var/lib/pgsql/13/data -c
Performing Consistency Checks on Old Live Server
------------------------------------------------
Checking cluster versions ok
Checking database user is the install user ok
Checking database connection settings ok
Checking for prepared transactions ok
Checking for system-defined composite types in user tables ok
Checking for reg* data types in user tables ok
Checking for contrib/isn with bigint-passing mismatch ok
Checking for presence of required libraries ok
Checking database user is the install user ok
Checking for prepared transactions ok
Checking for new cluster tablespace directories ok
*Clusters are compatible*
Các cờ có nghĩa là:
-
- b:Thư mục thực thi PostgreSQL cũ
-
- B:Thư mục thực thi PostgreSQL mới
-
- d:Thư mục cấu hình cụm cơ sở dữ liệu cũ
-
- D:Thư mục cấu hình cụm cơ sở dữ liệu mới
-
- c:Chỉ kiểm tra các cụm. Nó không thay đổi bất kỳ dữ liệu nào
Nếu mọi thứ đều ổn, bạn có thể chạy lệnh tương tự mà không có cờ -c và nó sẽ nâng cấp máy chủ PostgreSQL của bạn. Đối với điều này, trước tiên bạn cần dừng phiên bản hiện tại của mình và chạy lệnh đã đề cập.
$ systemctl stop postgresql-12
$ /usr/pgsql-13/bin/pg_upgrade -b /usr/pgsql-12/bin -B /usr/pgsql-13/bin -d /var/lib/pgsql/12/data -D /var/lib/pgsql/13/data
...
Upgrade Complete
----------------
Optimizer statistics are not transferred by pg_upgrade so, once you start the new server, consider running:
./analyze_new_cluster.sh
Running this script will delete the old cluster's data files:
./delete_old_cluster.sh
Khi hoàn tất, như thông báo gợi ý, bạn có thể sử dụng các tập lệnh đó để phân tích máy chủ PostgreSQL mới và xóa tập lệnh cũ khi nó an toàn.
Sử dụng phép sao chép lôgic
Sao chép lôgic là một phương pháp sao chép các đối tượng dữ liệu và các thay đổi của chúng, dựa trên nhận dạng bản sao của chúng. Nó dựa trên chế độ xuất bản và đăng ký, trong đó một hoặc nhiều người đăng ký đăng ký một hoặc nhiều ấn phẩm trên một nút nhà xuất bản.
Vì vậy, dựa trên điều này, hãy định cấu hình nhà xuất bản, trong trường hợp này là máy chủ PostgreSQL 12, như sau.
Chỉnh sửa tệp cấu hình postgresql.conf:
listen_addresses = '*'
wal_level = logical
max_wal_senders = 8
max_replication_slots = 4
Chỉnh sửa tệp cấu hình pg_hba.conf:
# TYPE DATABASE USER ADDRESS METHOD
host all rep1 10.10.10.141/32 md5
Sử dụng địa chỉ IP của người đăng ký tại đó.
Bây giờ, bạn phải định cấu hình người đăng ký, trong trường hợp này là máy chủ PostgreSQL 13, như sau.
Chỉnh sửa tệp cấu hình postgresql.conf:
listen_addresses = '*'
max_replication_slots = 4
max_logical_replication_workers = 4
max_worker_processes = 8
Vì PostgreSQL 13 này sẽ sớm là nút chính mới, bạn nên cân nhắc thêm các tham số wal_level và archive_mode trong bước này, để tránh khởi động lại dịch vụ mới sau này.
wal_level = logical
archive_mode = on
Các tham số này sẽ hữu ích nếu bạn muốn thêm một bản sao mới hoặc để sử dụng các bản sao lưu PITR.
Một số thay đổi này yêu cầu khởi động lại máy chủ, vì vậy hãy khởi động lại cả nhà xuất bản và người đăng ký.
Bây giờ, trong nhà xuất bản, bạn phải tạo người dùng để người đăng ký sử dụng để truy cập. Vai trò được sử dụng cho kết nối sao chép phải có thuộc tính REPLICATION và để có thể sao chép dữ liệu ban đầu, nó cũng cần có đặc quyền SELECT trên bảng đã xuất bản:
world=# CREATE ROLE rep1 WITH LOGIN PASSWORD '********' REPLICATION;
CREATE ROLE
world=# GRANT SELECT ON ALL TABLES IN SCHEMA public to rep1;
GRANT
Hãy tạo ấn phẩm pub1 trong nút nhà xuất bản, cho tất cả các bảng:
world=# CREATE PUBLICATION pub1 FOR ALL TABLES;
CREATE PUBLICATION
Vì lược đồ không được sao chép, bạn phải tạo một bản sao lưu trong PostgreSQL 12 của mình và khôi phục nó trong PostgreSQL 13. Bản sao lưu sẽ chỉ được thực hiện cho lược đồ vì thông tin sẽ được sao chép ban đầu chuyển nhượng.
Trong PostgreSQL 12, hãy chạy:
$ pg_dumpall -s > schema.sql
Trong PostgreSQL 13, hãy chạy:
$ psql -d postgres -f schema.sql
Khi bạn có lược đồ của mình trong PostgreSQL 13, bạn cần tạo đăng ký, thay thế các giá trị của máy chủ, dbname, người dùng và mật khẩu bằng những giá trị tương ứng với môi trường của bạn.
world=# CREATE SUBSCRIPTION sub1 CONNECTION 'host=10.10.10.140 dbname=world user=rep1 password=********' PUBLICATION pub1;
NOTICE: created replication slot "sub1" on publisher
CREATE SUBSCRIPTION
Ở trên sẽ bắt đầu quá trình sao chép, quá trình này sẽ đồng bộ hóa nội dung bảng ban đầu của các bảng trong ấn phẩm và sau đó bắt đầu sao chép các thay đổi gia tăng đối với các bảng đó.
Để xác minh đăng ký đã tạo, bạn có thể sử dụng danh mục pg_stat_subscription. Dạng xem này sẽ chứa một hàng cho mỗi đăng ký đối với công nhân chính (với PID rỗng nếu công nhân không chạy) và các hàng bổ sung cho công nhân xử lý bản sao dữ liệu ban đầu của các bảng đã đăng ký.
world=# SELECT * FROM pg_stat_subscription;
-[ RECORD 1 ]---------+------------------------------
subid | 16421
subname | sub1
pid | 464
relid |
received_lsn | 0/23A8490
last_msg_send_time | 2021-07-23 22:42:26.358605+00
last_msg_receipt_time | 2021-07-23 22:42:26.358842+00
latest_end_lsn | 0/23A8490
latest_end_time | 2021-07-23 22:42:26.358605+00
Để xác minh khi quá trình chuyển ban đầu kết thúc, bạn có thể kiểm tra biến srsubstate trên danh mục pg_subscription_rel. Danh mục này chứa trạng thái cho mỗi mối quan hệ được sao chép trong mỗi đăng ký.
world=# SELECT * FROM pg_subscription_rel;
srsubid | srrelid | srsubstate | srsublsn
---------+---------+------------+-----------
16421 | 16408 | r | 0/23B1738
16421 | 16411 | r | 0/23B17A8
16421 | 16405 | r | 0/23B17E0
16421 | 16402 | r | 0/23B17E0
(4 rows)
Mô tả cột:
-
srsubid:Tham chiếu đến đăng ký.
-
srrelid:Tham chiếu đến quan hệ.
-
srsubstate:Mã trạng thái:i =khởi tạo, d =dữ liệu đang được sao chép, s =đồng bộ hóa, r =sẵn sàng (sao chép bình thường).
-
srsublsn:Kết thúc LSN cho các trạng thái s và r.
Khi quá trình chuyển ban đầu kết thúc, bạn đã có mọi thứ sẵn sàng để trỏ ứng dụng của mình tới máy chủ PostgreSQL 13 mới của bạn.
Kết luận
Như bạn thấy, PostgreSQL có các tùy chọn khác nhau để nâng cấp, tùy thuộc vào yêu cầu và khả năng chịu thời gian chết của bạn.
Cho dù bạn đang sử dụng loại công nghệ nào, việc giữ cho máy chủ cơ sở dữ liệu của bạn được cập nhật bằng cách thực hiện nâng cấp thường xuyên là một nhiệm vụ cần thiết nhưng khó khăn vì bạn cần đảm bảo rằng bạn sẽ không bị mất dữ liệu hoặc dữ liệu không nhất quán sau khi nâng cấp. Một kế hoạch chi tiết và được kiểm tra là chìa khóa ở đây và tất nhiên, nó phải bao gồm tùy chọn khôi phục, đề phòng.