рд╣рдордиреЗ PostgreSQL рдХреЗ рд╕рд╛рде рдЖрдкрджрд╛ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддрд┐ рдХреЗ рд▓рд┐рдП рд╡рд┐рд▓рдВрдмрд┐рдд рдкреНрд░рддрд┐рдХреГрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛

рд╣рдордиреЗ PostgreSQL рдХреЗ рд╕рд╛рде рдЖрдкрджрд╛ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддрд┐ рдХреЗ рд▓рд┐рдП рд╡рд┐рд▓рдВрдмрд┐рдд рдкреНрд░рддрд┐рдХреГрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛
рдкреНрд░рддрд┐рдХреГрддрд┐ рдмреИрдХрдЕрдк рдирд╣реАрдВ рд╣реИ. рдпрд╛ рдирд╣реАрдВ? рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдЧрд▓рддреА рд╕реЗ рд╣рдЯрд╛рдП рдЧрдП рд╢реЙрд░реНрдЯрдХрдЯ рд╕реЗ рдЙрдмрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдордиреЗ рд╡рд┐рд▓рдВрдмрд┐рдд рдкреНрд░рддрд┐рдХреГрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ред

рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪрд╛ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдЗрд╕ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП GitLab рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ GitLab.com - рдкреНрд░рдХреГрддрд┐ рдореЗрдВ рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ GitLab рдЙрджрд╛рд╣рд░рдгред 3 рдорд┐рд▓рд┐рдпрди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдФрд░ рд▓рдЧрднрдЧ 7 рдорд┐рд▓рд┐рдпрди рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде, рдпрд╣ рд╕рдорд░реНрдкрд┐рдд рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЗ рд╕рд╛рде рд╕рдмрд╕реЗ рдмрдбрд╝реА рдУрдкрди рд╕реЛрд░реНрд╕ SaaS рд╕рд╛рдЗрдЯреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред PostgreSQL рдбреЗрдЯрд╛рдмреЗрд╕ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдмрд┐рдирд╛, GitLab.com рдЗрдиреНрдлреНрд░рд╛рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдмрд╣реБрдд рдЖрдЧреЗ рдирд╣реАрдВ рдмрдврд╝ рдкрд╛рдПрдЧрд╛, рдФрд░ рдЬрдм рдбреЗрдЯрд╛ рдЦреЛ рд╕рдХрддрд╛ рд╣реИ рддреЛ рдХрд┐рд╕реА рднреА рд╡рд┐рдлрд▓рддрд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЧрд▓рддреА рд╕рд╣рдирд╢реАрд▓рддрд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдо рдХреНрдпрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЗрд╕рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдРрд╕реА рдХреЛрдИ рдЖрдкрджрд╛ рдШрдЯрд┐рдд рд╣реЛрдЧреА, рд▓реЗрдХрд┐рди рд╣рдо рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рддреИрдпрд╛рд░ рд╣реИрдВ рдФрд░ рд╡рд┐рднрд┐рдиреНрди рдмреИрдХрдЕрдк рдФрд░ рдкреНрд░рддрд┐рдХреГрддрд┐ рддрдВрддреНрд░реЛрдВ рд╕реЗ рд╕реБрд╕рдЬреНрдЬрд┐рдд рд╣реИрдВред

рдкреНрд░рддрд┐рдХреГрддрд┐ рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛ рдмреИрдХрдЕрдк рд▓реЗрдиреЗ рдХрд╛ рд╕рд╛рдзрди рдирд╣реАрдВ рд╣реИ (рдиреАрдЪреЗ рджреЗрдЦреЗрдВ). рд▓реЗрдХрд┐рди рдЕрдм рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдЖрд▓рд╕реА рдкреНрд░рддрд┐рдХреГрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЧрд▓рддреА рд╕реЗ рд╣рдЯрд╛рдП рдЧрдП рдбреЗрдЯрд╛ рдХреЛ рддреБрд░рдВрдд рдХреИрд╕реЗ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ: рдЪрд╛рд▓реВ GitLab.com рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╢реЙрд░реНрдЯрдХрдЯ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП gitlab-ce рдФрд░ рдорд░реНрдЬ рдЕрдиреБрд░реЛрдзреЛрдВ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рд╕реЗ рдХрдиреЗрдХреНрд╢рди рдЯреВрдЯ рдЧрдпрд╛ред

