PostgreSQL 15

Najnowszy PostgreSQL 15 już dostępny – szczegółowy opis zmian

13 października 2022 roku zespół PostgreSQL Global Development Group opublikował najnowszą wersję wyczekiwanego silnika bazodanowego PostgreSQL 15. Jest to zatem dobra okazja do bliższego poznania najświeższego produktu, porównując go do poprzedniej wersji. Standardowo, sprawdzimy również aktualną pozycję PostgreSQL na rynku.

13 października 2022 roku zespół PostgreSQL Global Development Group opublikował najnowszą wersję wyczekiwanego silnika bazodanowego PostgreSQL 15. Jest to zatem dobra okazja do bliższego poznania najświeższego produktu, porównując go do poprzedniej wersji. Standardowo, sprawdzimy również aktualną pozycję PostgreSQL na rynku.

PostgreSQL to system do zarządzania obiektowo-relacyjnymi bazami danych. Umożliwia przechowywanie danych w postaci tabeli z wieloma relacjami oraz równoczesną manipulację nimi przy pomocy języka SQL. PostgreSQL został opracowany na Wydziale Informatyki Uniwersytetu Kalifornijskiego w Berkeley. Mając za sobą ponad dwie dekady rozwoju, jest obecnie najbardziej zaawansowaną bazą danych typu Open Source. Więcej informacji na temat historii Postgresa, a także o sporze użytkowników między nazwą PostgreSQL a Postgres, można znaleźć w naszym artykule, w którym szczegółowo omówiliśmy zmiany w PostgreSQL 14.

Kulisy powstania Postgresa 15

Obserwując na bieżąco zmagania twórców z napotykanymi problemami przy wersjach beta, można wysunąć wniosek, że w PostgreSQL 15 było sporo do poprawy. Najświeższy Postgres rzeczywiście doczekał się aż 4 wersji beta i 2 RC (Release Candidate). Nie świadczy to bynajmniej o braku kompetencji twórców, a wręcz przeciwnie – zmaganie się z tak wielkim projektem, obarczone jest występowaniem pewnych wyzwań, które twórcy nieustannie rozwiązują. W tym samym czasie wielu użytkowników testuje na własnym środowisku działanie kolejnych wersji, zgłaszając nowe, często bardzo zawikłane błędy. Stąd też składamy zasłużone gratulacje i życzymy chwili odpoczynku.

Pozycja PostgreSQL na rynku

Serwis Google Trends po raz kolejny posłuży nam do weryfikacji popularności PostgreSQL (kolor niebieski) względem rywali. Na wykresie można zauważyć początek światowej pandemii pod koniec roku 2020. To okres, w którym wyniki wyszukiwania drastycznie się obniżyły, żeby znów poszybować w górę w styczniu 2022. Mogło to być spowodowane powstaniem wielu firm sprzedających swoje produkty w internecie. Konkurencyjna baza danych Oracle (kolor czerwony) nie miała takiego procesu, być może dlatego, że sięgają po nią jedynie bardzo duże korporacje, które stać na to, by przepłacać. MongoDB (kolor żółty) jako bezpłatna alternatywa do Postgresa również otrzymała pewien niewielki zastrzyk zainteresowania.

PostgreSQL 15

Wykres przedstawia zainteresowanie konkretnymi rozwiązaniami w czasie. Szczyt popularności danej frazy w wyszukiwaniach Google oznaczony został jako wartość 100. Wartość 50 oznacza, że fraza była dwa razy mniej popularna.

PostgreSQL 15

Mapa obrazuje popularność PostgreSQL (niebieski), Oracle DB (czerwony), MongoDB (żółty) na przestrzeni ostatnich 10 lat. Im ciemniejszy jest kolor, tym większą ma przewagę w danym regionie. Kolor szary oznacza brak danych.

PostgreSQL 15 a PostgreSQL 14

Ostatnie wydanie PostgreSQL ustawiło wysoki priorytet na poprawę wydajności. Algorytmy sortowania w pamięci i na dysku zostały unowocześnione, przez co wyniki testów pokazują wzrost wydajności od 25% do nawet 400% w zależności od sortowanych typów danych. Poprawa wydajności w najnowszej wersji PostgreSQL 15 nie zatrzymuje się na tym i obejmuje również funkcje archiwizacji, a także tworzenia kopii zapasowych. Najnowszy PostgreSQL cechuje się też większą elastycznością w zarządzaniu replikacjami logicznymi. Filtrowanie wierszy, listowanie kolumn czy funkcje upraszczające zarządzanie konfliktami to zaledwie kilka z wielu przydatnych funkcji, które oferuje PostgreSQL 15.

Znaczącą różnicę w stosunku do poprzedniej wersji można zauważyć także w nowym formacie logów. Te mogą być teraz przetwarzane w systemach logowania strukturalnego. Konfiguracja samego Postgresa również została poprawiona. Od tej wersji administratorzy mają możliwość nadania użytkownikom uprawnień do zmiany parametrów konfiguracyjnych na poziomie serwera. Dodatkowo użytkownicy mogą teraz wyszukiwać informacje o konfiguracji za pomocą polecenia `\config` z narzędzia wiersza poleceń psql.

