Как ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ…ΠΌΠ΅ ΠΌΡŠΡ€Π·Π΅Π»ΠΈΠ²Π° рСпликация Π·Π° Π²ΡŠΠ·ΡΡ‚Π°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅ слСд срив с PostgreSQL

Как ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ…ΠΌΠ΅ ΠΌΡŠΡ€Π·Π΅Π»ΠΈΠ²Π° рСпликация Π·Π° Π²ΡŠΠ·ΡΡ‚Π°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅ слСд срив с PostgreSQL
РСпликацията Π½Π΅ Π΅ Ρ€Π΅Π·Π΅Ρ€Π²Π½ΠΎ ΠΊΠΎΠΏΠΈΠ΅. Или Π½Π΅? Π•Ρ‚ΠΎ ΠΊΠ°ΠΊ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ…ΠΌΠ΅ ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½Π° рСпликация Π·Π° Π²ΡŠΠ·ΡΡ‚Π°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅ ΠΎΡ‚ случайно ΠΈΠ·Ρ‚Ρ€ΠΈΡ‚ΠΈ ΠΏΡ€Π΅ΠΊΠΈ ΠΏΡŠΡ‚ΠΈΡ‰Π°.

БпСциалисти ΠΏΠΎ инфраструктура GitLab отговаря Π·Π° Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚Π° GitLab.com - Π½Π°ΠΉ-голСмият СкзСмпляр Π½Π° GitLab Π² ΠΏΡ€ΠΈΡ€ΠΎΠ΄Π°Ρ‚Π°. Π‘ 3 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΠΈ ΠΈ Π±Π»ΠΈΠ·ΠΎ 7 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, Ρ‚ΠΎΠ²Π° Π΅ Π΅Π΄ΠΈΠ½ ΠΎΡ‚ Π½Π°ΠΉ-Π³ΠΎΠ»Π΅ΠΌΠΈΡ‚Π΅ SaaS сайтовС с ΠΎΡ‚Π²ΠΎΡ€Π΅Π½ ΠΊΠΎΠ΄ със спСциална Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°. Π‘Π΅Π· систСмата Π·Π° Π±Π°Π·ΠΈ Π΄Π°Π½Π½ΠΈ PostgreSQL инфраструктурата Π½Π° GitLab.com няма Π΄Π° стигнС Π΄Π°Π»Π΅Ρ‡ ΠΈ ΠΊΠ°ΠΊΠ²ΠΎ ΠΏΡ€Π°Π²ΠΈΠΌ, Π·Π° Π΄Π° осигурим толСрантност към Π³Ρ€Π΅ΡˆΠΊΠΈ Π² случай Π½Π° ΠΏΠΎΠ²Ρ€Π΅Π΄ΠΈ, ΠΊΠΎΠ³Π°Ρ‚ΠΎ Π΄Π°Π½Π½ΠΈΡ‚Π΅ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ Π·Π°Π³ΡƒΠ±Π΅Π½ΠΈ. Малко вСроятно Π΅ Π΄Π° сС случи Ρ‚Π°ΠΊΠΎΠ²Π° бСдствиС, Π½ΠΎ Π½ΠΈΠ΅ смС Π΄ΠΎΠ±Ρ€Π΅ ΠΏΠΎΠ΄Π³ΠΎΡ‚Π²Π΅Π½ΠΈ ΠΈ запасСни с Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΈ Π·Π° Π°Ρ€Ρ…ΠΈΠ²ΠΈΡ€Π°Π½Π΅ ΠΈ рСпликация.

РСпликацията Π½Π΅ Π΅ срСдство Π·Π° Π°Ρ€Ρ…ΠΈΠ²ΠΈΡ€Π°Π½Π΅ Π½Π° Π±Π°Π·ΠΈ Π΄Π°Π½Π½ΠΈ (Π²ΠΈΠΆ ΠΎΡ‚Π΄ΠΎΠ»Ρƒ). Но сСга Ρ‰Π΅ Π²ΠΈΠ΄ΠΈΠΌ ΠΊΠ°ΠΊ Π±ΡŠΡ€Π·ΠΎ Π΄Π° Π²ΡŠΠ·ΡΡ‚Π°Π½ΠΎΠ²ΠΈΠΌ случайно ΠΈΠ·Ρ‚Ρ€ΠΈΡ‚ΠΈ Π΄Π°Π½Π½ΠΈ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° ΠΌΡŠΡ€Π·Π΅Π»ΠΈΠ²Π° рСпликация: on GitLab.com ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π» ΠΈΠ·Ρ‚Ρ€ΠΈ прСкия ΠΏΡŠΡ‚ Π·Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° gitlab-ce ΠΈ Π·Π°Π³ΡƒΠ±Π΅Π½ΠΈ Π²Ρ€ΡŠΠ·ΠΊΠΈ със заявки Π·Π° сливанС ΠΈ Π·Π°Π΄Π°Ρ‡ΠΈ.

Π‘ ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½Π° Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ° Π²ΡŠΠ·ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ…ΠΌΠ΅ Π΄Π°Π½Π½ΠΈΡ‚Π΅ само Π·Π° 1,5 часа. Π’ΠΈΠΆΡ‚Π΅ ΠΊΠ°ΠΊ стана.

