{"id":329479,"date":"2022-02-12T21:00:31","date_gmt":"2022-02-12T21:00:31","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=329479"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=329479","title":{"rendered":"<span>PostgreSQL 15: \u0427\u0430\u0441\u0442\u044c 4 \u0438\u043b\u0438 \u041a\u043e\u043c\u043c\u0438\u0442\u0444\u0435\u0441\u0442 2022-01<\/span>"},"content":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\u041f\u0435\u0440\u0432\u044b\u0435 \u0442\u0440\u0438 \u043a\u043e\u043c\u043c\u0438\u0442\u0444\u0435\u0441\u0442\u0430 15-\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 (<a href=\"https:\/\/habr.com\/ru\/company\/postgrespro\/blog\/572782\/\">2021-07<\/a>, <a href=\"https:\/\/habr.com\/ru\/company\/postgrespro\/blog\/583070\/\">2021-09<\/a>, <a href=\"https:\/\/habr.com\/ru\/company\/postgrespro\/blog\/596567\/\">2021-11<\/a>) \u043d\u0435 \u0431\u0430\u043b\u043e\u0432\u0430\u043b\u0438 \u043d\u0430\u0441 \u043a\u0440\u0443\u043f\u043d\u044b\u043c\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u043c\u0438. \u041d\u0435 \u0441\u0442\u0430\u043b \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u0438 \u0447\u0435\u0442\u0432\u0435\u0440\u0442\u044b\u0439, \u044f\u043d\u0432\u0430\u0440\u0441\u043a\u0438\u0439 \u043a\u043e\u043c\u043c\u0438\u0442\u0444\u0435\u0441\u0442. \u041d\u043e \u0432\u0441\u0451-\u0442\u0430\u043a\u0438 \u043d\u0430\u0439\u0434\u0435\u0442\u0441\u044f \u043e \u0447\u0435\u043c \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c.<br \/>  <a name=\"habracut\"><\/a><br \/>  <b><a href=\"https:\/\/commitfest.postgresql.org\/36\/2979\/\">psql: \u0430\u0432\u0442\u043e\u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0445 \u0441\u043b\u043e\u0432 \u0438 \u0438\u043c\u0435\u043d \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0445<\/a><\/b><br \/>  commit: <a href=\"https:\/\/github.com\/postgres\/postgres\/commit\/02b8048b\">02b8048b<\/a>, <a href=\"https:\/\/github.com\/postgres\/postgres\/commit\/020258fb\">020258fb<\/a><\/p>\n<p>  \u041f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u043a\u043e\u043c\u043c\u0438\u0442\u0444\u0435\u0441\u0442\u0435 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e\u0442\u0441\u044f \u043f\u0430\u0442\u0447\u0438, \u0443\u043b\u0443\u0447\u0448\u0430\u044e\u0449\u0438\u0435 \u0430\u0432\u0442\u043e\u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043f\u043e \u0442\u0430\u0431\u0443\u043b\u044f\u0446\u0438\u0438 \u0434\u043b\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u043a\u043e\u043c\u0430\u043d\u0434. \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 15-\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u044f \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043b \u0438\u0445 \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u0442\u044c.<\/p>\n<p>  \u041e\u0434\u043d\u0430\u043a\u043e \u044d\u0442\u043e\u0442 \u043f\u0430\u0442\u0447 \u0441\u0442\u043e\u0438\u0442 \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c. \u0420\u0435\u0447\u044c \u043d\u0435 \u043e\u0431 \u0430\u0432\u0442\u043e\u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u0434\u043b\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u043a\u043e\u043c\u0430\u043d\u0434. \u042d\u0442\u043e \u043e\u0431\u0449\u0435\u0435 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438\u043c\u0435\u043d \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432\/\u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0445 \u0441\u043b\u043e\u0432, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0445.<\/p>\n<p>  \u0414\u043b\u044f \u0441\u0435\u0431\u044f \u043e\u0442\u043c\u0435\u0442\u0438\u043b, \u0447\u0442\u043e \u043d\u0430\u0436\u0430\u0442\u0438\u0435 \u043d\u0430 \u0442\u0430\u0431\u0443\u043b\u044f\u0446\u0438\u044e \u043d\u0430\u043a\u043e\u043d\u0435\u0446-\u0442\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0440\u0435\u0433\u0438\u0441\u0442\u0440:<\/p>\n<pre><code class=\"plaintext\">vacuum ana[tab] -> vacuum analyze <\/code><\/pre>\n<p>  \u0440\u0430\u043d\u044c\u0448\u0435 \u0431\u044b\u043b\u043e:<\/p>\n<pre><code class=\"plaintext\">vacuum ana[tab] -> vacuum ANALYZE <\/code><\/pre>\n<p>  <b>psql: \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \\getenv \u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0434\u043e\u043c\u0430\u0448\u043d\u0435\u0433\u043e \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f<\/b><br \/>  commit: <a href=\"https:\/\/github.com\/postgres\/postgres\/commit\/33d3eead\">33d3eead<\/a> \u0438 <a href=\"https:\/\/github.com\/postgres\/postgres\/commit\/376ce3e4\">376ce3e4<\/a><\/p>\n<p>  \u041a\u043e\u043c\u0430\u043d\u0434\u0430 \\setenv \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0432 psql \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0434\u0430\u0432\u043d\u043e, \u0430 \u0432\u043e\u0442 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u0435 \u0431\u044b\u043b\u043e.<\/p>\n<p>  \u041f\u0435\u0440\u0432\u044b\u0439 \u043a\u043e\u043c\u043c\u0438\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \\getenv \u0432 psql:<\/p>\n<pre><code class=\"pgsql\">\\getenv home_saved HOME \\echo :home_saved <\/code><\/pre>\n<pre><code class=\"plaintext\">\/home\/pluzanov <\/code><\/pre>\n<p>  \u0412\u043e\u043e\u0431\u0449\u0435-\u0442\u043e, \u0442\u043e\u0433\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u0442\u0430\u043a:<\/p>\n<pre><code class=\"pgsql\">\\set home_saved `echo $HOME` <\/code><\/pre>\n<p>  \u041d\u043e \u044d\u0442\u043e\u0442 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0435 \u0432\u043e \u0432\u0441\u0435\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445.<\/p>\n<p>  \u0410 \u0432\u043e\u0442 \u0432\u0442\u043e\u0440\u043e\u0439 \u043a\u043e\u043c\u043c\u0438\u0442 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f UNIX-\u0441\u0438\u0441\u0442\u0435\u043c. \u041e\u043d \u043c\u0435\u043d\u044f\u0435\u0442 \u0441\u043f\u043e\u0441\u043e\u0431 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0434\u043e\u043c\u0430\u0448\u043d\u0435\u0433\u043e \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u0412\u043c\u0435\u0441\u0442\u043e getpwuid(getuid())->pw_dir \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f $HOME, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043f\u0440\u0438 \u0436\u0435\u043b\u0430\u043d\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u043c\u0435\u043d\u044f\u0442\u044c:<\/p>\n<pre><code class=\"pgsql\">\\setenv HOME \/tmp \\cd \\! pwd <\/code><\/pre>\n<pre><code class=\"plaintext\">\/tmp <\/code><\/pre>\n<p>  \u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435:<\/p>\n<pre><code class=\"pgsql\">\\setenv HOME :home_saved \\cd \\! pwd <\/code><\/pre>\n<pre><code class=\"plaintext\">\/home\/pluzanov <\/code><\/pre>\n<p>  <b><a href=\"https:\/\/commitfest.postgresql.org\/36\/3313\/\">psql: \\dl+ \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 \u043f\u0440\u0438\u0432\u0438\u043b\u0435\u0433\u0438\u0439 \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b<\/a><\/b><br \/>  commit: <a href=\"https:\/\/github.com\/postgres\/postgres\/commit\/328dfbda\">328dfbda<\/a><\/p>\n<p>  \u0421\u0443\u0442\u044c \u043f\u0430\u0442\u0447\u0430 \u0432 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0438. \u041d\u043e \u043a\u043e\u043c\u0443 \u043d\u0443\u0436\u043d\u044b \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0438 \u043f\u0440\u0430\u0432\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043d\u0438\u043c? \u042d\u0442\u043e\u0442 \u043f\u0430\u0442\u0447 \u043d\u0435 \u043f\u043e\u043f\u0430\u043b \u0431\u044b \u0432 \u043e\u0431\u0437\u043e\u0440, \u0435\u0441\u043b\u0438 \u0431\u044b \u043d\u0435 \u043e\u0434\u043d\u043e \u043e\u0431\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e. \u042d\u0442\u043e \u043c\u043e\u0439 \u043f\u0430\u0442\u0447 \ud83d\ude42<\/p>\n<p>  \u0417\u0430\u0447\u0435\u043c \u043c\u043d\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b? \u0412\u043e\u043e\u0431\u0449\u0435-\u0442\u043e \u043d\u0435 \u043e\u0441\u043e\u0431\u043e. \u041d\u043e \u0438\u0437\u0443\u0447\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e <a href=\"https:\/\/www.postgresql.org\/docs\/14\/ddl-priv.html#PRIVILEGES-SUMMARY-TABLE\">\u0437\u0434\u0435\u0441\u044c<\/a>, \u0441\u0442\u0430\u043b\u043e \u0437\u0430 \u043d\u0438\u0445 \u043e\u0431\u0438\u0434\u043d\u043e. \u041f\u043e\u0447\u0435\u043c\u0443 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u043f\u0443\u0441\u0442\u0430\u044f \u043a\u043b\u0435\u0442\u043a\u0430 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043a \u043a\u043e\u043c\u0430\u043d\u0434\u0435 psql \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438? <a href=\"https:\/\/www.postgresql.org\/docs\/devel\/ddl-priv.html#PRIVILEGES-SUMMARY-TABLE\">\u0418\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e<\/a>.<\/p>\n<p>  \u041d\u043e \u0441\u0430\u043c\u043e\u0435 \u0443\u0434\u0438\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435, \u0447\u0442\u043e \u0437\u043d\u0430\u043d\u0438\u0439 \u044f\u0437\u044b\u043a\u0430 C \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043f\u0435\u0440\u0432\u043e\u0439 \u0433\u043b\u0430\u0432\u044b \u0438\u0437 \u043a\u043d\u0438\u0436\u043a\u0438 \u041a\u0435\u0440\u043d\u0438\u0433\u0430\u043d\u0430 \u0438 \u0420\u0438\u0442\u0447\u0438 \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0432\u043f\u043e\u043b\u043d\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e. \u0422\u0430\u043a \u0447\u0442\u043e \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u0432\u043d\u0435\u0441\u0442\u0438 \u0441\u0432\u043e\u0439 \u0432\u043a\u043b\u0430\u0434 \u0432 \u0440\u0430\u0437\u0443\u043c\u043d\u043e\u0435, \u0434\u043e\u0431\u0440\u043e\u0435, \u0432\u0435\u0447\u043d\u043e\u0435. \u041d\u0435 \u0441\u0442\u0435\u0441\u043d\u044f\u0439\u0442\u0435\u0441\u044c!<\/p>\n<p>  <b><a href=\"https:\/\/commitfest.postgresql.org\/36\/3398\/\">postgresql: \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u0430\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f (CI)<\/a><\/b><br \/>  commit: <a href=\"https:\/\/github.com\/postgres\/postgres\/commit\/93d97349\">93d97349<\/a><\/p>\n<p>  \u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u044f \u0442\u0435\u043c\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438. \u0412 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0439 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 Cirrus CI. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0434\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0438 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u043a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 postgresql \u043d\u0430 github, \u0432\u043d\u043e\u0441\u0438\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0438 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043a\u0430\u043a \u043f\u0440\u043e\u0435\u043a\u0442 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430\u0445. \u0421\u0435\u0439\u0447\u0430\u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f: FreeBSD, Linux, macOS and Windows.<\/p>\n<p>  \u0423\u0434\u043e\u0431\u043d\u043e \u0442\u0435\u043c, \u0447\u0442\u043e \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u043d\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430\u0445, \u043f\u0430\u0442\u0447 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0432 -hackers\/commitfest, \u0433\u0434\u0435 \u0432\u0441\u0442\u0440\u043e\u0435\u043d: <a href=\"http:\/\/cfbot.cputube.org\/\">http:\/\/cfbot.cputube.org\/<\/a><\/p>\n<p>  \u0414\u0435\u0442\u0430\u043b\u0438 \u0432 <a href=\"https:\/\/github.com\/postgres\/postgres\/blob\/master\/src\/tools\/ci\/README\">src\/tools\/ci\/README<\/a>.<\/p>\n<p>  <b><a href=\"https:\/\/commitfest.postgresql.org\/36\/3385\/\">pg_log_backend_memory_contexts \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 \u0434\u043b\u044f \u0444\u043e\u043d\u043e\u0432\u044b\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 \u0441\u0435\u0440\u0432\u0435\u0440\u0430<\/a><\/b><br \/>  commit: <a href=\"https:\/\/github.com\/postgres\/postgres\/commit\/790fbda9\">790fbda9<\/a><\/p>\n<p>  \u041f\u043e\u044f\u0432\u0438\u0432\u0448\u0430\u044f\u0441\u044f \u0432 14-\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f <a href=\"https:\/\/www.postgresql.org\/docs\/devel\/functions-admin.html#FUNCTIONS-ADMIN-SIGNAL-TABLE\">pg_log_backend_memory_contexts<\/a> \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0432 \u0436\u0443\u0440\u043d\u0430\u043b \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043f\u0430\u043c\u044f\u0442\u0438, \u0437\u0430\u043d\u044f\u0442\u043e\u0439 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u044e\u0449\u0438\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u043c. <\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u0434\u043b\u044f \u0444\u043e\u043d\u043e\u0432\u044b\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 (bgwriter, wal writer, archiver, checkpointer\u2026), \u043a\u0440\u043e\u043c\u0435 logger \u0438 stats collector.<\/p>\n<p>  <b><a href=\"https:\/\/commitfest.postgresql.org\/36\/3431\/\">\u0423\u043d\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0432\u044b\u0432\u043e\u0434\u0430 VACUUM VERBOSE \u0438 <i>log_autovacuum_min_duration<\/i><\/a><\/b><br \/>  commit: <a href=\"https:\/\/github.com\/postgres\/postgres\/commit\/49c9d9fc\">49c9d9fc<\/a><\/p>\n<p>  \u0412 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0439 \u043e\u0442\u0447\u0435\u0442 \u043e\u0431 \u043e\u0447\u0438\u0441\u0442\u043a\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b VACUUM VERBOSE \u0432\u043a\u043b\u044e\u0447\u0438\u043b\u0438 \u043f\u043e\u043b\u0435\u0437\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0430\u043d\u044c\u0448\u0435 \u043f\u043e\u043f\u0430\u0434\u0430\u043b\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0436\u0443\u0440\u043d\u0430\u043b \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043f\u0440\u0438 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043d\u0438\u0438 <i>log_autovacuum_min_duration<\/i>.<\/p>\n<p>  \u0418\u0437 \u0432\u0430\u0436\u043d\u043e\u0433\u043e, \u0442\u0435\u043f\u0435\u0440\u044c \u0432\u043c\u0435\u0441\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0440\u043e\u0445\u043e\u0434 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c (\u0435\u0441\u043b\u0438 \u0438\u0445 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u2015 \u0441\u0440\u043e\u0447\u043d\u043e \u043f\u0435\u0440\u0435\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u0442\u0435 \u0430\u0432\u0442\u043e\u043e\u0447\u0438\u0441\u0442\u043a\u0443!) \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043e\u0434\u043d\u0430 \u0430\u043a\u043a\u0443\u043c\u0443\u043b\u0438\u0440\u0443\u044e\u0449\u0430\u044f. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0430\u0441\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0441\u0440\u0435\u0434\u043d\u0435\u0439 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0447\u0442\u0435\u043d\u0438\u044f\/\u0437\u0430\u043f\u0438\u0441\u0438 \u0441 \u0434\u0438\u0441\u043a\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0431\u0443\u0444\u0435\u0440\u043d\u043e\u0433\u043e \u043a\u0435\u0448\u0430 \u0438 WAL.<\/p>\n<p>  <b><a href=\"https:\/\/commitfest.postgresql.org\/36\/2996\/\">\u0423\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u0442\u0440\u043e\u043a \u0432 UTF-8<\/a><\/b><br \/>  commit: <a href=\"https:\/\/github.com\/postgres\/postgres\/commit\/911588a3\">911588a3<\/a><\/p>\n<p>  \u0421\u043e\u0433\u043b\u0430\u0441\u043d\u043e <a href=\"https:\/\/www.postgresql.org\/message-id\/CAFBsxsHR08mHEf06PvrMRstfcyPJLwF69g0r1pvRrxWD4GEVoQ%40mail.gmail.com\">\u0442\u0435\u0441\u0442\u0430\u043c<\/a> \u0430\u0432\u0442\u043e\u0440\u0430, \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u0442\u0440\u043e\u043a \u0432 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0435 UTF-8 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u0440\u0430\u0437\u044b \u0431\u044b\u0441\u0442\u0440\u0435\u0435. \u042d\u0442\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0442\u043e\u0447\u043d\u043e \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043e\u0431\u044a\u0435\u043c\u043e\u0432 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 COPY FROM.<\/p>\n<p>  <b><a href=\"https:\/\/commitfest.postgresql.org\/36\/3277\/\">postgres_fdw: \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 application_name \u0434\u043b\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435<\/a><\/b><br \/>  commit: <a href=\"https:\/\/github.com\/postgres\/postgres\/commit\/449ab635\">449ab635<\/a>, <a href=\"https:\/\/github.com\/postgres\/postgres\/commit\/6e0cb3de\">6e0cb3de<\/a><\/p>\n<p>  \u0414\u043b\u044f \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0432 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 postgres \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 \u043d\u0430 \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 demo \u0432 \u044d\u0442\u043e\u043c \u0436\u0435 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435. \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u043c \u0437\u0430\u043f\u0440\u043e\u0441 \u043a \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432:<\/p>\n<pre><code class=\"pgsql\">SELECT count(*) FROM bookings;  SELECT datname, pid, usename, application_name FROM pg_stat_activity WHERE datname IN ('demo','postgres'); <\/code><\/pre>\n<pre><code class=\"plaintext\"> datname  |  pid   | usename  | application_name ----------+--------+----------+------------------  postgres | 103897 | postgres | psql  demo     | 103898 | postgres | postgres_fdw <\/code><\/pre>\n<p>  \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e postgres_fdw \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 <i>application_name<\/i> \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0445 \u0441\u0435\u0430\u043d\u0441\u043e\u0432 \u0432 \u00abpostgres_fdw\u00bb. \u041d\u043e \u0435\u0441\u043b\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u044b \u0441\u0440\u0430\u0437\u0443 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0445 \u0441\u0435\u0430\u043d\u0441\u043e\u0432, \u0442\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u043a\u0442\u043e \u043e\u0442\u043a\u0443\u0434\u0430 \u043f\u0440\u0438\u0448\u0435\u043b \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e.<\/p>\n<p>  \u041d\u043e\u0432\u044b\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f <i>postgres_fdw.application_name<\/i> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f. <\/p>\n<pre><code class=\"pgsql\">\\c SET postgres_fdw.application_name = 'fdw: %u@%d(%p)'; SELECT count(*) FROM bookings; <\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432:<\/p>\n<pre><code class=\"pgsql\">SELECT datname, pid, usename, application_name FROM pg_stat_activity WHERE datname IN ('demo','postgres'); <\/code><\/pre>\n<pre><code class=\"plaintext\"> datname  |  pid   | usename  |        application_name         ----------+--------+----------+--------------------------------  demo     | 104073 | postgres | fdw: postgres@postgres(104009)  postgres | 104009 | postgres | psql <\/code><\/pre>\n<p>  \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u043f\u0435\u0446\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0435\u0439 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0432 <a href=\"https:\/\/www.postgresql.org\/docs\/devel\/postgres-fdw.html#id-1.11.7.45.18\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/a>. \u0412 \u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0438\u043c\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f(%u), \u0438\u043c\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445(%d) \u0438 \u043d\u043e\u043c\u0435\u0440 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430(%p), \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043b\u0435\u0433\u043a\u043e \u043d\u0430\u0439\u0442\u0438 \u0441\u0435\u0430\u043d\u0441, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0438\u0439 \u0437\u0430\u043f\u0440\u043e\u0441.<\/p>\n<p>  <b><a href=\"https:\/\/commitfest.postgresql.org\/36\/3414\/\">\u041b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u044f \u0431\u0435\u0437 \u0441\u0443\u043f\u0435\u0440\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f<\/a><\/b><br \/>  commit: <a href=\"https:\/\/github.com\/postgres\/postgres\/commit\/a2ab9c06\">a2ab9c06<\/a>, <a href=\"https:\/\/github.com\/postgres\/postgres\/commit\/96a6f11c\">96a6f11c<\/a><\/p>\n<p>  \u041f\u0440\u043e\u0446\u0435\u0441\u0441 logical replication worker \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0441 \u043f\u0440\u0438\u0432\u0438\u043b\u0435\u0433\u0438\u044f\u043c\u0438 \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0430 \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u043d \u0431\u044b\u0442\u044c \u0441\u0443\u043f\u0435\u0440\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c.<\/p>\n<p>  \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u0434\u0432\u0430 \u044d\u0442\u0430\u043f\u0430. \u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0438 \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f \u043f\u0440\u0430\u0432\u0430 \u0441\u0443\u043f\u0435\u0440\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u041d\u043e \u0437\u0430\u0442\u0435\u043c \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0431\u0440\u0430\u0442\u044c. \u0413\u043b\u0430\u0432\u043d\u043e\u0435, \u0447\u0442\u043e\u0431\u044b \u0443 \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0430 \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0438 \u0431\u044b\u043b\u0438 \u043f\u0440\u0430\u0432\u0430 \u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u043a\u0443\u0434\u0430 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f.<\/p>\n<p>  \u0414\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0431\u0443\u0434\u0435\u043c \u0440\u0435\u043f\u043b\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 test \u0438\u0437 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 postgres \u0432 \u0431\u0430\u0437\u0443 db, \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u0443\u044e \u0432 \u044d\u0442\u043e\u043c \u0436\u0435 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435.<\/p>\n<pre><code class=\"pgsql\">\\\u0441 postgres postgres CREATE TABLE test (id int); CREATE ROLE alice LOGIN SUPERUSER; CREATE DATABASE db OWNER alice; <\/code><\/pre>\n<p>  \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044e \u0438 \u0441\u043b\u043e\u0442:<\/p>\n<pre><code class=\"pgsql\">CREATE PUBLICATION test_pub FOR TABLE test; SELECT pg_create_logical_replication_slot('testslot','pgoutput'); <\/code><\/pre>\n<p>  \u041d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0438, \u043f\u043e\u043a\u0430 alice \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0443\u043f\u0435\u0440\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c:<\/p>\n<pre><code class=\"pgsql\">\\c db alice CREATE TABLE test (id int); CREATE SUBSCRIPTION test_sub     CONNECTION 'user=postgres dbname=postgres'     PUBLICATION test_pub     WITH (create_slot = false, slot_name = testslot); <\/code><\/pre>\n<p>  \u0417\u0430\u0431\u0438\u0440\u0430\u0435\u043c \u043f\u0440\u0430\u0432\u0430 \u0441\u0443\u043f\u0435\u0440\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u0443 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438:<\/p>\n<pre><code class=\"pgsql\">\\\u0441 postgres postgres ALTER ROLE alice NOSUPERUSER; INSERT INTO test VALUES(1);  \\c db alice SELECT * FROM test; <\/code><\/pre>\n<pre><code class=\"plaintext\"> id ----   1 (1 row) <\/code><\/pre>\n<p>  \u041f\u043e\u043a\u0430 \u0435\u0441\u0442\u044c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u043d\u044f\u0442\u043e \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0432\u0435\u0440\u0441\u0438\u044f\u0445. \u0415\u0441\u043b\u0438 \u0434\u043b\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b test \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0438 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 \u0437\u0430\u0449\u0438\u0442\u044b \u0441\u0442\u0440\u043e\u043a (RLS), \u0442\u043e \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u044f \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 \u043d\u0435 \u043c\u0435\u0448\u0430\u044e\u0442 alice \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u0443. \u041d\u0443\u0436\u043d\u043e \u0438\u043b\u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0430\u0442\u0440\u0438\u0431\u0443\u0442 superuser \u0434\u043b\u044f alice, \u0438\u043b\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0430\u0442\u0440\u0438\u0431\u0443\u0442 bypassrls.<\/p>\n<p>  <b><a href=\"https:\/\/commitfest.postgresql.org\/36\/3312\/\">\u0416\u0443\u0440\u043d\u0430\u043b \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 JSON<\/a><\/b><br \/>  commit: <a href=\"https:\/\/github.com\/postgres\/postgres\/commit\/dc686681\">dc686681<\/a><\/p>\n<p>  \u0423 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 log_destination \u043d\u043e\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u2015 jsonlog. \u0410 \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u0436\u0443\u0440\u043d\u0430\u043b \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0444\u043e\u0440\u043c\u0430\u0442 JSON. \u041f\u0440\u043e\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u0433\u043b\u0430\u0437\u0430\u043c\u0438 \u0436\u0443\u0440\u043d\u0430\u043b \u0432 \u044d\u0442\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u0441\u043b\u043e\u0436\u043d\u0435\u0435, \u0447\u0435\u043c \u0432 stderr. \u041e\u0434\u043d\u0430\u043a\u043e \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0436\u0443\u0440\u043d\u0430\u043b\u0430 \u044d\u0442\u043e \u0445\u043e\u0440\u043e\u0448\u0430\u044f \u043d\u043e\u0432\u043e\u0441\u0442\u044c. \u0424\u043e\u0440\u043c\u0430\u0442 \u0437\u0430\u043f\u0438\u0441\u0438, \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u0435\u0441\u0442\u044c \u0432 <a href=\"https:\/\/www.postgresql.org\/docs\/devel\/runtime-config-logging.html#RUNTIME-CONFIG-LOGGING-JSONLOG\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/a>.<\/p>\n<p>  <a href=\"https:\/\/www.depesz.com\/2022\/01\/17\/waiting-for-postgresql-15-introduce-log_destinationjsonlog\/\">\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435<\/a> \u043e\u0442 Depesz.<\/p>\n<p>  <b><a href=\"https:\/\/commitfest.postgresql.org\/36\/3401\/\">\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e: log_checkpoints \u0438 log_autovacuum_min_duration<\/a><\/b><br \/>  commit: <a href=\"https:\/\/github.com\/postgres\/postgres\/commit\/64da07c4\">64da07c4<\/a><\/p>\n<p>  \u041a\u043e\u0433\u0434\u0430 \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u0448\u043b\u043e \u043d\u0435 \u0442\u0430\u043a \u0441 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u0445\u043e\u0440\u043e\u0448\u043e \u0431\u044b \u0438\u043c\u0435\u0442\u044c \u043f\u043e\u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430.<\/p>\n<p>  \u0421 \u044d\u0442\u043e\u0439 \u0446\u0435\u043b\u044c\u044e, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 15-\u0439 \u0432\u0435\u0440\u0441\u0438\u0438, \u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0434\u0432\u0443\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432:<\/p>\n<pre><code class=\"pgsql\">SELECT name, boot_val, unit FROM pg_settings WHERE name IN ('log_checkpoints','log_autovacuum_min_duration'); <\/code><\/pre>\n<pre><code class=\"plaintext\">            name             | boot_val | unit -----------------------------+----------+------  log_autovacuum_min_duration | 600000   | ms  log_checkpoints             | on       | <\/code><\/pre>\n<p>  \u0410 \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u044b\u0445 \u0442\u043e\u0447\u0435\u043a \u0438 \u0434\u043e\u043b\u0433\u0438\u0445 (>10\u043c\u0438\u043d) \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0445 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u0436\u0443\u0440\u043d\u0430\u043b \u0441\u0435\u0440\u0432\u0435\u0440\u0430.<\/p>\n<p>  \u041d\u043e \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0436\u0434\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u043d\u0430 15-\u044e \u0432\u0435\u0440\u0441\u0438\u044e. \u0415\u0441\u043b\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043d\u0435 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u044b \u0441\u0435\u0439\u0447\u0430\u0441, \u0438\u0445 \u0441\u0442\u043e\u0438\u0442 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c.<\/p>\n<p>  <b><a href=\"https:\/\/commitfest.postgresql.org\/36\/2932\/\">\u0421\u043e\u0441\u0442\u0430\u0432\u043d\u044b\u0435 \u0432\u043d\u0435\u0448\u043d\u0438\u0435 \u043a\u043b\u044e\u0447\u0438 \u0441 ON DELETE SET NULL<\/a><\/b><br \/>  commit: <a href=\"https:\/\/github.com\/postgres\/postgres\/commit\/d6f96ed9\">d6f96ed9<\/a><\/p>\n<p>  \u041f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u043a\u043b\u044e\u0447\u0435\u0439 \u043c\u043e\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043f\u0440\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0438 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0441\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u043a\u043b\u044e\u0447\u0430 \u0443 \u0432\u0441\u0435\u0445 \u0441\u0441\u044b\u043b\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0432 NULL. \u041e\u0434\u043d\u0430\u043a\u043e \u0432 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f\u0445, \u043a\u043e\u0433\u0434\u0430 \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u044b\u0439\/\u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u043a\u043b\u044e\u0447 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u044b\u043c\u0438, \u043c\u043e\u0433\u0443\u0442 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0443\u0442\u044c \u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b.<\/p>\n<p>  \u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u043e\u0432 \u0438\u043c\u0435\u0435\u0442 \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u043e\u0439 \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u044b\u0439 \u043a\u043b\u044e\u0447, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043c\u0438\u043c\u043e \u043a\u043e\u0434\u0430 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0430 \u0432\u043a\u043b\u044e\u0447\u0435\u043d \u0435\u0449\u0435 \u0438 \u043a\u043e\u0434 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e \u0435\u0441\u0442\u044c \u0438 \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u043a\u043b\u044e\u0447 \u2015 \u043a\u043e\u0434 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044f \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0430, \u043e\u043f\u044f\u0442\u044c \u0436\u0435 \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u043e\u0439.<\/p>\n<pre><code class=\"pgsql\">CREATE TABLE employees (     company_code text,     employee_code text,     manager_code text,     PRIMARY KEY (company_code, employee_code),     CONSTRAINT employees_manager_fkey FOREIGN KEY (company_code, manager_code)             REFERENCES employees (company_code, employee_code)             ON DELETE SET NULL );  INSERT INTO employees VALUES     ('\u0413\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u043e\u0444\u0438\u0441', '\u0414\u0438\u0440\u0435\u043a\u0442\u043e\u0440', NULL),     ('\u0424\u0438\u043b\u0438\u0430\u043b', '\u0414\u0438\u0440\u0435\u043a\u0442\u043e\u0440', NULL),     ('\u0424\u0438\u043b\u0438\u0430\u043b', '\u0417\u0430\u043c.\u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0430', '\u0414\u0438\u0440\u0435\u043a\u0442\u043e\u0440'); SELECT * FROM employees; <\/code><\/pre>\n<pre><code class=\"plaintext\"> company_code  | employee_code | manager_code ---------------+---------------+--------------  \u0413\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u043e\u0444\u0438\u0441 | \u0414\u0438\u0440\u0435\u043a\u0442\u043e\u0440      |  \u0424\u0438\u043b\u0438\u0430\u043b        | \u0414\u0438\u0440\u0435\u043a\u0442\u043e\u0440      |  \u0424\u0438\u043b\u0438\u0430\u043b        | \u0417\u0430\u043c.\u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0430 | \u0414\u0438\u0440\u0435\u043a\u0442\u043e\u0440 (3 rows) <\/code><\/pre>\n<p>  \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u0447\u0442\u043e \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u0441 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u043e\u043c \u0444\u0438\u043b\u0438\u0430\u043b\u0430, \u0430 \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u043e\u043f\u0446\u0438\u0438 ON DELETE SET NULL \u043d\u0430\u0434\u0435\u0435\u043c\u0441\u044f, \u0447\u0442\u043e \u0435\u0433\u043e \u043f\u043e\u0434\u0447\u0438\u043d\u0435\u043d\u043d\u044b\u0435 \u043f\u043e\u043a\u0430 \u043e\u0441\u0442\u0430\u043d\u0443\u0442\u0441\u044f \u0431\u0435\u0437 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044f:<\/p>\n<pre><code class=\"pgsql\">DELETE FROM employees     WHERE company_code = '\u0424\u0438\u043b\u0438\u0430\u043b' AND employee_code = '\u0414\u0438\u0440\u0435\u043a\u0442\u043e\u0440'; <\/code><\/pre>\n<pre><code class=\"plaintext\">ERROR:  null value in column \"company_code\" of relation \"employees\" violates not-null constraint DETAIL:  Failing row contains (null, \u0417\u0430\u043c.\u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0430, null). <\/code><\/pre>\n<p>  \u041d\u043e \u0432 \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u043e\u043c \u0432\u043d\u0435\u0448\u043d\u0435\u043c \u043a\u043b\u044e\u0447\u0435 \u0441\u0442\u043e\u043b\u0431\u0435\u0446 company_id \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0435\u0449\u0435 \u0438 \u0447\u0430\u0441\u0442\u044c\u044e \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u0435\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 NULL \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f.<\/p>\n<p>  \u0412 15-\u0439 \u0432\u0435\u0440\u0441\u0438\u0438, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044f \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u043a\u043b\u044e\u0447 \u0441 ON DELETE SET NULL|DEFAULT \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432, \u043a \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u044d\u0442\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f:<\/p>\n<pre><code class=\"pgsql\">ALTER TABLE employees     DROP CONSTRAINT employees_manager_fkey,        ADD CONSTRAINT employees_manager_fkey             FOREIGN KEY (company_code, manager_code)             REFERENCES employees (company_code, employee_code)              ON DELETE SET NULL (manager_code); <\/code><\/pre>\n<p>  \u0422.\u0435. \u043c\u044b \u0445\u043e\u0442\u0438\u043c, \u0447\u0442\u043e\u0431\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u0434 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044f \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u043b\u0441\u044f \u0432 NULL, \u0430 \u043a\u043e\u0434 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u043f\u0443\u0441\u0442\u044c \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439.<\/p>\n<pre><code class=\"pgsql\">DELETE FROM employees     WHERE company_code = '\u0424\u0438\u043b\u0438\u0430\u043b' AND employee_code = '\u0414\u0438\u0440\u0435\u043a\u0442\u043e\u0440'; SELECT * FROM employees; <\/code><\/pre>\n<pre><code class=\"plaintext\"> company_code  | employee_code | manager_code ---------------+---------------+--------------  \u0413\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u043e\u0444\u0438\u0441 | \u0414\u0438\u0440\u0435\u043a\u0442\u043e\u0440      |  \u0424\u0438\u043b\u0438\u0430\u043b        | \u0417\u0430\u043c.\u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0430 | (2 rows) <\/code><\/pre>\n<p>  \u0422\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0434\u043b\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u0430\u043c\u0438 \u0438 \u0433\u0434\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0447\u0435\u0442\u043a\u043e\u0435 \u0440\u0430\u0437\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445. \u0414\u043b\u044f \u044d\u0442\u0438\u0445 \u0446\u0435\u043b\u0435\u0439 \u0432 \u043a\u0430\u0436\u0434\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0432 \u0441\u043e\u0441\u0442\u0430\u0432 \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430 \u043c\u043e\u0436\u043d\u043e \u0441\u043c\u0435\u043b\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u043d\u0435\u043a\u0438\u0439 tenant_id \u043d\u0435 \u0431\u043e\u044f\u0441\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u044b\u0448\u0435\u043e\u043f\u0438\u0441\u0430\u043d\u043d\u0443\u044e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443.<\/p>\n<p>  <b><a href=\"https:\/\/commitfest.postgresql.org\/37\/3307\/\">UNIQUE \u0438 NULL<\/a><\/b><br \/>  commit: <a href=\"https:\/\/github.com\/postgres\/postgres\/commit\/94aa7cc5\">94aa7cc5<\/a><\/p>\n<p>  \u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0434\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f NULL. \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 15-\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0443\u0442\u043e\u0447\u043d\u0435\u043d\u0438\u0435.<\/p>\n<p>  \u0421\u043e\u0437\u0434\u0430\u0432\u0430\u044f \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043c\u043e\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u0430\u043a \u0442\u0440\u0430\u043a\u0442\u043e\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f NULL:   <\/p>\n<ul>\n<li>NULLS DISTINCT \u2015 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f NULL \u0441\u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f \u0440\u0430\u0437\u043d\u044b\u043c\u0438, \u044d\u0442\u043e \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e.<\/li>\n<li>NULLS NOT DISTINCT \u2015 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f NULL \u0441\u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c\u0438.<\/li>\n<\/ul>\n<p>  \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043d\u043e\u0432\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435:<\/p>\n<pre><code class=\"pgsql\">CREATE TABLE test (     c1 int,     c2 int,     UNIQUE NULLS NOT DISTINCT (c1,c2) ); <\/code><\/pre>\n<p>  \u0412 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f UNIQUE \u043f\u043e\u044f\u0432\u0438\u043b\u043e\u0441\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 \u0443\u0442\u043e\u0447\u043d\u0435\u043d\u0438\u0435:<\/p>\n<pre><code class=\"pgsql\">\\d test <\/code><\/pre>\n<pre><code class=\"plaintext\">               Table \"bookings.test\"  Column |  Type   | Collation | Nullable | Default --------+---------+-----------+----------+---------  c1     | integer |           |          |  c2     | integer |           |          | Indexes:     \"test_c1_c2_key\" UNIQUE CONSTRAINT, btree (c1, c2) NULLS NOT DISTINCT <\/code><\/pre>\n<p>  \u0417\u0430\u043f\u0438\u0441\u0438 \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443, \u043f\u043e\u043a\u0430 \u043d\u0435\u0442 \u0434\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 NULL.<\/p>\n<pre><code class=\"pgsql\">INSERT INTO test VALUES     (1, NULL),     (NULL, 1),     (NULL, NULL); <\/code><\/pre>\n<p>  \u041e\u0434\u043d\u0430\u043a\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043b\u044e\u0431\u0443\u044e \u0438\u0437 \u044d\u0442\u0438\u0445 \u0441\u0442\u0440\u043e\u043a \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f, \u043e\u043d\u0438 \u043d\u0435 \u043f\u0440\u043e\u0439\u0434\u0443\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u043d\u0430 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c:<\/p>\n<pre><code class=\"pgsql\">INSERT INTO test VALUES (1, NULL); <\/code><\/pre>\n<pre><code class=\"plaintext\">ERROR:  duplicate key value violates unique constraint \"test_c1_c2_key\" DETAIL:  Key (c1, c2)=(1, null) already exists. <\/code><\/pre>\n<pre><code class=\"pgsql\">INSERT INTO test VALUES (NULL, 1); <\/code><\/pre>\n<pre><code class=\"plaintext\">ERROR:  duplicate key value violates unique constraint \"test_c1_c2_key\" DETAIL:  Key (c1, c2)=(null, 1) already exists. <\/code><\/pre>\n<pre><code class=\"pgsql\">INSERT INTO test VALUES (NULL, NULL); <\/code><\/pre>\n<pre><code class=\"plaintext\">ERROR:  duplicate key value violates unique constraint \"test_c1_c2_key\" DETAIL:  Key (c1, c2)=(null, null) already exists. <\/code><\/pre>\n<p>  \u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435 \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432:<\/p>\n<pre><code class=\"pgsql\">CREATE UNIQUE INDEX index_name ON table_name (column_list) NULLS NOT DISTINCT; <\/code><\/pre>\n<p>  \u0424\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u044d\u0442\u043e \u043f\u0430\u0442\u0447 \u0438\u0437 \u043c\u0430\u0440\u0442\u043e\u0432\u0441\u043a\u043e\u0433\u043e \u043a\u043e\u043c\u043c\u0438\u0442\u0444\u0435\u0441\u0442\u0430, \u043d\u043e \u0441\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u0444\u0435\u0432\u0440\u0430\u043b\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0443\u0441\u0442\u044c \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442 \u044f\u043d\u0432\u0430\u0440\u0441\u043a\u0438\u0439.<\/p>\n<hr\/>\n<p>  \u041d\u0430 \u044d\u0442\u043e\u043c \u043f\u043e\u043a\u0430 \u0432\u0441\u0451. \u0412\u043f\u0435\u0440\u0435\u0434\u0438 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u0430\u0440\u0442\u043e\u0432\u0441\u043a\u0438\u0439 \u043a\u043e\u043c\u043c\u0438\u0442\u0444\u0435\u0441\u0442, \u043f\u043e\u0441\u043b\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u0432\u043e\u0434\u0438\u0442\u044c \u0438\u0442\u043e\u0433\u0438 \u0432\u0441\u0435\u0433\u043e \u0440\u0435\u043b\u0438\u0437\u043d\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430 15-\u0439 \u0432\u0435\u0440\u0441\u0438\u0438.<\/div>\n<\/div>\n<\/div>\n<div class=\"v-portal\" style=\"display:none;\"><\/div>\n<\/div>\n<p> <!----> <!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/company\/postgrespro\/blog\/651143\/\"> https:\/\/habr.com\/ru\/company\/postgrespro\/blog\/651143\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\u041f\u0435\u0440\u0432\u044b\u0435 \u0442\u0440\u0438 \u043a\u043e\u043c\u043c\u0438\u0442\u0444\u0435\u0441\u0442\u0430 15-\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 (<a href=\"https:\/\/habr.com\/ru\/company\/postgrespro\/blog\/572782\/\">2021-07<\/a>, <a href=\"https:\/\/habr.com\/ru\/company\/postgrespro\/blog\/583070\/\">2021-09<\/a>, <a href=\"https:\/\/habr.com\/ru\/company\/postgrespro\/blog\/596567\/\">2021-11<\/a>) \u043d\u0435 \u0431\u0430\u043b\u043e\u0432\u0430\u043b\u0438 \u043d\u0430\u0441 \u043a\u0440\u0443\u043f\u043d\u044b\u043c\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u043c\u0438. \u041d\u0435 \u0441\u0442\u0430\u043b \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u0438 \u0447\u0435\u0442\u0432\u0435\u0440\u0442\u044b\u0439, \u044f\u043d\u0432\u0430\u0440\u0441\u043a\u0438\u0439 \u043a\u043e\u043c\u043c\u0438\u0442\u0444\u0435\u0441\u0442. \u041d\u043e \u0432\u0441\u0451-\u0442\u0430\u043a\u0438 \u043d\u0430\u0439\u0434\u0435\u0442\u0441\u044f \u043e \u0447\u0435\u043c \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c.  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-329479","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/329479","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=329479"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/329479\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=329479"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=329479"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=329479"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}