Innymi wartymi odnotowania nowościami są zmiany w sposobie gromadzenia statystyk, możliwość ustawienia collate ICU jako domyślnej, dodanie rozszerzenia pg_walinspect, zmiana polityki uprawnień dla schematu publicznego (domyślnego), jak również usunięcie trybu wyłączenia kopii zapasowej i zrezygnowanie ze wsparcia dla Pythona 2 z PL/Python.

Wspomniane informacje to jedynie zauważalne na pierwszy rzut oka zmiany. Aby dowiedzieć się, czego jeszcze można oczekiwać od najświeższego wydania najlepszej bazy danych Open Source, zapraszamy do zapoznania się ze szczegółową listą zmian, dostępną poniżej.

Szczegółowa lista zmian w PostgreSQL 15

Serwer

Zmiana Dodatkowe informacje Autor/Autorzy
Rejestrowanie i sprawdzanie wersji collate dla każdej bazy danych Ta funkcja przeznaczona jest do wykrywania zmian wersji collate w celu uniknięcia uszkodzenia indeksu. Funkcja pg_database_collation_actual_version() podaje wersję collate bazowego systemu operacyjnego, a ALTER DATABASE … REFRESH ustawia zarejestrowaną wersję bazy danych tak, aby odpowiadała wersji systemu operacyjnego Peter Eisentraut
Umożliwiono ustawianie collate ICU jako domyślnej dla klastrów i baz danych Poprzednio tylko collate oparte na libc mogło być wybierane na poziomie klastra i bazy danych. Collate ICU można było używać wyłącznie poprzez jawną klauzulę COLLATE Peter Eisentraut
Dodano widok systemowy pg_ident_file_mappings do raportowania informacji pg_ident.conf Julien Rouhaud

Serwer – partycjonowanie

Zmiana Dodatkowe informacje Autor/Autorzy
Poprawiono czas planowania dla zapytań odwołujących się do tabel partycjonowanych Ta zmiana pomaga, gdy istotnych jest tylko kilka partycji z wielu David Rowley
Zezwolono na uporządkowane skanowanie partycji Poprzednio tabela partycjonowana z partycją DEFAULT lub partycją LIST zawierającą wiele wartości nie mogła być użyta do uporządkowanego skanowania partycji. Teraz może być użyta, jeżeli takie partycje są przycinane (partition pruning) podczas planowania David Rowley
Poprawiono zachowanie klucza obcego podczas aktualizacji tabel partycjonowanych, przenoszących wiersze między partycjami Poprzednio takie aktualizacje uruchamiały akcję usuwania na partycji źródłowej i akcję wstawiania na partycji docelowej. Teraz PostgreSQL uruchomi akcję update na partycji głównej, zapewniając czystszą semantykę Amit Langote
Zezwolono na użycie CLUSTER w tabelach partycjonowanych Justin Pryzby
Naprawiono ALTER TRIGGER RENAME w tabelach partycjonowanych, aby poprawnie zmieniał nazwę triggera na wszystkich partycjach Klonowane triggery nie mogą teraz zmieniać nazwy Arne Roland, Álvaro Herrera

Serwer – indeksy

Zmiana Dodatkowe informacje Autor/Autorzy
Zezwolono indeksom btree w tabelach systemowych i TOAST na przechowywanie duplikatów Poprzednio de-duplikacja była wyłączona dla tych typów indeksów Peter Geoghegan
Poprawiono wydajność wyszukiwania indeksów GiST, które zostały zbudowane przy użyciu sortowania Aliaksandr Kalenik, Sergei Shoulbakov, Andrey Borodin
Umożliwiono ograniczeniom UNIQUE i INDEX traktowanie wartości NULL jako nie różniących się Poprzednio wpisy NULL były zawsze traktowane jako wartości różniące się, ale teraz można to zmienić poprzez tworzenie ograniczeń i indeksów z użyciem UNIQUE NULLS NOT DISTINCT Peter Eisentraut
Umożliwiono operatorowi ^@ starts-with i funkcji starts_with() używanie indeksów btree, jeśli używamy collate C Poprzednio mogły one używać tylko indeksów SP-GiST Tom Lane

Server – optimizer

Zmiana Dodatkowe informacje Autor/Autorzy
Umożliwiono rozszerzonym statystykom rejestrowanie statystyk dla rodzica ze wszystkimi jego dziećmi Regularne statystyki śledzą osobno statystyki rodzica i rodzica ze wszystkimi potomkami Tomas Vondra, Justin Pryzby
Dodano zmienną serwera recursive_worktable_factor, aby umożliwić użytkownikowi określenie oczekiwanego rozmiaru tabeli roboczej zapytania rekurencyjnego Simon Riggs

Server – general performance

