PostgreSQL āĻāϰ āϏāĻžāĻĨ⧇ āĻĻ⧁āĻ°ā§āϝ⧋āĻ— āĻĒ⧁āύāϰ⧁āĻĻā§āϧāĻžāϰ⧇āϰ āϜāĻ¨ā§āϝ āφāĻŽāϰāĻž āϕ⧀āĻ­āĻžāĻŦ⧇ āĻ…āϞāϏ āĻĒā§āϰāϤāĻŋāϞāĻŋāĻĒāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇āĻ›āĻŋ

PostgreSQL āĻāϰ āϏāĻžāĻĨ⧇ āĻĻ⧁āĻ°ā§āϝ⧋āĻ— āĻĒ⧁āύāϰ⧁āĻĻā§āϧāĻžāϰ⧇āϰ āϜāĻ¨ā§āϝ āφāĻŽāϰāĻž āϕ⧀āĻ­āĻžāĻŦ⧇ āĻ…āϞāϏ āĻĒā§āϰāϤāĻŋāϞāĻŋāĻĒāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇āĻ›āĻŋ
āĻĒā§āϰāϤāĻŋāϞāĻŋāĻĒāĻŋ āĻŦā§āϝāĻžāĻ•āφāĻĒ āύāϝāĻŧ. āĻ…āĻĨāĻŦāĻž āύāĻž? āϘāϟāύāĻžāĻ•ā§āϰāĻŽā§‡ āĻŽā§āϛ⧇ āĻĢ⧇āϞāĻž āĻļāĻ°ā§āϟāĻ•āĻžāϟāϗ⧁āϞāĻŋ āĻĨ⧇āϕ⧇ āĻĒ⧁āύāϰ⧁āĻĻā§āϧāĻžāϰ āĻ•āϰāϤ⧇ āφāĻŽāϰāĻž āϕ⧀āĻ­āĻžāĻŦ⧇ āĻŦāĻŋāϞāĻŽā§āĻŦāĻŋāϤ āĻĒā§āϰāϤāĻŋāϞāĻŋāĻĒāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇āĻ›āĻŋ āϤāĻž āĻāĻ–āĻžāύ⧇āĨ¤

āĻ…āĻŦāĻ•āĻžāĻ āĻžāĻŽā§‹ āĻŦāĻŋāĻļ⧇āώāĻœā§āĻž āĻ—āĻŋāϟāĻ˛ā§āϝāĻžāĻŦ āĻ•āĻžāĻœā§‡āϰ āϜāĻ¨ā§āϝ āĻĻāĻžāϝāĻŧā§€ GitLab.com - āĻĒā§āϰāĻ•ā§ƒāϤāĻŋāϰ āĻŦ⧃āĻšāĻ¤ā§āϤāĻŽ āĻ—āĻŋāϟāĻ˛ā§āϝāĻžāĻŦ āωāĻĻāĻžāĻšāϰāĻŖāĨ¤ 3 āĻŽāĻŋāϞāĻŋāϝāĻŧāύ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ āĻāĻŦāĻ‚ āĻĒā§āϰāĻžāϝāĻŧ 7 āĻŽāĻŋāϞāĻŋāϝāĻŧāύ āĻĒā§āϰāĻ•āĻ˛ā§āĻĒ⧇āϰ āϏāĻžāĻĨ⧇, āĻāϟāĻŋ āĻāĻ•āϟāĻŋ āĻĄā§‡āĻĄāĻŋāϕ⧇āĻŸā§‡āĻĄ āφāĻ°ā§āĻ•āĻŋāĻŸā§‡āĻ•āϚāĻžāϰ āϏāĻš āĻŦ⧃āĻšāĻ¤ā§āϤāĻŽ āĻ“āĻĒ⧇āύ āϏ⧋āĻ°ā§āϏ SaaS āϏāĻžāχāϟāϗ⧁āϞāĻŋāϰ āĻŽāĻ§ā§āϝ⧇ āĻāĻ•āϟāĻŋāĨ¤ PostgreSQL āĻĄāĻžāϟāĻžāĻŦ⧇āϏ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻŦā§āϝāϤ⧀āϤ, GitLab.com āĻĒāϰāĻŋāĻ•āĻžāĻ āĻžāĻŽā§‹ āĻŦ⧇āĻļāĻŋāĻĻā§‚āϰ āϝāĻžāĻŦ⧇ āύāĻž āĻāĻŦāĻ‚ āĻĄā§‡āϟāĻž āĻšāĻžāϰāĻŋāϝāĻŧ⧇ āϗ⧇āϞ⧇ āϕ⧋āύ⧋ āĻŦā§āϝāĻ°ā§āĻĨāϤāĻžāϰ āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇ āĻ¤ā§āϰ⧁āϟāĻŋ āϏāĻšāύāĻļā§€āϞāϤāĻž āύāĻŋāĻļā§āϚāĻŋāϤ āĻ•āϰāϤ⧇ āφāĻŽāϰāĻž āϕ⧀ āĻ•āϰāĻ›āĻŋāĨ¤ āĻāϟāĻž āĻ…āϏāĻŽā§āĻ­āĻžāĻŦā§āϝ āϝ⧇ āĻāχ āϧāϰāύ⧇āϰ āĻāĻ•āϟāĻŋ āĻŦāĻŋāĻĒāĻ°ā§āϝāϝāĻŧ āϘāϟāĻŦ⧇, āĻ•āĻŋāĻ¨ā§āϤ⧁ āφāĻŽāϰāĻž āĻ­āĻžāϞāĻ­āĻžāĻŦ⧇ āĻĒā§āϰāĻ¸ā§āϤ⧁āϤ āĻāĻŦāĻ‚ āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āύ āĻŦā§āϝāĻžāĻ•āφāĻĒ āĻāĻŦāĻ‚ āĻĒā§āϰāϤāĻŋāϞāĻŋāĻĒāĻŋ āĻĒā§āϰāĻ•ā§āϰāĻŋāϝāĻŧāĻžāϰ āϏāĻžāĻĨ⧇ āĻ¸ā§āϟāĻ• āφāĻĒāĨ¤

