αžšαž”αŸ€αž”αžŠαŸ‚αž›αž™αžΎαž„αž”αŸ’αžšαžΎαž€αžΆαžšαž…αž˜αŸ’αž›αž„αžαŸ’αž‡αž·αž›αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžŸαž„αŸ’αž‚αŸ’αžšαŸ„αŸ‡αž‚αŸ’αžšαŸ„αŸ‡αž˜αž αž“αŸ’αžαžšαžΆαž™αž‡αžΆαž˜αž½αž™ PostgreSQL

αžšαž”αŸ€αž”αžŠαŸ‚αž›αž™αžΎαž„αž”αŸ’αžšαžΎαž€αžΆαžšαž…αž˜αŸ’αž›αž„αžαŸ’αž‡αž·αž›αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžŸαž„αŸ’αž‚αŸ’αžšαŸ„αŸ‡αž‚αŸ’αžšαŸ„αŸ‡αž˜αž αž“αŸ’αžαžšαžΆαž™αž‡αžΆαž˜αž½αž™ PostgreSQL
αž€αžΆαžšαž…αž˜αŸ’αž›αž„αž˜αž·αž“αž˜αŸ‚αž“αž‡αžΆαž€αžΆαžšαž”αž˜αŸ’αžšαž»αž„αž‘αž»αž€αž‘αŸαŸ” αž¬β€‹αž˜αž·αž“β€‹αž˜αŸ‚αž“? αž“αŸαŸ‡αž‡αžΆαžšαž”αŸ€αž”αžŠαŸ‚αž›αž™αžΎαž„αž”αžΆαž“αž”αŸ’αžšαžΎαž€αžΆαžšαž…αž˜αŸ’αž›αž„αžŠαŸ‚αž›αž”αžΆαž“αž–αž“αŸ’αž™αžΆαž–αŸαž›αžŠαžΎαž˜αŸ’αž”αžΈαžŸαž„αŸ’αž‚αŸ’αžšαŸ„αŸ‡αž–αžΈαž€αžΆαžšαž›αž»αž”αž•αŸ’αž›αžΌαžœαž€αžΆαžαŸ‹αžŠαŸ„αž™αž…αŸƒαžŠαž“αŸ’αž™αŸ”

αž’αŸ’αž“αž€αž‡αŸ†αž“αžΆαž‰αž•αŸ’αž“αŸ‚αž€αž αŸαžŠαŸ’αž‹αžΆαžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ GitLab αž‘αž‘αž½αž›αžαž»αžŸαžαŸ’αžšαžΌαžœαž…αŸ†αž–αŸ„αŸ‡αž€αžΆαžšαž„αžΆαžš GitLab.com - αž§αž‘αžΆαž αžšαžŽαŸ GitLab αžŠαŸαž’αŸ†αž”αŸ†αž•αž»αžαž“αŸ…αž€αŸ’αž“αž»αž„αž’αž˜αŸ’αž˜αž‡αžΆαžαž·αŸ” αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ 3 αž›αžΆαž“αž“αžΆαž€αŸ‹ αž“αž·αž„αž‚αž˜αŸ’αžšαŸ„αž„αž‡αž·αž 7 αž›αžΆαž“αž“αžΆαž€αŸ‹ αžœαžΆαž‚αžΊαž‡αžΆαž‚αŸαž αž‘αŸ†αž–αŸαžš SaaS αž”αŸ’αžšαž—αž–αž”αžΎαž€αž…αŸ†αž αžŠαŸαž’αŸ†αž”αŸ†αž•αž»αžαž˜αž½αž™αžŠαŸ‚αž›αž˜αžΆαž“αžŸαŸ’αžαžΆαž”αžαŸ’αž™αž€αž˜αŸ’αž˜αž–αž·αžŸαŸαžŸαŸ” αž”αžΎαž‚αŸ’αž˜αžΆαž“αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ PostgreSQL αž‘αŸ αž αŸαžŠαŸ’αž‹αžΆαžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ GitLab.com αž“αžΉαž„αž˜αž·αž“αž‘αŸ…αžŽαžΆαž†αŸ’αž„αžΆαž™αž‘αŸ αž αžΎαž™αžαžΎαž™αžΎαž„αž€αŸ†αž–αž»αž„αž’αŸ’αžœαžΎαž’αŸ’αžœαžΈαžŠαžΎαž˜αŸ’αž”αžΈαž’αžΆαž“αžΆαž€αžΆαžšαž’αžαŸ‹αž±αž“αž…αŸ†αž–αŸ„αŸ‡αž€αŸ†αž αž»αžŸαž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž˜αžΆαž“αž€αžΆαžšαž”αžšαžΆαž‡αŸαž™αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž‘αž·αž“αŸ’αž“αž“αŸαž™αž’αžΆαž…αž”αžΆαžαŸ‹αž”αž„αŸ‹αŸ” αžœαžΆαž˜αž·αž“αž‘αŸ†αž“αž„αžαžΆαž‚αŸ’αžšαŸ„αŸ‡αž˜αž αž“αŸ’αžαžšαžΆαž™αž”αŸ‚αž”αž“αŸαŸ‡αž“αžΉαž„αž€αžΎαžαž‘αžΎαž„αž“αŸ„αŸ‡αž‘αŸ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž™αžΎαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαŸ€αž”αž…αŸ†αž™αŸ‰αžΆαž„αž›αŸ’αž’ αž“αž·αž„αžŸαŸ’αžαž»αž€αž‘αž»αž€αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž™αž“αŸ’αžαž€αžΆαžšαž”αž˜αŸ’αžšαž»αž„αž‘αž»αž€ αž“αž·αž„αž€αžΆαžšαž…αž˜αŸ’αž›αž„αž•αŸ’αžŸαŸαž„αŸ—αŸ”