Zmiana Dodatkowe informacje Autor/Autorzy
Zezwolono na hash lookup dla klauzul NOT IN z wieloma stałymi Poprzednio kod zawsze sekwencyjnie skanował listę wartości David Rowley, James Coleman
Zezwolono na równoległe wykonywanie SELECT DISTINCT David Rowley
Przyspieszono walidację kodowania tekstu UTF-8 poprzez przetwarzanie 16 bajtów na raz Usprawnia to operacje wymagające dużej ilości tekstu, takie jak COPY FROM John Naylor, Heikki Linnakangas
Poprawiono wydajność sortowania, które przekracza work_mem Gdy dane sortowania nie mieszczą się już w work_mem, należy przełączyć się na algorytm sortowania wsadowego, który wykorzystuje więcej strumieni wyjściowych niż wcześniej Heikki Linnakangas
Poprawiono wydajność i zmniejszenie zużycia pamięci przez sortowanie w pamięci Ronan Dunklau, David Rowley, Thomas Munro, John Naylor
Zezwolono na zapisywanie pełnych stron WAL z użyciem kompresji LZ4 i Zstandard Jest to kontrolowane przez ustawienie serwera wal_compression Andrey Borodin, Justin Pryzby
Dodano wsparcie dla zapisu WAL przy użyciu bezpośredniego I/O na macOS Działa to tylko jeżeli max_wal_senders = 0 i wal_level = minimal Thomas Munro
Zezwolono vacuum na śmielsze ustawianie oldest frozen i multi transaction id Peter Geoghegan
Zezwolono zapytaniu odwołującemu się do wielu tabel obcych na wykonywanie równoległych skanów tabel obcych w większej liczbie przypadków Andrey Lepikhov, Etsuro Fujita
Poprawiono wydajność funkcji okienkowych wykorzystujących row_number(), rank() dense_rank() i count() David Rowley
Poprawiono wydajność spinlocków na systemach ARM64 działających na maszynach z dużą liczbą rdzeni Geoffrey Blake

Serwer – monitoring

Zmiana Dodatkowe informacje Autor/Autorzy
Domyślne logowanie punktów kontrolnych i powolnych operacji autovacuum Funkcja ta włącza log_checkpoints, a log_autovacuum_min_duration zmienia na 10 minut. Powoduje to, że nawet bezczynny serwer będzie generował logi, co może powodować problemy na serwerach o ograniczonych zasobach bez konfiguracji rotacji logów. W takich przypadkach należy zmienić wartości domyślne Bharath Rupireddy
Generowanie komunikatów o postępie w dzienniku serwera podczas powolnych startów serwera Komunikaty informują o przyczynie opóźnienia. Interwał czasowy dla powiadomienia jest kontrolowany przez nową zmienną serwera log_startup_progress_interval Nitin Jadhav, Robert Haas
Zapisywanie skumulowanych danych systemowych dotyczących statystyk w pamięci współdzielonej Poprzednio dane te były wysyłane do procesu kolektora statystyk za pośrednictwem pakietów UDP i mogły być odczytywane przez sesje tylko po przesłaniu ich przez system plików. Aktualnie nie ma już osobnego procesu dla kolektora statystyk Kyotaro Horiguchi, Andres Freund, Melanie Plageman
Dodano dodatkowe informacje do komunikatów logowania VACUUM VERBOSE i autovacuum Peter Geoghegan
Dodano wyjście EXPLAIN (BUFFERS) dla tymczasowych bloków plików I/O Masahiko Sawada
Zezwolono na tworzenie logów w formacie JSON Nowe ustawienie to log_destination = jsonlog Sehrope Sarkuni, Michael Paquier
Zezwolono pg_stat_reset_single_table_counters() na resetowanie liczników relacji współdzielonych we wszystkich bazach Sadhuprasad Patro
Dodano wait events dla lokalnych poleceń powłoki Nowe wait events są używane podczas wywoływania archive_command, archive_cleanup_command, restore_command i recovery_end_command Fujii Masao

Serwer – uprawnienia

Zmiana Dodatkowe informacje Autor/Autorzy
Dostęp do tabel z widoku może być teraz kontrolowany za pomocą uprawnień wywołującego widok Poprzednio dostępy do widoków były zawsze traktowane jako wykonywane przez właściciela widoku. Nadal jest to domyślne Christoph Heiss
Umożliwiono członkom predefiniowanej roli pg_write_server_files wykonywanie kopii zapasowych bazy po stronie serwera Poprzednio tylko superużytkownicy mogli wykonywać takie kopie zapasowe Dagfinn Ilmari Mannsåker
GRANT może przyznawać uprawnienia do zmiany poszczególnych zmiennych serwera poprzez SET i ALTER SYSTEM Nowa funkcja has_parameter_privilege() informuje o tym przywileju Mark Dilger
Dodano predefiniowaną rolę pg_checkpoint, która pozwala członkom uruchamiać CHECKPOINT Poprzednio punkty kontrolne mogły być uruchamiane tylko przez superużytkowników Jeff Davis
Zapewniono członkom predefiniowanej roli pg_read_all_stats dostęp do widoków pg_backend_memory_contexts i pg_shmem_allocations Poprzednio dostęp do tych widoków mieli tylko superużytkownicy Bharath Rupireddy
GRANT może nadawać uprawnienia na pg_log_backend_memory_contexts() Poprzednio ta funkcja mogła być uruchamiana tylko przez superużytkowników Jeff Davis

Serwer – konfiguracja serwera

