Pembaruan versi PostgreSQL, atau Bagaimana tidak menjatuhkan database saat memperbarui?

Kami memutuskan untuk membagikan daftar periksa tim peningkatan PostgreSQL kami. Di dalamnya, kami mengambil dasar fitur yang disajikan dalam rilis dokumentasi resmi PostgreSQL, melakukan analisis untuk masalah kompatibilitas dan siapa yang harus memperhatikan fungsionalitas yang diperbarui.





Nama saya Alexander Kotsyuruba, saya mengelola pengembangan layanan internal di DomClick.ru.



Artikel ini dibagi menjadi beberapa bagian dengan judul. Setiap judul mengacu pada peningkatan PostgreSQL dari satu versi ke versi lainnya. Dalam setiap bab, kami telah menyoroti:



  • Fitur
  • Risiko yang ditimbulkan oleh potensi ketidaksesuaian

    • Gangguan aplikasi
    • Penurunan kinerja
  • Siapa yang harus dicari saat memperbarui

    • Administrator sistem
    • Pengembang
  • Komentar


Jadi, mari kita mulai.



Perbarui metode



  • pg_upgradeBukan cara paling andal untuk memperbarui PostreSQL. Misalnya, Anda mungkin mendapatkan kesalahan saat REINDEX dari versi PostgreSQL sebelumnya.
  • logical replication — , downtime . , logical replication 10. pglogical ( 2ndquadrant), 9.4 12. , PostgreSQL<10.0, .
  • pg_dumpall — . — downtime.
  • pg_dumpall --globals-only pg_dump --create. , , , PostgreSQL.


PostgreSQL 9.5 -> 9.6



to_char() ( )



, to_char('-4 years'::interval, 'YY') -04, -4.
- to_char() , .
extract() ( )



extract() «», . infinity -infinity , (, year, epoch), NULL (, day, hour). .
extract() c , .
pg_stat_activity , ( , )



, . pg_stat_activity . . waiting wait_event_type wait_event.
- . .
, email host ( )



, , tsvector, .
, , . PostgreSQL . pg_dump, . .. pg_upgrade.
CREATEUSER/NOCREATEUSER CREATE ROLE ( )



CREATEUSER SUPERUSER . , ( ), CREATEROLE. , , .
, 9.6.
, pg_, ( )



. , initdb.
psql -c --no-psqlrc ( , )



--no-psqlrc ( -X). psql.
psql.
pg_restore -t, , ( )
NextXID pg_controldata ( , )



--ID- : . / LSN, .
, , ( )



, . , ( pg_upgrade), ALTER EXTENSION UPDATE ( ).
pg_upgrade extension. pg_upgrade




MVCC ( )



, , . , , , . old_snapshot_threshold , MVCC . . , , , , .


Memecahkan masalah "membengkak" database karena "membuka transaksi dan pergi berlibur"; pembaruan terburu-buru yang membutuhkan waktu berjam-jam; merindukan selecttuan dan budak. Ini adalah salah satu dari dua opsi, berkat itu akan dimungkinkan untuk menyelesaikan masalah, karena itu mereka tidak dapat membebani permintaan lama dari master ke slave.



PostgreSQL 9.6 -> 10.0



Fitur Risiko Siapa yang harus diperhatikan Komentar
Setelah memutakhirkan dari pg_upgradeversi utama PostgreSQL sebelumnya, indeks hash harus dibangun kembali (Mithun Sai, Robert Haas, Amit Kapila)



Persyaratan ini disebabkan oleh peningkatan yang signifikan dalam mekanisme indeks hash. Untuk memudahkan tugas pengindeksan ulang, itu pg_upgradeakan membuat skrip pembantu.
Gangguan aplikasi Administrator sistem Argumen lain menentang pg_upgrade
pg_xlog pg_wal, pg_clog pg_xact ( )



— , , , . .
SQL, «xlog» «wal» ( )



, pg_switch_xlog() pg_switch_wal(), pg_receivexlogpg_receivewal, --xlogdir--waldir. pg_xlog ; «xlog» .
WAL location lsn ( )



.

pg_basebackup WAL, ( )



pg_basebackup -X/--wal-method stream. none. pg_basebackup -x ( -X fetch).
pg_hba.conf ( )



replication . , , all. - replication. , .
pg_ctl ( )



pg_ctl -w.
log_directory pg_log log ( )
ssl_dh_params_file OpenSSL DH ( )



dh1024.pem. , dh1024.pem ; , DH.
DH, DH- OpenSSL, 2048 ( )



DH 1024 2048 , DH . SSL, Java Runtime Environment 6, DH 1024 , , SSL. , DH 1024 .
( )



password_encryption off plain. UNENCRYPTED CREATE/ALTER USER ... PASSWORD. --unencrypted createuser. , , . password_encryption md5.
min_parallel_table_scan_size min_parallel_index_scan_size ( , )



min_parallel_relation_size, .
«» .
shared_preload_libraries ( )



, SQL- .
sql_inheritance ( )



, , . SQL , , PostgreSQL 7.1.
/ ( )



configure --disable-integer-datetimes . , PostgreSQL 8.3.
: rpm, deb, etc.
- 1.0 ( )



PostgreSQL 6.3.
contrib/tsearch2 ( )



, PostgreSQL 8.3.
createlang droplang ( )



PostgreSQL 9.1. CREATE EXTENSION DROP EXTENSION.
, , SELECT ( )