αž€αžΆαžšαž…αž˜αŸ’αž›αž„αž˜αž·αž“αž˜αŸ‚αž“αž‡αžΆαž˜αž’αŸ’αž™αŸ„αž”αžΆαž™αž“αŸƒαž€αžΆαžšαž”αž˜αŸ’αžšαž»αž„αž‘αž»αž€αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ (αž˜αžΎαž›β€‹αžαžΆαž„β€‹αž€αŸ’αžšαŸ„αž˜) αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž₯αž‘αžΌαžœαž“αŸαŸ‡αž™αžΎαž„αž“αžΉαž„αžƒαžΎαž‰αž–αžΈαžšαž”αŸ€αž”αžŠαžΎαž˜αŸ’αž”αžΈαžŸαž„αŸ’αž‚αŸ’αžšαŸ„αŸ‡αž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαŸ‚αž›αž”αžΆαž“αž›αž»αž”αžŠαŸ„αž™αž…αŸƒαžŠαž“αŸ’αž™αž™αŸ‰αžΆαž„αž†αžΆαž”αŸ‹αžšαž αŸαžŸαžŠαŸ„αž™αž”αŸ’αžšαžΎαž€αžΆαžšαž…αž˜αŸ’αž›αž„αžαŸ’αž‡αž·αž›αŸ– αž”αžΎαž€ GitLab.com αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαŸ” αž”αžΆαž“αž›αž»αž”αž•αŸ’αž›αžΌαžœαž€αžΆαžαŸ‹ αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‚αž˜αŸ’αžšαŸ„αž„ gitlab-ce αž“αž·αž„αž”αžΆαžαŸ‹αž”αž„αŸ‹αž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αž‡αžΆαž˜αž½αž™αž“αžΉαž„αžŸαŸ†αžŽαžΎ αž“αž·αž„αž€αž·αž…αŸ’αž…αž€αžΆαžšαž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαŸ”

αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαž…αž˜αŸ’αž›αž„αžŠαŸ‚αž›αž”αžΆαž“αž–αž“αŸ’αž™αžΆαžšαž–αŸαž› αž™αžΎαž„αž”αžΆαž“αž‘αžΆαž‰αž™αž€αž‘αž·αž“αŸ’αž“αž“αŸαž™αž‘αžΎαž„αžœαž·αž‰αž€αŸ’αž“αž»αž„αžšαž™αŸˆαž–αŸαž›αžαŸ’αžšαžΉαž˜αžαŸ‚ 1,5 αž˜αŸ‰αŸ„αž„αŸ” αž˜αžΎαž›αžαžΆαžαžΎαžœαžΆαž€αžΎαžαž‘αžΎαž„αž™αŸ‰αžΆαž„αžŠαžΌαž…αž˜αŸ’αžαŸαž…αŸ”

αž…αž„αŸ’αž’αž»αž›αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαž„αžΎαž”αž‘αžΎαž„αžœαž·αž‰αž–αŸαž›αžœαŸαž›αžΆαž‡αžΆαž˜αž½αž™ PostgreSQL

