{"id":39169,"date":"2019-10-31T22:28:14","date_gmt":"2019-10-31T19:28:14","guid":{"rendered":"https:\/\/prohoster.info\/blog\/postgresql-i-nastrojki-soglasovannosti-zapisi-dlya-kazhdogo-konkretnogo-soedineniya\/"},"modified":"2019-10-31T22:28:14","modified_gmt":"2019-10-31T19:28:14","slug":"postgresql-i-nastrojki-soglasovannosti-zapisi-dlya-kazhdogo-konkretnogo-soedineniya","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/postgresql-i-nastrojki-soglasovannosti-zapisi-dlya-kazhdogo-konkretnogo-soedineniya","title":{"rendered":"PostgreSQL i ustawienia sp\u00f3jno\u015bci zapisu dla konkretnego po\u0142\u0105czenia","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><em>T\u0142umaczenie artyku\u0142u przygotowano specjalnie dla student\u00f3w kursu <noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/jCX0\/\">\u201eBazy Danych\u201c<\/a><\/noindex>. Zainteresowany rozwojem w tym kierunku? Zapraszamy na <noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/jCX0\/\">Dzie\u0144 Otwarty<\/a><\/noindex>, na kt\u00f3rym szczeg\u00f3\u0142owo opowiemy o programie, cechach formatu online, kompetencjach oraz perspektywach zawodowych, kt\u00f3re czekaj\u0105 na absolwent\u00f3w po uko\u0144czeniu nauki.<\/em><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL i ustawienia sp\u00f3jno\u015bci zapisu dla konkretnego po\u0142\u0105czenia\" src=\"\/wp-content\/uploads\/2019\/10\/e69e30ba059af157f021c9cb33a59f51.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>PostgreSQL i ustawienia sp\u00f3jno\u015bci zapisu dla konkretnego po\u0142\u0105czenia<br \/>\nW Compose mamy do czynienia z wieloma bazami danych, co daje nam mo\u017cliwo\u015b\u0107 bli\u017cszego zapoznania si\u0119 z ich funkcjonalno\u015bci\u0105 i niedoci\u0105gni\u0119ciami. W miar\u0119 jak uczymy si\u0119 docenia\u0107 funkcjonalne cechy nowych baz danych, czasami zaczynamy my\u015ble\u0107 o tym, jak dobrze by\u0142oby, gdyby podobne funkcje by\u0142y dost\u0119pne r\u00f3wnie\u017c w bardziej dojrza\u0142ych narz\u0119dziach, z kt\u00f3rymi pracujemy ju\u017c od d\u0142u\u017cszego czasu. Jedn\u0105 z nowych cech, kt\u00f3rej chcieli\u015bmy do\u015bwiadcza\u0107 w PostgreSQL, by\u0142a konfigurowalna sp\u00f3jno\u015b\u0107 zapisu dla po\u0142\u0105czenia w ca\u0142ym klastrze. Okaza\u0142o si\u0119, \u017ce ju\u017c j\u0105 mamy, a dzisiaj chcemy podzieli\u0107 si\u0119 z Wami informacjami na temat tego, jak mo\u017cecie z niej skorzysta\u0107.<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p><\/p>\n<h1 id=\"zachem-mne-eto\">Dlaczego to dla mnie wa\u017cne?<\/h1>\n<p><\/p>\n<p>To, jak ma si\u0119 zachowywa\u0107 klaster, zale\u017cy od Waszej aplikacji. We\u017amy na przyk\u0142ad aplikacj\u0119 do p\u0142atno\u015bci. Potrzebujecie 100% sp\u00f3jno\u015bci w klastrze, wi\u0119c musicie w\u0142\u0105czy\u0107 synchronizowane zatwierdzenia, aby Wasza baza danych czeka\u0142a, a\u017c wszystkie zmiany zostan\u0105 wprowadzone. Jednak je\u015bli Wasza aplikacja to szybko rozwijaj\u0105ca si\u0119 sie\u0107 spo\u0142eczno\u015bciowa, na pewno wolicie szybk\u0105 reakcj\u0119 nad 100% sp\u00f3jno\u015bci\u0105. Aby to osi\u0105gn\u0105\u0107, mo\u017cecie w swoim klastrze korzysta\u0107 z asynchronicznych zatwierdze\u0144.<\/p>\n<p><\/p>\n<h2 id=\"znakomtes-kompromiss\">Poznajcie kompromis<\/h2>\n<p><\/p>\n<p>B\u0119dziecie musieli p\u00f3j\u015b\u0107 na kompromis mi\u0119dzy sp\u00f3jno\u015bci\u0105 danych a wydajno\u015bci\u0105. PostgreSQL zmienia si\u0119 z punktu widzenia sp\u00f3jno\u015bci, poniewa\u017c konfiguracja domy\u015blna w takim przypadku jest przewidywalna i nie wi\u0105\u017ce si\u0119 z niespodziankami. A teraz przyjrzyjmy si\u0119 kompromisom.<\/p>\n<p><\/p>\n<h3 id=\"kompromiss-1-proizvoditelnost\">Kompromis 1: Wydajno\u015b\u0107<\/h3>\n<p><\/p>\n<p>Je\u015bli klaster PostgreSQL nie wymaga sp\u00f3jno\u015bci, mo\u017ce dzia\u0142a\u0107 asynchronicznie. Zapis jest dokonywany w liderze klastra, a jego replikom aktualizacje b\u0119d\u0105 przesy\u0142ane po kilku milisekundach. Kiedy klaster PostgreSQL wymaga sp\u00f3jno\u015bci, musi dzia\u0142a\u0107 synchronizuj\u0105co. Zapis b\u0119dzie dokonany w liderze klastra, kt\u00f3ry przeka\u017ce aktualizacj\u0119 replikom i poczeka na potwierdzenie, \u017ce ka\u017cdy z nich dokona\u0142 zapisu, zanim odpowie klientowi, kt\u00f3ry zainicjowa\u0142 zapis, informuj\u0105c go, \u017ce zako\u0144czy\u0142 si\u0119 powodzeniem. R\u00f3\u017cnica praktyczna mi\u0119dzy tymi podej\u015bciami polega na tym, \u017ce metoda asynchroniczna wymaga dw\u00f3ch skok\u00f3w sieciowych, a metoda synchronizuj\u0105ca \u2013 czterech. <\/p>\n<p><\/p>\n<h3 id=\"kompromiss-2-soglasovannost\">Kompromis 2: Sp\u00f3jno\u015b\u0107<\/h3>\n<p><\/p>\n<p>W przypadku awarii lidera w tych dw\u00f3ch podej\u015bciach rezultat b\u0119dzie r\u00f3\u017cny. Je\u015bli operacja jest wykonywana asynchronicznie, to w przypadku wyst\u0105pienia takiego b\u0142\u0119du nie wszystkie zapisy b\u0119d\u0105 zarejestrowane przez replik\u0119. Ile zostanie utracone? Zale\u017cy to od samej aplikacji i efektywno\u015bci replikacji. Replikacja Compose uniemo\u017cliwi replikom zostanie liderem, je\u015bli ilo\u015b\u0107 danych w nich jest o 1 MB mniejsza ni\u017c w liderze, co oznacza, \u017ce potencjalnie mo\u017ce zosta\u0107 utracone do 1 MB zapis\u00f3w przy pracy asynchronicznej. <\/p>\n<p><\/p>\n<p>W trybie synchronizuj\u0105cym to nie ma miejsca. Je\u015bli lider zawiod\u0105\u0142, wszystkie repliki s\u0105 aktualizowane, poniewa\u017c ka\u017cdy zapis potwierdzony przez lidera musi by\u0107 potwierdzony w replikach. Oto sp\u00f3jno\u015b\u0107. <\/p>\n<p><\/p>\n<p>Zachowanie synchronizuj\u0105ce ma sens w aplikacji do p\u0142atno\u015bci, gdzie sp\u00f3jno\u015b\u0107 ma wyra\u017an\u0105 przewag\u0119 w znalezieniu kompromisu mi\u0119dzy sp\u00f3jno\u015bci\u0105 a wydajno\u015bci\u0105. Najwa\u017cniejsze dla takiej aplikacji to poprawne dane. A teraz przypomnij sobie o sieci spo\u0142eczno\u015bciowej, w kt\u00f3rej g\u0142\u00f3wnym celem jest zdobycie uwagi u\u017cytkownika poprzez jak najszybsze odpowiadanie na zapytania. W takim przypadku wydajno\u015b\u0107 z mniejsz\u0105 liczb\u0105 skok\u00f3w sieciowych i mniejszym czasem oczekiwania na potwierdzenia b\u0119dzie priorytetem. Jednak kompromis mi\u0119dzy wydajno\u015bci\u0105 a sp\u00f3jno\u015bci\u0105 nie jest jedynym, o kt\u00f3rym warto my\u015ble\u0107.<\/p>\n<p><\/p>\n<h3 id=\"kompromiss-3-sboi\">Kompromis 3: Awarie<\/h3>\n<p><\/p>\n<p>Bardzo wa\u017cne jest zrozumienie, jak klaster zachowuje si\u0119 w czasie awarii. Rozwa\u017cmy sytuacj\u0119, gdy jedna lub wi\u0119cej replik przestaje dzia\u0142a\u0107. Gdy zatwierdzenia s\u0105 przetwarzane asynchronicznie, lider b\u0119dzie kontynuowa\u0142 dzia\u0142anie, to znaczy b\u0119dzie przyjmowa\u0142 i przetwarza\u0142 zapisy, nie czekaj\u0105c na brakuj\u0105ce repliki. Gdy repliki wracaj\u0105 do klastra, doganiaj\u0105 lidera. Przy synchronnej replikacji, je\u015bli repliki nie odpowiadaj\u0105, to lider nie b\u0119dzie mia\u0142 innego wyj\u015bcia i b\u0119dzie czeka\u0142 na potwierdzenie zatwierdzenia, a\u017c replika wr\u00f3ci do klastra i b\u0119dzie mog\u0142a przyj\u0105\u0107 i potwierdzi\u0107 zapis.<\/p>\n<p><\/p>\n<h2 id=\"po-odnomu-soedineniyu-na-tranzakciyu\">Jedno po\u0142\u0105czenie na transakcj\u0119?<\/h2>\n<p><\/p>\n<p>Ka\u017cda aplikacja potrzebuje szczeg\u00f3lnego rodzaju kombinacji sp\u00f3jno\u015bci i wydajno\u015bci. Oczywi\u015bcie je\u015bli nie jest nasz\u0105 aplikacj\u0105 do op\u0142acania rachunk\u00f3w, kt\u00f3r\u0105 wyobra\u017camy sobie jako ca\u0142kowicie sp\u00f3jn\u0105, ani nasz\u0105 niemal efemeryczn\u0105 aplikacj\u0105 spo\u0142eczno\u015bciow\u0105. W wszystkich innych przypadkach b\u0119d\u0105 chwile, gdy niekt\u00f3re operacje musz\u0105 by\u0107 synchronizowane, a inne \u2013 asynchroniczne. Mo\u017ce nie chcesz, aby system czeka\u0142, a\u017c wiadomo\u015b\u0107 wys\u0142ana na czacie zostanie zatwierdzona, ale je\u015bli w tej samej aplikacji odbywa si\u0119 p\u0142atno\u015b\u0107, to trzeba b\u0119dzie czeka\u0107.<\/p>\n<p><\/p>\n<p>Wszystkie te decyzje podejmuje oczywi\u015bcie tw\u00f3rca aplikacji. W\u0142a\u015bciwe podejmowanie decyzji o tym, kiedy zastosowa\u0107 dane podej\u015bcie, pomo\u017ce w pe\u0142ni wykorzysta\u0107 mo\u017cliwo\u015b\u0107 klastra. Wa\u017cne jest, aby tw\u00f3rca m\u00f3g\u0142 prze\u0142\u0105cza\u0107 si\u0119 mi\u0119dzy nimi na poziomie SQL dla po\u0142\u0105cze\u0144 i transakcji. <\/p>\n<p><\/p>\n<h2 id=\"obespechenie-kontrolya-na-praktike\">Zapewnienie kontroli w praktyce<\/h2>\n<p><\/p>\n<p>Domy\u015blnie PostgreSQL zapewnia sp\u00f3jno\u015b\u0107. Jest to kontrolowane parametrem serwera <code>synchronous_commit<\/code>. Domy\u015blnie jest on ustawiony na <code>w\u0142\u0105czony<\/code>, ale ma trzy inne opcje: <code>local<\/code>, <code>remote_write<\/code> lub <code>wy\u0142\u0105czony<\/code>.<\/p>\n<p><\/p>\n<p>Ustawienie tego parametru na <code>wy\u0142\u0105czony<\/code> powoduje, \u017ce wszystkie synchronne zatwierdzenia s\u0105 zatrzymywane, nawet w systemie lokalnym. Parametr w local okre\u015bla tryb synchronny dla systemu lokalnego, ale zapisy do replik s\u0105 wykonywane asynchronicznie. <code>Remote_write<\/code> idzie jeszcze dalej: zapisy do replik s\u0105 wykonywane asynchronicznie, ale wracaj\u0105, gdy replika przyjmie zapis, ale nie zapisze go na dysku.<\/p>\n<p><\/p>\n<p>Rozwa\u017caj\u0105c dost\u0119pny zakres opcji, wybieramy zachowanie i, pami\u0119taj\u0105c, \u017ce <code>w\u0142\u0105czony<\/code> s\u0105 to synchronne zapisy, wybierzemy <code>local<\/code> dla asynchronicznych zatwierdze\u0144 w sieci, pozostawiaj\u0105c lokalne zatwierdzenia synchronnymi.<\/p>\n<p><\/p>\n<p>Teraz powiemy Ci, jak skonfigurowa\u0107 to w mgnieniu oka, ale wyobra\u017a sobie, \u017ce zainstalowali\u015bmy <code>synchronous_commit<\/code> do <code>local<\/code> na serwerze. Zastanawiali\u015bmy si\u0119, czy mo\u017cna zmienia\u0107 parameter <code>synchronous_commit<\/code> w locie, i okaza\u0142o si\u0119, \u017ce mo\u017cna to zrobi\u0107, a co wi\u0119cej, istniej\u0105 na to a\u017c dwa sposoby. Pierwszy \u2013 to ustawienie sesji po\u0142\u0105czenia w nast\u0119puj\u0105cy spos\u00f3b:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">SET SESSION synchronous_commit TO ON;  \n\/\/ Twoje zapisy id\u0105 tutaj<\/code><\/pre>\n<p><\/p>\n<p>Wszystkie kolejne zapisy w sesji b\u0119d\u0105 potwierdza\u0107 operacje zapisu dla replik, zanim zwr\u00f3c\u0105 pozytywny wynik po\u0142\u0105czonemu klientowi. Oczywi\u015bcie, je\u015bli nie zmienisz ustawienia <code>synchronous_commit<\/code> ponownie. Mo\u017cna pomin\u0105\u0107 cz\u0119\u015b\u0107 <code>SESSION<\/code> w poleceniu, poniewa\u017c b\u0119dzie ona mia\u0142a domy\u015bln\u0105 warto\u015b\u0107.<\/p>\n<p><\/p>\n<p>Drugi spos\u00f3b jest dobry, gdy chcesz upewni\u0107 si\u0119, \u017ce otrzymujesz replikacj\u0119 synchronizacyjn\u0105 dla jednej transakcji. W wielu bazach danych typu &#171;NoSQL&#187; poj\u0119cie transakcji nie istnieje, ale istnieje w PostgreSQL. W takim przypadku uruchamiasz transakcj\u0119, a nast\u0119pnie ustawiasz <code>synchronous_commit<\/code> do <code>w\u0142\u0105czony<\/code> przed wykonaniem zapisu dla transakcji. <code>COMMIT<\/code> zako\u0144czy transakcj\u0119, u\u017cywaj\u0105c dowolnej warto\u015bci parametru <code>synchronous_commit<\/code>, kt\u00f3ra by\u0142a ustawiona w danym momencie, chocia\u017c najlepiej jest ustawi\u0107 zmienn\u0105 wcze\u015bniej, aby upewni\u0107 si\u0119, \u017ce inni deweloperzy rozumiej\u0105, \u017ce zapisy nie s\u0105 asynchroniczne.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">BEGIN;  \nSET LOCAL synchronous_commit TO ON;  \n\/\/ Twoje zapisy id\u0105 tutaj\nCOMMIT;  <\/code><\/pre>\n<p><\/p>\n<p>Wszystkie komendy commit transakcji b\u0119d\u0105 teraz potwierdzane, jak zapisane w replikach jeszcze przed tym, jak baza danych zwr\u00f3ci pozytywn\u0105 odpowied\u017a po\u0142\u0105czonemu klientowi.<\/p>\n<p><\/p>\n<h2 id=\"nastroyka-postgresql\">Konfiguracja PostgreSQL<\/h2>\n<p><\/p>\n<p>Do tego momentu wyobra\u017cali\u015bmy sobie system PostgreSQL z <code>synchronous_commit<\/code>, zainstalowanym w <code>local<\/code>. Aby to by\u0142o realne po stronie serwera, b\u0119dziesz musia\u0142 ustawi\u0107 dwa parametry konfiguracji serwera. Kolejny parametr <code>synchronous_standby_names<\/code> wejdzie w swoje prawa, gdy <code>synchronous_commit<\/code> b\u0119dzie w <code>w\u0142\u0105czony<\/code>. Okre\u015bla, kt\u00f3re repliki maj\u0105 prawo do synchronizowanych commit\u00f3w, a my ustawimy go na <code>*<\/code>, co b\u0119dzie oznacza\u0107 wykorzystanie wszystkich replik. Te warto\u015bci s\u0105 zazwyczaj konfigurowane w <noindex><a rel=\"nofollow\" href=\"http:\/\/www.postgresql.org\/docs\/9.4\/static\/config-setting.html#CONFIG-SETTING-CONFIGURATION-FILE\">pliku konfiguracyjnym<\/a><\/noindex> poprzez dodanie: <\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">synchronous_commit = local  \nsynchronous_standby_names='*'<\/code><\/pre>\n<p><\/p>\n<p>Ustawiaj\u0105c parametr <code>synchronous_commit<\/code> na warto\u015b\u0107 <code>local<\/code>, tworzymy system, w kt\u00f3rym lokalne dyski pozostaj\u0105 synchronizowane, ale commity replik sieciowych s\u0105 domy\u015blnie asynchroniczne. Oczywi\u015bcie, je\u015bli zdecydujemy si\u0119 uczyni\u0107 te commity synchronizowanymi, jak pokazano powy\u017cej.<\/p>\n<p><\/p>\n<p>Je\u015bli \u015bledzi\u0142e\u015b rozw\u00f3j <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/compose\/governor\">projektu Governor<\/a><\/noindex>, mogli\u015bcie zauwa\u017cy\u0107 niekt\u00f3re ostatnie zmiany (<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/compose\/governor\/commit\/87f18c01f150b3f1b6f948e852c7add2949f7360\">1<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/compose\/governor\/commit\/dcbe849d33c535b1522ce767803cb77a3ac91a7e\">2<\/a><\/noindex>), kt\u00f3re pozwoli\u0142y u\u017cytkownikom Governor testowa\u0107 te opcje i kontrolowa\u0107 ich sp\u00f3jno\u015b\u0107.<\/p>\n<p><\/p>\n<h2 id=\"esche-para-slov\">Kilka s\u0142\u00f3w wi\u0119cej\u2026<\/h2>\n<p><\/p>\n<p>Jeszcze tydzie\u0144 temu powiedzia\u0142bym, \u017ce nie da si\u0119 tak precyzyjnie skonfigurowa\u0107 PostgreSQL. To w\u0142a\u015bnie wtedy Kurt, cz\u0142onek zespo\u0142u platformy Compose, upiera\u0142 si\u0119, \u017ce taka mo\u017cliwo\u015b\u0107 istnieje. Uspokoi\u0142 moje w\u0105tpliwo\u015bci i znalaz\u0142 w dokumentacji PostgreSQL <noindex><a rel=\"nofollow\" href=\"http:\/\/www.postgresql.org\/docs\/devel\/static\/runtime-config-wal.html#GUC-SYNCHRONOUS-COMMIT\">nast\u0119puj\u0105ce<\/a><\/noindex>:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL i ustawienia sp\u00f3jno\u015bci zapisu dla konkretnego po\u0142\u0105czenia\" src=\"\/wp-content\/uploads\/2019\/10\/e77e97e588fa3d1e8acbe5de0e26436a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><em>Ten parametr mo\u017ce by\u0107 zmieniany w dowolnym momencie. Zachowanie ka\u017cdej transakcji okre\u015blaj\u0105 ustawienia obowi\u0105zuj\u0105ce podczas commitowania. Dlatego mo\u017cliwe i korzystne jest, aby dla niekt\u00f3rych transakcji commity odbywa\u0142y si\u0119 synchronnie, a dla innych asynchronnie. Na przyk\u0142ad, aby zmusi\u0107 jedn\u0105 <code>multistatement<\/code> transakcj\u0119 do wykonywania commit\u00f3w asynchronicznie, gdy warto\u015b\u0107 parametru domy\u015blnie jest przeciwna, nale\u017cy ustawi\u0107 <\/em><code>SET LOCAL synchronous_commit TO OFF<\/code> <em>w transakcji.<\/em><\/p>\n<p><\/p>\n<p>Dzi\u0119ki takiej niewielkiej modyfikacji w pliku konfiguracyjnym umo\u017cliwili\u015bmy u\u017cytkownikom kontrolowanie ich sp\u00f3jno\u015bci i wydajno\u015bci.<\/p>\n<p>\u0179r\u00f3d\u0142o: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/otus\/blog\/472364\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0435\u0440\u0435\u0432\u043e\u0434 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u043e\u0432 \u043a\u0443\u0440\u0441\u0430 \u00ab\u0411\u0430\u0437\u044b \u0414\u0430\u043d\u043d\u044b\u0445\u00bb. \u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0438? \u041f\u0440\u0438\u0433\u043b\u0430\u0448\u0430\u0435\u043c \u0432\u0430\u0441 \u043d\u0430 \u0414\u0435\u043d\u044c \u041e\u0442\u043a\u0440\u044b\u0442\u044b\u0445 \u0414\u0432\u0435\u0440\u0435\u0439, \u0433\u0434\u0435 \u043c\u044b \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044f\u0445 \u043e\u043d\u043b\u0430\u0439\u043d-\u0444\u043e\u0440\u043c\u0430\u0442\u0430, \u043a\u043e\u043c\u043f\u0435\u0442\u0435\u043d\u0446\u0438\u044f\u0445 \u0438 \u043a\u0430\u0440\u044c\u0435\u0440\u043d\u044b\u0445 \u043f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u0430\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0436\u0434\u0443\u0442 \u0432\u044b\u043f\u0443\u0441\u043a\u043d\u0438\u043a\u043e\u0432 \u043f\u043e\u0441\u043b\u0435 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f. PostgreSQL \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u043d\u043e\u0441\u0442\u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u041d\u0430\u043c \u0432 Compose \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0438\u043c\u0435\u0442\u044c \u0434\u0435\u043b\u043e \u0441\u043e \u043c\u043d\u043e\u0433\u0438\u043c\u0438 \u0431\u0430\u0437\u0430\u043c\u0438 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":29395,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-39169","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0435\u0440\u0435\u0432\u043e\u0434 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u043e\u0432 \u043a\u0443\u0440\u0441\u0430 \u00ab\u0411\u0430\u0437\u044b \u0414\u0430\u043d\u043d\u044b\u0445\u00bb. \u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0438?\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/postgresql-i-nastrojki-soglasovannosti-zapisi-dlya-kazhdogo-konkretnogo-soedineniya\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"pl_PL\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47PostgreSQL \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u043d\u043e\u0441\u0442\u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0435\u0440\u0435\u0432\u043e\u0434 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u043e\u0432 \u043a\u0443\u0440\u0441\u0430 \u00ab\u0411\u0430\u0437\u044b \u0414\u0430\u043d\u043d\u044b\u0445\u00bb. \u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0438?\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/postgresql-i-nastrojki-soglasovannosti-zapisi-dlya-kazhdogo-konkretnogo-soedineniya\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T19:28:14+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:28:14+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47PostgreSQL i ustawienia sp\u00f3jno\u015bci zapisu dla ka\u017cdego konkretnego po\u0142\u0105czenia | ProHoster","description":"T\u0142umaczenie artyku\u0142u przygotowane specjalnie dla student\u00f3w kursu \u201eBazy Danych\u201d. Interesuje ci\u0119 rozw\u00f3j w tym kierunku?","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/postgresql-i-nastrojki-soglasovannosti-zapisi-dlya-kazhdogo-konkretnogo-soedineniya","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pl_PL","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47PostgreSQL \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u043d\u043e\u0441\u0442\u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f | ProHoster","og:description":"\u041f\u0435\u0440\u0435\u0432\u043e\u0434 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u043e\u0432 \u043a\u0443\u0440\u0441\u0430 \u00ab\u0411\u0430\u0437\u044b \u0414\u0430\u043d\u043d\u044b\u0445\u00bb. \u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0438?","og:url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/postgresql-i-nastrojki-soglasovannosti-zapisi-dlya-kazhdogo-konkretnogo-soedineniya","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T19:28:14+00:00","article:modified_time":"2019-10-31T19:28:14+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"39169","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-24 01:05:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 00:54:44","updated":"2026-01-24 01:05:19","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/39169","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/comments?post=39169"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/39169\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media\/29395"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=39169"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=39169"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=39169"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}