рд╡рд┐рд▓рдВрдмрд┐рдд рдкреНрд░рддрд┐рдХреГрддрд┐ рдХреЗ рд╕рд╛рде, рд╣рдордиреЗ рдХреЗрд╡рд▓ 1,5 рдШрдВрдЯреЗ рдореЗрдВ рдбреЗрдЯрд╛ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ред рджреЗрдЦрд┐рдпреЗ рдпреЗ рдХреИрд╕реЗ рд╣реБрдЖ.

PostgreSQL рдХреЗ рд╕рд╛рде рд╕рдордп рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддрд┐ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдВ

PostgreSQL рдореЗрдВ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рдордп рдореЗрдВ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдмрд┐рдВрджреБ рдкрд░ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдкреНрд╡рд╛рдЗрдВрдЯ-рдЗрди-рдЯрд╛рдЗрдо рд░рд┐рдХрд╡рд░реА (рдкреАрдЖрдИрдЯреАрдЖрд░) рдФрд░ рдЙрд╕реА рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдкреНрд░рддрд┐рдХреГрддрд┐ рдХреЛ рдЕрджреНрдпрддрд┐рдд рд░рдЦрддрд╛ рд╣реИ: рд╕рдВрдкреВрд░реНрдг рдбреЗрдЯрд╛рдмреЗрд╕ рдХреНрд▓рд╕реНрдЯрд░ (рдмреЗрд╕ рдмреИрдХрдЕрдк) рдХреЗ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╕реНрдиреИрдкрд╢реЙрдЯ рд╕реЗ рд╢реБрд░реВ рдХрд░рдХреЗ, рд╣рдо рд╕рдордп рдореЗрдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдмрд┐рдВрджреБ рддрдХ рд░рд╛рдЬреНрдп рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред

рдХреЛрд▓реНрдб рдмреИрдХрдЕрдк рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдмреБрдирд┐рдпрд╛рджреА рдбреЗрдЯрд╛рдмреЗрд╕ рдмреИрдХрдЕрдк рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреЗ рд╣реИрдВ (GitLab рдЕрднрд┐рд▓реЗрдЦрд╛рдЧрд╛рд░ рд▓рд╛рдЗрд╡ рдЗрди) рдЧреВрдЧрд▓ рдХреНрд▓рд╛рдЙрдб рд╕реНрдЯреЛрд░реЗрдЬ). рд╣рдо рд░рд╛рдЗрдЯ-рдлрд╝реЙрд░рд╡рд░реНрдб рд▓реЙрдЧ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдХреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рдирд┐рдЧрд░рд╛рдиреА рднреА рдХрд░рддреЗ рд╣реИрдВ (рдЖрдЧреЗ рд▓рд┐рдЦреЗрдВ рд▓реЙрдЧ, рд╡рд╛рд▓). рдФрд░ рдпрд╣ рд╕рдм рд╣реЛрдиреЗ рдкрд░, рд╣рдо рдЖрдкрджрд╛ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ PITR рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рд╡рд┐рдлрд▓рддрд╛ рд╕реЗ рдкрд╣рд▓реЗ рд▓рд┐рдП рдЧрдП рд╕реНрдиреИрдкрд╢реЙрдЯ рд╕реЗ рд╢реБрд░реВ рдХрд░рдирд╛, рдФрд░ рд╡рд┐рдлрд▓рддрд╛ рддрдХ рд╡рд╛рд▓ рд╕рдВрдЧреНрд░рд╣ рд╕реЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ред

