Bisnis dan perusahaan yang menggunakan PostgreSQL (PG) versi lama menghadapi tantangan saat memutakhirkan ke setidaknya versi stabil terbaru dari PostgreSQL 12 atau PostgreSQL 13. Ada banyak alasan mengapa memutakhirkan ke versi terbaru adalah harus. Beberapa alasan utamanya adalah untuk memanfaatkan peningkatan kritisnya pada fungsionalitas bawaannya, pembaruan keamanan, peningkatan kinerja, dan implementasi baru yang bermanfaat bagi manajemen basis data.
Upgrade PostgreSQL datang dengan beberapa tantangan karena tidak mudah dibandingkan dengan database mainstream lainnya. Jika Anda menghadapi masalah seperti ini, jangan khawatir. PostgreSQL tidak mengunci Anda pada versi tertentu untuk digunakan. Di blog ini, kita akan membahas contoh tantangan ini sambil menginstal TimescaleDB dan PostGIS pada host PostgreSQL 11 yang ada.
Mengapa pg_upgrade?
pg_upgrade telah ada sejak lama sebagai alat untuk meningkatkan versi utama PostgreSQL. Penggunaan alat ini tidak diperlukan untuk peningkatan versi minor, yang berarti bahwa peningkatan versi Anda saat ini dari 11.9 ke 11.13 tidak diperlukan.
Saat memutakhirkan PostgreSQL Anda ke versi utama dengan pg_upgrade, alat ini bekerja dengan mengizinkan data yang disimpan dalam file data PostgreSQL untuk ditingkatkan ke versi utama PostgreSQL yang lebih baru. Ini berfungsi tanpa perlu membuang/memuat ulang data, yang dapat memakan waktu lama jika Anda memiliki kumpulan data yang besar.
Sekarang, inilah keributannya. PostgreSQL, terutama untuk rilis versi utama, diketahui memiliki fitur baru yang ditambahkan yang sering mengubah tata letak tabel sistem, namun format penyimpanan data internal jarang berubah. pg_upgrade menggunakan fakta ini untuk melakukan upgrade cepat dengan membuat tabel sistem baru dan hanya menggunakan kembali file data pengguna lama. Jika rilis besar mendatang mengubah format penyimpanan data dengan cara yang membuat format data lama tidak dapat dibaca, pg_upgrade tidak akan dapat digunakan untuk peningkatan tersebut. (Komunitas akan berusaha menghindari situasi seperti itu.)
Beberapa orang mungkin menganggap pg_upgrade berbahaya, terutama untuk lingkungan produksi. Nah, alat ini telah banyak digunakan di tempat lain mulai dari QA, hingga dev, hingga lingkungan produksi. Itu memang memiliki batasan atau peringatan, seperti Unicode yang dikenal atau set karakter yang disimpan dalam dataset Anda. Dalam hal ini, Anda mungkin mempertimbangkan untuk menggunakan pg_dump/pg_restore, tetapi mungkin perlu beberapa saat untuk menyelesaikannya tergantung pada seberapa besar data Anda. Untuk versi PostgreSQL yang lebih baru, seperti PG 14.0, Anda hanya dapat mengambil dump/restore (atau ekspor/impor) atau replikasi logis, jika tidak gunakan pg_upgrade.
Untuk kumpulan data yang lebih besar, menggunakan pg_upgrade mengharuskan Anda menjalankan ini di host yang sama, yang secara default menerapkan salinan semua file fisik dari direktori data Anda. Dalam hal ini, pg_upgrade mendukung opsi -k atau --link, yang berarti ia akan menggunakan tautan keras alih-alih menyalin file ke cluster baru.
pg_upgrade melakukan yang terbaik untuk memastikan cluster lama dan baru kompatibel dengan biner, mis., dengan memeriksa pengaturan waktu kompilasi yang kompatibel, termasuk biner 32/64-bit. Penting juga bahwa setiap modul eksternal kompatibel dengan biner, meskipun ini tidak dapat diperiksa oleh pg_upgrade.
pg_upgrade mendukung peningkatan dari 8.4.X dan yang lebih baru ke rilis utama PostgreSQL saat ini, termasuk rilis snapshot dan beta.
Begini situasinya…
Dalam pengaturan ini, saya menggunakan ClusterControl untuk menerapkan cluster database PostgreSQL 11 untuk satu node. Berikut ini telah diuji pada Centos 7 dan 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)
Jadi saya mendapatkan yang berikut ini,
Versi server PostgreSQL: 11.13
Versi TimescaleDB: 2.3.1
Versi PostGIS: 3.1.4
Jika Anda ingin mengujinya dengan ClusterControl, ada dua cara untuk memiliki TimescaleDB. Anda dapat menerapkan kluster TimescaleDB atau memiliki PostgreSQL dan mengaktifkan plugin TimescaleDB.
Menyiapkan PostgreSQL 13
Menggunakan pengaturan manajer paket Anda untuk lingkungan Linux dengan repositori PostgreSQL dan TimescaleDB Anda lebih mudah. Berikut langkah-langkah untuk melakukannya:
Siapkan repositori yang diperlukan
Pertama, mari tambahkan repositori PostgreSQL.
Untuk CentOS/RHEL/Oracle Linux
Anda harus memastikan bahwa Anda memiliki repositori yang benar. Untuk Enterprise Linux (EL) 7, Anda dapat melakukan hal berikut:
sudo yum -y install https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
Untuk arsitektur lain, Anda dapat mendasarkan di sini https://download.postgresql.org/pub/repos/yum/reporpms/ dan mengganti subdirektori EL-7-x86_64.
Mari kita tambahkan juga repositori TimescaleDB.
vi /etc/yum.repos.d/timescale_timescaledb.repo
Kemudian tambahkan konten berikut untuk file ini,
[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
Cukup ganti baseurl yang sesuai jika Anda menggunakan versi selain EL 7.
Untuk Ubuntu/Debian
Tambahkan repositori PG untuk Ubuntu Focal:
deb http://apt.postgresql.org/pub/repos/apt/ focal-pgdg main
Untuk distribusi Ubuntu/Debian lainnya, cukup ganti fokus yang sesuai, yang dapat Anda temukan di sini http://apt.postgresql.org/pub/repos/apt/dists/. Misalnya, ganti focal-pgdg dengan buster-pgdg.
Sekarang, mari tambahkan repositori untuk 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"
Impor gantungan kunci,
wget --quiet -O - https://packagecloud.io/timescale/timescaledb/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/timescale.keyring
dan perbarui daftar paket untuk peningkatan versi untuk paket yang perlu ditingkatkan, serta paket baru yang baru saja masuk ke repositori.
sudo apt-get update
Anda dapat mengganti sub-direktori di URL jika Anda menggunakan Debian dari ubuntu.
Sekarang setelah repositori siap, kita siap untuk pergi.
Instal PostgreSQL versi 13 dengan TimescaleDB dan PostGIS
Menginstal PostgreSQL 13 dapat dilakukan pada host yang sama. Pertama, Anda harus memastikan hal-hal seperti port database unik. Dengan kata lain, itu harus berbeda dari PostgreSQL 11 saat ini yang diinstal pada host yang sama.
Untuk CentOS/RHEL/Oracle Linux
Jalankan perintah di bawah ini untuk menginstal PostgreSQL 13 dan paket-paket dependennya:
yum install postgresql13.x86_64 postgresql13-server.x86_64 postgresql13-contrib.x86_64 postgresql13-libs.x86_64
Kemudian inisialisasi cluster database dan kumpulan database yang diperlukan dengan menjalankan perintah di bawah ini:
$ /usr/pgsql-13/bin/postgresql-13-setup initdb
Pada titik ini, seharusnya ada dua direktori data untuk PG 11 dan 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
Sekarang setelah kita menguasai PostgreSQL 13, mari instal TimescaleDB. Kita perlu memastikan bahwa plugin yang akan diinstal adalah versi yang sama di PostreSQL 11.
Perhatikan bahwa, untuk memastikan bahwa pg_upgrade akan bekerja dengan lancar, plugin sumber dan tujuan versi utama Anda harus versi yang sama. Ini karena pg_upgrade akan mencari pustaka yang ditunjuk yang ditautkan ke plugin atau ekstensi yang telah dimuat atau digunakan oleh versi database lama atau sumber dari PostgreSQL Anda. Anda dapat memverifikasi ini di Enterprise Linux Anda dengan menjalankan showduplicates atau dengan memverifikasi dengan info seperti di bawah ini baik dengan dnf atau 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
Atau verifikasi dengan opsi info:
$ 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
Sekarang, kita siap untuk menginstal paket TimescaleDB untuk versi 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
Setelah Anda menginstalnya, Anda dapat mencoba menjalankan alat timescaledb-tune untuk menyetel file konfigurasi postgresql.conf Anda. Jalankan saja perintah di bawah ini:
$ timescaledb-tune --pg-config=/usr/pgsql-13/bin/pg_config
Sekarang, mari instal paket PostGIS untuk versi PG 13 juga.
$ yum install -y postgis31_13.x86_64
Untuk Ubuntu/Debian
Cukup jalankan:
$ apt install postgresql-client-13 postgresql-13
Hal hebat dari distribusi Ubuntu/Debian adalah adanya alat untuk PostgreSQL yang sangat berguna untuk mengelola cluster PostgreSQL Anda, seperti pg_lscluster, pg_ctlcluster, dll.
Anda dapat memverifikasi bahwa cluster yang tersedia telah diinstal.
$ 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
Di Ubuntu/Debian, tidak perlu mengubah port karena port akan ditangani selama fase penginstalan dan port akan mendeteksi dan menyetelnya secara unik.
Sekarang, mari kita instal TimescaleDB.
$ apt install timescaledb-2-loader-postgresql-13 timescaledb-2-postgresql-13
Secara opsional, Anda dapat menjalankan alat timescaledb-tune untuk menyetel file konfigurasi postgresql.conf hanya dengan menjalankan alat sebagai berikut:
$ timescaledb-tune
Sekarang, kita siap untuk menginstal paket PostGIS untuk PG 13.
$ apt install postgresql-13-postgis-3-scripts postgresql-13-postgis-3
Tinjau postgresql.conf Anda
Selalu lebih baik untuk meninjau file konfigurasi postgresql.conf Anda. Dalam versi Enterprise Linux, Anda dapat menemukan postgresql.conf baik di jalur data_directory atau PGDATA Anda. Sedangkan untuk Ubuntu/Debian, Anda dapat menemukannya di /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.
Praktik terbaik adalah membandingkan versi lama dan baru dari file konfigurasi PostgreSQL Anda untuk memastikan bahwa postgresql.conf Anda identik dengan apa yang dibutuhkan dan disetel.
Sebelum melanjutkan ke langkah berikutnya, kami juga perlu memeriksa apakah PostgreSQL versi 13 Anda dimuat dengan benar. Pastikan Anda memiliki versi terbaru yang diperoleh atau diinstal di host Anda. Mulai database dan pastikan database tersebut mulai dan berjalan dengan benar.
Untuk memulai distribusi EL, jalankan perintah di bawah ini:
$ 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
atau untuk Ubuntu/Debian, jalankan perintah di bawah ini:
$ 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
atau gunakan alat pg_ctlcluster untuk memulai, memulai ulang, atau menghentikan PG Cluster Anda.
Jika sudah siap, jalankan pg_upgrade…
Sebelum melanjutkan, pertama-tama pastikan bahwa Anda selalu memiliki cadangan dari server lama Anda siap dan tersedia. Selalu lakukan pencadangan logis dan pencadangan fisik sebagai praktik yang baik sebelum melanjutkan dengan peningkatan besar-besaran.
Sekarang setelah Anda siap, Anda dapat menjalankan pg_upgrade. Dalam praktiknya, Anda harus terlebih dahulu menjalankan pg_upgrade dengan tanda centang untuk menentukan ketidakcocokan dan masalah sebelum melanjutkan ke prosedur utama pg_upgrade. Sebelum menjalankan pg_upgrade, pastikan PG 11 dan PG 13 dalam keadaan down saat melakukan proses ini. Itu berarti waktu henti diperlukan untuk proses ini.
Untuk melakukannya, jalankan perintah berikut dengan opsi --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
Ganti nilai --old-datadir atau config_file yang sesuai jika berbeda dari pengaturan Anda.
Ini akan menjalankan pemeriksaan kompatibilitas seperti hasil di bawah ini:
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*
Jika semua memeriksa sinyal "ok", itu berarti pemeriksaan berhasil, dan pesan di bawah menunjukkan bahwa cluster kompatibel, maka Anda harus melakukannya.
Terakhir, jalankan perintah lagi tanpa opsi --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
Bergantung pada ukuran kumpulan data Anda, mungkin perlu sedikit waktu. Pada contoh perintah di atas, ia menyalin log transaksi, yang merupakan file fisik. Namun, jika ukuran disk Anda sempit, Anda dapat menggunakan opsi -k atau --link, yang menggunakan hard link. Jika semuanya berjalan dengan baik, itu akan memberi Anda pesan seperti di atas yang memberi tahu Anda tentang peningkatan lengkap dan pemberitahuan untuk memperbarui ekstensi yang mungkin Anda miliki. Dalam pengaturan ini, itu berjalan lancar. Update_extensions.sql hanya berisi berikut ini:
$ cat update_extensions.sql
\connect postgres
ALTER EXTENSION "pg_stat_statements" UPDATE;
Seperti yang Anda perhatikan, pg_upgrade melakukan serangkaian tindakan. Ini menganalisis semua baris dari cluster sumber, menyalin log metadata transaksi dan data status multi-transaksinya dan sisanya.
Setelah Anda mengetahui bahwa semuanya terlihat baik, jalankan skrip analyze_new_cluster.sh, yang akan menjalankan
vacuumdb --all --analyze-only.
$ sudo -iu postgres PGPORT=5433 ./analyze_new_cluster.sh
Perhatikan bahwa Anda harus menentukan port PostgreSQL 13 Anda sehingga vacuumdb akan berjalan dengan benar ke server target yang tepat.
Dalam kasus ini, hasil pemutakhiran dengan ekstensi TimescaleDB dan PostGIS diaktifkan berjalan dengan baik. Setelah semua muncul secara berurutan, pastikan untuk memulai server dan melakukan serangkaian tes dan pemeriksaan.
Uji proses peningkatan versi
Selalu uji dan tinjau proses peningkatan versi. Berikut adalah beberapa tabel dan database yang ditentukan pengguna, yang berisi hypertable dan tabel PostGIS yang mengandalkan penggunaan tipe dan fungsi spasial geometri dan geografi.
$ 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)
Memeriksa beberapa PostGIS dan hypertable saya:
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)
Sekarang semuanya tampak siap berfungsi sebagai cluster baru saya.
Setelah semuanya berjalan, Anda dapat menjalankan:
$ sudo -iu postgres ./delete_old_cluster.sh
Pastikan Anda hanya menjalankan skrip karena ini adalah skrip yang sangat berbahaya, karena akan menghapus semua file di cluster PostgreSQL lama Anda.
Kesimpulan
pg_upgrade adalah alat yang hebat untuk mengelola dan meningkatkan server database PostgreSQL Anda. Itu dapat menangani pengaturan kompleks seperti dengan TimescaleDB atau ekstensi PostGIS diaktifkan. Meskipun alat ini memiliki keterbatasan, tidak ada kata berhenti untuk menggunakannya, terutama untuk pekerjaan DBA Anda dan pada server produksi selain QA dan lingkungan pengembangan.