Π’ΡŠΠ·ΡΡ‚Π°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅ във Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ с PostgreSQL

PostgreSQL ΠΈΠΌΠ° Π²Π³Ρ€Π°Π΄Π΅Π½Π° функция, която Π²ΡŠΠ·ΡΡ‚Π°Π½ΠΎΠ²ΡΠ²Π° ΡΡŠΡΡ‚ΠΎΡΠ½ΠΈΠ΅Ρ‚ΠΎ Π½Π° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ Π΄ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΎΡ‚ Π²Ρ€Π΅ΠΌΠ΅. Нарича сС Π’ΡŠΠ·ΡΡ‚Π°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅ Π² Π΄Π°Π΄Π΅Π½ ΠΌΠΎΠΌΠ΅Π½Ρ‚ (PITR) ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΡΡŠΡ‰ΠΈΡ‚Π΅ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ°Ρ‚ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ‚Π° Π°ΠΊΡ‚ΡƒΠ°Π»Π½Π°: Π·Π°ΠΏΠΎΡ‡Π²Π°ΠΉΠΊΠΈ с Π½Π°Π΄Π΅ΠΆΠ΄Π½Π° ΠΌΠΎΠΌΠ΅Π½Ρ‚Π½Π° снимка Π½Π° цСлия ΠΊΠ»ΡŠΡΡ‚Π΅Ρ€ Π½Π° Π±Π°Π·Π°Ρ‚Π° Π΄Π°Π½Π½ΠΈ (Π±Π°Π·ΠΎΠ² Π°Ρ€Ρ…ΠΈΠ²), Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠ»Π°Π³Π°ΠΌΠ΅ ΠΏΠΎΡ€Π΅Π΄ΠΈΡ†Π° ΠΎΡ‚ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ Π² ΡΡŠΡΡ‚ΠΎΡΠ½ΠΈΠ΅Ρ‚ΠΎ Π΄ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ ΠΌΠΎΠΌΠ΅Π½Ρ‚ във Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ.

Π—Π° Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Ρ‚Π°Π·ΠΈ функция Π·Π° студСно Π°Ρ€Ρ…ΠΈΠ²ΠΈΡ€Π°Π½Π΅, Π½ΠΈΠ΅ Ρ€Π΅Π΄ΠΎΠ²Π½ΠΎ ΠΏΡ€Π°Π²ΠΈΠΌ основно Π°Ρ€Ρ…ΠΈΠ²ΠΈΡ€Π°Π½Π΅ Π½Π° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ ΠΈ Π³ΠΎ ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π°ΠΌΠ΅ Π² Π°Ρ€Ρ…ΠΈΠ² (Π°Ρ€Ρ…ΠΈΠ²ΠΈΡ‚Π΅ Π½Π° GitLab ТивСят Π² ΠžΠ±Π»Π°Ρ‡Π½ΠΎ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ Π½Π° Google). НиС ΡΡŠΡ‰ΠΎ Ρ‚Π°ΠΊΠ° наблюдавамС ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ Π² ΡΡŠΡΡ‚ΠΎΡΠ½ΠΈΠ΅Ρ‚ΠΎ Π½Π° Π±Π°Π·Π°Ρ‚Π° Π΄Π°Π½Π½ΠΈ, ΠΊΠ°Ρ‚ΠΎ Π°Ρ€Ρ…ΠΈΠ²ΠΈΡ€Π°ΠΌΠ΅ Π΄Π½Π΅Π²Π½ΠΈΠΊΠ° Π·Π° ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»Π΅Π½ запис (Π΄Π½Π΅Π²Π½ΠΈΠΊ Π·Π° ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»Π½ΠΎ записванС, WAL). И с всичко Ρ‚ΠΎΠ²Π° Π½Π° място, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌ PITR Π·Π° Π²ΡŠΠ·ΡΡ‚Π°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅ слСд бСдствиС: Π·Π°ΠΏΠΎΡ‡Π²Π°ΠΉΠΊΠΈ с ΠΌΠΎΠΌΠ΅Π½Ρ‚Π½Π°Ρ‚Π° снимка, Π½Π°ΠΏΡ€Π°Π²Π΅Π½Π° ΠΏΡ€Π΅Π΄ΠΈ ΠΏΠΎΠ²Ρ€Π΅Π΄Π°Ρ‚Π°, ΠΈ ΠΏΡ€ΠΈΠ»Π°Π³Π°ΠΉΠΊΠΈ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ ΠΎΡ‚ WAL Π°Ρ€Ρ…ΠΈΠ²Π° Π΄ΠΎ ΠΏΠΎΠ²Ρ€Π΅Π΄Π°Ρ‚Π°.

Какво Π΅ ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½Π° рСпликация?

ΠœΡŠΡ€Π·Π΅Π»ΠΈΠ²Π° рСпликация Π΅ ΠΏΡ€ΠΈΠ»Π°Π³Π°Π½Π΅Ρ‚ΠΎ Π½Π° ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ ΠΎΡ‚ WAL със закъснСниС. ВоСст транзакцията Π΅ станала Π·Π° час X, Π½ΠΎ Ρ‰Π΅ сС появи Π² Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ‚Π° със закъснСниС d Π² Π΅Π΄ΠΈΠ½ часа X + d.