рд╡рд┐рд▓рдВрдмрд┐рдд рдкреНрд░рддрд┐рдХреГрддрд┐ рдХреНрдпрд╛ рд╣реИ?

рдЖрд▓рд╕реА рдкреНрд░рддрд┐рдХреГрддрд┐ рд╡рд╛рд▓ рд╕реЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рджреЗрд░реА рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реИред рдпрд╛рдиреА рдПрдХ рдШрдВрдЯреЗ рдореЗрдВ рдЯреНрд░рд╛рдВрдЬреИрдХреНрд╢рди рд╣реЛ рдЧрдпрд╛ X, рд▓реЗрдХрд┐рди рдпрд╣ рдкреНрд░рддрд┐рдХреГрддрд┐ рдореЗрдВ рджреЗрд░реА рд╕реЗ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ d рдЬ X + d.

PostgreSQL рдХреЗ рдкрд╛рд╕ рднреМрддрд┐рдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдкреНрд░рддрд┐рдХреГрддрд┐ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ 2 рддрд░реАрдХреЗ рд╣реИрдВ: рдмреИрдХрдЕрдк рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддрд┐ рдФрд░ рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рдкреНрд░рддрд┐рдХреГрддрд┐ред рдХрд┐рд╕реА рд╕рдВрдЧреНрд░рд╣ рд╕реЗ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ PITR рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд▓рдЧрд╛рддрд╛рд░: рд╣рдо рд▓рдЧрд╛рддрд╛рд░ рд╡рд╛рд▓ рд╕рдВрдЧреНрд░рд╣ рд╕реЗ рдкрд░рд┐рд╡рд░реНрддрди рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдкреНрд░рддрд┐рдХреГрддрд┐ рдкрд░ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред рдП рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рдкреНрд░рддрд┐рдХреГрддрд┐ рдЕрдкрд╕реНрдЯреНрд░реАрдо рдбреЗрдЯрд╛рдмреЗрд╕ рд╣реЛрд╕реНрдЯ рд╕реЗ рд╕реАрдзреЗ рд╡рд╛рд▓ рд╕реНрдЯреНрд░реАрдо рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рд╣рдо рд╕рдВрдЧреНрд░рд╣ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддрд┐ рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрддреЗ рд╣реИрдВ - рдЗрд╕реЗ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рд╕рд╛рдорд╛рдиреНрдп рд╣реИ рдЬреЛ рдЙрддреНрдкрд╛рджрди рдХреНрд▓рд╕реНрдЯрд░ рдХреЗ рд╕рд╛рде рдмрдирд╛ рд░рд╣рддрд╛ рд╣реИред

рдХрд┐рд╕реА рд╕рдВрдЧреНрд░рд╣ рд╕реЗ рд╡рд┐рд▓рдВрдмрд┐рдд рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддрд┐ рдХреИрд╕реЗ рд╕реЗрдЯ рдХрд░реЗрдВ

рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддрд┐ рд╡рд┐рдХрд▓реНрдк рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИ 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'

рдЗрди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде, рд╣рдордиреЗ рдмреИрдХрдЕрдк рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рд▓рдВрдмрд┐рдд рдкреНрд░рддрд┐рдХреГрддрд┐ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХреАред рдпрд╣рд╛рдБ рдЗрд╕рдХрд╛ рдкреНрд░рдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ wale рд╡рд╛рд▓ рдЦрдВрдб рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП (restore_command) рд╕рдВрдЧреНрд░рд╣ рд╕реЗ, рдФрд░ рдкрд░рд┐рд╡рд░реНрддрди рдЖрда рдШрдВрдЯреЗ рдХреЗ рдмрд╛рдж рд▓рд╛рдЧреВ рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ (recovery_min_apply_delay). рдкреНрд░рддрд┐рдХреГрддрд┐ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рд╕рдордпрд░реЗрдЦрд╛ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдкрд░ рдирдЬрд╝рд░ рд░рдЦреЗрдЧреА, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдХреНрд▓рд╕реНрдЯрд░ рд╡рд┐рдлрд▓рддрд╛ рдХреЗ рдХрд╛рд░рдг (recovery_target_timeline).