PostgreSQL αž˜αžΆαž“αž˜αž»αžαž„αžΆαžšαžŠαŸ‚αž›αž—αŸ’αž‡αžΆαž”αŸ‹αž˜αž€αž‡αžΆαž˜αž½αž™αžŠαŸ‚αž›αžŸαŸ’αžŠαžΆαžšαžŸαŸ’αžαžΆαž“αž—αžΆαž–αž“αŸƒαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž‘αŸ…αž…αŸ†αžŽαž»αž…αž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹αž˜αž½αž™αž€αŸ’αž“αž»αž„αž–αŸαž›αžœαŸαž›αžΆαŸ” αžœαžΆβ€‹αž αŸ…αžαžΆ αž€αžΆαžšαž„αžΎαž”αž‘αžΎαž„αžœαž·αž‰αžαžΆαž˜αž–αŸαž›αžœαŸαž›αžΆ (PITR) αž“αž·αž„αž”αŸ’αžšαžΎαž™αž“αŸ’αžαž€αžΆαžšαžŠαžΌαž…αž‚αŸ’αž“αžΆαžŠαŸ‚αž›αžšαž€αŸ’αžŸαžΆαž€αžΆαžšαž…αž˜αŸ’αž›αž„αž±αŸ’αž™αž‘αžΆαž“αŸ‹αžŸαž˜αŸαž™αŸ– αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž‡αžΆαž˜αž½αž™αž“αžΉαž„αžšαžΌαž”αžαžαžŠαŸ‚αž›αž’αžΆαž…αž‘αž»αž€αž…αž·αžαŸ’αžαž”αžΆαž“αž“αŸƒαž…αž„αŸ’αž€αŸ„αž˜αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž‘αžΆαŸ†αž„αž˜αžΌαž› (αž€αžΆαžšαž”αž˜αŸ’αžšαž»αž„αž‘αž»αž€αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“) αž™αžΎαž„αž’αž“αž»αžœαžαŸ’αžαž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαžšαžŠαŸ’αž‹αž‡αžΆαž”αž“αŸ’αžαž”αž“αŸ’αž‘αžΆαž”αŸ‹αžšαž αžΌαžαžŠαž›αŸ‹αž…αŸ†αžŽαž»αž…αž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹αž˜αž½αž™αž€αŸ’αž“αž»αž„αž–αŸαž›αžœαŸαž›αžΆαŸ”

αžŠαžΎαž˜αŸ’αž”αžΈαž”αŸ’αžšαžΎαž˜αž»αžαž„αžΆαžšαž“αŸαŸ‡αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž”αž˜αŸ’αžšαž»αž„αž‘αž»αž€αžαŸ’αžšαž‡αžΆαž€αŸ‹ αž™αžΎαž„αž’αŸ’αžœαžΎαž€αžΆαžšαž”αž˜αŸ’αžšαž»αž„αž‘αž»αž€αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž‡αžΆαž”αŸ’αžšαž…αžΆαŸ† αž αžΎαž™αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αžœαžΆαž“αŸ…αž€αŸ’αž“αž»αž„αž”αžŽαŸ’αžŽαžŸαžΆαžš (αž”αžŽαŸ’αžŽαžŸαžΆαžš GitLab αžšαžŸαŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„ αžƒαŸ’αž›αžΆαŸ†αž„αž•αŸ’αž‘αž»αž€αž–αž–αž€ Google) αž™αžΎαž„αž€αŸαžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž“αŸ…αž€αŸ’αž“αž»αž„αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž“αŸƒαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαŸ„αž™αž€αžΆαžšαžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž€αŸ†αžŽαžαŸ‹αž αŸαžαž»αžŸαžšαžŸαŸαžšαž‡αžΆαž˜αž»αž“ (αž€αŸ†αžŽαžαŸ‹αž αŸαžαž»αžŸαžšαžŸαŸαžšαž‡αžΆαž˜αž»αž“, WAL) αŸ” αž αžΎαž™αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž’αŸ’αžœαžΈαŸ—αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸαŸ‡αž“αŸ…αž“αžΉαž„αž€αž“αŸ’αž›αŸ‚αž„ αž™αžΎαž„αž’αžΆαž…αž’αŸ’αžœαžΎ PITR αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžŸαž„αŸ’αž‚αŸ’αžšαŸ„αŸ‡αž‚αŸ’αžšαŸ„αŸ‡αž˜αž αž“αŸ’αžαžšαžΆαž™αŸ– αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž‡αžΆαž˜αž½αž™αžšαžΌαž”αžαžαžŠαŸ‚αž›αž”αžΆαž“αžαžαž˜αž»αž“αž–αŸαž›αž”αžšαžΆαž‡αŸαž™ αž αžΎαž™αž’αž“αž»αžœαžαŸ’αžαž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž–αžΈαž”αžŽαŸ’αžŽαžŸαžΆαžš WAL αžšαž αžΌαžαžŠαž›αŸ‹αž€αžΆαžšαž”αžšαžΆαž‡αŸαž™αŸ”

