PostgreSQL 19 atjaunināšana ir tuvu. RC1 iznāca 15. oktobrī, un laidiena komanda ir ieplānojusi RC2 12. novembrī un vispārēju pieejamību 2026. gada 19. novembrī. Lielākā daļa izmaiņu ir apsveicamas, bet vairākas var apturēt pg_upgrade, salauzt vecus klientus vai mainīt vaicājumu veiktspēju bez jebkādas kļūdas. Šo sarakstu mēs pārbaudām pirms produkcijas klastera atjaunināšanas.
Viss turpmāk minētais ņemts no PostgreSQL 19 laidiena piezīmēm un 19. versijas dokumentācijas. Laidiena piezīmes līdz galīgajam laidienam vēl var mainīties, tāpēc laidiena dienā pārbaudiet tās vēlreiz.
Izmaiņas, kas var apturēt pg_upgrade
Šīs jāatrod vispirms, jo pg_upgrade atsakās darboties, kamēr tās nav novērstas. Lielā klasterī par tām jāzina nedēļām iepriekš, nevis apkopes logā.
- btree_gist indeksi uz
inet/cidr. btree_gist dokumentācijā teikts, ka tā operatoru klasesgist_inet_opsungist_cidr_opsnav uzticamas: indeksa meklēšana var nepamanīt rindas. PostgreSQL 19 par noklusējumu padara iebūvēto GiSTinet_ops, unpg_upgradeneizdosies, ja vecajā klasterī joprojām ir indeksi ar kļūdainajām klasēm. Pirms atjaunināšanas aizstājiet tos arinet_opsindeksiem. - Datubāzu, lomu vai tabulu telpu nosaukumi ar rindas pārnesēm (CR vai LF) tagad ir aizliegti, un
pg_upgradeneatjauninās klasteri, kurā tādi ir. - Kodējums
MULE_INTERNALir noņemts. Datubāzes, kas to izmanto, jāizmet un jāatjauno ar citu kodējumu.
-- palaidiet katrā datubāzē: indeksi, kas bloķēs pg_upgrade uz 19
SELECT n.nspname, t.relname AS table_name, c.relname AS index_name, o.opcname
FROM pg_index i
JOIN pg_class c ON c.oid = i.indexrelid
JOIN pg_class t ON t.oid = i.indrelid
JOIN pg_namespace n ON n.oid = c.relnamespace
JOIN pg_opclass o ON o.oid = ANY (i.indclass::oid[])
WHERE o.opcname IN ('gist_inet_ops', 'gist_cidr_ops');
Lielā tabulā aizstājošā indeksa būvēšana ar CREATE INDEX CONCURRENTLY var ilgt stundām, un abi indeksi pastāv līdzās, līdz izdzēšat veco. Plānojiet diska vietu un dariet to krietni pirms atjaunināšanas datuma.
Izmaiņas, kas var salauzt klientus un pieteikšanos
- RADIUS autentifikācija ir noņemta. Piezīmēs paskaidrots, ka PostgreSQL atbalstīja RADIUS tikai pār UDP, kas ir nelabojami nedrošs. Katrai
radiusrindaipg_hba.confvajadzīgs aizstājējs, piemēram, LDAP, sertifikāti vai SCRAM. - MD5 paroļu pieteikšanās tagad rada brīdinājumu pēc veiksmīgas autentifikācijas. MD5 paroles jau PostgreSQL 18 tika atzītas par novecojušām. Brīdinājumu var izslēgt ar
md5_password_warnings, bet labāks risinājums ir pārcelt šīs lomas uz SCRAM. - Paroļu derīguma brīdinājumi. Jaunais
password_expiration_warning_thresholdbrīdina lietotājus par parolēm, kuru derīgums beidzas, pēc noklusējuma septiņas dienas iepriekš. Servisa konti arVALID UNTILto sāks redzēt. standard_conforming_stringsvienmēr iron. Izmetes, kas veidotas ar vecākupg_dumpno servera, kurā šis iestatījums iroff, neielādēsies pareizi. Izmantojiet PostgreSQL 19pg_dumpvai pārliecinieties, ka izmešanas laikā iestatījums iron.escape_string_warningir noņemts.- Mazākas uzvedības izmaiņas.
json_array()pār nulli rindu tagad atgriež tukšu JSON masīvu, nevisNULL.READ ONLYtransakcijas tagad nodod šo statusupostgres_fdwsesijām. Kolonnasync_error_countskatāpg_stat_subscription_statspārdēvēta parsync_table_error_count, un gaidīšanas notikuma tipsBUFFERPINkļūst parBUFFER. Monitoringa vaicājumi, kas lieto šos nosaukumus, jāatjauno.
Ātra pārbaude pirms atjaunināšanas augstāk minētajiem punktiem:
-- nosaukumi ar CR/LF bloķē pg_upgrade
SELECT 'database' AS kind, datname AS name FROM pg_database WHERE datname ~ '[\r\n]'
UNION ALL
SELECT 'role', rolname FROM pg_roles WHERE rolname ~ '[\r\n]'
UNION ALL
SELECT 'tablespace', spcname FROM pg_tablespace WHERE spcname ~ '[\r\n]';
-- RADIUS rindas pg_hba.conf pārstās darboties
SELECT line_number, type, database, user_name, auth_method
FROM pg_hba_file_rules WHERE auth_method = 'radius';
-- lomas, kurām joprojām ir MD5 paroles (vajag superlietotāju)
SELECT rolname FROM pg_authid WHERE rolpassword LIKE 'md5%';
-- vai kaut kas vēl strādā ar standard_conforming_strings = off?
SHOW standard_conforming_strings;
Jaunie noklusējumi, kas maina veiktspēju
Tie nerada kļūdas. Tie parādās vēlāk kā lēnāki vai ātrāki vaicājumi vai citāda uzvedība zem slodzes.
- JIT pēc noklusējuma ir izslēgts. Piezīmēs teikts, ka uz izmaksām balstītā JIT aktivizēšana izrādījās neuzticama, tāpēc
jittagad pēc noklusējuma iroff. Vietnēm ar daudziem lieliem analītiskiem vaicājumiem tas jāieslēdz pašām. Salīdziniet smagāko atskaišu laikus pirms un pēc un ieslēdziet JIT tikai tur, kur tas palīdz. max_locks_per_transactionnoklusējums mainās no 64 uz 128. Mainījies arī bloķējumu tabulas sadalījums, tāpēc piezīmēs teikts, ka pielāgota vērtība jādivkāršo, lai saglabātu to pašu ietilpību. Ja iestatījāt 256 daudzu partīciju dēļ, tagad atbilstošā vērtība ir 512. Par kļūdu, ko saņemat, ja tā ir par zemu, rakstījām rakstā out of shared memory un max_locks_per_transaction.- TOAST saspiešana pēc noklusējuma ir lz4.
default_toast_compressionmainās nopglzuzlz4. Dokumentācijā paskaidrots, ka esošās vērtības netiek saspiestas no jauna. Jauno metodi izmanto tikai jaunas vērtības, ja vien dati netiek pārrakstīti, piemēram, arpg_restore. wal_compression = ontagad izvēlas labāko pieejamo metodi, nevis vienmērpglz.log_lock_waitspēc noklusējuma ir ieslēgts. Gaidīšanas, kas ilgākas pardeadlock_timeout, tiek ierakstītas žurnālā. Tas ir noderīgi, bet noslogotā sistēmā ar bloķējumu konkurenci palielina žurnālu apjomu. Pārliecinieties, ka žurnālu pārsūtīšana un disks to izturēs.
Jaunas iespējas, kuras vērts ieplānot
REPACKaizstājVACUUM FULLunCLUSTER, kas saglabāti saderībai.REPACK (CONCURRENTLY)lielāko darba daļu veic arSHARE UPDATE EXCLUSIVEbloķējumu, vienlaicīgās izmaiņas uztver ar loģisko dekodēšanu unACCESS EXCLUSIVEņem tikai beigu apmaiņai. Tam vajag primāro atslēgu vai citu uz indeksu balstītu replikas identitāti, tas nedarbojas ar partīcijotām vai unlogged tabulām, tam vajag brīvu vietumax_repack_replication_slotsrobežās, un to nevar palaist transakcijas blokā.WAIT FOR LSNdod "read your writes" uz replikām: lietotne pagaida, līdz replika ir atskaņojusi noteiktu LSN, un tikai tad no tās lasa. Noklusējuma režīms irstandby_replay, un opcijaTIMEOUTneļauj atpalikušai replikai iesaldēt pieprasījumu.- Loģiskā replikācija bez restarta. Ar
wal_level = replicaserveris var ieslēgt loģisko dekodēšanu, kad tā vajadzīga. Jaunaiseffective_wal_levelrāda faktiski izmantoto līmeni. - Sekvenču replikācija. Publikācijās var iekļaut
ALL SEQUENCES, unALTER SUBSCRIPTION ... REFRESH SEQUENCESsinhronizē to vērtības. Tas noņem vienu manuālu soli atjaunināšanā ar loģisko replikāciju. - Autovacuum. Indeksus var apstrādāt paralēli autovacuum darbinieki (
autovacuum_max_parallel_workersun tabulas parametrsautovacuum_parallel_workers), un jauna punktu sistēma nosaka, kuras tabulas autovacuum apstrādā vispirms; tā redzamapg_stat_autovacuum_scores. - I/O darbinieku skaits mērogojas automātiski ar
io_method = worker, to regulēio_min_workersunio_max_workers.
Kas mainās lielās datubāzēs
- Izvēlieties metodi pēc apjoma un dīkstāves. Terabaitu klasteros izmešana un atjaunošana parasti ir par lēnu.
pg_upgradear--linkvai--clonesaīsina dīkstāvi, bet loģiskā replikācija var to tuvināt nullei.pg_upgradeun loģisko replikāciju aplūkojām rakstā PostgreSQL galvenās versijas atjaunināšana. - Izmēģiniet uz pilna izmēra kopijas. Indeksu pārbūve,
ANALYZEpēc atjaunināšanas un augstāk minētās pārbaudes aizņem laiku proporcionāli datu apjomam. Izmēriet visu secību uz kopijas ar produkcijas apjomu, nevis aplēsiet. - No jauna izmēriet analītiskos vaicājumus. Tā kā JIT tagad ir izslēgts, izmaiņas visticamāk redzēsiet garās atskaitēs pār lielām tabulām. Saglabājiet smagāko vaicājumu sarakstu un to laikus no pirms atjaunināšanas.
- Partīcijotām shēmām vajag jauno bloķējumu aprēķinu. Tūkstošiem partīciju nozīmē daudz bloķējumu vienā vaicājumā. Pirms restarta uz 19 divkāršojiet jebkuru pielāgotu
max_locks_per_transaction. - lz4 nesamazina esošos datus. Pēc
pg_upgradevecās vērtības paliekpglz. Negaidiet vietas ietaupījumu, kamēr dati nav pārrakstīti. REPACK (CONCURRENTLY)vajag vietu. Tam vajag brīvu diska vietu vismaz tabulas un tās indeksu apjomā, un dokumentācijā teikts, ka tas neizdodas, ja vienlaicīgi tiek atjauninātas vai dzēstas vairāk nekā aptuveni 104 miljoni rindu. Lielākajām tabulām palaidiet to klusā periodā.
Galvenās atziņas
- PostgreSQL 19 vispārēja pieejamība plānota 2026. gada 19. novembrī; RC2 ieplānots 12. novembrī.
- Vispirms atrodiet btree_gist
inet/cidrindeksus, nosaukumus ar CR/LF unMULE_INTERNAL: tie bloķē atjaunināšanu. - Aizstājiet RADIUS, pārceliet MD5 lomas uz SCRAM un veidojiet izmetes ar 19. versijas
pg_dump. - Izslēgts JIT, divkāršots
max_locks_per_transaction, lz4 TOAST un ieslēgtslog_lock_waitsmaina uzvedību bez kļūdām. REPACK (CONCURRENTLY)unWAIT FOR LSNir iespējas, ko lielākā daļa DBA izmantos vispirms.