╨б recovery_min_apply_delay рдЖрдк рджреЗрд░реА рд╕реЗ рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рдкреНрд░рддрд┐рдХреГрддрд┐ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдХреБрдЫ рдХрдорд┐рдпрд╛рдВ рд╣реИрдВ рдЬреЛ рдкреНрд░рддрд┐рдХреГрддрд┐ рд╕реНрд▓реЙрдЯ, рд╣реЙрдЯ рд╕реНрдЯреИрдВрдбрдмрд╛рдп рдлреАрдбрдмреИрдХ рдЗрддреНрдпрд╛рджрд┐ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВред рд╡рд╛рд▓ рд╕рдВрдЧреНрд░рд╣ рдЖрдкрдХреЛ рдЙрдирд╕реЗ рдмрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдкреНрд░рд╛рдЪрд▓ recovery_min_apply_delay рдХреЗрд╡рд▓ PostgreSQL 9.3 рдореЗрдВ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ред рдкрд┐рдЫрд▓реЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ, рд╡рд┐рд▓рдВрдмрд┐рдд рдкреНрд░рддрд┐рдХреГрддрд┐ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рд╕рдВрдпреЛрдЬрди рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддрд┐ рдкреНрд░рдмрдВрдзрди рдХрд╛рд░реНрдп (pg_xlog_replay_pause(), pg_xlog_replay_resume()) рдпрд╛ рд╡рд┐рд▓рдВрдм рдХреА рдЕрд╡рдзрд┐ рдХреЗ рд▓рд┐рдП рд╡рд╛рд▓ рдЦрдВрдбреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рд░рдЦреЗрдВред

PostgreSQL рдпрд╣ рдХреИрд╕реЗ рдХрд░рддрд╛ рд╣реИ?

рдпрд╣ рджреЗрдЦрдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдХрд┐ PostgreSQL рдЖрд▓рд╕реА рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддрд┐ рдХреЛ рдХреИрд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЖрдЗрдП рджреЗрдЦреЗрдВ recoveryApplyDelay(XlogReaderState). рд╕реЗ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдореБрдЦреНрдп рджреЛрд╣рд░рд╛рд╡ рдкрд╛рд╢ рд╡рд╛рд▓ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреЗ рд▓рд┐рдП.

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, рд╕рдм рдХреБрдЫ рдлрд┐рд░ рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдЖрдкрдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ (рдпрд╛ рдкреАрдЖрдИрдЯреАрдЖрд░ рдХреЗ рд▓рд┐рдП рдХреЛрд▓реНрдб рдмреИрдХрдЕрдк рднреА рд▓реЗрдирд╛ рд╣реЛрдЧрд╛)ред

рд╣рдордиреЗ рд╕реНрдердЧрд┐рдд рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдФрд░ рд╡рд╛рд▓ рд╕реЗрдЧрдореЗрдВрдЯ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕рдордп рддрдХ рджреЛрд╣рд░рд╛рдпрд╛ рдЧрдпрд╛ред рдЖрдк рдЗрд╕ рд╕реНрддрд░ рдкрд░ рдпрд╣ рдкреВрдЫрдХрд░ рдкреНрд░рдЧрддрд┐ рдХреЛ рдЯреНрд░реИрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

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рдкреБрдирдГ рдкреНрд░рдпрд╛рд╕ рдХреЗ рдмрд╛рдж рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЛ рдмрдВрдж рдХрд░рдирд╛, рдмрдврд╝рд╛рд╡рд╛ рджреЗрдирд╛ рдпрд╛ рд░реЛрдХрдирд╛ (рдпрд╣ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд▓рдВрдмрд┐рдд рд╣реИ)ред