αžαžΎαž€αžΆαžšαž…αž˜αŸ’αž›αž„αž–αž“αŸ’αž™αžΆαž–αŸαž›αž‚αžΊαž‡αžΆαž’αŸ’αžœαžΈ?

Lazy replication αž‚αžΊαž‡αžΆαž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž–αžΈ 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 αž’αž“αž»αžœαžαŸ’αžαž€αžΆαžšαž„αžΎαž”αž‘αžΎαž„αžœαž·αž‰αžαŸ’αž‡αž·αž›αŸ” αžαŸ„αŸ‡αž˜αžΎαž› 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) αŸ”

αž™αžΎαž„αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ 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αžŠαžΎαž˜αŸ’αž”αžΈαž”αž·αž‘ αž•αŸ’αžŸαž–αŸ’αžœαž•αŸ’αžŸαžΆαž™ αž¬αž•αŸ’αž’αžΆαž€αž§αž‘αžΆαž αžšαžŽαŸ αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž–αŸ’αž™αžΆαž™αžΆαž˜αž˜αŸ’αžαž„αž‘αŸ€αž (αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αž’αžΆαž€αžαžΆαž˜αž›αŸ†αž“αžΆαŸ†αžŠαžΎαž˜)αŸ”

αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž”αžΆαž“αžαŸ’αžšαž‘αž”αŸ‹αž‘αŸ…αžŸαŸ’αžαžΆαž“αž—αžΆαž–αžšαž”αžŸαŸ‹αžœαžΆαžœαž·αž‰ αž˜αž»αž“αž–αŸαž›αžŸαŸ†αžŽαžΎαž’αž€αž»αžŸαž›αž“αŸ„αŸ‡αŸ” αž₯αž‘αžΌαžœαž“αŸαŸ‡ αž’αŸ’αž“αž€αž’αžΆαž…αž§αž‘αžΆαž αžšαžŽαŸ αž“αžΆαŸ†αž…αŸαž‰αž‘αž·αž“αŸ’αž“αž“αŸαž™αŸ” αž™αžΎαž„αž”αžΆαž“αž“αžΆαŸ†αž…αŸαž‰αž‘αž·αž“αŸ’αž“αž“αŸαž™αžŸαŸ’αž›αžΆαž€αžŠαŸ‚αž›αž”αžΆαž“αž›αž»αž” αž“αž·αž„αžαŸ†αžŽαž—αŸ’αž‡αžΆαž”αŸ‹αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž‘αŸ…αž“αžΉαž„αž”αž‰αŸ’αž αžΆ αž“αž·αž„αžŸαŸ†αžŽαžΎαž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆ αž αžΎαž™αž”αžΆαž“αž•αŸ’αž›αžΆαžŸαŸ‹αž‘αžΈαž–αž½αž€αžœαžΆαž‘αŸ…αž€αŸ’αž“αž»αž„αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž•αž›αž·αžαž€αž˜αŸ’αž˜αŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž€αžΆαžšαžαžΆαžαž”αž„αŸ‹αž˜αžΆαž“αž‘αŸ†αž αŸ†αž’αŸ† αž’αŸ’αž“αž€αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αž’αžΆαž…αž•αŸ’αžŸαž–αŸ’αžœαž•αŸ’αžŸαžΆαž™αž€αžΆαžšαž…αž˜αŸ’αž›αž„ αž αžΎαž™αž”αŸ’αžšαžΎαžœαžΆαž‡αžΆαž…αž˜αŸ’αž”αž„αŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž…αŸ†αžŽαž»αž…αžŠαŸ‚αž›αž™αžΎαž„αž”αžΆαž“αž„αžΎαž”αž‘αžΎαž„αžœαž·αž‰αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαžαŸ‹αž”αž„αŸ‹αŸ”