PostgreSQL ΠΈΠΌΠ° 2 Π½Π°Ρ‡ΠΈΠ½Π° Π·Π° настройка Π½Π° физичСска Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ° Π½Π° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ: Π²ΡŠΠ·ΡΡ‚Π°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅ Π½Π° Ρ€Π΅Π·Π΅Ρ€Π²Π½ΠΎ ΠΊΠΎΠΏΠΈΠ΅ ΠΈ рСпликация Π½Π° ΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎ ΠΏΡ€Π΅Π΄Π°Π²Π°Π½Π΅. Π’ΡŠΠ·ΡΡ‚Π°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅ ΠΎΡ‚ Π°Ρ€Ρ…ΠΈΠ², ΠΏΠΎ ΡΡŠΡ‰Π΅ΡΡ‚Π²ΠΎ Ρ€Π°Π±ΠΎΡ‚ΠΈ ΠΊΠ°Ρ‚ΠΎ PITR, Π½ΠΎ Π½Π΅ΠΏΡ€Π΅ΠΊΡŠΡΠ½Π°Ρ‚ΠΎ: Π½ΠΈΠ΅ постоянно ΠΈΠ·Π²Π»ΠΈΡ‡Π°ΠΌΠ΅ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ ΠΎΡ‚ WAL Π°Ρ€Ρ…ΠΈΠ²Π° ΠΈ Π³ΠΈ ΠΏΡ€ΠΈΠ»Π°Π³Π°ΠΌΠ΅ към Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ‚Π°. А ΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈΡ€Π°Π½Π΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ ΠΈΠ·Π²Π»ΠΈΡ‡Π° WAL ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΎΡ‚ хоста Π½Π° Π±Π°Π·Π°Ρ‚Π° Π΄Π°Π½Π½ΠΈ Π½Π°Π³ΠΎΡ€Π΅. НиС ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°ΠΌΠ΅ Π°Ρ€Ρ…ΠΈΠ²Π½ΠΎ Π²ΡŠΠ·ΡΡ‚Π°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅ - Ρ‚ΠΎ Π΅ ΠΏΠΎ-лСсно Π·Π° ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΈ ΠΈΠΌΠ° Π½ΠΎΡ€ΠΌΠ°Π»Π½Π° производитСлност, която Π΅ Π² ΠΊΡ€Π°ΠΊ с производствСния ΠΊΠ»ΡŠΡΡ‚Π΅Ρ€.

Как Π΄Π° настроитС ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½ΠΎ Π²ΡŠΠ·ΡΡ‚Π°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅ ΠΎΡ‚ Π°Ρ€Ρ…ΠΈΠ²

ΠžΠΏΡ†ΠΈΠΈ Π·Π° Π²ΡŠΠ·ΡΡ‚Π°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅ описани във Ρ„Π°ΠΉΠ»Π° recovery.conf, ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

standby_mode = 'on'
restore_command = '/usr/bin/envdir /etc/wal-e.d/env /opt/wal-e/bin/wal-e wal-fetch -p 4 "%f" "%p"'
recovery_min_apply_delay = '8h'
recovery_target_timeline = 'latest'

Π‘ Ρ‚Π΅Π·ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Ρ…ΠΌΠ΅ ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½Π° Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ° с Π²ΡŠΠ·ΡΡ‚Π°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅ Π½Π° Ρ€Π΅Π·Π΅Ρ€Π²Π½ΠΎ ΠΊΠΎΠΏΠΈΠ΅. Π’ΡƒΠΊ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΡƒΠΎΠ»-Π΅ Π·Π° ΠΈΠ·Π²Π»ΠΈΡ‡Π°Π½Π΅ Π½Π° WAL сСгмСнти (restore_command) ΠΎΡ‚ Π°Ρ€Ρ…ΠΈΠ²Π° ΠΈ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ Ρ‰Π΅ Π±ΡŠΠ΄Π°Ρ‚ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈ слСд осСм часа (recovery_min_apply_delay). Π Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ‚Π° Ρ‰Π΅ слСди Π·Π° ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ във Π²Ρ€Π΅ΠΌΠ΅Π²Π°Ρ‚Π° линия Π² Π°Ρ€Ρ…ΠΈΠ²Π°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΠΎΡ€Π°Π΄ΠΈ ΠΎΡ‚ΠΊΠ°Π· Π½Π° ΠΊΠ»ΡŠΡΡ‚Π΅Ρ€ (recovery_target_timeline).

