แ แแแแแแแชแแ แแ แแ แแก แกแแ แแแแ แแ. แฒแฃ แแ แ? แแ, แ แแแแ แแแแแแแงแแแแ แแแแแแแแฃแแ แ แแแแแแแชแแ แแแแกแแฎแแแแแแแก แจแแแแฎแแแแแ แฌแแจแแแกแแแ แแแแแกแแกแฌแแ แแแแแ.
แ แแแแแแแชแแ แแ แแ แแก แแแแแชแแแแ แแแแแก แกแแ แแแแ แแ แกแแจแฃแแแแแ (gitlab-ce
แแแแแแแแแแฃแแ แ แแแแแแแ, แฉแแแ แแฆแแแแแแแแ แแแแแชแแแแแ แแฎแแแแ 1,5 แกแแแแจแ. แจแแฎแแแ แ แแแแ แแแฎแแ.
แแแฃแแแแแ แแ แแจแ แแฆแแแแแ PostgreSQL-แแ
PostgreSQL-แก แแฅแแก แฉแแจแแแแแฃแแ แคแฃแแฅแชแแ, แ แแแแแแช แแฆแแแแแแก แแแแแชแแแแ แแแแแก แแแแแแแ แแแแแก แแ แแแก แแแแแ แแขแฃแ แแแแแแขแจแ. แแแก แแซแแฎแแแ
แแ แคแฃแแฅแชแแแก แชแแแ แกแแ แแแแ แแ แแกแแแก แแแแแกแแงแแแแแแแ, แฉแแแ แ แแแฃแแแ แฃแแแ แแแแแแแแ แแแแแชแแแแ แแแแแก แกแแ แแแแ แแ แแกแแก แแ แแแแแฎแแแ แแแก แแ แฅแแแจแ (GitLab แแ แฅแแแแแ แชแฎแแแ แแแก
แ แ แแ แแก แแแแแแแแฃแแ แ แแแแแแแชแแ?
แแแ แแแชแ แ แแแแแแแชแแ แแ แแก WAL-แแแ แชแแแแแแแแแแก แแแแแงแแแแแ แแแแแแแแแแแ. แแแฃ แแแ แแแแแ แแแฎแแ แแ แ แกแแแแจแ X
, แแแแ แแ แ แแแแแแแจแ แแแแแแแแแแแ แแแแแฉแแแแแ d
แแ แ แกแแแแจแ X + d
.
PostgreSQL-แก แแฅแแก 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
แแฅแแแ แจแแแแซแแแแ แแแแงแแแแ แแแแแแแก แ แแแแแแแชแแ แแแแแแแแแแแ, แแแแ แแ แแฅ แแ แแก แ แแแแแแแแ แแ แแแแแแ, แ แแแแแแแช แแแแแแจแแ แแแฃแแแ แ แแแแแแแชแแแก แกแแแขแแแแแ, แชแฎแแ แแแแแแแก แแแแแฎแแแฃแ แแแแกแแแ แแ แ.แจ. WAL แแ แฅแแแ แกแแจแฃแแแแแแก แแแซแแแแ แแแแแแแ แแแชแแแแ แแกแแแ.
แแแ แแแแขแ แแก recovery_min_apply_delay
แแแแแฉแแแ แแฎแแแแ PostgreSQL 9.3-แจแ. แฌแแแ แแแ แกแแแแจแ, แแแแแแแแแแฃแแ แ แแแแแแแชแแแกแแแแก แกแแญแแ แแ แแแแแแแแชแแแก แแแแคแแแฃแ แแชแแ pg_xlog_replay_pause(), pg_xlog_replay_resume()
) แแ แจแแแแแฎแแ WAL แกแแแแแแขแแแ แแ แฅแแแจแ แแแแแแแแแแแก แฎแแแแ แซแแแแแแแกแแแแก.
แ แแแแ แแแแแแแก แแแแก 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, µ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
, แงแแแแแคแแ แ แแกแแ แฌแแแจแแแแ แแ แแแแแฌแแแ แแแแแแแ แแแฌแงแแแ (แแ แแฃแแแแช แชแแแ แกแแ แแแแ แแ แแกแแแก แแฆแแแ 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
แแแแแชแแแแ แแแแ แแแฃแแ แฃแแแ แแแแแก แแแแแแแ แแแแแก แแ แกแแแฌแฃแฎแแ แ แแแแฎแแแแแแแ. แแฎแแ แจแแแแซแแแแ, แแแแแแแแแ, แแแแแชแแแแแแก แแฅแกแแแ แขแ. แฉแแแ แแฅแกแแแ แขแแ แแแฃแแแ แแแแแแแก แฌแแจแแแแ แแแแแชแแแแแ แแ แงแแแแ แแแฃแแ แกแแแแแฎแแแแแ แแ แแแแ แแแแแแแแก แแแแฎแแแแแแแแ แแ แแแแแแแขแแแแ แแกแแแ แฌแแ แแแแแแก แแแแแชแแแแ แแแแแจแ. แแฃ แแแแแแแ แแแแ แคแแ แแแแแกแจแขแแแแแแแ, แจแแแแซแแแแ แฃแแ แแแแ แแแแฌแแแแฃแ แแ แ แแแแแแ แแ แแแแแแงแแแแ แแแ, แ แแแแ แช แแแแแแ แ. แแแแ แแ แจแแแแแ แงแแแแ แชแแแแแแแ แแ แฌแแ แขแแแแก แจแแแแแ, แ แแแแแกแแช แฉแแแ แแฆแแแแแแแ, แแแแแแ แแแแ.
แแ แแแก แแแแแแญแแแแแก แแแชแแแแ, แฃแแฏแแแแกแแ แแแแแแงแแแแ แขแ แแแแแฅแชแแแก ID-แแแ. แกแแกแแ แแแแแแ แแ ID-แแแแก แฉแแฌแแ แ, แแแแแแแแแ, DDL แแแแชแฎแแแแแแแแกแแแแก (แ แแแแ แแชแแ DROP TABLE
), แแแแแงแแแแแแ log_statements = 'ddl'
. แขแ แแแแแฅแชแแแก ID แ แแ แแแฅแแแแแก, แแแฆแแแแแ recovery_target_xid
แแ แแแแฅแชแ แงแแแแแคแแ แ แขแ แแแแแฅแชแแแแแ แแฎแแแแแแแ DELETE
.
แกแแแฃแจแแแแ แแแแ แฃแแแแ แซแแแแแ แแแ แขแแแแ: แฌแแจแแแแ แงแแแแ แชแแแแแแแ recovery.conf
แแ แแแแแขแแแ แแแ Postgres. แ แแแแแแแก แแแแ แแกแแ แ แแ แกแแแแแก แแแแแแแแแแ แแฅแแแแ แแ แฉแแแ แแแแ แแแ แ แแแแแแแแ แแ แแแแแแแแแกแแแแก.
แแฆแแแแแแก แฃแแแ แแขแแกแแแแแ
แชแแแ แกแแ แแแแ แแ แแกแแแก แแแชแแแแ แแแแแแแแแแฃแแ แ แแแแแแแ, แแฅแแแ แแ แแญแแ แแแแแ แกแแแแแแแก แแแฎแแ แฏแแ แแ แฅแแแแแแ แแแแแ แกแฃแ แแแแก แแฆแแแแแแกแแแแก. แแแแแแแแแ, 2 แขแ แแแแแแแ แกแแ แแแแ แแ แแกแแแก แแแกแแฆแแแแ แฎแฃแแ แกแแแแ แแแญแแ แแแแ. แแ แจแแแแแ แแฅแแแ แแแแแ แฃแแแ แแแแแแงแแแแ แแแแแ แงแแแแแแฆแแฃแ แ WAL แกแแกแฃแ แแแ แแแแแแแ แแแแแแแ แแฆแกแแแแแแแ (แฃแแ แแก แจแแแแฎแแแแแจแ).
แแแแแแแแฃแแ แ แแแแแแ แฃแแแแแกแแ, แแแแ แ แชแแแ แกแแ แแแแ แแ แแ แ แแแแ:
- แแ แแ แแก แกแแญแแ แ แแ แฅแแแแแแ แแแแแแแ แกแแ แแแแ แแ แแกแแแก แแแแฆแแแ.
- แแ แกแแแแแก WAL แกแแแแแแขแแแแก แคแแฅแกแแ แแแฃแแ แ แแ แกแแแแแแแ แคแแแฏแแ แ, แ แแแแแแช แฃแแแ แแแแแแแ แแแก.
แฉแแแ แแกแแแ แแฃแแแแแแ แแแแแฌแแแแ, แจแแกแแซแแแแแแแ แแฃ แแ แ PITR-แแก แแแแแแแแแ WAL-แแแ แแ แฉแแแ แกแฌแ แแคแแ แจแแแแแฉแแแแ แแแ แฃแคแชแแแก แแ แกแฎแแ แแ แแแแแแแแก WAL-แแก แแ แฅแแแแแ แแแแแแจแแ แแแแ, แแแแแแแแแแฃแแ แ แแแแแแแก แจแแคแแ แฎแแแแก แแแแแขแแ แแแแแ.
แแ แแแแแแแแจแ, แแฆแแแแแแก 50 แฌแฃแแ แแแแแญแแ แแ, แ แแช แแแจแแแแก, แ แแ แกแแฉแฅแแ แ แแงแ 110 แแ WAL แแแแแชแแแแแ แกแแแแจแ (แแ แฅแแแ แฏแแ แแแแแ แฉแแ แแฃแแ แแงแ
แจแแแแแแแ: แกแแแแช แแแแแแแแแแฃแแ แ แแแแแแ แกแแกแแ แแแแแแ (แแ แกแแ แแ แ)
แแแแแแงแแแแ แแแแแแแแแแฃแแ แ แแแแแแแชแแ, แ แแแแ แช แแแ แแแแแแ แแแฎแแแ แแแ, แแฃ แจแแแแฎแแแแแ แแแแแ แแแ แแแแแชแแแแแ แแ แจแแแแจแแแ แแก แแ แแแแแแ แแแแคแแแฃแ แแ แแแฃแแ แแแแแแแแแแแ.
แแแแ แแ แแแฎแกแแแแแ: แ แแแแแแแชแแ แแ แแ แแก แกแแ แแแแ แแ.
แกแแ แแแแ แแ แแ แ แแแแแแแชแแแก แกแฎแแแแแกแฎแแ แแแแแจแแฃแแแแ แแฅแแก. แชแแแ แกแแ แแแแ แแ แกแแจแฃแแแแแ แแแแแแแแแแแแ, แแฃ แจแแแแฎแแแแแ แแแแแแแแ DELETE
แแ DROP TABLE
. แฉแแแ แแแแแแแแ แกแแ แแแแ แแ แแกแแก แชแแแ แกแแชแแแแแแ แแ แแฆแแแแแแแ แชแฎแ แแแแก แแ แแแแแ แแแแแชแแแแ แแแแแก แฌแแแ แแแแแแแ แแแแแก. แแแแ แแ แแแแแ แแ แแก แแฎแแแแ DROP TABLE
แแแแฅแแแก แแงแแกแแแ แแ แแ แแแแแแแ แกแแแฃแจแแ แแแแกแขแแ แแ แงแแแแ แ แแแแแแแจแ, แแแแขแแ แฉแแแฃแแแแ แแแ แ แแแแแแแชแแ แแฅ แแ แแแแแแฎแแแ แแแ. แ แแแแแแแชแแ แแแแแกแแแแแ แแแแฎแแแก แแแแแชแแแแ แแแแแก, แ แแแแกแแช แชแแแแแฃแแ แกแแ แแแ แแแ แฅแแ แแแแแแ แแ แแแแฌแแแแแก แแแขแแแ แแแแก.
แแแแแแแแฃแแ แแกแแแก แจแแแแฎแแแแแจแแช แแ, แแแแฏแแ แแแแแแแแแ แแแญแแ แแแแ แชแแแ แกแแ แแแแ แแ แกแแจแฃแแแแแ แฃแกแแคแ แแฎแ แแแแแแแก, แแฃ แแแฎแแแแ แแแแแชแแแแ แชแแแขแ แแก แฃแแแแ แแกแแแ, แคแแ แฃแแ แแแแแแแแแ แแ แกแฎแแ แแแแแแแแแ, แ แแแแแแแช แแแฃแงแแแแแแแแ แแ แแ แแก แจแแกแแแฉแแแแ. แแแ แขแ แแแแแแ แแแ แแฅ แแ แแคแแ แจแฃแแจแแ.
แจแแแแจแแแ. แฌแแแก
แฌแงแแ แ: www.habr.com