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

Nâng cấp PostgreSQL 11 lên PostgreSQL 13 với TimescaleDB và PostGIS trong Linux bằng pg_upgrade

Các doanh nghiệp và doanh nghiệp sử dụng phiên bản cũ của PostgreSQL (PG) phải đối mặt với thách thức khi nâng cấp lên ít nhất phiên bản ổn định gần đây nhất từ ​​PostgreSQL 12 hoặc PostgreSQL 13. Có nhiều lý do tại sao phải nâng cấp lên phiên bản mới nhất. cần phải. Một số lý do chính cho việc này là tận dụng những cải tiến quan trọng của nó đối với các chức năng tích hợp, cập nhật bảo mật, cải tiến hiệu suất và triển khai mới có lợi cho việc quản lý cơ sở dữ liệu.

Nâng cấp PostgreSQL đi kèm với một số thách thức vì nó không dễ dàng so với các cơ sở dữ liệu chính thống khác. Nếu bạn đang gặp phải loại vấn đề này, đừng lo lắng. PostgreSQL không khóa bạn trên một phiên bản cụ thể để sử dụng. Trong blog này, chúng tôi sẽ giới thiệu cho các bạn một ví dụ về thách thức này khi cài đặt TimescaleDB và PostGIS trên máy chủ PostgreSQL 11 hiện có.

Tại sao nên chọn pg_upgrade?

pg_upgrade đã xuất hiện từ rất lâu như một công cụ để nâng cấp các phiên bản chính của PostgreSQL. Việc sử dụng công cụ này không bắt buộc đối với các nâng cấp phiên bản nhỏ, có nghĩa là không cần nâng cấp phiên bản 11.9 hiện tại của bạn lên 11.13.

Khi nâng cấp PostgreSQL của bạn lên phiên bản chính với pg_upgrade, công cụ hoạt động bằng cách cho phép dữ liệu được lưu trữ trong các tệp dữ liệu PostgreSQL được nâng cấp lên phiên bản PostgreSQL chính sau này. Điều này hoạt động mà không cần kết xuất / tải lại dữ liệu, có thể mất một chút thời gian nếu bạn có một tập dữ liệu lớn.

Bây giờ, rắc rối đến rồi. PostgreSQL, đặc biệt đối với các phiên bản chính, được biết là có các tính năng mới được bổ sung thường làm thay đổi bố cục của các bảng hệ thống, nhưng định dạng lưu trữ dữ liệu nội bộ hiếm khi thay đổi. pg_upgrade sử dụng thực tế này để thực hiện nâng cấp nhanh chóng bằng cách tạo các bảng hệ thống mới và chỉ cần sử dụng lại các tệp dữ liệu người dùng cũ. Nếu một bản phát hành lớn trong tương lai từng thay đổi định dạng lưu trữ dữ liệu theo cách làm cho định dạng dữ liệu cũ không thể đọc được, thì pg_upgrade sẽ không thể sử dụng được cho các bản nâng cấp đó. (Cộng đồng sẽ cố gắng tránh những trường hợp như vậy.)

Một số có thể coi pg_upgrade là nguy hiểm, đặc biệt là đối với môi trường sản xuất. Chà, công cụ này đã được sử dụng rộng rãi ở nhiều nơi khác, từ QA, dev, đến môi trường sản xuất. Nó có những hạn chế hoặc cảnh báo, chẳng hạn như Unicode hoặc bộ ký tự đã biết được lưu trữ trong tập dữ liệu của bạn. Trong trường hợp đó, bạn có thể cân nhắc sử dụng pg_dump / pg_restore, nhưng có thể mất một chút thời gian để hoàn thành tùy thuộc vào dung lượng dữ liệu của bạn. Đối với các phiên bản PostgreSQL mới hơn, chẳng hạn như PG 14.0, bạn chỉ có thể thực hiện kết xuất / khôi phục (hoặc xuất / nhập) hoặc sao chép logic, nếu không, hãy sử dụng pg_upgrade.

Đối với tập dữ liệu lớn hơn, việc sử dụng pg_upgrade yêu cầu bạn chạy tập dữ liệu này trên cùng một máy chủ, theo mặc định áp dụng bản sao của tất cả các tệp vật lý của bạn từ thư mục dữ liệu của bạn. Trong trường hợp đó, pg_upgrade hỗ trợ tùy chọn -k hoặc --link, có nghĩa là nó sẽ sử dụng các liên kết cứng thay vì sao chép tệp vào cụm mới.