αž‡αŸ†αž“αž½αžŸαž±αŸ’αž™αž€αžΆαžšαžαŸ’αžšαžΆαž–αŸαž›αžœαŸαž›αžΆ αžœαžΆαž‡αžΆαž€αžΆαžšαž”αŸ’αžšαžŸαžΎαžšαž€αŸ’αž“αž»αž„αž€αžΆαžšαž”αŸ’αžšαžΎαž›αŸαžαžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαŸ” αžœαžΆαž˜αžΆαž“αž”αŸ’αžšαž™αŸ„αž‡αž“αŸαž€αŸ’αž“αž»αž„αž€αžΆαžšαž€αžαŸ‹αžαŸ’αžšαžΆαž›αŸαžαžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αž‘αžΆαŸ†αž„αž“αŸαŸ‡ αž‡αžΆαž§αž‘αžΆαž αžšαžŽαŸ αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŸαŸαž…αž€αŸ’αžαžΈαžαŸ’αž›αŸ‚αž„αž€αžΆαžšαžŽαŸ DDL (αžŠαžΌαž…αž‡αžΆ DROP TABLE) αžŠαŸ„αž™αž”αŸ’αžšαžΎ log_statements = 'ddl'. αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž™αžΎαž„αž˜αžΆαž“αž›αŸαžαžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžš αž™αžΎαž„αž“αžΉαž„αž™αž€ recovery_target_xid αž αžΎαž™αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž’αŸ’αžœαžΈαž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αž…αž»αŸ‡αž‘αŸ…αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž˜αž»αž“αž–αŸαž›αžŸαŸ†αžŽαžΎ DELETE.

αž€αžΆαžšαžαŸ’αžšαž›αž”αŸ‹αž‘αŸ…αž’αŸ’αžœαžΎαž€αžΆαžšαžœαž·αž‰αž‚αžΊαžŸαžΆαž˜αž‰αŸ’αž‰αžŽαžΆαžŸαŸ‹αŸ– αž›αž»αž”αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž…αŸαž‰αž–αžΈ recovery.conf αž αžΎαž™αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜ Postgres αž‘αžΎαž„αžœαž·αž‰αŸ” αž€αžΆαžšαž…αž˜αŸ’αž›αž„αž“αžΉαž„αž˜αžΆαž“αž€αžΆαžšαž–αž“αŸ’αž™αžΆαžšαž–αŸαž›αž”αŸ’αžšαžΆαŸ†αž”αžΈαž˜αŸ‰αŸ„αž„αž˜αŸ’αžαž„αž‘αŸ€αžαž€αŸ’αž“αž»αž„αž–αŸαž›αž†αžΆαž”αŸ‹αŸ—αž“αŸαŸ‡ αž αžΎαž™αž™αžΎαž„αž”αžΆαž“αžšαŸ€αž”αž…αŸ†αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αž‰αŸ’αž αžΆαž“αžΆαž–αŸαž›αž’αž“αžΆαž‚αžαŸ”

αž’αžαŸ’αžαž”αŸ’αžšαž™αŸ„αž‡αž“αŸαž“αŸƒαž€αžΆαžšαžŸαŸ’αžαžΆαžšαž‘αžΎαž„αžœαž·αž‰

αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαž…αž˜αŸ’αž›αž„αžŠαŸ‚αž›αž”αžΆαž“αž–αž“αŸ’αž™αžΆαžšαž–αŸαž›αž‡αŸ†αž“αž½αžŸαž±αŸ’αž™αž€αžΆαžšαž”αž˜αŸ’αžšαž»αž„αž‘αž»αž€αžαŸ’αžšαž‡αžΆαž€αŸ‹ αž’αŸ’αž“αž€αž˜αž·αž“αž…αžΆαŸ†αž”αžΆαž…αŸ‹αž…αŸ†αžŽαžΆαž™αž–αŸαž›αž…αŸ’αžšαžΎαž“αž˜αŸ‰αŸ„αž„αžŠαžΎαž˜αŸ’αž”αžΈαžŸαŸ’αžŠαžΆαžšαžšαžΌαž”αž—αžΆαž–αž‘αžΆαŸ†αž„αž˜αžΌαž›αž–αžΈαž”αžŽαŸ’αžŽαžŸαžΆαžšαž“αŸ„αŸ‡αž‘αŸαŸ” αž‡αžΆαž§αž‘αžΆαž αžšαžŽαŸ αž™αžΎαž„αž…αŸ†αžŽαžΆαž™αž–αŸαž›αž”αŸ’αžšαžΆαŸ†αž˜αŸ‰αŸ„αž„αžŠαžΎαž˜αŸ’αž”αžΈαž‘αž‘αž½αž›αž”αžΆαž“αž€αžΆαžšαž”αž˜αŸ’αžšαž»αž„αž‘αž»αž€αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“ 2 TB αž‘αžΆαŸ†αž„αž˜αžΌαž›αŸ” αž αžΎαž™αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž’αŸ’αž“αž€αž“αŸ…αžαŸ‚αžαŸ’αžšαžΌαžœαž’αž“αž»αžœαžαŸ’αž WAL αž”αŸ’αžšαž…αžΆαŸ†αžαŸ’αž„αŸƒαž‘αžΆαŸ†αž„αž˜αžΌαž›αžŠαžΎαž˜αŸ’αž”αžΈαžŸαŸ’αžαžΆαžšαžŸαŸ’αžαžΆαž“αž—αžΆαž–αžŠαŸ‚αž›αž…αž„αŸ‹αž”αžΆαž“ (αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαžŠαŸαž’αžΆαž€αŸ’αžšαž€αŸ‹αž”αŸ†αž•αž»αž) αŸ”