Zmiana Dodatkowe informacje Autor/Autorzy
Dodano zmienną serwera shared_memory_size, aby raportować rozmiar przydzielonej pamięci współdzielonej Nathan Bossart
Dodano zmienną serwera shared_memory_size_in_huge_pages, aby zgłaszać liczbę wymaganych stron huge memory Jest to obsługiwane tylko w systemie Linux Nathan Bossart
Dodano zmienną serwera shared_preload_libraries w trybie pojedynczego użytkownika Ta zmiana wspiera użycie shared_preload_libraries do załadowania niestandardowych metod dostępu i menedżerów zasobów WAL, które byłyby niezbędne dla dostępu do bazy danych nawet w trybie pojedynczego użytkownika Jeff Davis
Ustawiono, by na systemach typu Solaris domyślnym ustawieniem dynamic_shared_memory_type był sysv Poprzedni domyślny wybór, posix, mógł powodować fałszywe błędy na tej platformie Thomas Munro
Umożliwiono postgres -C prawidłowe raportowanie wartości wyliczanych podczas działania serwera Poprzednio podczas działania serwera data_checksums, wal_segment_size i data_directory_mode raportowały wartości, które nie były dokładne na działającym serwerze. Nathan Bossart

Replikacja strumieniowa i przywracanie

Zmiana Dodatkowe informacje Autor/Autorzy
Dodano obsługę kompresji LZ4 i Zstandard dla kopii zapasowych bazy po stronie serwera Jeevan Ladhe, Robert Haas
Uruchamianie procesów checkpointer i bgwriter podczas odzyskiwania po awarii Pomaga to przyspieszyć długie odzyskiwanie po awarii Thomas Munro
Umożliwiono przetwarzanie WAL w celu wstępnego pobierania potrzebnej zawartości plików Jest to kontrolowane przez zmienną serwera recovery_prefetch Thomas Munro
Umożliwiono archiwizację poprzez ładowalne moduły Poprzednio archiwizacja była wykonywana tylko poprzez wywoływanie poleceń powłoki. Nowa zmienna serwera archive_library może być ustawiona w celu określenia biblioteki, która ma być wywołana do archiwizacji Nathan Bossart
Uruchamianie IDENTIFY_SYSTEM nie jest już wymagane przed START_REPLICATION Jeff Davis

Replikacja strumieniowa i przywracanie – replikacja logiczna

Zmiana Dodatkowe informacje Autor/Autorzy
Zezwolono na publikację wszystkich tabel w schemacie Obsługiwana jest obecnie taka składnia: CREATE PUBLICATION pub1 FOR TABLES IN SCHEMA s1,s2. ALTER PUBLICATION obsługuje podobną składnię. Tabele dodane później do wymienionych schematów również zostaną zreplikowane Vignesh C, Hou Zhijie, Amit Kapila
Umożliwiono filtrowanie zawartości publikacji za pomocą klauzuli WHERE Wiersze niespełniające klauzuli WHERE nie są publikowane Hou Zhijie, Euler Taveira, Peter Smith, Ajin Cherian, Tomas Vondra, Amit Kapila
Zezwolono na ograniczenie zawartości publikacji do określonych kolumn Tomas Vondra, Álvaro Herrera, Rahila Syed
Zezwolono na pomijanie transakcji na subskrybencie przy użyciu ALTER SUBSCRIPTION … SKIP Masahiko Sawada
Dodano wsparcie dla przygotowanych (dwufazowych) transakcji do replikacji logicznej W komendzie CREATE_REPLICATION_SLOT dodana została nowa opcja o nazwie TWO_PHASE. pg_recvlogical. Obsługuje ona nowy argument –two-phase Peter Smith, Ajin Cherian, Amit Kapila, Nikhil Sontakke, Stas Kelvich
Zapobiegnięto logicznej replikacji pustych transakcji Poprzednio wydawcy komunikatów wysyłali puste transakcje do subskrybentów, jeżeli subskrybowane tabele nie były modyfikowane Ajin Cherian, Hou Zhijie, Euler Taveira
Dodanie funkcji SQL do monitorowania zawartości katalogów w slotach replikacji logicznej Nowe funkcje to pg_ls_logicalsnapdir(), pg_ls_logicalmapdir(), oraz pg_ls_replslotdir(). Mogą one być uruchamiane przez członków predefiniowanej roli pg_monitor Bharath Rupireddy
Umożliwiono subskrybentom zatrzymanie wdrażania zmian replikacji logicznej w przypadku wystąpienia błędu Funkcja jest włączona przy pomocy opcji subskrybenta disable_on_error i pozwala uniknąć możliwych nieskończonych pętli błędów Osumi Takamichi, Mark Dilger
Dostosowano zmienne serwera subskrybenta do wydawcy komunikatów, aby wartości datetime i float8 były interpretowane spójnie Japin Li
Dodano widok systemowy pg_stat_subscription_stats do raportowania aktywności subskrybentów Nowa funkcja pg_stat_reset_subscription_stats() pozwala na zresetowanie liczników statystyk Masahiko Sawada
Zapobiegnięto duplikowaniu wpisów w widoku systemowym pg_publication_tables W niektórych przypadkach partycja mogła pojawić się więcej niż raz Hou Zhijie

Komendy użytkowe