āĻĒā§āϰāϤāĻŋāϞāĻŋāĻĒāĻŋ āĻĄāĻžāϟāĻžāĻŦ⧇āϏ āĻŦā§āϝāĻžāĻ• āφāĻĒ āĻ•āϰāĻžāϰ āĻāĻ•āϟāĻŋ āωāĻĒāĻžāϝāĻŧ āύāϝāĻŧ (āύāĻŋāĻšā§‡ āĻĻ⧇āĻ–) āĻ•āĻŋāĻ¨ā§āϤ⧁ āĻāĻ–āύ āφāĻŽāϰāĻž āĻĻ⧇āĻ–āĻŦ āĻ•āĻŋāĻ­āĻžāĻŦ⧇ āĻĻā§āϰ⧁āϤ āĻ…āϞāϏ āĻĒā§āϰāϤāĻŋāϞāĻŋāĻĒāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻĻ⧁āĻ°ā§āϘāϟāύāĻžāĻ•ā§āϰāĻŽā§‡ āĻŽā§āϛ⧇ āĻĢ⧇āϞāĻž āĻĄā§‡āϟāĻž āĻĒ⧁āύāϰ⧁āĻĻā§āϧāĻžāϰ āĻ•āϰāĻž āϝāĻžāϝāĻŧ: āĻ…āύ GitLab.com āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ āĻļāĻ°ā§āϟāĻ•āĻžāϟ āĻŽā§āϛ⧇ āĻĢ⧇āϞāĻž āĻšāϝāĻŧ⧇āϛ⧇ āĻĒā§āϰāĻ•āĻ˛ā§āĻĒ⧇āϰ āϜāĻ¨ā§āϝ gitlab-ce āĻāĻŦāĻ‚ āĻŽāĻžāĻ°ā§āϜ āĻ…āύ⧁āϰ⧋āϧ āĻāĻŦāĻ‚ āĻ•āĻžāϜāϗ⧁āϞāĻŋāϰ āϏāĻžāĻĨ⧇ āϏāĻ‚āϝ⧋āĻ— āĻšāĻžāϰāĻŋāϝāĻŧ⧇āϛ⧇⧎

āĻāĻ•āϟāĻŋ āĻŦāĻŋāϞāĻŽā§āĻŦāĻŋāϤ āĻĒā§āϰāϤāĻŋāϰ⧂āĻĒ āĻĻāĻŋāϝāĻŧ⧇, āφāĻŽāϰāĻž āĻŽāĻžāĻ¤ā§āϰ 1,5 āϘāĻ¨ā§āϟāĻžāϰ āĻŽāĻ§ā§āϝ⧇ āĻĄā§‡āϟāĻž āĻĒ⧁āύāϰ⧁āĻĻā§āϧāĻžāϰ āĻ•āϰ⧇āĻ›āĻŋāĨ¤ āĻĻ⧇āϖ⧁āύ āĻ•āĻŋāĻ­āĻžāĻŦ⧇ āĻāϟāĻž āĻšāϝāĻŧ⧇āϛ⧇.

PostgreSQL-āĻāϰ āϏāĻžāĻšāĻžāĻ¯ā§āϝ⧇ āĻĒāϝāĻŧ⧇āĻ¨ā§āϟ āχāύ āϟāĻžāχāĻŽ āϰāĻŋāĻ•āĻ­āĻžāϰāĻŋ

