
Π Π΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ β Π½Π΅ ΡΠ΅Π·Π΅ΡΠ²Π½ΠΎ ΠΊΠΎΠΏΠΈΡΠ°Π½Π΅. ΠΠ»ΠΈ ΠΌΠΎΠΆΠ΅ Π±ΠΈ Π΄Π°? ΠΡΠΎ ΠΊΠ°ΠΊ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ
ΠΌΠ΅ ΠΎΡΠ»ΠΎΠΆΠ΅Π½Π° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ Π·Π° Π²ΡΠ·ΡΡΠ°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅, ΡΠ»Π΅Π΄ ΠΊΠ°ΡΠΎ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎ ΠΈΠ·ΡΡΠΈΡ
ΠΌΠ΅ ΡΡΠ»ΠΈΡΠΈΡΠ΅.
Π² GitLab ΠΎΡΠ³ΠΎΠ²Π°ΡΡΡ Π·Π° ΡΠ°Π±ΠΎΡΠ°ΡΠ° β Π½Π°ΠΉ-Π³ΠΎΠ»ΡΠΌΠΎΡΠΎ ΠΏΡΠΎΡΠ²Π»Π΅Π½ΠΈΠ΅ Π½Π° GitLab Π² ΡΠ²Π΅ΡΠ°. Π’ΡΠΊ ΠΈΠΌΠ° 3 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈ ΠΈ ΠΏΠΎΡΡΠΈ 7 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ°, ΠΈ ΡΠΎΠ²Π° Π΅ Π΅Π΄ΠΈΠ½ ΠΎΡ Π½Π°ΠΉ-Π³ΠΎΠ»Π΅ΠΌΠΈΡΠ΅ ΠΎΠΏΠ΅Π½ΡΠΎΡΡ ΡΠ°ΠΉΡΠΎΠ²Π΅ SaaS Ρ ΠΎΡΠ΄Π΅Π»Π΅Π½Π° Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ°. ΠΠ΅Π· ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ° Π·Π° Π±Π°Π·ΠΈ Π΄Π°Π½Π½ΠΈ PostgreSQL ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ°ΡΠ° Π½Π° GitLab.com ΡΠ΅ Π±ΡΠ΄Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½Π°, Π·Π°ΡΠΎΠ²Π° Π½ΠΈΠ΅ ΠΏΡΠ°Π²ΠΈΠΌ Π²ΡΠΈΡΠΊΠΎ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ Π·Π° ΠΎΡΠΊΠ°ΠΆΠ°Π½Π΅ Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ° ΠΏΡΠΈ Π²ΡΡΠΊΠ°ΠΊΠ²ΠΈ ΡΡΠΈΠ²ΠΎΠ²Π΅, Π·Π° Π΄Π° Π½Π΅ Π·Π°Π³ΡΠ±ΠΈΠΌ Π΄Π°Π½Π½ΠΈ. ΠΠ΅ΡΠΎΡΡΠ½ΠΎ ΡΠ°ΠΊΠ°Π²Π° ΠΊΠ°ΡΠ°ΡΡΡΠΎΡΠ° Π½ΡΠΌΠ° Π΄Π° ΡΠ΅ ΡΠ»ΡΡΠΈ, Π½ΠΎ Π½ΠΈΠ΅ ΡΠΌΠ΅ Π΄ΠΎΠ±ΡΠ΅ ΠΏΠΎΠ΄Π³ΠΎΡΠ²Π΅Π½ΠΈ Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠΈ Π·Π° ΡΠ΅Π·Π΅ΡΠ²Π½ΠΎ ΠΊΠΎΠΏΠΈΡΠ°Π½Π΅ ΠΈ ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ.
Π Π΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΡΠ° Π½Π΅ Π΅ ΡΡΠ΅Π΄ΡΡΠ²ΠΎ Π·Π° ΡΠ΅Π·Π΅ΡΠ²Π½ΠΎ ΠΊΠΎΠΏΠΈΡΠ°Π½Π΅ Π½Π° Π±Π°Π·ΠΈ Π΄Π°Π½Π½ΠΈ (). ΠΠΎ ΡΠ΅Π³Π° ΡΠ΅ Π²ΠΈΠ΄ΠΈΠΌ ΠΊΠ°ΠΊ Π±ΡΡΠ·ΠΎ Π΄Π° Π²ΡΠ·ΡΡΠ°Π½ΠΎΠ²ΠΈΠΌ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎ ΠΈΠ·ΡΡΠΈΡΠΈ Π΄Π°Π½Π½ΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΠΎΡΠ»ΠΎΠΆΠ΅Π½Π° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ: Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π» Π·Π° ΠΏΡΠΎΠ΅ΠΊΡΠ° ΠΈ Π·Π°Π³ΡΠ±ΠΈΡ Π²ΡΡΠ·ΠΊΠΈΡΠ΅ Ρ ΠΌΠ΅ΡΠΆ-ΡΠ΅ΠΊΠ²Π΅ΡΡΠΈΡΠ΅ ΠΈ Π·Π°Π΄Π°ΡΠΈΡΠ΅.
Π‘ ΠΎΡΠ»ΠΎΠΆΠ΅Π½Π°ΡΠ° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ° Π²ΡΠ·ΡΡΠ°Π½ΠΎΠ²ΠΈΡ ΠΌΠ΅ Π΄Π°Π½Π½ΠΈΡΠ΅ ΡΠ°ΠΌΠΎ Π·Π° 1,5 ΡΠ°ΡΠ°. ΠΠΈΠΆΡΠ΅ ΠΊΠ°ΠΊ Π±Π΅ΡΠ΅.
ΠΡΠ·ΡΡΠ°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅ Π½Π° ΠΌΠΎΠΌΠ΅Π½Ρ ΠΎΡ Π²ΡΠ΅ΠΌΠ΅ Ρ PostgreSQL
PostgreSQL ΡΠ°Π·ΠΏΠΎΠ»Π°Π³Π° Ρ Π²Π³ΡΠ°Π΄Π΅Π½Π° ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΡΠΎ Π²ΡΠ·ΡΡΠ°Π½ΠΎΠ²ΡΠ²Π° ΡΡΡΡΠΎΡΠ½ΠΈΠ΅ΡΠΎ Π½Π° Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ Π΄ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ ΠΌΠΎΠΌΠ΅Π½Ρ. Π’Ρ ΡΠ΅ Π½Π°ΡΠΈΡΠ° (PITR) ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΡΡΡΠΈΡΠ΅ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠΈ, ΠΊΠΎΠΈΡΠΎ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°Ρ Π°ΠΊΡΡΠ°Π»Π½ΠΎΡΡΡΠ° Π½Π° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠ°: Π·Π°ΠΏΠΎΡΠ²Π°ΠΉΠΊΠΈ ΠΎΡ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ ΠΌΠΎΠΌΠ΅Π½ΡΠ΅Π½ ΠΎΠ±ΡΠ°Π· Π½Π° ΡΠ΅Π»ΠΈΡ ΠΊΠ»Π°ΡΡΠ΅Ρ ΠΎΡ Π±Π°Π·ΠΈ Π΄Π°Π½Π½ΠΈ (ΠΎΡΠ½ΠΎΠ²Π½ΠΎ ΡΠ΅Π·Π΅ΡΠ²Π½ΠΎ ΠΊΠΎΠΏΠΈΠ΅), ΠΏΡΠΈΠ»ΠΎΠΆΠΈΠΌ ΡΠ΅Π΄ΠΈΡΠ° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π½Π° ΡΡΡΡΠΎΡΠ½ΠΈΠ΅ΡΠΎ Π΄ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ ΠΌΠΎΠΌΠ΅Π½Ρ.
ΠΠ° Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΡΠ°Π·ΠΈ ΡΡΠ½ΠΊΡΠΈΡ Π·Π° ΡΡΡΠ΄Π΅Π½ΠΎ ΡΠ΅Π·Π΅ΡΠ²Π½ΠΎ ΠΊΠΎΠΏΠΈΠ΅, Π½ΠΈΠ΅ ΡΠ΅Π΄ΠΎΠ²Π½ΠΎ ΠΏΡΠ°Π²ΠΈΠΌ ΠΎΡΠ½ΠΎΠ²Π½ΠΎ ΡΠ΅Π·Π΅ΡΠ²Π½ΠΎ ΠΊΠΎΠΏΠΈΠ΅ Π½Π° Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ ΠΈ Π³ΠΎ ΡΡΡ ΡΠ°Π½ΡΠ²Π°ΠΌΠ΅ Π² Π°ΡΡ ΠΈΠ² (Π°ΡΡ ΠΈΠ²ΠΈΡΠ΅ Π½Π° GitLab ΠΆΠΈΠ²Π΅ΡΡ Π² ). ΠΡΠ²Π΅Π½ ΡΠΎΠ²Π° ΡΠ»Π΅Π΄ΠΈΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡΡΠ° Π½Π° ΡΡΡΡΠΎΡΠ½ΠΈΠ΅ΡΠΎ Π½Π° Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ, Π°ΡΡ ΠΈΠ²ΠΈΡΠ°ΠΉΠΊΠΈ ΠΆΡΡΠ½Π°Π»Π° Π½Π° ΠΏΡΠ΅Π΄ΡΠ΅ΡΡΠ²Π°ΡΠΎΡΠΎ Π·Π°ΠΏΠΈΡΠ²Π°Π½Π΅ (, 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 ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ° ΠΎΡΠ»ΠΎΠΆΠ΅Π½ΠΎΡΠΎ Π²ΡΠ·ΡΡΠ°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅. ΠΠ΅ΠΊΠ° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ . Π’ΠΎΠΉ ΡΠ΅ ΠΈΠ·Π²ΠΈΠΊΠ²Π° ΠΎΡ Π·Π° Π²ΡΡΠΊΠ° Π·Π°ΠΏΠΈΡΡ ΠΎΡ WAL.
static bool
recoveryApplyDelay(XLogReaderState *record)
{
uint8 xact_info;
TimestampTz xtime;
long secs;
int microsecs;
/* ΠΡΠΌΠ° ΠΊΠ°ΠΊΠ²ΠΎ Π΄Π° ΡΠ΅ ΠΏΡΠ°Π²ΠΈ, Π°ΠΊΠΎ Π½ΡΠΌΠ° Π·Π°Π΄Π°Π΄Π΅Π½Π° Π·Π°Π±Π°Π²ΡΠ½Π΅ */
if (recovery_min_apply_delay <= 0)
return false;
/* ΠΡΠΌΠ° Π·Π°ΠΊΡΡΠ½Π΅Π½ΠΈΠ΅ ΠΏΡΠΈ Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ, ΠΊΠΎΡΡΠΎ Π²ΡΠ΅ ΠΎΡΠ΅ Π½Π΅ Π΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½Π° */
if (!reachedConsistency)
return false;
/*
* ΠΠ°Π»ΠΈ Π΅ Π·Π°ΠΏΠΈΡ Π·Π° COMMIT?
*
* Π£ΠΌΠΈΡΠ»Π΅Π½ΠΎ ΠΈΠ·Π±ΠΈΡΠ°ΠΌΠ΅ Π΄Π° Π½Π΅ Π·Π°Π±Π°Π²ΡΠΌΠ΅ abort, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΡΠ΅ Π½ΡΠΌΠ°Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π·Π°
* MVCC. ΠΠ΅ΡΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π°ΠΌΠ΅ Π²ΡΠ·ΠΏΡΠΎΠΈΠ·Π²Π΅ΠΆΠ΄Π°Π½Π΅ Π½Π° Π·Π°ΠΏΠΈΡΠΈ, ΠΊΠΎΠΈΡΠΎ Π½ΡΠΌΠ°Ρ Π²ΡΠ΅ΠΌΠ΅Π²ΠΈ ΠΌΠ°ΡΠΊΠ΅Ρ,
* ΡΠ°ΠΊΠ° ΡΠ΅ Π²Π΅ΡΠ΅ ΠΈΠΌΠ° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ ΠΏΡΠΈΡΠΈΠ½Π΅Π½ΠΈ ΠΎΡ ΡΠ°Π½Π½ΠΈ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΠΈ Π½Π°
* 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);
/*
* ΠΠ·Ρ
ΠΎΠ΄, Π±Π΅Π· Π΄Π° Π·Π°Π΄Π΅ΠΉΡΡΠ²Π°ΠΌΠ΅ latch, Π°ΠΊΠΎ Π΅ Π²Π΅ΡΠ΅ ΡΠ»Π΅Π΄ Π²ΡΠ΅ΠΌΠ΅ΡΠΎ Π·Π° ΠΏΡΠΈΠ»Π°Π³Π°Π½Π΅ Π½Π° ΡΠΎΠ·ΠΈ
* Π·Π°ΠΏΠΈΡ
* /
TimestampDifference(GetCurrentTimestamp(), recoveryDelayUntilTime,
&secs, µsecs);
if (secs <= 0 && microsecs <= 0)
return false;
while (true)
{
// Π‘ΡΠΊΡΠ°ΡΠ°Π²Π°Π½Π΅:
// ΠΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡΠ΅ WaitLatch, Π΄ΠΎΠΊΠ°ΡΠΎ Π½Π΅ Π΄ΠΎΡΡΠΈΠ³Π½Π΅ΠΌ recoveryDelayUntilTime
// ΠΈ ΡΠ»Π΅Π΄ ΡΠΎΠ²Π°
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
-- ΡΠ΅ΠΊΡΡΠΎ ΠΌΠ΅ΡΡΠΎΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² WAL
pg_last_xlog_replay_location(),
-- ΡΠ΅ΠΊΡΡΠ° Π²ΡΠ΅ΠΌΠ΅Π²Π° ΠΎΡΠΌΠ΅ΡΠΊΠ° Π½Π° ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡΡΠ° (ΡΡΡΡΠΎΡΠ½ΠΈΠ΅ΡΠΎ Π½Π° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠ°)
pg_last_xact_replay_timestamp(),
-- ΡΠ΅ΠΊΡΡΠΎ ΡΠΈΠ·ΠΈΡΠ΅ΡΠΊΠΎ Π²ΡΠ΅ΠΌΠ΅
now(),
-- ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎΡΠΎ Π²ΡΠ΅ΠΌΠ΅, ΠΊΠΎΠ΅ΡΠΎ Π²ΡΠ΅ ΠΎΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΎ, Π΄ΠΎΠΊΠ°ΡΠΎ Π½Π΅ Π±ΡΠ΄Π΅ Π΄ΠΎΡΡΠΈΠ³Π½Π°ΡΠΎ recovery_target_time
'2018-10-12 09:25:00+00'::timestamptz - pg_last_xact_replay_timestamp() as delay;ΠΠΊΠΎ Π²ΡΠ΅ΠΌΠ΅Π²Π°ΡΠ° ΠΎΡΠΌΠ΅ΡΠΊΠ° Π²Π΅ΡΠ΅ Π½Π΅ ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½Ρ, Π²ΡΠ·ΡΡΠ°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅ΡΠΎ Π΅ Π·Π°Π²ΡΡΡΠ΅Π½ΠΎ. ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π½Π°ΡΡΡΠΎΠΈΡΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ΡΠΎ , Π·Π° Π΄Π° Π·Π°ΡΠ²ΠΎΡΠΈΡΠ΅, ΠΏΡΠ΅ΠΌΠ΅ΡΡΠΈΡΠ΅ ΠΈΠ»ΠΈ Π·Π°Π΄ΡΡΠΆΠΈΡΠ΅ ΠΈΠ½ΡΡΠ°Π½ΡΠΈΡΡΠ° ΡΠ»Π΅Π΄ Π²ΡΠ·ΡΡΠ°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅ (ΠΏΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅ ΡΡ ΡΠ΅ Π·Π°Π΄ΡΡΠΆΠ°).
ΠΠ°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ Π΅ Π΄ΠΎΡΡΠΈΠ³Π½Π°Π»Π° ΡΡΡΡΠΎΡΠ½ΠΈΠ΅ ΠΏΡΠ΅Π΄ΠΈ Π·Π»ΠΎΡΠ°ΡΡΠ½Π°ΡΠ° Π·Π°ΡΠ²ΠΊΠ°. Π‘Π΅Π³Π° ΠΌΠΎΠΆΠ΅ΡΠ΅ Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Π΄Π° Π΅ΠΊΡΠΏΠΎΡΡΠΈΡΠ°ΡΠ΅ Π΄Π°Π½Π½ΠΈΡΠ΅. ΠΠΈΠ΅ Π΅ΠΊΡΠΏΠΎΡΡΠΈΡΠ°Ρ ΠΌΠ΅ ΠΈΠ·ΡΡΠΈΡΠΈΡΠ΅ Π΄Π°Π½Π½ΠΈ Π·Π° ΠΌΠ°ΡΠΊΠ΅ΡΠ° ΠΈ Π²ΡΠΈΡΠΊΠΈ Π²ΡΡΠ·ΠΊΠΈ Ρ Π·Π°Π΄Π°ΡΠΈΡΠ΅ ΠΈ ΠΌΠ΅ΡΠΆ-ΡΠ΅ΠΊΠ²Π΅ΡΡΠΈΡΠ΅ ΠΈ Π³ΠΈ ΠΏΡΠ΅Π½Π΅ΡΠΎΡ ΠΌΠ΅ Π² ΡΠ°Π±ΠΎΡΠ½Π°ΡΠ° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ. ΠΠΊΠΎ Π·Π°Π³ΡΠ±ΠΈΡΠ΅ ΡΠ° Π·Π½Π°ΡΠΈΡΠ΅Π»Π½ΠΈ, ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΡΠΎΡΡΠΎ Π΄Π° ΠΏΡΠ΅ΠΌΠ΅ΡΡΠΈΡΠ΅ ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠ° ΠΈ Π΄Π° Ρ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΠΊΠ°ΡΠΎ ΠΎΡΠ½ΠΎΠ²Π½Π°. ΠΠΎ ΡΠΎΠ³Π°Π²Π° Π·Π°Π³ΡΠ±ΠΈΡΠ΅ Π²ΡΠΈΡΠΊΠΈ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ ΡΠ»Π΅Π΄ ΠΌΠΎΠΌΠ΅Π½ΡΠ°, Π΄ΠΎ ΠΊΠΎΠΉΡΠΎ ΡΠΌΠ΅ ΡΠ΅ Π²ΡΠ·ΡΡΠ°Π½ΠΎΠ²ΠΈΠ»ΠΈ.
ΠΠΌΠ΅ΡΡΠΎ Π²ΡΠ΅ΠΌΠ΅Π²ΠΈ ΠΎΡΠΌΠ΅ΡΠΊΠΈ Π΅ ΠΏΠΎ-Π΄ΠΎΠ±ΡΠ΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ID Π½Π° ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈΡΠ΅. ΠΠΎΠ»Π΅Π·Π½ΠΎ Π΅ Π΄Π° Π·Π°ΠΏΠΈΡΠ²Π°ΡΠ΅ ΡΠ΅Π·ΠΈ ID, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π·Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΈ DDL (ΠΊΠ°ΡΠΎ DROP TABLE) Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° log_statements = 'ddl'. ΠΠΊΠΎ ΠΈΠΌΠ°Ρ
ΠΌΠ΅ ID Π½Π° ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡΡΠ°, ΡΡΡ
ΠΌΠ΅ Π΄Π° Π²Π·Π΅ΠΌΠ΅ΠΌ recovery_target_xid ΠΈ Π΄Π° ΠΏΡΠ΅ΠΌΠΈΠ½Π΅ΠΌ ΠΏΡΠ΅Π· Π²ΡΠΈΡΠΊΠΎ Π΄ΠΎ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡΡΠ° ΠΏΡΠ΅Π΄ΠΈ Π·Π°ΡΠ²ΠΊΠ°ΡΠ°. DELETE.
ΠΡΡΡΠ°Π½Π΅ΡΠΎ ΠΊΡΠΌ ΡΠ°Π±ΠΎΡΠ° Π΅ ΠΌΠ½ΠΎΠ³ΠΎ Π»Π΅ΡΠ½ΠΎ: ΠΏΡΠΎΡΡΠΎ ΠΏΡΠ΅ΠΌΠ°Ρ
Π½Π΅ΡΠ΅ Π²ΡΠΈΡΠΊΠΈ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ ΠΎΡ recovery.conf ΠΈ ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ°ΠΉΡΠ΅ Postgres. Π‘ΠΊΠΎΡΠΎ Π²ΡΠ² ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠ° ΠΎΡΠ½ΠΎΠ²ΠΎ ΡΠ΅ ΡΠ΅ ΠΏΠΎΡΠ²ΠΈ ΠΎΡΠ΅ΠΌΡΠ°ΡΠΎΠ²Π° Π·Π°Π±Π°Π²ΡΠ½Π΅ ΠΈ ΡΠΌΠ΅ Π³ΠΎΡΠΎΠ²ΠΈ Π·Π° Π±ΡΠ΄Π΅ΡΠΈ Π½Π΅ΠΏΡΠΈΡΡΠ½ΠΎΡΡΠΈ.
ΠΡΠ΅Π΄ΠΈΠΌΡΡΠ²Π° ΠΏΡΠΈ Π²ΡΠ·ΡΡΠ°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅ΡΠΎ
Π‘ ΠΎΡΠ»ΠΎΠΆΠ΅Π½Π°ΡΠ° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ° Π²ΠΌΠ΅ΡΡΠΎ ΡΡΡΠ΄Π΅Π½ Π±Π΅ΠΊΡΠΏ Π½Π΅ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ°ΡΠΎΠ²Π΅ Π½Π°ΡΠ΅Π΄ Π΄Π° Π²ΡΠ·ΡΡΠ°Π½ΠΎΠ²ΡΠ²Π°ΡΠ΅ ΡΠ΅Π»ΠΈΡ ΡΠ½ΠΈΠΌΡΠΊ ΠΎΡ Π°ΡΡ ΠΈΠ²Π°. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π½ΠΈ ΡΡΡΠ±Π²Π°Ρ ΠΏΠ΅Ρ ΡΠ°ΡΠ°, Π·Π° Π΄Π° ΠΈΠ·Π²Π»Π΅ΡΠ΅ΠΌ ΡΠ΅Π»ΠΈΡ ΠΎΡΠ½ΠΎΠ²Π΅Π½ Π±Π΅ΠΊΡΠΏ ΠΎΡ 2 Π’Π. Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΡΠ΅ ΡΡΡΠ±Π²Π° ΠΈ Π΄Π° ΠΏΡΠΈΠ»ΠΎΠΆΠΈΠΌ ΡΠ΅Π»ΠΈΡ Π΄Π½Π΅Π²Π΅Π½ WAL, Π·Π° Π΄Π° ΡΠ΅ Π²ΡΠ·ΡΡΠ°Π½ΠΎΠ²ΠΈΠΌ Π΄ΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΡΡΡΠΎΡΠ½ΠΈΠ΅ (Π² Π½Π°ΠΉ-Π»ΠΎΡΠΈΡ ΡΠ»ΡΡΠ°ΠΉ).
ΠΡΠ»ΠΎΠΆΠ΅Π½Π°ΡΠ° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ° Π΅ ΠΏΠΎ-Π΄ΠΎΠ±ΡΠ° ΠΎΡ ΡΡΡΠ΄Π΅Π½ΠΈΡ Π±Π΅ΠΊΡΠΏ ΠΏΠΎ Π΄Π²Π΅ ΡΠΎΡΠΊΠΈ:
- ΠΠ΅ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° ΠΈΠ·Π²Π»ΠΈΡΠ°ΡΠ΅ ΡΠ΅Π»ΠΈΡ ΠΎΡΠ½ΠΎΠ²Π΅Π½ Π±Π΅ΠΊΡΠΏ ΠΎΡ Π°ΡΡ ΠΈΠ²Π°.
- ΠΠΌΠ° ΡΠΈΠΊΡΠΈΡΠ°Π½ΠΎ ΠΎΡΠ΅ΠΌΡΠ°ΡΠΎΠ²ΠΎ ΠΏΡΠΎΠ·ΠΎΡΠ΅Ρ ΠΎΡ ΡΠ΅Π³ΠΌΠ΅Π½ΡΠΈ Π½Π° WAL, ΠΊΠΎΠΈΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π°Ρ Π²ΡΠ·ΡΡΠ°Π½ΠΎΠ²Π΅Π½ΠΈ.
Π‘ΡΡΠΎ ΡΠ°ΠΊΠ° ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎ ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π°ΠΌΠ΅ Π΄Π°Π»ΠΈ Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΠΌ PITR ΠΎΡ WAL ΠΈ Π±ΡΡΠ·ΠΎ Π±ΠΈΡ ΠΌΠ΅ Π·Π°Π±Π΅Π»ΡΠ·Π°Π»ΠΈ ΠΏΠΎΠ²ΡΠ΅Π΄ΠΈ ΠΈΠ»ΠΈ Π΄ΡΡΠ³ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ Ρ Π°ΡΡ ΠΈΠ²Π° Π½Π° WAL, Π½Π°Π±Π»ΡΠ΄Π°Π²Π°ΠΉΠΊΠΈ Π·Π°Π±Π°Π²ΡΠ½Π΅ΡΠΎ Π½Π° ΠΎΡΠ»ΠΎΠΆΠ΅Π½Π°ΡΠ° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°.
Π ΡΠΎΠ·ΠΈ ΠΏΡΠΈΠΌΠ΅Ρ Π½ΠΈ ΠΎΡΠ½Π΅ 50 ΠΌΠΈΠ½ΡΡΠΈ Π΄Π° ΡΠ΅ Π²ΡΠ·ΡΡΠ°Π½ΠΎΠ²ΠΈΠΌ, ΠΊΠΎΠ΅ΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π²Π°, ΡΠ΅ ΡΠΊΠΎΡΠΎΡΡΡΠ° Π΅ Π±ΠΈΠ»Π° 110 GB Π΄Π°Π½Π½ΠΈ Π½Π° WAL Π½Π° ΡΠ°Ρ (Π°ΡΡ ΠΈΠ²ΡΡ Π²ΡΠ΅ ΠΎΡΠ΅ Π±Π΅ΡΠ΅ Π½Π° ). ΠΠΈΠ΅ ΡΡΠΏΡΡ ΠΌΠ΅ Π΄Π° ΡΠ°Π·ΡΠ΅ΡΠΈΠΌ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° ΠΈ Π²ΡΠ·ΡΡΠ°Π½ΠΎΠ²ΠΈΠΌ Π΄Π°Π½Π½ΠΈΡΠ΅ Π·Π° 1,5 ΡΠ°ΡΠ°.
Π Π΅Π·ΡΠΌΠ΅: ΠΊΡΠ΄Π΅ Π΅ ΠΏΠΎΠ»Π΅Π·Π½Π° ΠΎΡΠ»ΠΎΠΆΠ΅Π½Π°ΡΠ° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ (ΠΈ ΠΊΡΠ΄Π΅ Π½Π΅ Π΅)
ΠΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡΠ΅ ΠΎΡΠ»ΠΎΠΆΠ΅Π½Π°ΡΠ° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ ΠΊΠ°ΡΠΎ ΡΡΠ΅Π΄ΡΡΠ²ΠΎ Π·Π° ΠΏΡΡΠ²Π° ΠΏΠΎΠΌΠΎΡ, Π°ΠΊΠΎ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎ Π·Π°Π³ΡΠ±ΠΈΡΠ΅ Π΄Π°Π½Π½ΠΈ ΠΈ Π·Π°Π±Π΅Π»Π΅ΠΆΠΈΡΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Π² ΡΠ°ΠΌΠΊΠΈΡΠ΅ Π½Π° Π½Π°ΡΡΡΠΎΠ΅Π½Π°ΡΠ° Π·Π°ΠΊΡΡΠ½Π΅Π½ΠΈΠ΅.
ΠΠΎ ΠΈΠΌΠ°ΠΉΡΠ΅ ΠΏΡΠ΅Π΄Π²ΠΈΠ΄: ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΡΠ° Π½Π΅ Π΅ Π±Π΅ΠΊΡΠΏ.
ΠΠ΅ΠΊΡΠΏΡΡ ΠΈ ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΡΠ° ΠΈΠΌΠ°Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΠ΅Π»ΠΈ. Π₯Π»Π°Π΄Π½ΠΈΡΡ Π±Π΅ΠΊΡΠΏ ΡΠ΅ Π±ΡΠ΄Π΅ ΠΏΠΎΠ»Π΅Π·Π΅Π½, Π°ΠΊΠΎ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎ ΡΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈΠ»ΠΈ DELETE ΠΈΠ»ΠΈ DROP TABLE. ΠΠΈΠ΅ ΠΏΡΠ°Π²ΠΈΠΌ Π±Π΅ΠΊΡΠΏ ΠΎΡ Ρ
Π»Π°Π΄Π½ΠΎ Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ ΠΈ Π²ΡΠ·ΡΡΠ°Π½ΠΎΠ²ΡΠ²Π°ΠΌΠ΅ ΠΏΡΠ΅Π΄ΠΈΡΠ½ΠΎΡΠΎ ΡΡΡΡΠΎΡΠ½ΠΈΠ΅ Π½Π° ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° ΠΈΠ»ΠΈ Π½Π° ΡΡΠ»Π°ΡΠ° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ. ΠΠΎ ΠΏΡΠΈ ΡΠΎΠ²Π° Π·Π°ΡΠ²ΠΊΠ°ΡΠ° DROP TABLE ΠΏΠΎΡΡΠΈ ΠΌΠΎΠΌΠ΅Π½ΡΠ°Π»Π½ΠΎ ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π° Π²ΡΠ² Π²ΡΠΈΡΠΊΠΈ ΡΠ΅ΠΏΠ»ΠΈΠΊΠΈ Π½Π° ΡΠ°Π±ΠΎΡΠ½ΠΈΡ ΠΊΠ»Π°ΡΡΠ΅Ρ, ΡΠ°ΠΊΠ° ΡΠ΅ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½Π°ΡΠ° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ ΡΡΠΊ Π½ΡΠΌΠ° Π΄Π° ΠΏΠΎΠΌΠΎΠ³Π½Π΅. Π‘Π°ΠΌΠ°ΡΠ° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ Π΄ΠΎΡΡΡΠΏΠ½Π°, ΠΊΠΎΠ³Π°ΡΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈ ΡΡΡΠ²ΡΡΠΈ ΡΠ° Π½Π΅Π΄ΠΎΡΡΡΠΏΠ½ΠΈ, ΠΈ ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Ρ Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅ΡΠΎ.
ΠΠΎΡΠΈ Ρ ΠΎΡΠ»ΠΎΠΆΠ΅Π½Π°ΡΠ° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ ΠΏΠΎΠ½ΡΠΊΠΎΠ³Π° ΠΌΠ½ΠΎΠ³ΠΎ Π½ΠΈ Π΅ Π½ΡΠΆΠ΅Π½ Ρ Π»Π°Π΄Π΅Π½ Π±Π΅ΠΊΡΠΏ Π½Π° Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎ ΠΌΡΡΡΠΎ, Π°ΠΊΠΎ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎ ΡΠ΅ ΡΠ»ΡΡΠΈ ΠΏΠΎΠ²ΡΠ΅Π΄Π° Π½Π° Π΄Π°ΡΠ° ΡΠ΅Π½ΡΡΡΠ°, ΡΠΊΡΠΈΡΠΎ ΠΏΠΎΠ²ΡΠ΅ΠΆΠ΄Π°Π½Π΅ ΠΈΠ»ΠΈ Π΄ΡΡΠ³ΠΈ ΡΡΠ±ΠΈΡΠΈΡ, ΠΊΠΎΠΈΡΠΎ Π½Π΅ Π·Π°Π±Π΅Π»ΡΠ·Π²Π°ΡΠ΅ Π²Π΅Π΄Π½Π°Π³Π°. Π’ΡΠΊ ΡΠ°ΠΌΠΎ ΠΎΡ ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΡΠ° Π½ΡΠΌΠ° Π΄Π° ΠΈΠΌΠ° ΠΏΠΎΠ»Π·Π°.
ΠΠ°Π±Π΅Π»Π΅ΠΆΠΊΠ°. ΠΠ° Π² ΠΌΠΎΠΌΠ΅Π½ΡΠ° Π·Π°ΡΠΈΡΠ°Π²Π°ΠΌΠ΅ Π΄Π°Π½Π½ΠΈΡΠ΅ ΠΎΡ Π·Π°Π³ΡΠ±Π° ΡΠ°ΠΌΠΎ Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎ Π½ΠΈΠ²ΠΎ ΠΈ Π½Π΅ Π²ΡΠ·ΡΡΠ°Π½ΠΎΠ²ΡΠ²Π°ΠΌΠ΅ Π΄Π°Π½Π½ΠΈ Π½Π° Π½ΠΈΠ²ΠΎ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π».
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