Zmiana Dodatkowe informacje Autor/Autorzy
Dodano polecenie SQL MERGE, aby dopasować jedną tabelę do innej Działa podobnie jak INSERT … ON CONFLICT, ale jest bardziej zorientowane na batche. Simon Riggs, Pavan Deolasee, Álvaro Herrera, Amit Langote
Dodano wsparcie dla opcji HEADER w formacie tekstowym COPY Nowa opcja powoduje, że nazwy kolumn są wyprowadzane i opcjonalnie weryfikowane na wejściu Rémi Lapeyre
Dodano nową metodę WAL-logged do tworzenia bazy danych Jest to nowa domyślna metoda kopiowania szablonowej bazy danych, ponieważ pozwala uniknąć konieczności stosowania punktów kontrolnych podczas tworzenia bazy danych. Jednak może być powolna, jeżeli baza danych jest duża. Stara metoda nadal jest dostępna Dilip Kumar
Umożliwiono CREATE DATABASE ustawienie OID bazy danych Shruthi Gowda, Antonin Houska
Naprawiono błędy DROP DATABASE, DROP TABLESPACE i ALTER DATABASE SET TABLESPACE podczas równoległego użycia w systemie Windows Thomas Munro
Umożliwiono działanie klucza obcego ON DELETE SET wyłącznie na określone kolumny Paul Martinez
Umożliwiono ALTER TABLE modyfikację tabeli ACCESS METHOD Justin Pryzby, Jeff Davis
Poprawiono wywoływanie access hooks do obiektów podczas przepisania tabeli przez ALTER TABLE Michael Paquier
Umożliwiono tworzenie nielogowanych sekwencji Peter Eisentraut
Poprawiono śledzenie zależności kolumn w wynikach funkcji zawierających typy złożone, czyli tablice, rekordy i typy wyliczeniowe Poprzednio, jeżeli widok lub reguła zawierała odwołanie do konkretnej kolumny, nie było to odnotowywane jako zależność. Widok lub reguła były uważane za zależne tylko od typu złożonego jako całości. Oznaczało to, że upuszczenie pojedynczej kolumny mogło prowadzić do problemów przy użyciu widoku lub reguły Tom Lane

Typy danych

Zmiana Dodatkowe informacje Autor/Autorzy
Zezwolono, aby precyzja podczas rzutowania na liczbę była ujemna Pozwala to na zaokrąglanie wartości na lewo po przecinku, np. ‘1234’::numeric(4, -2) zwraca 1200 Dean Rasheed, Tom Lane
Poprawiono wykrywanie błędów przepełnienia podczas rzutowania wartości na interwał Joe Koshakow
Zmieniono format I/O znaków innych niż ASCII “char” Tom Lane
Uaktualniono informacje o szerokości wyświetlania nowoczesnych znaków Unicode, takich jak emojis Zaktualizowano także Unicode 5.0 do 14.0.0. Istnieje teraz zautomatyzowany sposób aktualizacji Unicode w Postgresie Jacob Champion

Funkcje

Zmiana Dodatkowe informacje Autor/Autorzy
Dodano wielozakresowe wejście dla range_agg() Paul Jungwirth
Dodano agregaty MIN() i MAX() dla typu danych xid8 Ken Kato
Dodano funkcje wyrażeń regularnych dla kompatybilności z innymi systemami relacyjnymi Nowe funkcje to regexp_count(), regexp_instr(), regexp_like() oraz regexp_substr(). Dodano również kilka nowych opcjonalnych argumentów do regexp_replace() Gilles Darold, Tom Lane
Dodano możliwość obliczania odległości między wielokątami Tom Lane
Dodano do_char() kody formatu of, tzh i tzm Odpowiedniki tych kodów pisane wielkimi literami były już obsługiwane Nitin Jadhav
Przy stosowaniu AT TIME ZONE używany jest czas rozpoczęcia transakcji, aby określić, czy DST ma zastosowanie Pozwala to, aby konwersja była uważana za stabilną, a dodatkowo minimalizuje zapytania do jądra Aleksander Alekseev, Tom Lane
Ignorowanie NULL podczas wykonywania funkcji ts_delete() i setweight() Funkcje te efektywnie ignorują elementy tablicowe typu empty-string (ponieważ te nigdy nie mogłyby pasować do poprawnego leksemu). Wydaje się spójne, aby pozwolić im również ignorować elementy NULL, zamiast wyrzucać błąd Jean-Christophe Arnu
Dodano wsparcie dla jednostek petabajtowych do pg_size_pretty() i pg_size_bytes() David Christensen
Zmieniono pg_event_trigger_ddl_commands(), aby wyprowadzać referencje do tymczasowych schematów innych sesji używając aktualnej nazwy schematu Poprzednio funkcja ta nazywała wszystkie zwrócone, tymczasowe schematy jako pg_temp i było to mylące Tom Lane

PL/pgSQL

Zmiana Dodatkowe informacje Autor/Autorzy
Poprawka egzekwowania oznaczeń zmiennych CONSTANT w PL/pgSQL Poprzednio zmienna mogła być użyta jako parametr wyjściowy CALL lub zmienna OPEN refcursora pomimo oznaczenia CONSTANT Tom Lane