рдЙрд╕ рджреБрд░реНрднрд╛рдЧреНрдпрдкреВрд░реНрдг рдЕрдиреБрд░реЛрдз рд╕реЗ рдкрд╣рд▓реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдЕрдкрдиреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд▓реМрдЯ рдЖрдпрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдм рдЖрдк рдбреЗрдЯрд╛ рдирд┐рд░реНрдпрд╛рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдордиреЗ рд╣рдЯрд╛рдП рдЧрдП рд▓реЗрдмрд▓ рдбреЗрдЯрд╛ рдФрд░ рдореБрджреНрджреЛрдВ рдФрд░ рдорд░реНрдЬ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд╕рднреА рд▓рд┐рдВрдХ рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдП рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЙрддреНрдкрд╛рджрди рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ред рдпрджрд┐ рдиреБрдХрд╕рд╛рди рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рд╣реИрдВ, рддреЛ рдЖрдк рдмрд╕ рдкреНрд░рддрд┐рдХреГрддрд┐ рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдореБрдЦреНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдлрд┐рд░ рдЬрд┐рд╕ рдмрд┐рдВрджреБ рддрдХ рд╣рдо рдЙрдмрд░ рдЪреБрдХреЗ рд╣реИрдВ рдЙрд╕рдХреЗ рдмрд╛рдж рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрди рдЦреЛ рдЬрд╛рдПрдВрдЧреЗред

рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдХреЗ рдмрдЬрд╛рдп, рд▓реЗрдирджреЗрди рдЖрдИрдбреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред рдЗрди рдЖрдИрдбреА рдХреЛ рд░рд┐рдХреЙрд░реНрдб рдХрд░рдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдбреАрдбреАрдПрд▓ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЗ рд▓рд┐рдП (рдЬреИрд╕реЗ DROP TABLE), рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ log_statements = 'ddl'. рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд▓реЗрдирджреЗрди рдЖрдИрдбреА рд╣реЛрддреА, рддреЛ рд╣рдо рд▓реЗрддреЗ recovery_target_xid рдФрд░ рдЕрдиреБрд░реЛрдз рд╕реЗ рдкрд╣рд▓реЗ рд▓реЗрди-рджреЗрди рддрдХ рд╕рдм рдХреБрдЫ рдЪрд▓рд╛ рджрд┐рдпрд╛ DELETE.

рдХрд╛рдо рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдирд╛ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ: рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрди рд╣рдЯрд╛ рджреЗрдВ recovery.conf рдФрд░ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ рдХреЛ рдкреБрдирдГ рдЖрд░рдВрдн рдХрд░реЗрдВред рдкреНрд░рддрд┐рдХреГрддрд┐ рдореЗрдВ рдЬрд▓реНрдж рд╣реА рдлрд┐рд░ рд╕реЗ рдЖрда рдШрдВрдЯреЗ рдХреА рджреЗрд░реА рд╣реЛрдЧреА, рдФрд░ рд╣рдо рднрд╡рд┐рд╖реНрдп рдХреА рдкрд░реЗрд╢рд╛рдирд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВред

рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддрд┐ рд▓рд╛рдн