pg_upgrade sẽ cố gắng hết sức để đảm bảo các cụm cũ và mới tương thích với hệ nhị phân, ví dụ:bằng cách kiểm tra cài đặt thời gian biên dịch tương thích, bao gồm các tệp nhị phân 32/64-bit. Điều quan trọng nữa là bất kỳ mô-đun bên ngoài nào cũng tương thích với hệ nhị phân, mặc dù điều này không thể được kiểm tra bởi pg_upgrade.

pg_upgrade hỗ trợ nâng cấp từ 8.4.X trở lên lên bản phát hành chính hiện tại của PostgreSQL, bao gồm cả bản phát hành ảnh chụp nhanh và bản beta.

Đây là tình huống…

Trong thiết lập này, tôi đã sử dụng ClusterControl để triển khai cụm cơ sở dữ liệu PostgreSQL 11 cho một nút duy nhất. Những điều sau đã được thử nghiệm trên Centos 7 và Ubuntu Focal (20.04.1):

$ /usr/pgsql-11/bin/postgres --version
postgres (PostgreSQL) 11.13

postgres=# \dx
                                           List of installed extensions

          Name          | Version |   Schema   |                            Description

------------------------+---------+------------+-------------------------------------------------------------------
 fuzzystrmatch          | 1.1     | public     | determine similarities and distance between strings
 pg_stat_statements     | 1.6     | public     | track execution statistics of all SQL statements executed
 plpgsql                | 1.0     | pg_catalog | PL/pgSQL procedural language
 postgis                | 3.1.4   | public     | PostGIS geometry and geography spatial types and functions
 postgis_raster         | 3.1.4   | public     | PostGIS raster types and functions
 postgis_sfcgal         | 3.1.4   | public     | PostGIS SFCGAL functions
 postgis_tiger_geocoder | 3.1.4   | tiger      | PostGIS tiger geocoder and reverse geocoder
 postgis_topology       | 3.1.4   | topology   | PostGIS topology spatial types and functions
 timescaledb            | 2.3.1   | public     | Enables scalable inserts and complex queries for time-series data
(9 rows)

Vì vậy, tôi có những thứ sau đây,

Phiên bản máy chủ PostgreSQL: 11,13

Phiên bản TimescaleDB: 2.3.1

Phiên bản PostGIS: 3.1.4

Nếu bạn muốn kiểm tra điều này với ClusterControl, có hai cách để có TimescaleDB. Bạn có thể triển khai cụm TimescaleDB hoặc có PostgreSQL và kích hoạt plugin TimescaleDB.

Thiết lập cho PostgreSQL 13 của bạn

Sử dụng thiết lập trình quản lý gói của bạn cho môi trường Linux với kho PostgreSQL và TimescaleDB của bạn dễ dàng hơn. Dưới đây là các bước để làm như vậy:

Thiết lập kho lưu trữ bắt buộc

Đầu tiên, hãy thêm kho lưu trữ PostgreSQL.

Dành cho CentOS / RHEL / Oracle Linux

Bạn phải đảm bảo rằng bạn có đúng kho lưu trữ. Đối với Enterprise Linux (EL) 7, bạn có thể làm như sau:

sudo yum -y install https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm

Đối với kiến ​​trúc khác, bạn có thể căn cứ vào đây https://download.postgresql.org/pub/repos/yum/reporpms/ và thay thế thư mục con EL-7-x86_64.

Hãy thêm cả kho lưu trữ TimescaleDB.

vi /etc/yum.repos.d/timescale_timescaledb.repo

Sau đó, thêm nội dung sau cho tệp này,

[timescale_timescaledb]
name=timescale_timescaledb
baseurl=https://packagecloud.io/timescale/timescaledb/el/7/\$basearch
repo_gpgcheck=1
gpgcheck=0
enabled=1
gpgkey=https://packagecloud.io/timescale/timescaledb/gpgkey
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
metadata_expire=300

Chỉ cần thay baseurl cho phù hợp nếu bạn đang sử dụng phiên bản khác với EL 7.

Dành cho Ubuntu / Debian

Thêm kho lưu trữ PG cho Ubuntu Focal:

deb http://apt.postgresql.org/pub/repos/apt/ focal-pgdg main

Đối với các bản phân phối Ubuntu / Debian khác, chỉ cần thay thế tiêu điểm cho phù hợp, bạn có thể tìm thấy tiêu điểm tại đây http://apt.postgresql.org/pub/repos/apt/dists/. Ví dụ:thay thế tiêu điểm-pgdg bằng buster-pgdg.

Bây giờ, hãy thêm kho lưu trữ cho TimescaleDB,

sudo sh -c "echo 'deb [signed-by=/usr/share/keyrings/timescale.keyring] https://packagecloud.io/timescale/timescaledb/ubuntu/ $(lsb_release -c -s) main' > /etc/apt/sources.list.d/timescaledb.list"

Nhập chuỗi khóa,

wget --quiet -O - https://packagecloud.io/timescale/timescaledb/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/timescale.keyring

và cập nhật danh sách gói để nâng cấp cho các gói cần nâng cấp, cũng như các gói mới vừa đến kho.

sudo apt-get update

Bạn có thể thay thế thư mục con trong URL nếu bạn đang sử dụng Debian từ ubuntu.

Bây giờ chúng ta đã có kho lưu trữ sẵn sàng, chúng ta đã sẵn sàng.

Cài đặt PostgreSQL phiên bản 13 với TimescaleDB và PostGIS

Việc cài đặt PostgreSQL 13 có thể được thực hiện trên cùng một máy chủ. Đầu tiên, bạn phải đảm bảo những thứ như cổng cơ sở dữ liệu là duy nhất. Nói cách khác, nó phải khác với PostgreSQL 11 hiện tại được cài đặt trên cùng một máy chủ.

Dành cho CentOS / RHEL / Oracle Linux

Chạy lệnh bên dưới để cài đặt PostgreSQL 13 và các gói phụ thuộc của nó:

yum install postgresql13.x86_64 postgresql13-server.x86_64 postgresql13-contrib.x86_64 postgresql13-libs.x86_64  

Sau đó khởi tạo cụm cơ sở dữ liệu và bộ sưu tập cơ sở dữ liệu bắt buộc của nó bằng cách chạy lệnh dưới đây:

$ /usr/pgsql-13/bin/postgresql-13-setup initdb

Tại thời điểm này, sẽ có hai thư mục dữ liệu cho cả PG 11 và PG 13:

[[email protected] ~]# ls -alth /var/lib/pgsql/* -d
drwx------. 4 postgres postgres 51 Sep 22 14:19 /var/lib/pgsql/13
drwx------. 4 postgres postgres 33 Sep 21 18:53 /var/lib/pgsql/11

Bây giờ chúng ta đã sử dụng tốt PostgreSQL 13, hãy cài đặt TimescaleDB. Chúng tôi cần đảm bảo rằng plugin được cài đặt là cùng một phiên bản trên PostreSQL 11.

Hãy lưu ý rằng, để đảm bảo rằng pg_upgrade sẽ hoạt động trơn tru, các plugin của nguồn và đích phiên bản chính của bạn phải cùng một phiên bản. Điều này là do pg_upgrade sẽ tìm kiếm các thư viện được chỉ định của nó được liên kết với các plugin hoặc tiện ích mở rộng đã được tải hoặc sử dụng bởi phiên bản cơ sở dữ liệu cũ hoặc nguồn PostgreSQL của bạn. Bạn có thể xác minh điều này trong Enterprise Linux của mình bằng cách chạy showduplicates hoặc bằng cách xác minh bằng thông tin giống như bên dưới với dnf hoặc yum:

$ yum --showduplicates list timescaledb_13.x86_64 timescaledb-2-postgresql-13.x86_64 timescaledb-2-oss-postgresql-13.x86_64 timescaledb-2-loader-postgresql-13.x86_64|grep '2.3.1'
Repository pgdg-common is listed more than once in the configuration
timescaledb-2-loader-postgresql-13.x86_64  2.3.1-0.el7     timescale_timescaledb
timescaledb-2-oss-postgresql-13.x86_64     2.3.1-0.el7     timescale_timescaledb
timescaledb-2-postgresql-13.x86_64         2.3.1-0.el7     timescale_timescaledb

Hoặc xác minh bằng tùy chọn thông tin:

$ yum info timescaledb-2-loader-postgresql-13-2.3.1-0.el7.x86_64 timescaledb-2-postgresql-13-2.3.1-0.el7.x86_64

Bây giờ, chúng tôi đã sẵn sàng cài đặt gói TimescaleDB cho phiên bản PG 13.

$ yum install timescaledb-2-loader-postgresql-13-2.3.1-0.el7.x86_64 timescaledb-2-postgresql-13-2.3.1-0.el7.x86_64

Sau khi cài đặt xong, bạn có thể thử chạy công cụ timescaledb-tune để tinh chỉnh tệp cấu hình postgresql.conf của mình. Chỉ cần chạy lệnh dưới đây:

$  timescaledb-tune --pg-config=/usr/pgsql-13/bin/pg_config

Bây giờ, hãy cài đặt gói PostGIS cho cả phiên bản PG 13.

$ yum install -y postgis31_13.x86_64 

Dành cho Ubuntu / Debian

Chỉ cần chạy:

$  apt install postgresql-client-13 postgresql-13

Điều tuyệt vời với các bản phân phối Ubuntu / Debian là có các công cụ dành cho PostgreSQL rất tiện dụng để quản lý các cụm PostgreSQL của bạn, chẳng hạn như pg_lsclusters, pg_ctlcluster, v.v.

Bạn có thể xác minh các cụm có sẵn của mình đã được cài đặt.

$ pg_lsclusters
Ver Cluster Port Status Owner    Data directory              Log file
11  main    5432 online   postgres /var/lib/postgresql/11/main log/postgresql-%Y-%m-%d_%H%M%S.log
13  main    5433 online postgres /var/lib/postgresql/13/main /var/log/postgresql/postgresql-13-main.log

Trong Ubuntu / Debian, không cần thay đổi cổng vì nó sẽ được xử lý trong giai đoạn cài đặt và nó sẽ phát hiện và đặt nó duy nhất, theo đó.

Bây giờ, hãy cài đặt TimescaleDB.

$ apt install timescaledb-2-loader-postgresql-13 timescaledb-2-postgresql-13

Theo tùy chọn, bạn có thể chạy công cụ timescaledb-tune để điều chỉnh tệp cấu hình postgresql.conf của mình bằng cách chỉ cần gọi công cụ như sau:

$ timescaledb-tune

Bây giờ, chúng tôi đã sẵn sàng cài đặt gói PostGIS cho PG 13.

$ apt install postgresql-13-postgis-3-scripts postgresql-13-postgis-3

Xem lại postgresql.conf của bạn

Tốt hơn hết là bạn nên xem lại tệp cấu hình postgresql.conf của mình. Trong các phiên bản Enterprise Linux, bạn có thể định vị postgresql.conf của mình trong đường dẫn data_directory hoặc PGDATA. Trong khi đó đối với Ubuntu / Debian, bạn có thể định vị nó trong / etc / postgresql / / /postgresql.conf. Đảm bảo rằng trong postgresql.conf của bạn, các dòng sau được định cấu hình chính xác:

shared_preload_libraries = 'pg_stat_statements,timescaledb'     # pg_stat_statements is not required but if you are using ClusterControl, make sure this is appended.
port = 5532   # make sure that the port number is unique than the old version of your PostgreSQL

listen_address = *     # depends on your setup but if you need to specify the available network interfaces to its IP addresses (IPv4 or IPv6) set it accordingly.

Cách tốt nhất là so sánh phiên bản cũ và mới của tệp cấu hình PostgreSQL để đảm bảo rằng postgresql.conf của bạn giống với những gì cần thiết và được thiết lập.

Trước khi tiếp tục bước tiếp theo, chúng tôi cũng cần kiểm tra xem PostgreSQL phiên bản 13 của bạn có được tải tương ứng hay không. Đảm bảo rằng bạn đã mua hoặc cài đặt phiên bản mới nhất trong máy chủ của mình. Khởi động cơ sở dữ liệu và đảm bảo rằng nó khởi động và chạy chính xác.

Để bắt đầu trong bản phân phối EL, hãy chạy lệnh bên dưới:

$ sudo -iu postgres /usr/pgsql-13/bin/pg_ctl -D /var/lib/pgsql/13/data/ -o "-c config_file=/var/lib/pgsql/13/data/postgresql.conf" start

