Π Π΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ° Π½ΠΈΡΠ΅ ΡΠ΅Π·Π΅ΡΠ²Π½Π° ΠΊΠΎΠΏΠΈΡΠ°. ΠΠ»ΠΈ Π½Π΅? ΠΠ²ΠΎ ΠΊΠ°ΠΊΠΎ ΡΠΌΠΎ ΠΊΠΎΡΠΈΡΡΠΈΠ»ΠΈ ΠΎΠ΄Π»ΠΎΠΆΠ΅Π½Ρ ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΡ Π·Π° ΠΎΠΏΠΎΡΠ°Π²Π°ΠΊ ΠΎΠ΄ ΡΠ»ΡΡΠ°ΡΠ½ΠΎΠ³ Π±ΡΠΈΡΠ°ΡΠ° ΠΏΡΠ΅ΡΠΈΡΠ°.
Π Π΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ° Π½ΠΈΡΠ΅ ΡΡΠ΅Π΄ΡΡΠ²ΠΎ Π·Π° ΠΏΡΠ°Π²ΡΠ΅ΡΠ΅ ΡΠ΅Π·Π΅ΡΠ²Π½ΠΈΡ
ΠΊΠΎΠΏΠΈΡΠ° Π±Π°Π·Π° ΠΏΠΎΠ΄Π°ΡΠ°ΠΊΠ° (gitlab-ce
Π‘Π° ΠΎΠ΄Π»ΠΎΠΆΠ΅Π½ΠΎΠΌ ΡΠ΅ΠΏΠ»ΠΈΠΊΠΎΠΌ ΠΎΠΏΠΎΡΠ°Π²ΠΈΠ»ΠΈ ΡΠΌΠΎ ΠΏΠΎΠ΄Π°ΡΠΊΠ΅ Π·Π° ΡΠ°ΠΌΠΎ 1,5 ΡΠ°Ρ. ΠΠΎΠ³Π»Π΅Π΄Π°Ρ ΠΊΠ°ΠΊΠΎ ΡΠ΅ ΡΠΎ Π΄Π΅ΡΠΈΠ»ΠΎ.
ΠΠΏΠΎΡΠ°Π²Π°ΠΊ Ρ ΡΡΠ΅Π½ΡΡΠΊΡ ΡΠ° ΠΠΎΡΡΠ³ΡΠ΅Π‘ΠΠ-ΠΎΠΌ
ΠΠΎΡΡΠ³ΡΠ΅Π‘ΠΠ ΠΈΠΌΠ° ΡΠ³ΡΠ°ΡΠ΅Π½Ρ ΡΡΠ½ΠΊΡΠΈΡΡ ΠΊΠΎΡΠ° Π²ΡΠ°ΡΠ° ΡΡΠ°ΡΠ΅ Π±Π°Π·Π΅ ΠΏΠΎΠ΄Π°ΡΠ°ΠΊΠ° Ρ ΠΎΠ΄ΡΠ΅ΡΠ΅Π½ΠΎ Π²ΡΠ΅ΠΌΠ΅. ΠΠΎΠ²Π΅ ΡΠ΅
ΠΠ° Π±ΠΈΡΠΌΠΎ ΠΊΠΎΡΠΈΡΡΠΈΠ»ΠΈ ΠΎΠ²Ρ ΡΡΠ½ΠΊΡΠΈΡΡ Π·Π° Ρ
Π»Π°Π΄Π½Ρ ΡΠ΅Π·Π΅ΡΠ²Π½Ρ ΠΊΠΎΠΏΠΈΡΡ, ΡΠ΅Π΄ΠΎΠ²Π½ΠΎ ΠΏΡΠ°Π²ΠΈΠΌΠΎ ΠΎΡΠ½ΠΎΠ²Π½Ρ ΡΠ΅Π·Π΅ΡΠ²Π½Ρ ΠΊΠΎΠΏΠΈΡΡ Π±Π°Π·Π΅ ΠΏΠΎΠ΄Π°ΡΠ°ΠΊΠ° ΠΈ ΡΡΠ²Π°ΠΌΠΎ ΡΠ΅ Ρ Π°ΡΡ
ΠΈΠ²ΠΈ (ΠΠΈΡΠΠ°Π± Π°ΡΡ
ΠΈΠ²Π΅ ΠΆΠΈΠ²Π΅ Ρ
Π¨ΡΠ° ΡΠ΅ ΠΎΠ΄Π»ΠΎΠΆΠ΅Π½Π° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ°?
ΠΠ΅ΡΠ° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ° ΡΠ΅ ΠΏΡΠΈΠΌΠ΅Π½Π° ΠΏΡΠΎΠΌΠ΅Π½Π° ΠΈΠ· ΠΠΠ-Π° ΡΠ° Π·Π°ΠΊΠ°ΡΡΠ΅ΡΠ΅ΠΌ. Π’ΠΎ ΡΠ΅ΡΡ, ΡΡΠ°Π½ΡΠ°ΠΊΡΠΈΡΠ° ΡΠ΅ Π΄ΠΎΠ³ΠΎΠ΄ΠΈΠ»Π° Π·Π° ΡΠ°Ρ Π²ΡΠ΅ΠΌΠ΅Π½Π° X
, Π°Π»ΠΈ ΡΠ΅ ΡΠ΅ Ρ ΡΠ΅ΠΏΠ»ΠΈΡΠΈ ΠΏΠΎΡΠ°Π²ΠΈΡΠΈ ΡΠ° Π·Π°ΠΊΠ°ΡΡΠ΅ΡΠ΅ΠΌ d
Π·Π° ΡΠ°Ρ Π²ΡΠ΅ΠΌΠ΅Π½Π° X + d
.
ΠΠΎΡΡΠ³ΡΠ΅Π‘ΠΠ ΠΈΠΌΠ° 2 Π½Π°ΡΠΈΠ½Π° Π΄Π° ΡΠ΅ ΠΏΠΎΠ΄Π΅ΡΠΈ ΡΠ΅ΠΏΠ»ΠΈΠΊΠ° ΡΠΈΠ·ΠΈΡΠΊΠ΅ Π±Π°Π·Π΅ ΠΏΠΎΠ΄Π°ΡΠ°ΠΊΠ°: ΠΎΠΏΠΎΡΠ°Π²Π°ΠΊ ΡΠ΅Π·Π΅ΡΠ²Π½Π΅ ΠΊΠΎΠΏΠΈΡΠ΅ ΠΈ ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ° ΡΡΡΠΈΠΌΠΈΠ½Π³Π°.
ΠΠ°ΠΊΠΎ ΠΏΠΎΠ΄Π΅ΡΠΈΡΠΈ ΠΎΠ΄Π»ΠΎΠΆΠ΅Π½ΠΈ ΠΎΠΏΠΎΡΠ°Π²Π°ΠΊ ΠΈΠ· Π°ΡΡ ΠΈΠ²Π΅
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'
Π‘Π° ΠΎΠ²ΠΈΠΌ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΠΌΠ° ΡΠΌΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π»ΠΈ ΠΎΠ΄Π»ΠΎΠΆΠ΅Π½Ρ ΡΠ΅ΠΏΠ»ΠΈΠΊΡ ΡΠ° ΠΎΠΏΠΎΡΠ°Π²ΠΊΠΎΠΌ ΡΠ΅Π·Π΅ΡΠ²Π½Π΅ ΠΊΠΎΠΏΠΈΡΠ΅. ΠΠ²Π΄Π΅ ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠΈ restore_command
) ΠΈΠ· Π°ΡΡ
ΠΈΠ²Π΅, Π° ΠΏΡΠΎΠΌΠ΅Π½Π΅ ΡΠ΅ Π±ΠΈΡΠΈ ΠΏΡΠΈΠΌΠ΅ΡΠ΅Π½Π΅ Π½Π°ΠΊΠΎΠ½ ΠΎΡΠ°ΠΌ ΡΠ°ΡΠΈ (recovery_min_apply_delay
). Π Π΅ΠΏΠ»ΠΈΠΊΠ° ΡΠ΅ ΠΏΠ°Π·ΠΈΡΠΈ Π½Π° ΠΏΡΠΎΠΌΠ΅Π½Π΅ Π²ΡΠ΅ΠΌΠ΅Π½ΡΠΊΠ΅ Π»ΠΈΠ½ΠΈΡΠ΅ Ρ Π°ΡΡ
ΠΈΠ²ΠΈ, Π½Π° ΠΏΡΠΈΠΌΠ΅Ρ Π·Π±ΠΎΠ³ Π³ΡΠ΅ΡΠΊΠ΅ ΠΊΠ»Π°ΡΡΠ΅ΡΠ° (recovery_target_timeline
).
Π‘ recovery_min_apply_delay
ΠΠΎΠΆΠ΅ΡΠ΅ ΠΏΠΎΠ΄Π΅ΡΠΈΡΠΈ ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΡ ΡΡΡΠΈΠΌΠΈΠ½Π³Π° ΡΠ° Π·Π°ΠΊΠ°ΡΡΠ΅ΡΠ΅ΠΌ, Π°Π»ΠΈ ΠΎΠ²Π΄Π΅ ΠΏΠΎΡΡΠΎΡΠΈ Π½Π΅ΠΊΠΎΠ»ΠΈΠΊΠΎ Π·Π°ΠΌΠΊΠΈ ΠΊΠΎΡΠ΅ ΡΠ΅ ΠΎΠ΄Π½ΠΎΡΠ΅ Π½Π° ΡΠ»ΠΎΡΠΎΠ²Π΅ Π·Π° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΡ, ΠΏΠΎΠ²ΡΠ°ΡΠ½Π΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡΠ΅ ΠΎ Π²ΡΡΡΠΎΡ ΠΏΡΠΈΠΏΡΠ°Π²Π½ΠΎΡΡΠΈ ΠΈ ΡΠ°ΠΊΠΎ Π΄Π°ΡΠ΅. ΠΠΠ Π°ΡΡ
ΠΈΠ²Π° Π²Π°ΠΌ ΠΎΠΌΠΎΠ³ΡΡΠ°Π²Π° Π΄Π° ΠΈΡ
ΠΈΠ·Π±Π΅Π³Π½Π΅ΡΠ΅.
ΠΠ°ΡΠ°ΠΌΠ΅ΡΠ°Ρ recovery_min_apply_delay
ΠΏΠΎΡΠ°Π²ΠΈΠΎ ΡΠ΅ ΡΠ°ΠΌΠΎ Ρ ΠΠΎΡΡΠ³ΡΠ΅Π‘ΠΠ 9.3. Π£ ΠΏΡΠ΅ΡΡ
ΠΎΠ΄Π½ΠΈΠΌ Π²Π΅ΡΠ·ΠΈΡΠ°ΠΌΠ°, Π·Π° ΠΎΠ΄Π»ΠΎΠΆΠ΅Π½Ρ ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΡ ΠΌΠΎΡΠ°ΡΠ΅ Π΄Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ΅ΡΠ΅ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΡΡ pg_xlog_replay_pause(), pg_xlog_replay_resume()
) ΠΈΠ»ΠΈ Π·Π°Π΄ΡΠΆΠΈΡΠ΅ ΠΠΠ ΡΠ΅Π³ΠΌΠ΅Π½ΡΠ΅ Ρ Π°ΡΡ
ΠΈΠ²ΠΈ Π·Π° Π²ΡΠ΅ΠΌΠ΅ ΡΡΠ°ΡΠ°ΡΠ° ΠΊΠ°ΡΡΠ΅ΡΠ°.
ΠΠ°ΠΊΠΎ ΠΠΎΡΡΠ³ΡΠ΅Π‘ΠΠ ΡΠΎ ΡΠ°Π΄ΠΈ?
ΠΠ°Π½ΠΈΠΌΡΠΈΠ²ΠΎ ΡΠ΅ Π²ΠΈΠ΄Π΅ΡΠΈ ΠΊΠ°ΠΊΠΎ ΠΠΎΡΡΠ³ΡΠ΅Π‘ΠΠ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ° Π»Π΅ΡΠΈ ΠΎΠΏΠΎΡΠ°Π²Π°ΠΊ. Π₯Π°ΡΠ΄Π΅ Π΄Π° ΠΏΠΎΠ³Π»Π΅Π΄Π°ΠΌΠΎ 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, µsecs);
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 Π’Π. Π ΠΎΠ½Π΄Π° ΠΈ Π΄Π°ΡΠ΅ ΠΌΠΎΡΠ°ΡΠ΅ Π΄Π° ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡΠ΅ ΡΠ΅ΠΎ Π΄Π½Π΅Π²Π½ΠΈ ΠΠΠ Π΄Π° Π±ΠΈΡΡΠ΅ ΡΠ΅ ΠΎΠΏΠΎΡΠ°Π²ΠΈΠ»ΠΈ Ρ ΠΆΠ΅ΡΠ΅Π½ΠΎ ΡΡΠ°ΡΠ΅ (Ρ Π½Π°ΡΠ³ΠΎΡΠ΅ΠΌ ΡΠ»ΡΡΠ°ΡΡ).
ΠΠ΄Π»ΠΎΠΆΠ΅Π½Π° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ° ΡΠ΅ Π±ΠΎΡΠ° ΠΎΠ΄ Ρ Π»Π°Π΄Π½Π΅ ΡΠ΅Π·Π΅ΡΠ²Π½Π΅ ΠΊΠΎΠΏΠΈΡΠ΅ Π½Π° Π΄Π²Π° Π½Π°ΡΠΈΠ½Π°:
- ΠΠ΅ΠΌΠ° ΠΏΠΎΡΡΠ΅Π±Π΅ Π΄Π° ΡΠΊΠ»Π°ΡΠ°ΡΠ΅ ΡΠ΅Π»Ρ ΠΎΡΠ½ΠΎΠ²Π½Ρ ΡΠ΅Π·Π΅ΡΠ²Π½Ρ ΠΊΠΎΠΏΠΈΡΡ ΠΈΠ· Π°ΡΡ ΠΈΠ²Π΅.
- ΠΠΎΡΡΠΎΡΠΈ ΡΠΈΠΊΡΠ½ΠΈ ΠΎΡΠΌΠΎΡΠ°ΡΠΎΠ²Π½ΠΈ ΠΏΡΠΎΠ·ΠΎΡ ΠΠΠ ΡΠ΅Π³ΠΌΠ΅Π½Π°ΡΠ° ΠΊΠΎΡΠΈ ΡΠ΅ ΠΌΠΎΡΠ°ΡΡ ΠΏΠΎΠ½ΠΎΠ²ΠΈΡΠΈ.
Π’Π°ΠΊΠΎΡΠ΅ ΡΡΠ°Π»Π½ΠΎ ΠΏΡΠΎΠ²Π΅ΡΠ°Π²Π°ΠΌΠΎ Π΄Π° Π»ΠΈ ΡΠ΅ ΠΌΠΎΠ³ΡΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈΡΠΈ ΠΠΠ’Π ΠΈΠ· ΠΠΠ-Π° ΠΈ Π±ΡΠ·ΠΎ Π±ΠΈΡΠΌΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠΈΠ»ΠΈ ΠΎΡΡΠ΅ΡΠ΅ΡΠ΅ ΠΈΠ»ΠΈ Π΄ΡΡΠ³Π΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ΅ ΡΠ° ΠΠΠ Π°ΡΡ ΠΈΠ²ΠΎΠΌ ΠΏΡΠ°ΡΠ΅ΡΠ΅ΠΌ ΠΊΠ°ΡΡΠ΅ΡΠ° ΠΎΠ΄Π»ΠΎΠΆΠ΅Π½Π΅ ΡΠ΅ΠΏΠ»ΠΈΠΊΠ΅.
Π£ ΠΎΠ²ΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΡ, ΡΡΠ΅Π±Π°Π»ΠΎ Π½Π°ΠΌ ΡΠ΅ 50 ΠΌΠΈΠ½ΡΡΠ° Π΄Π° Π²ΡΠ°ΡΠΈΠΌΠΎ, ΡΡΠΎ Π·Π½Π°ΡΠΈ Π΄Π° ΡΠ΅ Π±ΡΠ·ΠΈΠ½Π° Π±ΠΈΠ»Π° 110 ΠΠ ΠΠΠ ΠΏΠΎΠ΄Π°ΡΠ°ΠΊΠ° Π½Π° ΡΠ°Ρ (Π°ΡΡ
ΠΈΠ²Π° ΡΠ΅ ΡΠΎΡ ΡΠ²Π΅ΠΊ Π±ΠΈΠ»Π° ΡΠΊΡΡΡΠ΅Π½Π°
Π Π΅Π·ΡΠ»ΡΠ°ΡΠΈ: Π³Π΄Π΅ ΡΠ΅ ΠΎΠ΄Π»ΠΎΠΆΠ΅Π½Π° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ° ΠΊΠΎΡΠΈΡΠ½Π° (Π° Π³Π΄Π΅ Π½ΠΈΡΠ΅)
ΠΠΎΡΠΈΡΡΠΈΡΠ΅ ΠΎΠ΄Π»ΠΎΠΆΠ΅Π½Ρ ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΡ ΠΊΠ°ΠΎ ΠΏΡΠ²Ρ ΠΏΠΎΠΌΠΎΡ Π°ΠΊΠΎ ΡΡΠ΅ ΡΠ»ΡΡΠ°ΡΠ½ΠΎ ΠΈΠ·Π³ΡΠ±ΠΈΠ»ΠΈ ΠΏΠΎΠ΄Π°ΡΠΊΠ΅ ΠΈ ΠΏΡΠΈΠΌΠ΅ΡΠΈΠ»ΠΈ ΠΎΠ²Π°Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌ ΡΠ½ΡΡΠ°Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π½ΠΎΠ³ ΠΎΠ΄Π»Π°Π³Π°ΡΠ°.
ΠΠ»ΠΈ ΠΈΠΌΠ°ΡΡΠ΅ Π½Π° ΡΠΌΡ: ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ° Π½ΠΈΡΠ΅ ΡΠ΅Π·Π΅ΡΠ²Π½Π° ΠΊΠΎΠΏΠΈΡΠ°.
Π Π΅Π·Π΅ΡΠ²Π½Π° ΠΊΠΎΠΏΠΈΡΠ° ΠΈ ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ° ΠΈΠΌΠ°ΡΡ ΡΠ°Π·Π»ΠΈΡΠΈΡΠ΅ ΡΠ²ΡΡ
Π΅. Π₯Π»Π°Π΄Π½Π° ΡΠ΅Π·Π΅ΡΠ²Π½Π° ΠΊΠΎΠΏΠΈΡΠ° ΡΠ΅ Π²Π°ΠΌ Π΄ΠΎΠ±ΡΠΎ Π΄ΠΎΡΠΈ Π°ΠΊΠΎ ΡΡΠ΅ ΡΠ»ΡΡΠ°ΡΠ½ΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈΠ»ΠΈ DELETE
ΠΈΠ»ΠΈ DROP TABLE
. ΠΡΠ°Π²ΠΈΠΌΠΎ ΡΠ΅Π·Π΅ΡΠ²Π½Ρ ΠΊΠΎΠΏΠΈΡΡ ΡΠ° Ρ
Π»Π°Π΄Π½ΠΎΠ³ ΡΠΊΠ»Π°Π΄ΠΈΡΡΠ° ΠΈ Π²ΡΠ°ΡΠ°ΠΌΠΎ ΠΏΡΠ΅ΡΡ
ΠΎΠ΄Π½ΠΎ ΡΡΠ°ΡΠ΅ ΡΠ°Π±Π΅Π»Π΅ ΠΈΠ»ΠΈ ΡΠ΅Π»Π΅ Π±Π°Π·Π΅ ΠΏΠΎΠ΄Π°ΡΠ°ΠΊΠ°. ΠΠ»ΠΈ ΠΈΡΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½ΠΎ ΠΈ Π·Π°Ρ
ΡΠ΅Π² DROP TABLE
ΡΠ΅ ΡΠΊΠΎΡΠΎ ΡΡΠ΅Π½ΡΡΠ½ΠΎ ΡΠ΅ΠΏΡΠΎΠ΄ΡΠΊΡΡΠ΅ Ρ ΡΠ²ΠΈΠΌ ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΠΌΠ° Π½Π° ΡΠ°Π΄Π½ΠΎΠΌ ΠΊΠ»Π°ΡΡΠ΅ΡΡ, ΡΠ°ΠΊΠΎ Π΄Π° ΠΎΠ±ΠΈΡΠ½Π° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ° ΠΎΠ²Π΄Π΅ Π½Π΅ΡΠ΅ ΠΏΠΎΠΌΠΎΡΠΈ. Π‘Π°ΠΌΠ° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ° ΠΎΠ΄ΡΠΆΠ°Π²Π° Π±Π°Π·Ρ ΠΏΠΎΠ΄Π°ΡΠ°ΠΊΠ° Π΄ΠΎΡΡΡΠΏΠ½ΠΎΠΌ ΠΊΠ°Π΄Π° ΡΠ΅ ΠΏΠΎΡΠ΅Π΄ΠΈΠ½Π°ΡΠ½ΠΈ ΡΠ΅ΡΠ²Π΅ΡΠΈ ΠΈΠ·Π½Π°ΡΠΌΡΡΡΡ ΠΈ ΡΠ°ΡΠΏΠΎΡΠ΅ΡΡΡΠ΅ ΠΎΠΏΡΠ΅ΡΠ΅ΡΠ΅ΡΠ΅.
Π§Π°ΠΊ ΠΈ ΡΠ° ΠΎΠ΄Π»ΠΎΠΆΠ΅Π½ΠΎΠΌ ΡΠ΅ΠΏΠ»ΠΈΠΊΠΎΠΌ, ΠΏΠΎΠ½Π΅ΠΊΠ°Π΄ Π½Π°ΠΌ ΡΠ΅ Π·Π°ΠΈΡΡΠ° ΠΏΠΎΡΡΠ΅Π±Π½Π° Ρ Π»Π°Π΄Π½Π° ΡΠ΅Π·Π΅ΡΠ²Π½Π° ΠΊΠΎΠΏΠΈΡΠ° Π½Π° Π±Π΅Π·Π±Π΅Π΄Π½ΠΎΠΌ ΠΌΠ΅ΡΡΡ Π°ΠΊΠΎ Π΄ΠΎΡΠ΅ Π΄ΠΎ ΠΊΠ²Π°ΡΠ° ΡΠ΅Π½ΡΡΠ° ΠΏΠΎΠ΄Π°ΡΠ°ΠΊΠ°, ΡΠΊΡΠΈΠ²Π΅Π½ΠΈΡ ΠΎΡΡΠ΅ΡΠ΅ΡΠ° ΠΈΠ»ΠΈ Π΄ΡΡΠ³ΠΈΡ Π΄ΠΎΠ³Π°ΡΠ°ΡΠ° ΠΊΠΎΡΠΈ Π½ΠΈΡΡ ΠΎΠ΄ΠΌΠ°Ρ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΈ. Π‘Π°ΠΌΠ° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ° ΠΎΠ²Π΄Π΅ Π½ΠΈΡΠ΅ ΠΎΠ΄ ΠΊΠΎΡΠΈΡΡΠΈ.
ΠΡΠΈΠΌΠ΅ΡΠΈΡΠΈ. ΠΠ½
ΠΠ·Π²ΠΎΡ: Π²Π²Π².Ρ Π°Π±Ρ.ΡΠΎΠΌ