рдХреЛрд▓реНрдб рдмреИрдХрдЕрдк рдХреЗ рдмрдЬрд╛рдп рд╡рд┐рд▓рдВрдмрд┐рдд рдкреНрд░рддрд┐рдХреГрддрд┐ рдХреЗ рд╕рд╛рде, рдЖрдкрдХреЛ рд╕рдВрдЧреНрд░рд╣ рд╕реЗ рдкреВрд░реА рдЫрд╡рд┐ рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдШрдВрдЯреЛрдВ рдЦрд░реНрдЪ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рдВрдкреВрд░реНрдг рдмреБрдирд┐рдпрд╛рджреА 2 рдЯреАрдмреА рдмреИрдХрдЕрдк рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╣рдореЗрдВ рдкрд╛рдВрдЪ рдШрдВрдЯреЗ рд▓рдЧрддреЗ рд╣реИрдВред рдФрд░ рдлрд┐рд░ рдЖрдкрдХреЛ рд╡рд╛рдВрдЫрд┐рдд рд╕реНрдерд┐рддрд┐ (рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╕реНрдерд┐рддрд┐ рдореЗрдВ) рдореЗрдВ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрднреА рднреА рд╕рдВрдкреВрд░реНрдг рджреИрдирд┐рдХ рд╡рд╛рд▓ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдПрдХ рд╕реНрдердЧрд┐рдд рдкреНрд░рддрд┐рдХреГрддрд┐ рджреЛ рддрд░реАрдХреЛрдВ рд╕реЗ рдХреЛрд▓реНрдб рдмреИрдХрдЕрдк рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИ:

  1. рд╕рдВрдЧреНрд░рд╣ рд╕реЗ рд╕рдВрдкреВрд░реНрдг рдореВрд▓ рдмреИрдХрдЕрдк рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
  2. рд╡рд╛рд▓ рдЦрдВрдбреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрда рдШрдВрдЯреЗ рдХреА рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╡рд┐рдВрдбреЛ рд╣реИ рдЬрд┐рд╕реЗ рджреЛрд╣рд░рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╣рдо рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рднреА рд▓рдЧрд╛рддрд╛рд░ рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╡рд╛рд▓ рд╕реЗ рдкреАрдЖрдИрдЯреАрдЖрд░ рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рдФрд░ рд╣рдо рд╕реНрдердЧрд┐рдд рдкреНрд░рддрд┐рдХреГрддрд┐ рдХреЗ рдЕрдВрддрд░рд╛рд▓ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдХреЗ рд╡рд╛рд▓ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд╕рд╛рде рднреНрд░рд╖реНрдЯрд╛рдЪрд╛рд░ рдпрд╛ рдЕрдиреНрдп рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рддреБрд░рдВрдд рдиреЛрдЯрд┐рд╕ рдХрд░реЗрдВрдЧреЗред

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдореЗрдВ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдореЗрдВ 50 рдорд┐рдирдЯ рд▓рдЧреЗ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЧрддрд┐ рдкреНрд░рддрд┐ рдШрдВрдЯреЗ 110 рдЬреАрдмреА рд╡рд╛рд▓ рдбреЗрдЯрд╛ рдереА (рд╕рдВрдЧреНрд░рд╣ рдЕрднреА рднреА рдЪрд╛рд▓реВ рдерд╛) рдПрдбрдмреНрд▓реНрдпреВрдПрд╕ рдПрд╕ 3). рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░, рд╣рдордиреЗ 1,5 рдШрдВрдЯреЗ рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рдХрд░ рджреА рдФрд░ рдбреЗрдЯрд╛ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░ рд▓рд┐рдпрд╛ред

рдкрд░рд┐рдгрд╛рдо: рдЬрд╣рд╛рдВ рдПрдХ рд╡рд┐рд▓рдВрдмрд┐рдд рдкреНрд░рддрд┐рдХреГрддрд┐ рдЙрдкрдпреЛрдЧреА рд╣реИ (рдФрд░ рдЬрд╣рд╛рдВ рдпрд╣ рдирд╣реАрдВ рд╣реИ)

рдпрджрд┐ рдЖрдкрдиреЗ рдЧрд▓рддреА рд╕реЗ рдбреЗрдЯрд╛ рдЦреЛ рджрд┐рдпрд╛ рд╣реИ рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдП рдЧрдП рд╡рд┐рд▓рдВрдм рдХреЗ рднреАрддрд░ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдкрд░ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рд╣реИ, рддреЛ рдкреНрд░рд╛рдердорд┐рдХ рдЙрдкрдЪрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рд▓рдВрдмрд┐рдд рдкреНрд░рддрд┐рдХреГрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

рд▓реЗрдХрд┐рди рдзреНрдпрд╛рди рд░рдЦреЗрдВ: рдкреНрд░рддрд┐рдХреГрддрд┐ рдмреИрдХрдЕрдк рдирд╣реАрдВ рд╣реИред