hoặc đối với Ubuntu / Debian, hãy chạy lệnh bên dưới:

$ sudo -iu postgres /usr/lib/postgresql/13/bin/pg_ctl -D /var/lib/postgresql/13/main/ -o "-c config_file=/etc/postgresql/13/main/postgresql.conf" start

hoặc sử dụng công cụ pg_ctlcluster để bắt đầu, khởi động lại hoặc dừng Cụm PG của bạn.

Khi đã sẵn sàng, hãy chạy pg_upgrade…

Trước khi tiếp tục, trước tiên hãy đảm bảo rằng bạn luôn có sẵn bản sao lưu từ máy chủ cũ của mình. Luôn thực hiện sao lưu hợp lý và sao lưu vật lý là phương pháp hay trước khi tiếp tục nâng cấp lớn.

Bây giờ bạn đã sẵn sàng, bạn có thể chạy pg_upgrade. Trong thực tế, ban đầu bạn phải chạy pg_upgrade với một kiểm tra để xác định sự không tương thích và các vấn đề trước khi tiếp tục quy trình chính của pg_upgrade. Trước khi chạy pg_upgrade, hãy đảm bảo rằng cả PG 11 và PG 13 đều không hoạt động trong khi thực hiện quá trình này. Điều đó chỉ có nghĩa là thời gian chết là cần thiết cho quá trình này.

Để làm điều đó, hãy chạy lệnh sau với tùy chọn --check:

$ sudo -iu postgres /usr/lib/postgresql/13/bin/pg_upgrade -o "-c config_file=/etc/postgresql/11/main/postgresql.conf" --old-datadir=/var/lib/postgresql/11/main/   -O "-c config_file=/etc/postgresql/13/main/postgresql.conf"  --new-datadir=/var/lib/postgresql/13/main/ --old-bindir=/usr/lib/postgresql/11/bin --new-bindir=/usr/lib/postgresql/13/bin --check

Thay thế giá trị --old-datadir hoặc config_file cho phù hợp nếu nó khác với thiết lập của bạn.

Điều này sẽ chạy kiểm tra tính tương thích giống như kết quả bên dưới:

Performing Consistency Checks

-----------------------------
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 tables WITH OIDS                               ok
Checking for invalid "sql_identifier" user columns          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*

Nếu tất cả các lần kiểm tra đều báo hiệu "ok", điều đó có nghĩa là kiểm tra thành công và thông báo dưới cùng cho thấy rằng các cụm tương thích, thì bạn nên thực hiện.

Cuối cùng, chạy lại lệnh mà không có tùy chọn --check:

$ sudo -iu postgres /usr/lib/postgresql/13/bin/pg_upgrade -o "-c config_file=/etc/postgresql/11/main/postgresql.conf" --old-datadir=/var/lib/postgresql/11/main/   -O "-c config_file=/etc/postgresql/13/main/postgresql.conf"  --new-datadir=/var/lib/postgresql/13/main/ --old-bindir=/usr/lib/postgresql/11/bin --new-bindir=/usr/lib/postgresql/13/bin

Performing Consistency Checks

-----------------------------
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 tables WITH OIDS                               ok
Checking for invalid "sql_identifier" user columns          ok
Creating dump of global objects                             ok
Creating dump of database schemas                           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

If pg_upgrade fails after this point, you must re-initdb the
new cluster before continuing.
Performing Upgrade

------------------
Analyzing all rows in the new cluster                       ok
Freezing all rows in the new cluster                        ok
Deleting files from new pg_xact                             ok
Copying old pg_xact to new server                           ok
Setting oldest XID for new cluster                          ok
Setting next transaction ID and epoch for new cluster       ok
Deleting files from new pg_multixact/offsets                ok
Copying old pg_multixact/offsets to new server              ok
Deleting files from new pg_multixact/members                ok
Copying old pg_multixact/members to new server              ok
Setting next multixact ID and offset for new cluster        ok
Resetting WAL archives                                      ok
Setting frozenxid and minmxid counters in new cluster       ok
Restoring global objects in the new cluster                 ok
Restoring database schemas in the new cluste                ok
Copying user relation files                                 ok
Setting next OID for new cluster                            ok
Sync data directory to disk                                 ok
Creating script to analyze new cluster                      ok
Creating script to delete old cluster                       ok
Checking for extension updates                              notice
Your installation contains extensions that should be updated
with the ALTER EXTENSION command.  The file
    update_extensions.sql