Π‘ recovery_min_apply_delay ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° настроитС ΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈΡ€Π°Π½Π΅ със закъснСниС, Π½ΠΎ Ρ‚ΡƒΠΊ ΠΈΠΌΠ° няколко ΠΊΠ»ΠΎΠΏΠΊΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ са ΡΠ²ΡŠΡ€Π·Π°Π½ΠΈ със слотовСтС Π·Π° рСпликация, ΠΎΠ±Ρ€Π°Ρ‚Π½Π°Ρ‚Π° Π²Ρ€ΡŠΠ·ΠΊΠ° Π² Ρ€Π΅ΠΆΠΈΠΌ Π½Π° Π³ΠΎΡ€Π΅Ρ‰Π° готовност ΠΈ Ρ‚.Π½. WAL Π°Ρ€Ρ…ΠΈΠ²ΡŠΡ‚ Π²ΠΈ позволява Π΄Π° Π³ΠΈ ΠΈΠ·Π±Π΅Π³Π½Π΅Ρ‚Π΅.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚ΡŠΡ€ recovery_min_apply_delay сС появи само Π² PostgreSQL 9.3. Π’ ΠΏΡ€Π΅Π΄ΠΈΡˆΠ½ΠΈ вСрсии Π·Π° ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½Π° рСпликация трябва Π΄Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Ρ‚Π΅ комбинацията Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π·Π° ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° Π²ΡŠΠ·ΡΡ‚Π°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅Ρ‚ΠΎ (pg_xlog_replay_pause(), pg_xlog_replay_resume()) ΠΈΠ»ΠΈ Π·Π°Π΄Ρ€ΡŠΠΆΡ‚Π΅ WAL сСгмСнти Π² Π°Ρ€Ρ…ΠΈΠ² Π·Π° ΠΏΡ€ΠΎΠ΄ΡŠΠ»ΠΆΠΈΡ‚Π΅Π»Π½ΠΎΡΡ‚Ρ‚Π° Π½Π° забавянСто.

Как PostgreSQL ΠΏΡ€Π°Π²ΠΈ Ρ‚ΠΎΠ²Π°?

Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ½ΠΎ Π΅ Π΄Π° сС Π²ΠΈΠ΄ΠΈ ΠΊΠ°ΠΊ PostgreSQL ΠΏΡ€ΠΈΠ»Π°Π³Π° ΠΌΡŠΡ€Π·Π΅Π»ΠΈΠ²ΠΎ Π²ΡŠΠ·ΡΡ‚Π°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅. НСка Π΄Π° Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ recoveryApplyDelay(XlogReaderState). Извиква сС ΠΎΡ‚ основСн повтарящ сС Ρ†ΠΈΠΊΡŠΠ» Π·Π° всСки запис ΠΎΡ‚ WAL.

static bool
recoveryApplyDelay(XLogReaderState *record)
{
    uint8       xact_info;
    TimestampTz xtime;
    long        secs;
    int         microsecs;

    /* nothing to do if no delay configured */
    if (recovery_min_apply_delay <= 0)
        return false;

    /* no delay is applied on a database not yet consistent */
    if (!reachedConsistency)
        return false;

    /*
     * Is it a COMMIT record?
     *
     * We deliberately choose not to delay aborts since they have no effect on
     * MVCC. We already allow replay of records that don't have a timestamp,
     * so there is already opportunity for issues caused by early conflicts on
     * standbys.
     */
    if (XLogRecGetRmid(record) != RM_XACT_ID)
        return false;

    xact_info = XLogRecGetInfo(record) & XLOG_XACT_OPMASK;

    if (xact_info != XLOG_XACT_COMMIT &&
        xact_info != XLOG_XACT_COMMIT_PREPARED)
        return false;

    if (!getRecordTimestamp(record, &xtime))
        return false;

    recoveryDelayUntilTime =
        TimestampTzPlusMilliseconds(xtime, recovery_min_apply_delay);

    /*
     * Exit without arming the latch if it's already past time to apply this
     * record
     */
    TimestampDifference(GetCurrentTimestamp(), recoveryDelayUntilTime,
                        &secs, &microsecs);
    if (secs <= 0 && microsecs <= 0)
        return false;

    while (true)
    {
        // Shortened:
        // Use WaitLatch until we reached recoveryDelayUntilTime
        // and then
        break;
    }
    return true;
}

Π”ΠΎΠ»Π½Π°Ρ‚Π° линия Π΅, Ρ‡Π΅ забавянСто сС основава Π½Π° физичСското Π²Ρ€Π΅ΠΌΠ΅, записано Π² ΠΊΠ»Π΅ΠΉΠΌΠΎΡ‚ΠΎ Π·Π° Π²Ρ€Π΅ΠΌΠ΅ Π½Π° ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π°Π½Π΅ Π½Π° транзакцията (xtime). ΠšΠ°ΠΊΡ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡ‚Π΅, забавянСто сС ΠΏΡ€ΠΈΠ»Π°Π³Π° само Π·Π° Π°Π½Π³Π°ΠΆΠΈΠΌΠ΅Π½Ρ‚ΠΈ ΠΈ Π½Π΅ засяга Π΄Ρ€ΡƒΠ³ΠΈ записи - всички ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ сС ΠΏΡ€ΠΈΠ»Π°Π³Π°Ρ‚ Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ, Π° Π°Π½Π³Π°ΠΆΠΈΠΌΠ΅Π½Ρ‚ΡŠΡ‚ Π΅ ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ Ρ‰Π΅ Π²ΠΈΠ΄ΠΈΠΌ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ само слСд ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Π½ΠΎΡ‚ΠΎ забавянС.

Как Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ Π·Π°Π±Π°Π²Π΅Π½Π° Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ° Π·Π° Π²ΡŠΠ·ΡΡ‚Π°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ

Π”Π° ΠΊΠ°ΠΆΠ΅ΠΌ, Ρ‡Π΅ ΠΈΠΌΠ°ΠΌΠ΅ ΠΊΠ»ΡŠΡΡ‚Π΅Ρ€ ΠΎΡ‚ Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ ΠΈ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ° с осСмчасово забавянС Π² производството. НСка Π²ΠΈΠ΄ΠΈΠΌ ΠΊΠ°ΠΊ Π΄Π° Π²ΡŠΠ·ΡΡ‚Π°Π½ΠΎΠ²ΠΈΠΌ Π΄Π°Π½Π½ΠΈ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€ случайно ΠΈΠ·Ρ‚Ρ€ΠΈΠ²Π°Π½Π΅ Π½Π° ΠΏΡ€Π΅ΠΊΠΈ ΠΏΡŠΡ‚ΠΈΡ‰Π°.

ΠšΠΎΠ³Π°Ρ‚ΠΎ Π½Π°ΡƒΡ‡ΠΈΡ…ΠΌΠ΅ Π·Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°, Π½ΠΈΠ΅ Π²ΡŠΠ·ΡΡ‚Π°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Π°Ρ€Ρ…ΠΈΠ²Π° Π΅ спряно Π·Π° ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½Π° Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°:

SELECT pg_xlog_replay_pause();

Π‘ ΠΏΠ°ΡƒΠ·Π° нямахмС риск Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ‚Π° Π΄Π° ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΈ заявката DELETE. ПолСзно Π½Π΅Ρ‰ΠΎ, Π°ΠΊΠΎ ΠΈΠΌΠ°Ρ‚Π΅ Π½ΡƒΠΆΠ΄Π° ΠΎΡ‚ Π²Ρ€Π΅ΠΌΠ΅, Π·Π° Π΄Π° Ρ€Π°Π·Π±Π΅Ρ€Π΅Ρ‚Π΅ всичко.

Π’ΡŠΠΏΡ€ΠΎΡΡŠΡ‚ Π΅, Ρ‡Π΅ ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½Π°Ρ‚Π° Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ° трябва Π΄Π° достигнС ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° ΠΏΡ€Π΅Π΄ΠΈ заявката DELETE. ΠŸΡ€ΠΈΠ±Π»ΠΈΠ·ΠΈΡ‚Π΅Π»Π½ΠΎ Π·Π½Π°Π΅Ρ…ΠΌΠ΅ физичСското Π²Ρ€Π΅ΠΌΠ΅ Π½Π° отстраняванС. Π˜Π·Ρ‚Ρ€ΠΈΡ…ΠΌΠ΅ recovery_min_apply_delay ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈ recovery_target_time Π² recovery.conf. Π•Ρ‚ΠΎ ΠΊΠ°ΠΊ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ‚Π° достига точния ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π±Π΅Π· забавянС:

recovery_target_time = '2018-10-12 09:25:00+00'

Π‘ Π²Ρ€Π΅ΠΌΠ΅Π²ΠΈΡ‚Π΅ ΠΏΠ΅Ρ‡Π°Ρ‚ΠΈ Π΅ ΠΏΠΎ-Π΄ΠΎΠ±Ρ€Π΅ Π΄Π° Π½Π°ΠΌΠ°Π»ΠΈΡ‚Π΅ излишъка, Π·Π° Π΄Π° Π½Π΅ пропуснСтС. Вярно Π΅, Ρ‡Π΅ ΠΊΠΎΠ»ΠΊΠΎΡ‚ΠΎ ΠΏΠΎ-голям Π΅ ΡΠΏΠ°Π΄ΡŠΡ‚, Ρ‚ΠΎΠ»ΠΊΠΎΠ²Π° ΠΏΠΎΠ²Π΅Ρ‡Π΅ Π΄Π°Π½Π½ΠΈ Π³ΡƒΠ±ΠΈΠΌ. ΠžΡ‚Π½ΠΎΠ²ΠΎ, Π°ΠΊΠΎ пропуснСм заявката DELETE, всичко Ρ‰Π΅ бъдС ΠΈΠ·Ρ‚Ρ€ΠΈΡ‚ΠΎ ΠΎΡ‚Π½ΠΎΠ²ΠΎ ΠΈ Ρ‰Π΅ трябва Π΄Π° Π·Π°ΠΏΠΎΡ‡Π½Π΅Ρ‚Π΅ ΠΎΡ‚Π½Π°Ρ‡Π°Π»ΠΎ (ΠΈΠ»ΠΈ Π΄ΠΎΡ€ΠΈ Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ студСно Π°Ρ€Ρ…ΠΈΠ²ΠΈΡ€Π°Π½Π΅ Π·Π° PITR).

РСстартирахмС ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½Π°Ρ‚Π° инстанция Π½Π° Postgres ΠΈ WAL сСгмСнтитС сС повтаряха Π΄ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎΡ‚ΠΎ Π²Ρ€Π΅ΠΌΠ΅. ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° прослСдитС Π½Π°ΠΏΡ€Π΅Π΄ΡŠΠΊΠ° Π½Π° Ρ‚ΠΎΠ·ΠΈ Π΅Ρ‚Π°ΠΏ, ΠΊΠ°Ρ‚ΠΎ ΠΏΠΎΠΏΠΈΡ‚Π°Ρ‚Π΅:

SELECT
  -- current location in WAL
  pg_last_xlog_replay_location(),
  -- current transaction timestamp (state of the replica)
  pg_last_xact_replay_timestamp(),
  -- current physical time
  now(),
  -- the amount of time still to be applied until recovery_target_time has been reached
  '2018-10-12 09:25:00+00'::timestamptz - pg_last_xact_replay_timestamp() as delay;

Ако ΠΊΠ»Π΅ΠΉΠΌΠΎΡ‚ΠΎ Π·Π° Π²Ρ€Π΅ΠΌΠ΅ Π²Π΅Ρ‡Π΅ Π½Π΅ сС промСня, Π²ΡŠΠ·ΡΡ‚Π°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅Ρ‚ΠΎ Π΅ Π·Π°Π²ΡŠΡ€ΡˆΠ΅Π½ΠΎ. ДСйствиСто ΠΌΠΎΠΆΠ΅ Π΄Π° сС пСрсонализира recovery_target_actionΠ·Π° затварянС, повишаванС ΠΈΠ»ΠΈ ΠΏΠ°ΡƒΠ·Π° Π½Π° СкзСмпляра слСд ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π΅Π½ ΠΎΠΏΠΈΡ‚ (Ρ‚ΠΎΠΉ Π΅ спрян ΠΏΠΎ ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅).

Π‘Π°Π·Π°Ρ‚Π° Π΄Π°Π½Π½ΠΈ сС Π²ΡŠΡ€Π½Π° Π² ΡΡŠΡΡ‚ΠΎΡΠ½ΠΈΠ΅Ρ‚ΠΎ си ΠΏΡ€Π΅Π΄ΠΈ Ρ‚Π°Π·ΠΈ Π·Π»ΠΎΠΏΠΎΠ»ΡƒΡ‡Π½Π° заявка. Π‘Π΅Π³Π° ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π΄Π° СкспортиратС Π΄Π°Π½Π½ΠΈ. ЕкспортирахмС ΠΈΠ·Ρ‚Ρ€ΠΈΡ‚ΠΈΡ‚Π΅ Π΄Π°Π½Π½ΠΈ Π·Π° Π΅Ρ‚ΠΈΠΊΠ΅Ρ‚ΠΈ ΠΈ всички Π²Ρ€ΡŠΠ·ΠΊΠΈ към ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ ΠΈ заявки Π·Π° сливанС ΠΈ Π³ΠΈ прСмСстихмС Π² производствСната Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ. Ако Π·Π°Π³ΡƒΠ±ΠΈΡ‚Π΅ са Π³ΠΎΠ»Π΅ΠΌΠΈ, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ просто Π΄Π° Ρ€Π΅ΠΊΠ»Π°ΠΌΠΈΡ€Π°Ρ‚Π΅ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ‚Π° ΠΈ Π΄Π° я ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ ΠΊΠ°Ρ‚ΠΎ основна. Но Ρ‚ΠΎΠ³Π°Π²Π° всички ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ слСд Ρ‚ΠΎΡ‡ΠΊΠ°Ρ‚Π°, Π΄ΠΎ която смС сС Π²ΡŠΠ·ΡΡ‚Π°Π½ΠΎΠ²ΠΈΠ»ΠΈ, Ρ‰Π΅ Π±ΡŠΠ΄Π°Ρ‚ Π·Π°Π³ΡƒΠ±Π΅Π½ΠΈ.

ВмСсто Π²Ρ€Π΅ΠΌΠ΅Π²ΠΈ ΠΎΡ‚ΠΏΠ΅Ρ‡Π°Ρ‚ΡŠΡ†ΠΈ Π΅ ΠΏΠΎ-Π΄ΠΎΠ±Ρ€Π΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΈ Π½Π° Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ. ПолСзно Π΅ Π΄Π° записватС Ρ‚Π΅Π·ΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π·Π° DDL ΠΈΠ·Ρ€Π°Π·ΠΈ (ΠΊΠ°Ρ‚ΠΎ Π½Π°ΠΏΡ€ DROP TABLE), ΠΊΠ°Ρ‚ΠΎ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° log_statements = 'ddl'. Ако ΠΈΠΌΠ°Ρ…ΠΌΠ΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π½Π° транзакция, щяхмС Π΄Π° Π²Π·Π΅ΠΌΠ΅ΠΌ recovery_target_xid ΠΈ изпълни всичко Π΄ΠΎ транзакцията ΠΏΡ€Π΅Π΄ΠΈ заявката DELETE.

Π’Ρ€ΡŠΡ‰Π°Π½Π΅Ρ‚ΠΎ Π½Π° Ρ€Π°Π±ΠΎΡ‚Π° Π΅ ΠΌΠ½ΠΎΠ³ΠΎ просто: ΠΏΡ€Π΅ΠΌΠ°Ρ…Π½Π΅Ρ‚Π΅ всички ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ ΠΎΡ‚ recovery.conf ΠΈ рСстартирайтС Postgres. Π Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ‚Π° скоро ΠΎΡ‚Π½ΠΎΠ²ΠΎ Ρ‰Π΅ ΠΈΠΌΠ° осСмчасово забавянС ΠΈ Π½ΠΈΠ΅ смС ΠΏΠΎΠ΄Π³ΠΎΡ‚Π²Π΅Π½ΠΈ Π·Π° Π±ΡŠΠ΄Π΅Ρ‰ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ.