рдмреИрдХрдЕрдк рдФрд░ рдкреНрд░рддрд┐рдХреГрддрд┐ рдХреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЙрджреНрджреЗрд╢реНрдп рд╣реИрдВред рдпрджрд┐ рдЖрдкрдиреЗ рдЧрд▓рддреА рд╕реЗ рдХреЛрд▓реНрдб рдмреИрдХрдЕрдк рдмрдирд╛ рд▓рд┐рдпрд╛ рд╣реИ рддреЛ рдпрд╣ рдЖрдкрдХреЗ рдХрд╛рдо рдЖрдПрдЧрд╛ DELETE рдпрд╛ DROP TABLE. рд╣рдо рдХреЛрд▓реНрдб рд╕реНрдЯреЛрд░реЗрдЬ рд╕реЗ рдмреИрдХрдЕрдк рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рддрд╛рд▓рд┐рдХрд╛ рдпрд╛ рд╕рдВрдкреВрд░реНрдг рдбреЗрдЯрд╛рдмреЗрд╕ рдХреА рдкрд┐рдЫрд▓реА рд╕реНрдерд┐рддрд┐ рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╕рд╛рде рд╣реА рдЕрдиреБрд░реЛрдз DROP TABLE рдХрд╛рд░реНрдпрд╢реАрд▓ рдХреНрд▓рд╕реНрдЯрд░ рдкрд░ рд╕рднреА рдкреНрд░рддрд┐рдХреГрддрд┐рдпреЛрдВ рдореЗрдВ рд▓рдЧрднрдЧ рддреБрд░рдВрдд рдкреБрдирд░реБрддреНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рддрд┐рдХреГрддрд┐ рдпрд╣рд╛рдВ рдорджрдж рдирд╣реАрдВ рдХрд░реЗрдЧреАред рдЬрдм рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╕рд░реНрд╡рд░ рдХрд┐рд░рд╛рдП рдкрд░ рджрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рддреЛ рдкреНрд░рддрд┐рдХреГрддрд┐ рд╕реНрд╡рдпрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдЙрдкрд▓рдмреНрдз рд░рдЦрддреА рд╣реИ рдФрд░ рд▓реЛрдб рд╡рд┐рддрд░рд┐рдд рдХрд░рддреА рд╣реИред

рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рд╡рд┐рд▓рдВрдмрд┐рдд рдкреНрд░рддрд┐рдХреГрддрд┐ рдХреЗ рд╕рд╛рде рднреА, рдпрджрд┐ рдбреЗрдЯрд╛ рд╕реЗрдВрдЯрд░ рдХреА рд╡рд┐рдлрд▓рддрд╛, рдЫрд┐рдкреА рд╣реБрдИ рдХреНрд╖рддрд┐, рдпрд╛ рдЕрдиреНрдп рдШрдЯрдирд╛рдПрдВ рдЬреЛ рддреБрд░рдВрдд рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реЛрддреА рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдХрднреА-рдХрднреА рдПрдХ рд╕реБрд░рдХреНрд╖рд┐рдд рд╕реНрдерд╛рди рдкрд░ рдХреЛрд▓реНрдб рдмреИрдХрдЕрдк рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЕрдХреЗрд▓реЗ рдкреНрд░рддрд┐рдХреГрддрд┐ рдХрд╛ рдпрд╣рд╛рдБ рдХреЛрдИ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рд╣реИред

рдиреЛрдЯ. рдкрд░ GitLab.com рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╣рдо рдХреЗрд╡рд▓ рд╕рд┐рд╕реНрдЯрдо рд╕реНрддрд░ рдкрд░ рдбреЗрдЯрд╛ рд╣рд╛рдирд┐ рд╕реЗ рд░рдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрддрд░ рдкрд░ рдбреЗрдЯрд╛ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