PostgreSQL āĻāϰ āĻāĻ•āϟāĻŋ āĻ…āĻ¨ā§āϤāĻ°ā§āύāĻŋāĻ°ā§āĻŽāĻŋāϤ āĻĢāĻžāĻ‚āĻļāύ āϰāϝāĻŧ⧇āϛ⧇ āϝāĻž āĻāĻ•āϟāĻŋ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āϏāĻŽāϝāĻŧ⧇ āĻāĻ•āϟāĻŋ āĻĄāĻžāϟāĻžāĻŦ⧇āϏ⧇āϰ āĻ…āĻŦāĻ¸ā§āĻĨāĻž āĻĒ⧁āύāϰ⧁āĻĻā§āϧāĻžāϰ āĻ•āϰ⧇āĨ¤ āĻāϟāĻž āϕ⧇ āĻŦāϞ⧇ āĻĒāϝāĻŧ⧇āĻ¨ā§āϟ-āχāύ-āϟāĻžāχāĻŽ āϰāĻŋāĻ•āĻ­āĻžāϰāĻŋ (PITR) āĻāĻŦāĻ‚ āĻāĻ•āχ āĻĒāĻĻā§āϧāϤāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āϝāĻž āĻĒā§āϰāϤāĻŋāϞāĻŋāĻĒāĻŋāϟāĻŋāϕ⧇ āφāĻĒ āϟ⧁ āĻĄā§‡āϟ āϰāĻžāϖ⧇: āϏāĻŽāĻ—ā§āϰ āĻĄāĻžāϟāĻžāĻŦ⧇āϏ āĻ•ā§āϞāĻžāĻ¸ā§āϟāĻžāϰ⧇āϰ āĻāĻ•āϟāĻŋ āύāĻŋāĻ°ā§āĻ­āϰāϝ⧋āĻ—ā§āϝ āĻ¸ā§āĻ¨ā§āϝāĻžāĻĒāĻļāϟ āĻĻāĻŋāϝāĻŧ⧇ āĻļ⧁āϰ⧁ āĻ•āϰ⧇ (āĻŦ⧇āϏ āĻŦā§āϝāĻžāĻ•āφāĻĒ), āφāĻŽāϰāĻž āĻāĻ•āϟāĻŋ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āϏāĻŽāϝāĻŧ āĻĒāĻ°ā§āϝāĻ¨ā§āϤ āϰāĻžāĻˇā§āĻŸā§āϰ⧀āϝāĻŧ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ⧇āϰ āĻāĻ•āϟāĻŋ āϏāĻŋāϰāĻŋāϜ āĻĒā§āϰāϝāĻŧā§‹āĻ— āĻ•āϰāĻŋāĨ¤

āϕ⧋āĻ˛ā§āĻĄ āĻŦā§āϝāĻžāĻ•āφāĻĒ⧇āϰ āϜāĻ¨ā§āϝ āĻāχ āĻŦ⧈āĻļāĻŋāĻˇā§āĻŸā§āϝāϟāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ, āφāĻŽāϰāĻž āύāĻŋāϝāĻŧāĻŽāĻŋāϤ āĻāĻ•āϟāĻŋ āĻŽā§ŒāϞāĻŋāĻ• āĻĄāĻžāϟāĻžāĻŦ⧇āϏ āĻŦā§āϝāĻžāĻ•āφāĻĒ āĻ•āϰāĻŋ āĻāĻŦāĻ‚ āĻāϟāĻŋ āĻāĻ•āϟāĻŋ āϏāĻ‚āϰāĻ•ā§āώāĻŖāĻžāĻ—āĻžāϰ⧇ āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰāĻŋ (GitLab āϏāĻ‚āϰāĻ•ā§āώāĻŖāĻžāĻ—āĻžāϰāϗ⧁āϞāĻŋ āϞāĻžāχāĻ­ āχāύ āϗ⧁āĻ—āϞ āĻ•ā§āϞāĻžāωāĻĄ āĻ¸ā§āĻŸā§‹āϰ⧇āϜ) āφāĻŽāϰāĻž āϞ⧇āĻ–āĻž-āφāĻ—āĻžāĻŽā§€ āϞāĻ— (āϞāĻŋāϖ⧁āύ āĻāĻ—āĻŋāϝāĻŧ⧇ āϞāĻ—, āĻ“āϝāĻŧāĻžāϞ)āĨ¤ āĻāĻŦāĻ‚ āĻāχ āϏāĻŽāĻ¸ā§āϤ āϜāĻžāϝāĻŧāĻ—āĻžāϝāĻŧ, āφāĻŽāϰāĻž āĻĻ⧁āĻ°ā§āϝ⧋āĻ— āĻĒ⧁āύāϰ⧁āĻĻā§āϧāĻžāϰ⧇āϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ 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 āĻ•āĻŋāĻ­āĻžāĻŦ⧇ āĻāϟāĻž āĻ•āϰ⧇?

āĻĒā§‹āĻ¸ā§āϟāĻ—ā§āϰ⧇āĻāϏāĻ•āĻŋāωāĻāϞ āϕ⧀āĻ­āĻžāĻŦ⧇ āĻ…āϞāϏ āĻĒ⧁āύāϰ⧁āĻĻā§āϧāĻžāϰ āĻĒā§āϰāϝāĻŧā§‹āĻ— āĻ•āϰ⧇ āϤāĻž āĻĻ⧇āĻ–āϤ⧇ āφāĻ•āĻ°ā§āώāĻŖā§€āϝāĻŧāĨ¤ āĻāĻĻāĻŋāϕ⧇ āϤāĻžāĻ•āĻžāύ 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-āĻāϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āϕ⧋āĻ˛ā§āĻĄ āĻŦā§āϝāĻžāĻ•āφāĻĒ āύāĻŋāϤ⧇ āĻšāĻŦ⧇)āĨ¤