Ползи Π·Π° Π²ΡŠΠ·ΡΡ‚Π°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅

Π‘ ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½Π° Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ° вмСсто студСно Π°Ρ€Ρ…ΠΈΠ²ΠΈΡ€Π°Π½Π΅, Π½Π΅ Π΅ Π½ΡƒΠΆΠ½ΠΎ Π΄Π° ΠΏΡ€Π΅ΠΊΠ°Ρ€Π²Π°Ρ‚Π΅ часовС, Π·Π° Π΄Π° Π²ΡŠΠ·ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚Π΅ цялото ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΎΡ‚ Π°Ρ€Ρ…ΠΈΠ²Π°. НапримСр, ΠΎΡ‚Π½Π΅ΠΌΠ° Π½ΠΈ ΠΏΠ΅Ρ‚ часа, Π·Π° Π΄Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ цялото основно Π°Ρ€Ρ…ΠΈΠ²ΠΈΡ€Π°Π½Π΅ ΠΎΡ‚ 2 TB. И Ρ‚ΠΎΠ³Π°Π²Π° всС ΠΎΡ‰Π΅ трябва Π΄Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠΈΡ‚Π΅ цСлия Π΄Π½Π΅Π²Π΅Π½ WAL, Π·Π° Π΄Π° сС Π²ΡŠΠ·ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚Π΅ Π΄ΠΎ ΠΆΠ΅Π»Π°Π½ΠΎΡ‚ΠΎ ΡΡŠΡΡ‚ΠΎΡΠ½ΠΈΠ΅ (Π² Π½Π°ΠΉ-лошия случай).

ΠžΡ‚Π»ΠΎΠΆΠ΅Π½Π°Ρ‚Π° Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ° Π΅ ΠΏΠΎ-Π΄ΠΎΠ±Ρ€Π° ΠΎΡ‚ студСното Π°Ρ€Ρ…ΠΈΠ²ΠΈΡ€Π°Π½Π΅ ΠΏΠΎ Π΄Π²Π° Π½Π°Ρ‡ΠΈΠ½Π°:

  1. НС Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° ΠΏΡ€Π΅ΠΌΠ°Ρ…Π²Π°Ρ‚Π΅ цСлия основСн Π°Ρ€Ρ…ΠΈΠ² ΠΎΡ‚ Π°Ρ€Ρ…ΠΈΠ²Π°.
  2. Има фиксиран осСмчасов ΠΏΡ€ΠΎΠ·ΠΎΡ€Π΅Ρ† ΠΎΡ‚ WAL сСгмСнти, ΠΊΠΎΠΈΡ‚ΠΎ трябва Π΄Π° сС повтарят.

НиС ΡΡŠΡ‰ΠΎ Ρ‚Π°ΠΊΠ° постоянно провСрявамС Π΄Π°Π»ΠΈ Π΅ възмоТно Π΄Π° сС Π½Π°ΠΏΡ€Π°Π²ΠΈ PITR ΠΎΡ‚ WAL ΠΈ Π±ΡŠΡ€Π·ΠΎ Ρ‰Π΅ Π·Π°Π±Π΅Π»Π΅ΠΆΠΈΠΌ ΠΏΠΎΠ²Ρ€Π΅Π΄Π° ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ с WAL Π°Ρ€Ρ…ΠΈΠ²Π°, ΠΊΠ°Ρ‚ΠΎ наблюдавамС забавянСто Π½Π° ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½Π°Ρ‚Π° Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°.

Π’ Ρ‚ΠΎΠ·ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π²ΡŠΠ·ΡΡ‚Π°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅Ρ‚ΠΎ Π½ΠΈ ΠΎΡ‚Π½Π΅ 50 ΠΌΠΈΠ½ΡƒΡ‚ΠΈ, ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π²Π°, Ρ‡Π΅ скоростта бСшС 110 GB WAL Π΄Π°Π½Π½ΠΈ Π½Π° час (Π°Ρ€Ρ…ΠΈΠ²ΡŠΡ‚ всС ΠΎΡ‰Π΅ бСшС Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ AWS S3). ΠšΠ°Ρ‚ΠΎ цяло Ρ€Π΅ΡˆΠΈΡ…ΠΌΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° ΠΈ Π²ΡŠΠ·ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ…ΠΌΠ΅ Π΄Π°Π½Π½ΠΈΡ‚Π΅ Π·Π° 1,5 часа.

Π Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΠΈ: къдС ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½Π°Ρ‚Π° Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ° Π΅ ΠΏΠΎΠ»Π΅Π·Π½Π° (ΠΈ къдС Π½Π΅)

Π˜Π·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡ‚Π΅ ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½Π° рСпликация ΠΊΠ°Ρ‚ΠΎ ΠΏΡŠΡ€Π²Π° ΠΏΠΎΠΌΠΎΡ‰, Π°ΠΊΠΎ случайно стС Π·Π°Π³ΡƒΠ±ΠΈΠ»ΠΈ Π΄Π°Π½Π½ΠΈ ΠΈ стС забСлязали Ρ‚ΠΎΠ·ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Π² Ρ€Π°ΠΌΠΊΠΈΡ‚Π΅ Π½Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Π½ΠΎΡ‚ΠΎ забавянС.