αž€αžΆαžšαž…αž˜αŸ’αž›αž„αžŠαŸ‚αž›αž”αžΆαž“αž–αž“αŸ’αž™αžΆαžšαž–αŸαž›αž‚αžΊαž”αŸ’αžšαžŸαžΎαžšαž‡αžΆαž„αž€αžΆαžšαž”αž˜αŸ’αžšαž»αž„αž‘αž»αž€αžαŸ’αžšαž‡αžΆαž€αŸ‹αžαžΆαž˜αž–αžΈαžšαžœαž·αž’αžΈαŸ–

  1. αž˜αž·αž“αž…αžΆαŸ†αž”αžΆαž…αŸ‹αž›αž»αž”αž€αžΆαžšαž”αž˜αŸ’αžšαž»αž„αž‘αž»αž€αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αžΆαŸ†αž„αž˜αžΌαž›αž…αŸαž‰αž–αžΈαž”αŸαžŽαŸ’αžŽαžŸαžΆαžšαž‘αŸαŸ”
  2. αž˜αžΆαž“αž”αž„αŸ’αž’αž½αž…αžšαž™αŸˆαž–αŸαž›αž”αŸ’αžšαžΆαŸ†αž”αžΈαž˜αŸ‰αŸ„αž„αžαŸαžšαž“αŸƒαž•αŸ’αž“αŸ‚αž€ WAL αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαžαŸ‚αž’αŸ’αžœαžΎαž˜αŸ’αžαž„αž‘αŸ€αžαŸ”

αž™αžΎαž„αž€αŸαž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž‡αžΆαž“αž·αž…αŸ’αž…αžŠαžΎαž˜αŸ’αž”αžΈαž˜αžΎαž›αžαžΆαžαžΎαžœαžΆαž’αžΆαž…αž‘αŸ…αžšαž½αž…αž€αŸ’αž“αž»αž„αž€αžΆαžšαž”αž„αŸ’αž€αžΎαž PITR αž–αžΈ WAL αžŠαŸ‚αžšαž¬αž‘αŸ αž αžΎαž™αž™αžΎαž„αž“αžΉαž„αž€αžαŸ‹αžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αž™αŸ‰αžΆαž„αž†αžΆαž”αŸ‹αžšαž αŸαžŸαž’αŸ†αž–αžΈαž’αŸ†αž–αžΎαž–αž»αž€αžšαž›αž½αž™ αž¬αž”αž‰αŸ’αž αžΆαž•αŸ’αžŸαŸαž„αž‘αŸ€αžαž‡αžΆαž˜αž½αž™αž”αžŽαŸ’αžŽαžŸαžΆαžš WAL αžŠαŸ„αž™αžαžΆαž˜αžŠαžΆαž“αž—αžΆαž–αž™αžΊαžαž™αŸ‰αžΆαžœαž“αŸƒαž€αžΆαžšαž…αž˜αŸ’αž›αž„αžŠαŸ‚αž›αž”αžΆαž“αž–αž“αŸ’αž™αžΆαžšαž–αŸαž›αŸ”

αž€αŸ’αž“αž»αž„αž§αž‘αžΆαž αžšαžŽαŸαž“αŸαŸ‡ αžœαžΆαž”αžΆαž“αž…αŸ†αžŽαžΆαž™αž–αŸαž› 50 αž“αžΆαž‘αžΈαžŠαžΎαž˜αŸ’αž”αžΈαžŸαŸ’αžŠαžΆαžš αž˜αžΆαž“αž“αŸαž™αžαžΆαž›αŸ’αž”αžΏαž“αž‚αžΊ 110 GB αž“αŸƒαž‘αž·αž“αŸ’αž“αž“αŸαž™ WAL αž€αŸ’αž“αž»αž„αž˜αž½αž™αž˜αŸ‰αŸ„αž„ (αž”αŸαžŽαŸ’αžŽαžŸαžΆαžšαž“αŸ…αžαŸ‚αž”αžΎαž€ αž’αŸαžŸαŸ” ធេស ៣) αžŸαžšαž»αž”αž˜αž€ αž™αžΎαž„αž”αžΆαž“αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž”αž‰αŸ’αž αžΆ αž“αž·αž„αž”αžΆαž“αž™αž€αž‘αž·αž“αŸ’αž“αž“αŸαž™αž˜αž€αžœαž·αž‰αž€αŸ’αž“αž»αž„αžšαž™αŸˆαž–αŸαž› 1,5 αž˜αŸ‰αŸ„αž„αŸ”