āφāĻŽāϰāĻž āĻ¸ā§āĻĨāĻ—āĻŋāϤ āĻĒā§‹āĻ¸ā§āϟāĻ—ā§āϰ⧇āϏ āĻĻ⧃āĻˇā§āϟāĻžāĻ¨ā§āϤ āĻĒ⧁āύāϰāĻžāϝāĻŧ āϚāĻžāϞ⧁ āĻ•āϰ⧇āĻ›āĻŋ āĻāĻŦāĻ‚ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āϏāĻŽāϝāĻŧ āĻĒāĻ°ā§āϝāĻ¨ā§āϤ 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āĻĒ⧁āύāσāĻĒā§āϰāĻšā§‡āĻˇā§āϟāĻžāϰ āĻĒāϰ⧇ āĻĻ⧃āĻˇā§āϟāĻžāĻ¨ā§āϤāϟāĻŋ āĻŦāĻ¨ā§āϧ āĻ•āϰāϤ⧇, āĻĒā§āϰāϚāĻžāϰ āĻ•āϰāϤ⧇ āĻŦāĻž āĻŦāĻŋāϰāĻžāĻŽ āĻĻāĻŋāϤ⧇ (āĻāϟāĻŋ āĻĄāĻŋāĻĢāĻ˛ā§āϟāϰ⧂āĻĒ⧇ āĻ¸ā§āĻĨāĻ—āĻŋāϤ āĻĨāĻžāϕ⧇)āĨ¤

āϏ⧇āχ āĻĻ⧁āĻ°ā§āĻ­āĻžāĻ—ā§āϝāϜāύāĻ• āĻ…āύ⧁āϰ⧋āϧ⧇āϰ āφāϗ⧇āχ āĻĄāĻžāϟāĻžāĻŦ⧇āϏāϟāĻŋ āϤāĻžāϰ āĻ…āĻŦāĻ¸ā§āĻĨāĻžāϝāĻŧ āĻĢāĻŋāϰ⧇ āĻāϏ⧇āϛ⧇āĨ¤ āĻāĻ–āύ āφāĻĒāύāĻŋ, āωāĻĻāĻžāĻšāϰāĻŖāĻ¸ā§āĻŦāϰ⧂āĻĒ, āĻĄā§‡āϟāĻž āϰāĻĒā§āϤāĻžāύāĻŋ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤ āφāĻŽāϰāĻž āĻŽā§āϛ⧇ āĻĢ⧇āϞāĻž āϞ⧇āĻŦ⧇āϞ āĻĄā§‡āϟāĻž āĻāĻŦāĻ‚ āϏāĻŽāĻ¸ā§āϝāĻžāϗ⧁āϞāĻŋāϰ āϏāĻŽāĻ¸ā§āϤ āϞāĻŋāĻ™ā§āĻ• āĻāĻŦāĻ‚ āĻŽāĻžāĻ°ā§āϜ āĻ…āύ⧁āϰ⧋āϧāϗ⧁āϞāĻŋ āϰāĻĒā§āϤāĻžāύāĻŋ āĻ•āϰ⧇āĻ›āĻŋ āĻāĻŦāĻ‚ āϏ⧇āϗ⧁āϞāĻŋāϕ⧇ āĻĒā§āϰ⧋āĻĄāĻžāĻ•āĻļāύ āĻĄāĻžāϟāĻžāĻŦ⧇āϏ⧇ āĻ¸ā§āĻĨāĻžāύāĻžāĻ¨ā§āϤāϰāĻŋāϤ āĻ•āϰ⧇āĻ›āĻŋ⧎ āϝāĻĻāĻŋ āĻ•ā§āώāϤāĻŋāϗ⧁āϞāĻŋ āĻŦāĻĄāĻŧ āφāĻ•āĻžāϰ⧇āϰ āĻšāϝāĻŧ, āφāĻĒāύāĻŋ āϕ⧇āĻŦāϞ āĻĒā§āϰāϤāĻŋāϰ⧂āĻĒāϟāĻŋāϕ⧇ āĻĒā§āϰāϚāĻžāϰ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ āĻāĻŦāĻ‚ āĻāϟāĻŋāϕ⧇ āĻĒā§āϰāϧāĻžāύ āĻšāĻŋāϏāĻžāĻŦ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤ āĻ•āĻŋāĻ¨ā§āϤ⧁ āϤāĻžāϰāĻĒāϰ⧇ āφāĻŽāϰāĻž āϝ⧇ āĻŦāĻŋāĻ¨ā§āĻĻ⧁āϤ⧇ āĻĒ⧁āύāϰ⧁āĻĻā§āϧāĻžāϰ āĻ•āϰ⧇āĻ›āĻŋ āϤāĻžāϰ āĻĒāϰ⧇ āϏāĻŽāĻ¸ā§āϤ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻšāĻžāϰāĻŋāϝāĻŧ⧇ āϝāĻžāĻŦ⧇āĨ¤