Но ΠΈΠΌΠ°ΠΉΡ‚Π΅ ΠΏΡ€Π΅Π΄Π²ΠΈΠ΄: рСпликацията Π½Π΅ Π΅ Ρ€Π΅Π·Π΅Ρ€Π²Π½ΠΎ ΠΊΠΎΠΏΠΈΠ΅.

АрхивиранСто ΠΈ рСпликацията ΠΈΠΌΠ°Ρ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Ρ†Π΅Π»ΠΈ. Π‘Ρ‚ΡƒΠ΄Π΅Π½ΠΎΡ‚ΠΎ Π°Ρ€Ρ…ΠΈΠ²ΠΈΡ€Π°Π½Π΅ Ρ‰Π΅ бъдС ΠΏΠΎΠ»Π΅Π·Π½ΠΎ, Π°ΠΊΠΎ случайно стС Π½Π°ΠΏΡ€Π°Π²ΠΈΠ»ΠΈ DELETE ΠΈΠ»ΠΈ DROP TABLE. ΠŸΡ€Π°Π²ΠΈΠΌ Ρ€Π΅Π·Π΅Ρ€Π²Π½ΠΎ ΠΊΠΎΠΏΠΈΠ΅ ΠΎΡ‚ студСно Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ ΠΈ Π²ΡŠΠ·ΡΡ‚Π°Π½ΠΎΠ²ΡΠ²Π°ΠΌΠ΅ ΠΏΡ€Π΅Π΄ΠΈΡˆΠ½ΠΎΡ‚ΠΎ ΡΡŠΡΡ‚ΠΎΡΠ½ΠΈΠ΅ Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ‚Π° ΠΈΠ»ΠΈ цялата Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ. Но Π² ΡΡŠΡ‰ΠΎΡ‚ΠΎ Π²Ρ€Π΅ΠΌΠ΅ ΠΌΠΎΠ»Π±Π°Ρ‚Π° DROP TABLE сС Π²ΡŠΠ·ΠΏΡ€ΠΎΠΈΠ·Π²Π΅ΠΆΠ΄Π° ΠΏΠΎΡ‡Ρ‚ΠΈ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°Π»Π½ΠΎ във всички Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ Π½Π° работния ΠΊΠ»ΡŠΡΡ‚Π΅Ρ€, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½Π°Ρ‚Π° рСпликация няма Π΄Π° ΠΏΠΎΠΌΠΎΠ³Π½Π΅ Ρ‚ΡƒΠΊ. Π‘Π°ΠΌΠ°Ρ‚Π° рСпликация ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ° Π±Π°Π·Π°Ρ‚Π° Π΄Π°Π½Π½ΠΈ Π΄ΠΎΡΡ‚ΡŠΠΏΠ½Π°, ΠΊΠΎΠ³Π°Ρ‚ΠΎ ΠΎΡ‚Π΄Π΅Π»Π½ΠΈΡ‚Π΅ ΡΡŠΡ€Π²ΡŠΡ€ΠΈ сС ΠΎΡ‚Π΄Π°Π²Π°Ρ‚ ΠΏΠΎΠ΄ Π½Π°Π΅ΠΌ ΠΈ разпрСдСля Π½Π°Ρ‚ΠΎΠ²Π°Ρ€Π²Π°Π½Π΅Ρ‚ΠΎ.

Π”ΠΎΡ€ΠΈ ΠΈ с ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½Π° Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°, понякога наистина сС Π½ΡƒΠΆΠ΄Π°Π΅ΠΌ ΠΎΡ‚ студСно Π°Ρ€Ρ…ΠΈΠ²ΠΈΡ€Π°Π½Π΅ Π½Π° сигурно място, Π°ΠΊΠΎ възникнС ΠΏΠΎΠ²Ρ€Π΅Π΄Π° Π² Ρ†Π΅Π½Ρ‚ΡŠΡ€Π° Π·Π° Π΄Π°Π½Π½ΠΈ, скрита ΠΏΠΎΠ²Ρ€Π΅Π΄Π° ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΈ ΡΡŠΠ±ΠΈΡ‚ΠΈΡ, ΠΊΠΎΠΈΡ‚ΠΎ Π½Π΅ сС забСлязват Π²Π΅Π΄Π½Π°Π³Π°. РСпликацията сама ΠΏΠΎ сСбС си Π½Π΅ Π΅ ΠΎΡ‚ ΠΏΠΎΠ»Π·Π° Ρ‚ΡƒΠΊ.

Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Π·Π° GitLab.com Π’ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° Π·Π°Ρ‰ΠΈΡ‚Π°Π²Π°ΠΌΠ΅ срСщу Π·Π°Π³ΡƒΠ±Π° Π½Π° Π΄Π°Π½Π½ΠΈ само Π½Π° Π½ΠΈΠ²ΠΎ систСма ΠΈ Π½Π΅ Π²ΡŠΠ·ΡΡ‚Π°Π½ΠΎΠ²ΡΠ²Π°ΠΌΠ΅ Π΄Π°Π½Π½ΠΈ Π½Π° Π½ΠΈΠ²ΠΎ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π».

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: www.habr.com

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€