when executed by psql by the database superuser will update
these extensions.

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

Tùy thuộc vào kích thước tập dữ liệu của bạn, có thể mất một chút thời gian. Trong lệnh ví dụ trên, nó sao chép các bản ghi giao dịch, là các tệp vật lý. Tuy nhiên, nếu kích thước đĩa của bạn chật hẹp, thì bạn có thể sử dụng tùy chọn -k hoặc --link, tùy chọn này sử dụng liên kết cứng. Nếu mọi việc suôn sẻ, nó sẽ cung cấp cho bạn các thông báo như ở trên thông báo cho bạn về việc nâng cấp hoàn chỉnh và các thông báo để cập nhật các tiện ích mở rộng mà bạn có thể có. Trong thiết lập này, nó diễn ra suôn sẻ. Update_extensions.sql chỉ chứa những thứ sau:

$ cat update_extensions.sql
\connect postgres
ALTER EXTENSION "pg_stat_statements" UPDATE;

Như bạn đã nhận thấy, pg_upgrade thực hiện một loạt các hành động. Nó phân tích tất cả các hàng từ cụm nguồn, sao chép nhật ký siêu dữ liệu giao dịch và dữ liệu trạng thái đa giao dịch của nó và phần còn lại.

Khi bạn nhận ra rằng mọi thứ đều ổn, hãy chạy tập lệnh analyse_new_cluster.sh, tập lệnh này sẽ chạy

vacuumdb --all --analyze-only.
$ sudo -iu postgres PGPORT=5433 ./analyze_new_cluster.sh

Lưu ý rằng bạn nên chỉ định cổng PostgreSQL 13 của mình để chân không chạy chính xác đến đúng máy chủ mục tiêu.

Trong trường hợp này, kết quả nâng cấp với các tiện ích mở rộng TimescaleDB và PostGIS được bật sẽ diễn ra tốt đẹp. Sau khi tất cả xuất hiện theo thứ tự, hãy đảm bảo khởi động máy chủ và thực hiện một loạt các thử nghiệm và kiểm tra.

Kiểm tra quá trình nâng cấp

Luôn kiểm tra và xem xét quá trình nâng cấp. Dưới đây là một số bảng và cơ sở dữ liệu do người dùng xác định, chứa các siêu bảng và bảng PostGIS dựa vào việc sử dụng các kiểu và chức năng không gian hình học và địa lý.

$ sudo -iu postgres psql -p5433
psql (13.4 (Ubuntu 13.4-1.pgdg20.04+1))
Type "help" for help.

postgres=# \l

                              List of databases

   Name    |  Owner   | Encoding | Collate |  Ctype  |   Access privileges

-----------+----------+----------+---------+---------+-----------------------
 mydb      | postgres | UTF8     | C.UTF-8 | C.UTF-8 |
 postgres  | postgres | UTF8     | C.UTF-8 | C.UTF-8 |
 template0 | postgres | UTF8     | C.UTF-8 | C.UTF-8 | =c/postgres          +
           |          |          |         |         | postgres=CTc/postgres
 template1 | postgres | UTF8     | C.UTF-8 | C.UTF-8 | postgres=CTc/postgres+
           |          |          |         |         | =c/postgres
(4 rows)

postgres=# \c mydb
You are now connected to database "mydb" as user "postgres".

mydb=# set search_path="$user",public;
SET
mydb=# \dt+
                                  List of relations

 Schema |      Name       | Type  |  Owner   | Persistence |    Size    | Description

--------+-----------------+-------+----------+-------------+------------+-------------
 public | conditions      | table | postgres | permanent   | 8192 bytes |
 public | global_points   | table | postgres | permanent   | 16 kB      |
 public | roads           | table | postgres | permanent   | 16 kB      |
 public | sample_table    | table | postgres | permanent   | 8192 bytes |
 public | spatial_ref_sys | table | postgres | permanent   | 6968 kB    |
(5 rows)

Kiểm tra một số PostGIS và siêu bảng của tôi:

mydb=# \d roads
                        Table "public.roads"

   Column   |         Type         | Collation | Nullable | Default