āϟāĻžāχāĻŽāĻ¸ā§āĻŸā§āϝāĻžāĻŽā§āĻĒ⧇āϰ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤ⧇, āϞ⧇āύāĻĻ⧇āύ āφāχāĻĄāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āĻ­āĻžāϞāĨ¤ āĻāχ āφāχāĻĄāĻŋāϗ⧁āϞāĻŋ āϰ⧇āĻ•āĻ°ā§āĻĄ āĻ•āϰāĻž āĻĻāϰāĻ•āĻžāϰ⧀, āωāĻĻāĻžāĻšāϰāĻŖāĻ¸ā§āĻŦāϰ⧂āĻĒ, āĻĄāĻŋāĻĄāĻŋāĻāϞ āĻ¸ā§āĻŸā§‡āϟāĻŽā§‡āĻ¨ā§āĻŸā§‡āϰ āϜāĻ¨ā§āϝ (āϝ⧇āĻŽāύ DROP TABLE), āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ log_statements = 'ddl'. āϞ⧇āύāĻĻ⧇āύ āφāχāĻĄāĻŋ āĻĨāĻžāĻ•āϞ⧇ āφāĻŽāϰāĻž āύāĻŋāϤāĻžāĻŽ recovery_target_xid āĻāĻŦāĻ‚ āĻ…āύ⧁āϰ⧋āϧ⧇āϰ āφāϗ⧇ āϏāĻŦāĻ•āĻŋāϛ⧁ āϞ⧇āύāĻĻ⧇āύ⧇āϰ āϜāĻ¨ā§āϝ āύāĻŋāĻšā§‡ āϚāϞ⧇ āϗ⧇āϛ⧇ DELETE.

āĻ•āĻžāĻœā§‡ āĻĢāĻŋāϰ⧇ āφāϏāĻž āϖ⧁āĻŦāχ āϏāĻšāϜ: āĻĨ⧇āϕ⧇ āϏāĻŽāĻ¸ā§āϤ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻŽā§āϛ⧇ āĻĢ⧇āϞ⧁āύ recovery.conf āĻāĻŦāĻ‚ Postgres āĻĒ⧁āύāϰāĻžāϝāĻŧ āϚāĻžāϞ⧁ āĻ•āϰ⧁āύāĨ¤ āĻĒā§āϰāϤāĻŋāϰ⧂āĻĒāϟāĻŋ āĻļā§€āĻ˜ā§āϰāχ āφāĻŦāĻžāϰ āφāϟ āϘāĻ¨ā§āϟāĻž āĻŦāĻŋāϞāĻŽā§āĻŦāĻŋāϤ āĻšāĻŦ⧇, āĻāĻŦāĻ‚ āφāĻŽāϰāĻž āĻ­āĻŦāĻŋāĻˇā§āϝāϤ⧇āϰ āϏāĻŽāĻ¸ā§āϝāĻžāϰ āϜāĻ¨ā§āϝ āĻĒā§āϰāĻ¸ā§āϤ⧁āϤāĨ¤

āĻĒ⧁āύāϰ⧁āĻĻā§āϧāĻžāϰ⧇āϰ āϏ⧁āĻŦāĻŋāϧāĻž

āϕ⧋āĻ˛ā§āĻĄ āĻŦā§āϝāĻžāĻ•āφāĻĒ⧇āϰ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤ⧇ āĻāĻ•āϟāĻŋ āĻŦāĻŋāϞāĻŽā§āĻŦāĻŋāϤ āĻĒā§āϰāϤāĻŋāϰ⧂āĻĒ āϏāĻš, āφāĻĒāύāĻžāϕ⧇ āϏāĻ‚āϰāĻ•ā§āώāĻŖāĻžāĻ—āĻžāϰ āĻĨ⧇āϕ⧇ āϏāĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āϚāĻŋāĻ¤ā§āϰ āĻĒ⧁āύāϰ⧁āĻĻā§āϧāĻžāϰ āĻ•āϰāϤ⧇ āϘāĻ¨ā§āϟāĻž āĻŦā§āϝāϝāĻŧ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇ āύāĻžāĨ¤ āωāĻĻāĻžāĻšāϰāĻŖāĻ¸ā§āĻŦāϰ⧂āĻĒ, āϏāĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻŽā§ŒāϞāĻŋāĻ• 2 āϟāĻŋāĻŦāĻŋ āĻŦā§āϝāĻžāĻ•āφāĻĒ āĻĒ⧇āϤ⧇ āφāĻŽāĻžāĻĻ⧇āϰ āĻĒāĻžāρāϚ āϘāĻ¨ā§āϟāĻž āϏāĻŽāϝāĻŧ āϞāĻžāϗ⧇āĨ¤ āĻāĻŦāĻ‚ āϤāĻžāϰāĻĒāϰ⧇āĻ“ āφāĻĒāύāĻžāϕ⧇ āĻ•āĻžāĻ™ā§āĻ•ā§āώāĻŋāϤ āĻ…āĻŦāĻ¸ā§āĻĨāĻžāϝāĻŧ āĻĒ⧁āύāϰ⧁āĻĻā§āϧāĻžāϰ āĻ•āϰāϤ⧇ (āϏāĻŦāĻšā§‡āϝāĻŧ⧇ āĻ–āĻžāϰāĻžāĻĒ āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇) āϏāĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻĻ⧈āύāĻŋāĻ• WAL āĻĒā§āϰāϝāĻŧā§‹āĻ— āĻ•āϰāϤ⧇ āĻšāĻŦ⧇āĨ¤