libpq

Zmiana Dodatkowe informacje Autor/Autorzy
Zezwolono na dopasowanie adresu IP do Subject Alternative Name branego z certyfikatu serwera Jacob Champion
Zezwolono PQsslAttribute() na raportowanie typu biblioteki SSL bez konieczności połączenia libpq Jacob Champion
Zmieniono anulowanie zapytań wysyłanych przez klienta tak, aby używały tych samych ustawień TCP co normalne połączenia Pozwala to skonfigurowanym timeoutom TCP stosować się do połączeń query cancel Jelte Fennema
Zabroniono zgłaszanie błędów libpq event callback podczas umyślnego zwrócenia błędu
Tom Lane

Client Applications

Zmiana Dodatkowe informacje Autor/Autorzy
Pozwolono, aby pgbench ponownie spróbował się wykonać po błędach serializacji i deadlock’u Yugo Nagata, Marina Polyakova

Aplikacje klienckie – psql

Zmiana Dodatkowe informacje Autor/Autorzy
Poprawiono wydajność polecenia psql’s \copy poprzez wysyłanie danych w większych porcjach Heikki Linnakangas
Dodano polecenie \config do raportowania zmiennych serwera Działa to podobnie do polecenia SHOW, ale może przetwarzać wzorce, aby wygodnie pokazać wiele zmiennych Mark Dilger, Tom Lane
Dodano polecenie \getenv służące przypisaniu wartości zmiennej środowiskowej do zmiennej psql Tom Lane
Dodano opcję + do poleceń \lo_list i \dl w celu pokazania uprawnień obiektów typu large-object Paweł Luzanow
Dodano opcję pagera dla polecenia \watch Jest to obsługiwane tylko w systemie Unix i jest kontrolowane przez zmienną środowiskową PSQL_WATCH_PAGER Pavel Stehule, Thomas Munro
Psql uwzględnia wewnątrzpytaniowe komentarze z podwójnym myślnikiem w zapytaniach wysyłanych do serwera Poprzednio takie komentarze były usuwane z zapytania przed wysłaniem. Komentarze z podwójnym myślnikiem, które znajdują się przed jakimkolwiek tekstem zapytania, nie są wysyłane i nie są rejestrowane jako osobne wpisy w historii psql Tom Lane, Greg Nancarrow
Poprawiono psql tak, aby polecenie meta-# Readline wstawiało znacznik komentarza z podwójnym myślnikiem Poprzednio wstawiany był znacznik funta, chyba że użytkownik zadał sobie trud skonfigurowania niedomyślnego znacznika komentarza Tom Lane
Umożliwiono psql wyprowadzanie wszystkich wyników, gdy wiele zapytań jest przekazywanych do serwera jednocześnie Poprzednio wyświetlany był tylko ostatni wynik zapytania. Stare zachowanie może być przywrócone przez ustawienie zmiennej psql SHOW_ALL_RESULTS na off Fabien Coelho
W przypadku wykrycia błędu w trybie –single-transaction i włączeniu ON_ERROR_STOP, końcowe polecenie COMMIT zmieniane jest na ROLLBACK Poprzednio wykrycie błędu w poleceniu -c lub pliku skryptu -f prowadziło do wydania ROLLBACK na końcu, niezależnie od wartości ON_ERROR_STOP Michael Paquier
Ulepszenie uzupełniania zakładek w psql Shinya Kato, Dagfinn Ilmari Mannsåker, Peter Smith, Koyu Tanigawa, Ken Kato, David Fetter, Haiying Tang, Peter Eisentraut, Álvaro Herrera, Tom Lane, Masahiko Sawada
Ograniczono obsługę poleceń backslash w psql dla serwerów z wersją PostgreSQL 9. 2 lub nowszą Usunięto kod, który był używany tylko podczas pracy ze starszym serwerem. Polecenia, które uległy wycofaniu były kompatybilne jedynie z wersjami poniżej 9.2 Tom Lane

Aplikacje klienckie – pg_dump

Zmiana Dodatkowe informacje Autor/Autorzy
Sprawiono, aby pg_dump zrzucał również publiczne zmiany własności i etykiety bezpieczeństwa schematu Noah Misch
Poprawiono wydajność zrzucania baz danych z większą liczbą obiektów Poprawi to również wydajność pg_upgrade. Tom Lane
Poprawiono wydajność równoległego pg_dump dla tabel z dużymi tablicami TOAST Tom Lane
Dodano opcję dump/restore –no-table-access, aby wymusić przywrócenie tylko domyślnej metody dostępu do tabel Justin Pryzby
Ograniczono obsługę pg_dump i pg_dumpall do serwerów z PostgreSQL w wersji 9. 2 lub nowszej Tom Lane

Zastosowania serwera