, , SELECT, , LATERAL FROM. , . , NULL. , , , . , , , CASE COALESCE.
set-returning function (.. , ) FROM. , - SELECT. - , . .
UPDATE ... SET (_) = _ ( )



_ ROW; . _ , _ ROW, , . _.* _ , _.
Ini adalah aturan yang biasa untuk row_constructor. Tidaklah biasa untuk menggunakannya dengan UPDATEcara ini. Dalam praktiknya, saya belum melihat kasus seperti itu, meskipun sintaks seperti itu muncul dalam dokumentasi di PostgreSQL 8.2. Di versi 10, tampaknya sintaks ini dibawa ke standar yang digunakan di versi lain dari PostgreSQL. Tidak peduli betapa aneh kelihatannya, adalah mungkin untuk memasukkan potongan kode seperti itu.


Fitur menarik



Publikasikan / Berlangganan Replikasi Logis


Sebuah fitur berguna yang dapat digunakan untuk meningkatkan dengan waktu henti yang minimal.



Partisi tabel deklaratif


Sintaks deklaratif baru menyederhanakan partisi tabel.



Meningkatkan Paralelisasi Kueri


Awalnya 9.6 memperkenalkan dukungan untuk eksekusi paralel kueri besar. Tapi itu hanya menyangkut pemindaian, penggabungan, dan agregasi.



Di 10.0, pada gilirannya, kemungkinan eksekusi paralel muncul:



  • Pemindaian indeks B-Tree
  • Pemindaian bitmap
  • Gabungkan bergabung
  • Subkueri tidak berkorelasi


Perlindungan kata sandi yang lebih kuat menggunakan SCRAM-SHA-256


Mungkin tidak kompatibel dengan beberapa pustaka koneksi PostgreSQL non-standar (non-libpq).



PostgreSQL 10.0 -> 11.0



Fitur Risiko Siapa yang harus diperhatikan Komentar
Penanganan ekspresi yang benar dengan jalur relatif masuk xmltable(), xpath()dan fungsi lain yang bekerja dengan XML (Markus Winand)



Menurut standar SQL, jalur relatif harus dipertimbangkan dari simpul dokumen XML, dan bukan dari simpul akar, seperti fungsi yang biasa dilakukan.
SQL. , XML. , .
pg_dump , ( )



, GRANT/REVOKE ALTER DATABASE SET, pg_dumpall. pg_dump --create pg_restore --create . pg_dumpall -g , . pg_dumpall ( -g) .



pg_dump pg_restore --create / ; .



pg_dumpall , , , . CREATE DATABASE , .



pg_dumpall --clean postgres template1, , .
. , .. . . , pg_dump/pg_restore --create . , , .
( , )



, .
adminpack pg_file_read(), pg_file_length() pg_logfile_rotate() ( )



. adminpack , ALTER EXTENSION ... UPDATE.
replacement_sort_tuples ( )



, .




text ^@ text SP-GiST ( )



LIKE '%' btree, .


Pencarian berdasarkan awalan cukup umum. Untuk ini, kami menambahkan operator khusus dengan dukungan untuk indeks khusus. Dan yang paling menarik, dokumentasi resmi tidak menyebutkan sepatah kata pun tentang operator ini. Sebaliknya, sebuah fungsi disebutkan starts_with- fungsi internal yang menjadi dasar operator ini, tetapi penggunaannya tidak memberikan percepatan menggunakan indeks.



Mengurangi ekspresi = menjadi ekspresi IS NOT NULLyang setara (Tom Lane)



Ini meningkatkan skor selektivitas.


Anehnya, kami telah menemukan desain seperti itu dalam praktiknya. Ternyata, kasus seperti itu tidak jarang terjadi.



PostgreSQL 11.0 -> 12.0



Fitur Risiko Siapa yang harus diperhatikan Komentar
substring(), SQL, , «» ( )



, , , ; , %#"aa*#"% , a.
, , SQL. - substring() , , . , .
recovery.conf postgresql.conf ( , , -, )



recovery.conf , , . recovery.signal standby.signal. trigger_file promote_trigger_file, standby_mode .
recovery_target* ( )



, recovery_target, recovery_target_lsn, recovery_target_name, recovery_target_time recovery_target_xid. , . , , .
( )



recovery_target_timeline latest. current.
pg_verify_checksums pg_checksums ( )
pg_restore -f — ( )



, , .
\pset format psql ( )



, , \pset format a aligned; asciidoc, .
\pset psql. , , psql \pset.
btree 8 ( )



REINDEX , pg_upgrade, .
. , . , . pg_upgrade.
( )



, dynamic_shared_memory_type none.
(CTE), . , , , , . 12- CTE . , , , . , .



, pg_stat_statments . , template1.




btree ( , )



/ , , . .



, pg_upgrade.


Argumen lain tidak mendukung pg_upgrade.



Kesimpulan



Daftar periksa ini adalah ekstrak kami dari sumber resmi PostgreSQL. Dalam praktiknya, bergantung pada pendekatan pengembangan, kekritisan kompatibilitas tertentu untuk Anda mungkin berbeda. Saya akan senang jika artikel ini akan menyelamatkan seseorang dari kehilangan data atau mengurangi biaya tenaga kerja untuk memperbarui PostgreSQL.



PS



Berkat Oleg Samoilov (splarv) untuk membantu menyiapkan artikel.



All Articles