āĻāĻ•āϟāĻŋ āĻŦāĻŋāϞāĻŽā§āĻŦāĻŋāϤ āĻĒā§āϰāϤāĻŋāϰ⧂āĻĒ āĻĻ⧁āϟāĻŋ āωāĻĒāĻžāϝāĻŧ⧇ āĻāĻ•āϟāĻŋ āĻ āĻžāĻ¨ā§āĻĄāĻž āĻŦā§āϝāĻžāĻ•āφāĻĒ⧇āϰ āĻšā§‡āϝāĻŧ⧇ āĻ­āĻžāϞ:

  1. āϏāĻ‚āϰāĻ•ā§āώāĻŖāĻžāĻ—āĻžāϰ āĻĨ⧇āϕ⧇ āϏāĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻŽā§ŒāϞāĻŋāĻ• āĻŦā§āϝāĻžāĻ•āφāĻĒ āĻ…āĻĒāϏāĻžāϰāĻŖ āĻ•āϰāĻžāϰ āĻĒā§āϰāϝāĻŧā§‹āϜāύ āύ⧇āχāĨ¤
  2. WAL āϏ⧇āĻ—āĻŽā§‡āĻ¨ā§āϟāϗ⧁āϞāĻŋāϰ āĻāĻ•āϟāĻŋ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āφāϟ-āϘāĻ¨ā§āϟāĻž āωāχāĻ¨ā§āĻĄā§‹ āϰāϝāĻŧ⧇āϛ⧇ āϝāĻž āĻĒ⧁āύāϰāĻžāĻŦ⧃āĻ¤ā§āϤāĻŋ āĻ•āϰāĻž āφāĻŦāĻļā§āϝāĻ•āĨ¤

WAL āĻĨ⧇āϕ⧇ āĻĒāĻŋāφāχāϟāĻŋāφāϰ āϤ⧈āϰāĻŋ āĻ•āϰāĻž āϏāĻŽā§āĻ­āĻŦ āĻ•āĻŋāύāĻž āϤāĻžāĻ“ āφāĻŽāϰāĻž āĻ•ā§āϰāĻŽāĻžāĻ—āϤ āĻĒāϰ⧀āĻ•ā§āώāĻž āĻ•āϰāĻŋ āĻāĻŦāĻ‚ āĻ¸ā§āĻĨāĻ—āĻŋāϤ āĻĒā§āϰāϤāĻŋāϰ⧂āĻĒ⧇āϰ āĻŦā§āϝāĻŦāϧāĻžāύ āĻĒāĻ°ā§āϝāĻŦ⧇āĻ•ā§āώāĻŖ āĻ•āϰ⧇ āφāĻŽāϰāĻž āĻĻā§āϰ⧁āϤ WAL āϏāĻ‚āϰāĻ•ā§āώāĻŖāĻžāĻ—āĻžāϰ⧇ āĻĻ⧁āĻ°ā§āύ⧀āϤāĻŋ āĻŦāĻž āĻ…āĻ¨ā§āϝāĻžāĻ¨ā§āϝ āϏāĻŽāĻ¸ā§āϝāĻž āϞāĻ•ā§āĻˇā§āϝ āĻ•āϰāĻŦāĨ¤

āĻāχ āωāĻĻāĻžāĻšāϰāϪ⧇, āĻāϟāĻŋ āĻĒ⧁āύāϰ⧁āĻĻā§āϧāĻžāϰ āĻ•āϰāϤ⧇ āφāĻŽāĻžāĻĻ⧇āϰ 50 āĻŽāĻŋāύāĻŋāϟ āϏāĻŽāϝāĻŧ āϞ⧇āϗ⧇āϛ⧇, āϝāĻžāϰ āĻŽāĻžāύ⧇ āĻ—āϤāĻŋ āĻ›āĻŋāϞ āĻĒā§āϰāϤāĻŋ āϘāĻ¨ā§āϟāĻžāϝāĻŧ 110 GB WAL āĻĄā§‡āϟāĻž (āφāĻ°ā§āĻ•āĻžāχāĻ­āϟāĻŋ āĻāĻ–āύāĻ“ āϚāĻžāϞ⧁ āĻ›āĻŋāϞ āĻāĻĄāĻžāĻŦā§āϞ⧁āĻāϏ āĻāϏ 3) āĻŽā§‹āϟ, āφāĻŽāϰāĻž āϏāĻŽāĻ¸ā§āϝāĻžāϟāĻŋ āϏāĻŽāĻžāϧāĻžāύ āĻ•āϰ⧇āĻ›āĻŋ āĻāĻŦāĻ‚ 1,5 āϘāĻ¨ā§āϟāĻžāϰ āĻŽāĻ§ā§āϝ⧇ āĻĄā§‡āϟāĻž āĻĒ⧁āύāϰ⧁āĻĻā§āϧāĻžāϰ āĻ•āϰ⧇āĻ›āĻŋāĨ¤