αž›αž‘αŸ’αž’αž•αž›αŸ– αž€αž“αŸ’αž›αŸ‚αž„αžŠαŸ‚αž›αž€αžΆαžšαž…αž˜αŸ’αž›αž„αžŠαŸ‚αž›αž”αžΆαž“αž–αž“αŸ’αž™αžΆαžšαž˜αžΆαž“αž”αŸ’αžšαž™αŸ„αž‡αž“αŸ (αž“αž·αž„αž€αž“αŸ’αž›αŸ‚αž„αžŠαŸ‚αž›αžœαžΆαž˜αž·αž“αž˜αžΆαž“)

αž”αŸ’αžšαžΎαž€αžΆαžšαž…αž˜αŸ’αž›αž„αžŠαŸ‚αž›αž”αžΆαž“αž–αž“αŸ’αž™αžΆαžšαž–αŸαž›αž‡αžΆαž‡αŸ†αž“αž½αž™αžŠαŸ†αž”αžΌαž„ αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž”αžΆαžαŸ‹αž”αž„αŸ‹αž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαŸ„αž™αž…αŸƒαžŠαž“αŸ’αž™ αž αžΎαž™αž”αžΆαž“αž€αžαŸ‹αžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αž”αž‰αŸ’αž αžΆαž“αŸαŸ‡αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαž–αž“αŸ’αž™αžΆαž–αŸαž›αžŠαŸ‚αž›αž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αŸ”

αž”αŸ‰αž»αž“αŸ’αžαŸ‚β€‹αžαŸ’αžšαžΌαžœβ€‹αž…αžΆαŸ†β€‹αžαžΆβ€‹αŸ– αž€αžΆαžšβ€‹αž…αž˜αŸ’αž›αž„β€‹αž˜αž·αž“β€‹αž˜αŸ‚αž“β€‹αž‡αžΆβ€‹αž€αžΆαžšβ€‹αž”αž˜αŸ’αžšαž»αž„β€‹αž‘αž»αž€β€‹αž‘αŸαŸ”

αž€αžΆαžšαž”αž˜αŸ’αžšαž»αž„αž‘αž»αž€ αž“αž·αž„αž€αžΆαžšαž…αž˜αŸ’αž›αž„αž˜αžΆαž“αž‚αŸ„αž›αž”αŸ†αžŽαž„αž•αŸ’αžŸαŸαž„αž‚αŸ’αž“αžΆαŸ” αž€αžΆαžšαž”αž˜αŸ’αžšαž»αž„αž‘αž»αž€αžαŸ’αžšαž‡αžΆαž€αŸ‹αž“αžΉαž„αž˜αžΆαž“αž”αŸ’αžšαž™αŸ„αž‡αž“αŸαž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαžŠαŸ„αž™αž…αŸƒαžŠαž“αŸ’αž™ DELETE ឬ DROP TABLE. αž™αžΎαž„αž’αŸ’αžœαžΎαž€αžΆαžšαž”αž˜αŸ’αžšαž»αž„αž‘αž»αž€αž–αžΈαž€αž“αŸ’αž›αŸ‚αž„αž•αŸ’αž‘αž»αž€αžαŸ’αžšαž‡αžΆαž€αŸ‹ αž“αž·αž„αžŸαŸ’αžŠαžΆαžšαžŸαŸ’αžαžΆαž“αž—αžΆαž–αž˜αž»αž“αž“αŸƒαžαžΆαžšαžΆαž„ αž¬αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž‘αžΆαŸ†αž„αž˜αžΌαž›αŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž‘αž“αŸ’αž‘αžΉαž˜αž“αžΉαž„αž€αžΆαžšαžŸαŸ’αž“αžΎαžŸαž»αŸ† DROP TABLE αžαŸ’αžšαžΌαžœβ€‹αž”αžΆαž“β€‹αž•αž›αž·αžβ€‹αž‘αžΎαž„β€‹αžœαž·αž‰β€‹αžŸαŸ’αž‘αžΎαžšβ€‹αžαŸ‚β€‹αž—αŸ’αž›αžΆαž˜αŸ—β€‹αž“αŸ…β€‹αž€αŸ’αž“αž»αž„β€‹αž€αžΆαžšβ€‹αž…αž˜αŸ’αž›αž„β€‹αž‘αžΆαŸ†αž„αž’αžŸαŸ‹β€‹αž“αŸ…β€‹αž›αžΎβ€‹αž…αž„αŸ’αž€αŸ„αž˜β€‹αž’αŸ’αžœαžΎαž€αžΆαžš αžŠαžΌαž…αŸ’αž“αŸαŸ‡β€‹αž€αžΆαžšβ€‹αž…αž˜αŸ’αž›αž„β€‹αž’αž˜αŸ’αž˜αžαžΆβ€‹αž“αžΉαž„β€‹αž˜αž·αž“β€‹αž’αžΆαž…β€‹αž‡αž½αž™β€‹αž”αžΆαž“β€‹αž“αŸ…β€‹αž‘αžΈαž“αŸαŸ‡β€‹αž‘αŸαŸ” αž€αžΆαžšαž…αž˜αŸ’αž›αž„αžαŸ’αž›αž½αž“αžœαžΆαžšαž€αŸ’αžŸαžΆαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαŸ‚αž›αž˜αžΆαž“αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž“αžΈαž˜αž½αž™αŸ—αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‡αž½αž›αž…αŸαž‰ αž“αž·αž„αž…αŸ‚αž€αž…αžΆαž™αž”αž“αŸ’αž‘αž»αž€αŸ”