Zmiana Dodatkowe informacje Autor/Autorzy
Dodano nową opcję pg_basebackup –target, aby kontrolować lokalizację bazowej kopii zapasowej Nowymi opcjami są server – używana, aby zapisać kopie zapasową lokalnie oraz blackhole – która pozwala wyrzucić kopię zapasową (do testów) Robert Haas
Zezwolono pg_basebackup na kompresję gzip, LZ4 i Zstandard po stronie serwera oraz kompresję LZ4 i Zstandard po stronie klienta dla plików bazowej kopii zapasowej Kompresja gzip po stronie klienta była już obsługiwana Dipesh Pandit, Jeevan Ladhe
Zezwolono pg_basebackup na kompresję po stronie serwera i dekompresję po stronie klienta przed zapisem Jest to możliwe dzięki ustawieniu kompresji po stronie serwera i formatu plain na wyjściu Dipesh Pandit
Zezwolono opcji –compress pg_basebackup na kontrolę miejsca kompresji (serwer lub klient), metody kompresji i opcji kompresji Michael Paquier, Robert Haas
Dodano metodę kompresji LZ4 do pg_receivewal Działa to przez –compress=lz4 i wymaga zbudowania binariów przy użyciu –with-lz4 Georgios Kokolatos
Dodano dodatkowe możliwości do opcji –compress pg_receivewal Georgios Kokolatos
Poprawiono zdolność pg_receivewal do restartu we właściwej lokalizacji WAL Poprzednio pg_receivewal uruchamiał się w oparciu o plik WAL z lokalnego katalogu archive lub bieżącej lokalizacji WAL flush serwera wysyłającego. Dzięki tej zmianie, jeżeli lokalny katalog archive jest pusty i znany jest replication slot, punkt restartu replication slot będzie użyty Ronan Dunklau
Dodano opcję pg_rewind –config-file, aby uprościć użycie, gdy pliki konfiguracyjne serwera są przechowywane poza katalogiem danych Gunnar Bluth

Zastosowanie serwera – pg_upgrade

Zmiana Dodatkowe informacje Autor/Autorzy
Pliki tymczasowe oraz log pg_upgrade będą przechowywane w podkatalogu nowego klastra o nazwie pg_upgrade_output.d Poprzednio takie pliki były pozostawiane w bieżącym katalogu, co wymagało ręcznego czyszczenia. Teraz są one automatycznie usuwane po pomyślnym zakończeniu pg_upgrade Justin Pryzby
Wyłączono domyślne raportowanie statusu podczas operacji pg_upgrade, jeżeli wyjściem nie jest terminal Wyjście raportowania statusu może być włączone dla użycia non-tty przez użycie –verbose. Andres Freund
Sprawiono, że pg_upgrade zgłasza wszystkie bazy danych z niepoprawnymi ustawieniami połączenia Poprzednio raportowana była tylko pierwsza baza z nieprawidłowym połączeniem Jeevan Ladhe
Sprawiono, aby pg_upgrade zachowywał OID dla przestrzeni tabel, baz danych, jak również dla numerów węzłów relacyjnych Shruthi Gowda, Antonin Houska
Dodano opcję –no-sync do pg_upgrade Użycie jest zalecane jedynie do testów Michael Paquier
Ograniczono wsparcie pg_upgrade do starych serwerów z PostgreSQL w wersji 9. 2 lub starszych Tom Lane

Aplikacje serwerowe – pg_waldump

Zmiana Dodatkowe informacje Autor/Autorzy
Dodano możliwość filtrowania outputu pg_waldump według węzła pliku relacji, numeru bloku, numeru forka i obrazów pełnych stron David Christensen, Thomas Munro
Zmieniono pg_waldump, aby logował statystyki przed przerwaniem outputu Na przykład, użycie Ctrl+C w terminalu z uruchomionym pg_waldump –stats –follow zgłosi bieżące statystyki przed wyjściem. Nie działa to w systemie Windows Bharath Rupireddy
Poprawiono opisy niektórych rekordów WAL transakcji raportowanych przez pg_waldump Masahiko Sawada, Michael Paquier
Umożliwiono pg_waldump zrzucanie informacji o menedżerach zasobów Służy do tego opcja –rmgr, której można używać wielokrotnie Heikki Linnakangas

Dokumentacja

Zmiana Dodatkowe informacje Autor/Autorzy
Dodano dokumentację dla pg_encoding_to_char() i pg_char_to_encoding() Ian Lawrence Barwick
Dokumentacja operatora ^@ starts-with Tom Lane

Kod źródłowy