āĻĢāϞāĻžāĻĢāϞ: āϝ⧇āĻ–āĻžāύ⧇ āĻāĻ•āϟāĻŋ āĻŦāĻŋāϞāĻŽā§āĻŦāĻŋāϤ āĻĒā§āϰāϤāĻŋāϰ⧂āĻĒ āĻĻāϰāĻ•āĻžāϰ⧀ (āĻāĻŦāĻ‚ āϝ⧇āĻ–āĻžāύ⧇ āĻāϟāĻŋ āύāϝāĻŧ)

āφāĻĒāύāĻŋ āϝāĻĻāĻŋ āϭ⧁āϞāĻŦāĻļāϤ āĻĄā§‡āϟāĻž āĻšāĻžāϰāĻŋāϝāĻŧ⧇ āĻĢ⧇āϞ⧇āύ āĻāĻŦāĻ‚ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ āĻ•āϰāĻž āĻŦāĻŋāϞāĻŽā§āĻŦ⧇āϰ āĻŽāĻ§ā§āϝ⧇ āĻāχ āϏāĻŽāĻ¸ā§āϝāĻžāϟāĻŋ āϞāĻ•ā§āĻˇā§āϝ āĻ•āϰ⧇āύ āϤāĻŦ⧇ āĻĒā§āϰāĻžāĻĨāĻŽāĻŋāĻ• āϚāĻŋāĻ•āĻŋā§ŽāϏāĻž āĻšāĻŋāϏāĻžāĻŦ⧇ āĻŦāĻŋāϞāĻŽā§āĻŦāĻŋāϤ āĻĒā§āϰāϤāĻŋāϞāĻŋāĻĒāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύāĨ¤

āĻ•āĻŋāĻ¨ā§āϤ⧁ āĻŽāύ⧇ āϰāĻžāĻ–āĻŦ⧇āύ: āĻĒā§āϰāϤāĻŋāϞāĻŋāĻĒāĻŋ āĻŦā§āϝāĻžāĻ•āφāĻĒ āύāϝāĻŧāĨ¤

āĻŦā§āϝāĻžāĻ•āφāĻĒ āĻāĻŦāĻ‚ āĻĒā§āϰāϤāĻŋāϞāĻŋāĻĒāĻŋ āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āύ āωāĻĻā§āĻĻ⧇āĻļā§āϝ āφāϛ⧇. āφāĻĒāύāĻŋ āϭ⧁āϞāĻŦāĻļāϤ āϤ⧈āϰāĻŋ āĻ•āϰāϞ⧇ āĻāĻ•āϟāĻŋ āĻ āĻžāĻ¨ā§āĻĄāĻž āĻŦā§āϝāĻžāĻ•āφāĻĒ āĻ•āĻžāĻœā§‡ āφāϏāĻŦ⧇ DELETE āĻŦāĻž DROP TABLE. āφāĻŽāϰāĻž āϕ⧋āĻ˛ā§āĻĄ āĻ¸ā§āĻŸā§‹āϰ⧇āϜ āĻĨ⧇āϕ⧇ āĻāĻ•āϟāĻŋ āĻŦā§āϝāĻžāĻ•āφāĻĒ āϤ⧈āϰāĻŋ āĻ•āϰāĻŋ āĻāĻŦāĻ‚ āĻŸā§‡āĻŦāĻŋāϞ⧇āϰ āĻĒā§‚āĻ°ā§āĻŦāĻŦāĻ°ā§āϤ⧀ āĻ…āĻŦāĻ¸ā§āĻĨāĻž āĻŦāĻž āϏāĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻĄāĻžāϟāĻžāĻŦ⧇āϏ āĻĒ⧁āύāϰ⧁āĻĻā§āϧāĻžāϰ āĻ•āϰāĻŋāĨ¤ āĻ•āĻŋāĻ¨ā§āϤ⧁ āĻāĻ•āχ āϏāĻ™ā§āϗ⧇ āĻ…āύ⧁āϰ⧋āϧ DROP TABLE āĻ•āĻžāĻ°ā§āϝāĻ•āĻžāϰ⧀ āĻ•ā§āϞāĻžāĻ¸ā§āϟāĻžāϰ⧇ āϏāĻŽāĻ¸ā§āϤ āĻĒā§āϰāϤāĻŋāϞāĻŋāĻĒāĻŋāϤ⧇ āĻĒā§āϰāĻžāϝāĻŧ āϤāĻžāĻ¤ā§āĻ•ā§āώāĻŖāĻŋāĻ•āĻ­āĻžāĻŦ⧇ āĻĒ⧁āύāϰ⧁āĻ¤ā§āĻĒāĻžāĻĻāύ āĻ•āϰāĻž āĻšāϝāĻŧ, āϤāĻžāχ āϏāĻžāϧāĻžāϰāĻŖ āĻĒā§āϰāϤāĻŋāϞāĻŋāĻĒāĻŋ āĻāĻ–āĻžāύ⧇ āϏāĻžāĻšāĻžāĻ¯ā§āϝ āĻ•āϰāĻŦ⧇ āύāĻžāĨ¤ āϝāĻ–āύ āĻĒ⧃āĻĨāĻ• āϏāĻžāĻ°ā§āĻ­āĻžāϰ āĻ­āĻžāĻĄāĻŧāĻž āĻ•āϰāĻž āĻšāϝāĻŧ āĻāĻŦāĻ‚ āϞ⧋āĻĄ āĻŦāĻŋāϤāϰāĻŖ āĻ•āϰāĻž āĻšāϝāĻŧ āϤāĻ–āύ āĻĒā§āϰāϤāĻŋāϞāĻŋāĻĒāĻŋ āύāĻŋāĻœā§‡āχ āĻĄāĻžāϟāĻžāĻŦ⧇āϏ āωāĻĒāϞāĻŦā§āϧ āϰāĻžāϖ⧇āĨ¤