------------+----------------------+-----------+----------+---------
 road_id    | integer              |           |          |
 road_name  | character varying    |           |          |
 roads_geom | geometry(LineString) |           |          |

mydb=# \d sample_table
                                     Table "public.sample_table"

 Column |           Type           | Collation | Nullable |                 Default
--------+--------------------------+-----------+----------+------------------------------------------
 id     | integer                  |           | not null | nextval('sample_table_id_seq'::regclass)
 time   | timestamp with time zone |           | not null |
 name   | character varying        |           | not null |
Indexes:
   "sample_table_pkey" PRIMARY KEY, btree (id, "time")
    "sample_table_time_idx" btree ("time" DESC)
Triggers:
    ts_insert_blocker BEFORE INSERT ON sample_table FOR EACH ROW EXECUTE FUNCTION _timescaledb_internal.insert_blocker()
Number of child tables: 371 (Use \d+ to list them.)

mydb=# \d conditions
                        Table "public.conditions"

   Column    |           Type           | Collation | Nullable | Default
-------------+--------------------------+-----------+----------+---------
 time        | timestamp with time zone |           | not null |
 location    | text                     |           | not null |
 location2   | character(10)            |           | not null |
 temperature | double precision         |           |          |
 humidity    | double precision         |           |          |
Indexes:
    "conditions_time_idx" btree ("time" DESC)
Triggers:
    ts_insert_blocker BEFORE INSERT ON conditions FOR EACH ROW EXECUTE FUNCTION _timescaledb_internal.insert_blocker()
Number of child tables: 366 (Use \d+ to list them.)

mydb=# select count(*) from sample_table;
 count
-------
  2588
(1 row)



mydb=# SELECT name FROM global_points WHERE ST_DWithin(location, 'SRID=4326;POINT(-110 29)'::geography, 1000000);
  name

--------
 Town
 Forest
(2 rows)



mydb=# SELECT n, ST_AsEWKT(ST_GeometryN(the_geom, n)) As geomewkt
mydb-# FROM (
mydb(# VALUES (ST_GeomFromEWKT('MULTIPOINT(1 2 7, 3 4 7, 5 6 7, 8 9 10)') ),
mydb(# ( ST_GeomFromEWKT('MULTICURVE(CIRCULARSTRING(2.5 2.5,4.5 2.5, 3.5 3.5), (10 11, 12 11))') )
mydb(# )As foo(the_geom)
mydb-# CROSS JOIN generate_series(1,100) n
mydb-# WHERE n <= ST_NumGeometries(the_geom);
 n |                geomewkt

---+-----------------------------------------
 1 | POINT(1 2 7)
 1 | CIRCULARSTRING(2.5 2.5,4.5 2.5,3.5 3.5)
 2 | POINT(3 4 7)
 2 | LINESTRING(10 11,12 11)
 3 | POINT(5 6 7)
 4 | POINT(8 9 10)
(6 rows)

Bây giờ mọi thứ có vẻ đã sẵn sàng để hoạt động như một cụm mới của tôi.

Khi mọi thứ diễn ra suôn sẻ, bạn có thể chạy:

$ sudo -iu postgres ./delete_old_cluster.sh

Đảm bảo rằng bạn chỉ chạy tập lệnh vì đây là một tập lệnh rất nguy hiểm, vì nó sẽ xóa tất cả các tệp trong cụm PostgreSQL cũ của bạn.

Kết luận

pg_upgrade là một công cụ tuyệt vời để quản lý và nâng cấp máy chủ cơ sở dữ liệu PostgreSQL của bạn. Nó có thể xử lý các thiết lập phức tạp như khi bật các tiện ích mở rộng TimescaleDB hoặc PostGIS. Mặc dù công cụ này đi kèm với những hạn chế của nó, nhưng không ngừng sử dụng nó, đặc biệt là cho công việc DBA của bạn và trên các máy chủ sản xuất ngoài QA và môi trường phát triển.


  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 để bạn tìm được số hàng cho tất cả các bảng của mình trong Postgres

  2. Không thể cài đặt PG gem trên máy Mac của tôi với Mavericks

  3. Tương đương với univot () trong PostgreSQL

  4. Bây giờ () không có múi giờ

  5. pgAdmin Alternatives - PostgreSQL Database Management GUI ClusterControl