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 /
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.