āĻāĻŽāύāĻ•āĻŋ āĻāĻ•āϟāĻŋ āĻŦāĻŋāϞāĻŽā§āĻŦāĻŋāϤ āĻĒā§āϰāϤāĻŋāϰ⧂āĻĒ⧇āϰ āϏāĻžāĻĨ⧇āĻ“, āĻĄā§‡āϟāĻž āϏ⧇āĻ¨ā§āϟāĻžāϰ⧇āϰ āĻŦā§āϝāĻ°ā§āĻĨāϤāĻž, āϞ⧁āĻ•āĻžāύ⧋ āĻ•ā§āώāϤāĻŋ, āĻŦāĻž āĻ…āĻŦāĻŋāϞāĻŽā§āĻŦ⧇ āϞāĻ•ā§āώāĻŖā§€āϝāĻŧ āύāϝāĻŧ āĻāĻŽāύ āϘāϟāύāĻž āϘāϟāϞ⧇ āφāĻŽāĻžāĻĻ⧇āϰ āĻŽāĻžāĻā§‡ āĻŽāĻžāĻā§‡ āĻāĻ•āϟāĻŋ āύāĻŋāϰāĻžāĻĒāĻĻ āĻ¸ā§āĻĨāĻžāύ⧇ āĻāĻ•āϟāĻŋ āĻ āĻžāĻ¨ā§āĻĄāĻž āĻŦā§āϝāĻžāĻ•āφāĻĒ⧇āϰ āĻĒā§āϰāϝāĻŧā§‹āϜāύ āĻšāϝāĻŧāĨ¤ āĻāĻ•āĻž āĻĒā§āϰāϤāĻŋāϞāĻŋāĻĒāĻŋ āĻāĻ–āĻžāύ⧇ āϕ⧋āύ āĻ•āĻžāĻœā§‡ āφāϏ⧇ āύāĻž.

āĻŽāĻ¨ā§āϤāĻŦā§āϝāĨ¤ āωāĻĒāϰ GitLab.com āφāĻŽāϰāĻž āĻŦāĻ°ā§āϤāĻŽāĻžāύ⧇ āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻ¸ā§āϤāϰ⧇ āĻĄā§‡āϟāĻž āĻ•ā§āώāϤāĻŋāϰ āĻŦāĻŋāϰ⧁āĻĻā§āϧ⧇ āϰāĻ•ā§āώāĻž āĻ•āϰāĻŋ āĻāĻŦāĻ‚ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ āĻ¸ā§āϤāϰ⧇ āĻĄā§‡āϟāĻž āĻĒ⧁āύāϰ⧁āĻĻā§āϧāĻžāϰ āĻ•āϰāĻŋ āύāĻžāĨ¤

āωāĻ¤ā§āϏ: www.habr.com

DDoS āϏ⧁āϰāĻ•ā§āώāĻž, VPS VDS āϏāĻžāĻ°ā§āĻ­āĻžāϰ āϏāĻš āϏāĻžāχāϟāϗ⧁āϞāĻŋāϰ āϜāĻ¨ā§āϝ āύāĻŋāĻ°ā§āĻ­āϰāϝ⧋āĻ—ā§āϝ āĻšā§‹āĻ¸ā§āϟāĻŋāĻ‚ āĻ•āĻŋāύ⧁āύ đŸ”Ĩ DDoS āϏ⧁āϰāĻ•ā§āώāĻž āϏāĻš āύāĻŋāĻ°ā§āĻ­āϰāϝ⧋āĻ—ā§āϝ āĻ“āϝāĻŧ⧇āĻŦāϏāĻžāχāϟ āĻšā§‹āĻ¸ā§āϟāĻŋāĻ‚ āĻ•āĻŋāύ⧁āύ, VPS VDS āϏāĻžāĻ°ā§āĻ­āĻžāϰ | ProHoster