αž‘αŸ„αŸ‡αž”αžΈαž‡αžΆαž˜αžΆαž“αž€αžΆαžšαž…αž˜αŸ’αž›αž„αžŠαŸ‚αž›αž”αžΆαž“αž–αž“αŸ’αž™αžΆαžšαž–αŸαž›αž€αŸαžŠαŸ„αž™ αž–αŸαž›αžαŸ’αž›αŸ‡αž™αžΎαž„αž–αž·αžαž‡αžΆαžαŸ’αžšαžΌαžœαž€αžΆαžšαž€αžΆαžšαž”αž˜αŸ’αžšαž»αž„αž‘αž»αž€αžαŸ’αžšαž‡αžΆαž€αŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αž€αž“αŸ’αž›αŸ‚αž„αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž– αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž˜αž‡αŸ’αžˆαž˜αžŽαŸ’αžŒαž›αž‘αž·αž“αŸ’αž“αž“αŸαž™αž”αžšαžΆαž‡αŸαž™ αž€αžΆαžšαžαžΌαž…αžαžΆαžαžŠαŸ‚αž›αž›αžΆαž€αŸ‹ αž¬αž–αŸ’αžšαžΉαžαŸ’αžαž·αž€αžΆαžšαžŽαŸαž•αŸ’αžŸαŸαž„αž‘αŸ€αžαžŠαŸ‚αž›αž˜αž·αž“αž‚αž½αžšαž±αŸ’αž™αž€αžαŸ‹αžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αž€αžΎαžαž‘αžΎαž„αž—αŸ’αž›αžΆαž˜αŸ—αŸ” αž€αžΆαžšαž…αž˜αŸ’αž›αž„αžαŸ‚αž˜αž½αž™αž‚αžαŸ‹αž‚αžΊαž‚αŸ’αž˜αžΆαž“αž”αŸ’αžšαž™αŸ„αž‡αž“αŸαž“αŸ…αž‘αžΈαž“αŸαŸ‡αž‘αŸαŸ”

αž€αžΆαžšαž€αžαŸ‹αžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αŸ” αž”αžΎαž€ GitLab.com αž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž“αŸαŸ‡ αž™αžΎαž„αž€αžΆαžšαž–αžΆαžšαžαŸ‚αž€αžΆαžšαž”αžΆαžαŸ‹αž”αž„αŸ‹αž‘αž·αž“αŸ’αž“αž“αŸαž™αž“αŸ…αž€αž˜αŸ’αžšαž·αžαž”αŸ’αžšαž–αŸαž“αŸ’αž’αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡ αž“αž·αž„αž˜αž·αž“αžŸαž„αŸ’αž‚αŸ’αžšαŸ„αŸ‡αž‘αž·αž“αŸ’αž“αž“αŸαž™αž“αŸ…αž€αž˜αŸ’αžšαž·αžαž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž“αŸ„αŸ‡αž‘αŸαŸ”

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