Zmiana Dodatkowe informacje Autor/Autorzy
Dodano wsparcie dla testów continuous integration przy użyciu cirrus-ci Andres Freund, Thomas Munro, Melanie Plageman
Dodano opcję configure –with-zstd, aby włączyć kompilacje Zstandard Jeevan Ladhe, Robert Haas, Michael Paquier
Dodano pole id ABI do magic block w ładowanych bibliotekach, umożliwiając dystrybucjom non-community PostgreSQL prawidłową identyfikację bibliotek, niekompatybilnych z innymi buildami Niedopasowanie pola ABI wygeneruje błąd podczas ładowania. Peter Eisentraut
Utworzono nową wartość pg_type.typcategory dla “char” Do tej kategorii przypisane zostały również niektóre inne typy do użytku wewnętrznego Tom Lane
Dodano nową wiadomość protokołu TARGET, aby określić nową metodę COPY, która ma być używana dla kopii zapasowych bazy pg_basebackup używa teraz tej metody Robert Haas
Dodano nową wiadomość protokołu COMPRESSION i COMPRESSION_DETAIL, aby określić metodę kompresji i opcje Robert Haas
Usunięto wsparcie serwera dla starej składni polecenia BASE_BACKUP i protokołu bazowej kopii zapasowej Robert Haas
Dodano wsparcie dla rozszerzeń w zakresie ustawiania niestandardowych celów tworzenia kopii zapasowych Robert Haas
Umożliwiono rozszerzeniom definiowanie niestandardowych menedżerów zasobów WAL Jeff Davis
Dodano funkcję pg_settings_get_flags(), aby uzyskać flagi zmiennych serwera Justin Pryzby
W systemie Windows wyeksportowano wszystkie zmienne globalne serwera za pomocą znaczników PGDLLIMPORT Poprzednio w Windowsie tylko określone zmienne były dostępne dla rozszerzeń Robert Haas
Wymaganie GNU make w wersji 3.81 lub nowszej do budowy PostgreSQL Tom Lane
Wymaganie OpenSSL do budowy rozszerzenia pgcrypto Peter Eisentraut
Wymaganie Perl w wersji 5. 8.3 lub nowszej Dagfinn Ilmari Mannsåker
Wymaganie Python w wersji 3. 2 lub nowszej Andres Freund

Dodatkowe moduły

Zmiana Dodatkowe informacje Autor/Autorzy
Umożliwiono amcheck sprawdzanie sekwencji Mark Dilger
Poprawiono kontrolę poprawności amcheck dla tabel TOAST Mark Dilger
Dodano nowy moduł basebackup_to_shell jako przykład niestandardowego celu tworzenia kopii zapasowych Robert Haas
Dodano nowy moduł basic_archive jako przykład wykonywania archiwizacji przez bibliotekę Nathan Bossart
Zezwolono na indeksy btree_gist na kolumnach boolean Mogą one być używane do ograniczeń wykluczenia Emre Hasegeli
Poprawiono pageinspect page_header() do obsługi 32-kilobajtowych rozmiarów stron Poprzednio w niektórych przypadkach mogły być zwracane nieprawidłowe wartości ujemne Quan Zongliang
Dodano liczniki dla tymczasowych bloków plików I/O do pg_stat_statements Masahiko Sawada
Dodano liczniki JIT do pg_stat_statements Magnus Hagander
Dodano nowy moduł pg_walinspect Daje on wyjście na poziomie SQL podobne do pg_waldump. Bharath Rupireddy
Dodano informacje o stanie (permissive/enforcing) w komunikatach logów sepgsql Dave Page

Dodatkowe moduły – postgres_fdw

Zmiana Dodatkowe informacje Autor/Autorzy
Zezwolono postgres_fdw na upychanie wyrażeń CASE Alexander Pyhalov
Dodano zmienną serwerową postgres_fdw. application_name do kontroli nazwy aplikacji w połączeniach postgres_fdw Poprzednio nazwa aplikacji sesji zdalnej mogła być ustawiona tylko na zdalnym serwerze lub poprzez specyfikację połączenia postgres_fdw. postgres_fdw. application_name obsługuje pewne sekwencje specjalne, ułatwiając odróżnienie takich połączeń na zdalnym serwerze Hayato Kuroda
Zezwolono na równoległe wykonywanie commitów na serwerach postgres_fdw Jest to włączone za pomocą opcji CREATE SERVER parallel_commit Etsuro Fujita

Podsumowanie i słowo o twórcach

Często patrząc na produkt, nie widzimy stojących za nim ludzi. Nie widzimy tych, którzy włożyli swoje serce i poświęcili czas na stworzenie go. Dobrym doświadczeniem dla naszej wyobraźni jest więc, aby od czasu do czasu spojrzeć na produkt od innej strony. Postaramy się w kilku słowach przybliżyć obraz twórców Postgresa. PostgreSQL Global Development Group jest prywatną firmą non-profit, znaną na rynku od 26 lat. Niezmiennie od ponad 15 lat aktywnie zajmuje się poprawą jakości systemu bazodanowego PostgreSQL. Aktualnie zrzesza 71 specjalistów, a przynajmniej taka liczba widnieje na jej oficjalnym profilu w LinkedIn. Firma zaznacza, że jej główne biuro znajduje się w Stanach Zjednoczonych – nie określa jednak gdzie konkretnie. Co ciekawe, zapytane o to Google Maps wskazuje Kanadę. Może jednak w rzeczywistości PostgreSQL Global Development Group nie posiada swojego biura i każdy pracuje z dowolnego miejsca na świecie? Jednego jesteśmy pewni – nie ważne, gdzie wykonują swoją pracę – robią ją znakomicie, a każda nowa wersja staje się standardem pracy dla milionów deweloperów.

Autorzy

Artykuły na blogu są pisane przez osoby z zespołu EuroLinux. 80% treści zawdzięczamy naszym developerom, pozostałą część przygotowuje dział sprzedaży lub marketingu. Dokładamy starań, żeby treści były jak najlepsze merytorycznie i językowo, ale nie jesteśmy nieomylni. Jeśli zauważysz coś wartego poprawienia lub wyjaśnienia, będziemy wdzięczni za wiadomość.