แƒ แƒแƒ’แƒแƒ  แƒ’แƒแƒ›แƒแƒ•แƒ˜แƒงแƒ”แƒœแƒ”แƒ— Lazy Replication แƒ™แƒแƒขแƒแƒกแƒขแƒ แƒแƒคแƒ˜แƒก แƒแƒฆแƒ“แƒ’แƒ”แƒœแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก PostgreSQL-แƒ˜แƒ—

แƒ แƒแƒ’แƒแƒ  แƒ’แƒแƒ›แƒแƒ•แƒ˜แƒงแƒ”แƒœแƒ”แƒ— Lazy Replication แƒ™แƒแƒขแƒแƒกแƒขแƒ แƒแƒคแƒ˜แƒก แƒแƒฆแƒ“แƒ’แƒ”แƒœแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก PostgreSQL-แƒ˜แƒ—
แƒ แƒ”แƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ แƒแƒ  แƒแƒ แƒ˜แƒก แƒกแƒแƒ แƒ”แƒ–แƒ”แƒ แƒ•แƒ. แฒ—แƒฃ แƒแƒ แƒ? แƒแƒ˜, แƒ แƒแƒ’แƒแƒ  แƒ’แƒแƒ›แƒแƒ•แƒ˜แƒงแƒ”แƒœแƒ”แƒ— แƒ’แƒแƒ“แƒแƒ“แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ แƒ”แƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ แƒ›แƒแƒšแƒกแƒแƒฎแƒ›แƒแƒ‘แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒ˜แƒ— แƒฌแƒแƒจแƒšแƒ˜แƒกแƒ’แƒแƒœ แƒ’แƒแƒ›แƒแƒกแƒแƒกแƒฌแƒแƒ แƒ”แƒ‘แƒšแƒแƒ“.

แƒ˜แƒœแƒคแƒ แƒแƒกแƒขแƒ แƒฃแƒฅแƒขแƒฃแƒ แƒ˜แƒก แƒกแƒžแƒ”แƒชแƒ˜แƒแƒšแƒ˜แƒกแƒขแƒ”แƒ‘แƒ˜ GitLab แƒžแƒแƒกแƒฃแƒฎแƒ˜แƒกแƒ›แƒ’แƒ”แƒ‘แƒ”แƒšแƒ˜แƒ แƒกแƒแƒ›แƒฃแƒจแƒแƒแƒ–แƒ” GitLab.com - แƒงแƒ•แƒ”แƒšแƒแƒ–แƒ” แƒ“แƒ˜แƒ“แƒ˜ GitLab-แƒ˜แƒก แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜ แƒ‘แƒฃแƒœแƒ”แƒ‘แƒแƒจแƒ˜. 3 แƒ›แƒ˜แƒšแƒ˜แƒแƒœแƒ˜ แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒšแƒ˜แƒก แƒ“แƒ แƒ—แƒ˜แƒ—แƒฅแƒ›แƒ˜แƒก 7 แƒ›แƒ˜แƒšแƒ˜แƒแƒœแƒ˜ แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒ—, แƒ”แƒก แƒแƒ แƒ˜แƒก แƒ”แƒ แƒ—-แƒ”แƒ แƒ—แƒ˜ แƒงแƒ•แƒ”แƒšแƒแƒ–แƒ” แƒ“แƒ˜แƒ“แƒ˜ แƒฆแƒ˜แƒ แƒ™แƒแƒ“แƒ˜แƒก SaaS แƒกแƒแƒ˜แƒขแƒ˜ แƒ’แƒแƒœแƒกแƒแƒ™แƒฃแƒ—แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒแƒ แƒฅแƒ˜แƒขแƒ”แƒฅแƒขแƒฃแƒ แƒ˜แƒ—. PostgreSQL แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ˜แƒก แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒ˜แƒก แƒ’แƒแƒ แƒ”แƒจแƒ”, GitLab.com แƒ˜แƒœแƒคแƒ แƒแƒกแƒขแƒ แƒฃแƒฅแƒขแƒฃแƒ แƒ แƒจแƒแƒ แƒก แƒแƒ  แƒฌแƒแƒ•แƒ แƒ“แƒ แƒ แƒแƒก แƒ•แƒแƒ™แƒ”แƒ—แƒ”แƒ‘แƒ— แƒจแƒ”แƒชแƒ“แƒแƒ›แƒ”แƒ‘แƒ˜แƒก แƒขแƒแƒšแƒ”แƒ แƒแƒœแƒขแƒแƒ‘แƒ˜แƒก แƒฃแƒ–แƒ แƒฃแƒœแƒ•แƒ”แƒšแƒกแƒแƒงแƒแƒคแƒแƒ“ แƒœแƒ”แƒ‘แƒ˜แƒกแƒ›แƒ˜แƒ”แƒ แƒ˜ แƒฌแƒแƒ แƒฃแƒ›แƒแƒขแƒ”แƒ‘แƒšแƒแƒ‘แƒ˜แƒก แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜, แƒ แƒแƒ“แƒ”แƒกแƒแƒช แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜ แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ“แƒแƒ˜แƒ™แƒแƒ แƒ’แƒแƒก. แƒœแƒแƒ™แƒšแƒ”แƒ‘แƒแƒ“ แƒกแƒแƒ•แƒแƒ แƒแƒฃแƒ“แƒแƒ, แƒ แƒแƒ› แƒแƒกแƒ”แƒ—แƒ˜ แƒ™แƒแƒขแƒแƒกแƒขแƒ แƒแƒคแƒ แƒ›แƒแƒฎแƒ“แƒ”แƒก, แƒ›แƒแƒ’แƒ แƒแƒ› แƒฉแƒ•แƒ”แƒœ แƒ™แƒแƒ แƒ’แƒแƒ“ แƒ•แƒแƒ แƒ— แƒ›แƒแƒ›แƒ–แƒแƒ“แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ“แƒ แƒ›แƒแƒ›แƒแƒ แƒแƒ’แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒกแƒฎแƒ•แƒแƒ“แƒแƒกแƒฎแƒ•แƒ แƒกแƒแƒ แƒ”แƒ–แƒ”แƒ แƒ•แƒ แƒ“แƒ แƒ แƒ”แƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒ›แƒ”แƒฅแƒแƒœแƒ˜แƒ–แƒ›แƒ”แƒ‘แƒ˜แƒ—.

แƒ แƒ”แƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ แƒแƒ  แƒแƒ แƒ˜แƒก แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ˜แƒก แƒกแƒแƒ แƒ”แƒ–แƒ”แƒ แƒ•แƒ แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒ (แƒ˜แƒฎแƒ˜แƒšแƒ”แƒ— แƒฅแƒ•แƒ”แƒ›แƒแƒ—). แƒ›แƒแƒ’แƒ แƒแƒ› แƒแƒฎแƒšแƒ แƒฉแƒ•แƒ”แƒœ แƒ•แƒœแƒแƒฎแƒแƒ•แƒ—, แƒ—แƒฃ แƒ แƒแƒ’แƒแƒ  แƒกแƒฌแƒ แƒแƒคแƒแƒ“ แƒแƒฆแƒ•แƒแƒ“แƒ’แƒ˜แƒœแƒแƒ— แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒ˜แƒ— แƒฌแƒแƒจแƒšแƒ˜แƒšแƒ˜ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜ แƒ–แƒแƒ แƒ›แƒแƒชแƒ˜ แƒ แƒ”แƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—: แƒฉแƒแƒ แƒ—แƒฃแƒšแƒ˜แƒ GitLab.com แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒ”แƒšแƒ˜ แƒฌแƒแƒจแƒแƒšแƒ แƒ›แƒแƒšแƒกแƒแƒฎแƒ›แƒแƒ‘แƒ˜ แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก gitlab-ce แƒ“แƒ แƒ“แƒแƒ™แƒแƒ แƒ’แƒฃแƒšแƒ˜ แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ‘แƒ˜ แƒจแƒ”แƒ แƒฌแƒงแƒ›แƒ˜แƒก แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ”แƒ‘แƒ—แƒแƒœ แƒ“แƒ แƒแƒ›แƒแƒชแƒแƒœแƒ”แƒ‘แƒ—แƒแƒœ.

แƒ’แƒแƒ“แƒแƒ•แƒแƒ“แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ แƒ”แƒžแƒšแƒ˜แƒ™แƒ˜แƒ—, แƒฉแƒ•แƒ”แƒœ แƒแƒฆแƒ•แƒแƒ“แƒ’แƒ˜แƒœแƒ”แƒ— แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜ แƒ›แƒฎแƒแƒšแƒแƒ“ 1,5 แƒกแƒแƒแƒ—แƒจแƒ˜. แƒจแƒ”แƒฎแƒ”แƒ“แƒ” แƒ แƒแƒ’แƒแƒ  แƒ›แƒแƒฎแƒ“แƒ.

แƒ›แƒ˜แƒฃแƒ—แƒ˜แƒ—แƒ”แƒ— แƒ“แƒ แƒแƒจแƒ˜ แƒแƒฆแƒ“แƒ’แƒ”แƒœแƒ PostgreSQL-แƒ˜แƒ—

PostgreSQL-แƒก แƒแƒฅแƒ•แƒก แƒฉแƒแƒจแƒ”แƒœแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒแƒฆแƒแƒ“แƒ’แƒ”แƒœแƒก แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ˜แƒก แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒแƒก แƒ“แƒ แƒแƒ˜แƒก แƒ™แƒแƒœแƒ™แƒ แƒ”แƒขแƒฃแƒš แƒ›แƒแƒ›แƒ”แƒœแƒขแƒจแƒ˜. แƒ›แƒแƒก แƒ”แƒซแƒแƒฎแƒ˜แƒแƒœ แƒ“แƒ แƒแƒจแƒ˜ แƒแƒฆแƒ“แƒ’แƒ”แƒœแƒ (PITR) แƒ“แƒ แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒก แƒ˜แƒ’แƒ˜แƒ•แƒ” แƒ›แƒ”แƒฅแƒแƒœแƒ˜แƒ–แƒ›แƒ”แƒ‘แƒก, แƒ แƒแƒ›แƒšแƒ”แƒ‘แƒ˜แƒช แƒ’แƒแƒœแƒแƒแƒฎแƒšแƒ”แƒ‘แƒก แƒ แƒ”แƒžแƒšแƒ˜แƒ™แƒแƒก: แƒ“แƒแƒฌแƒงแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ›แƒ—แƒ”แƒšแƒ˜ แƒ™แƒšแƒแƒกแƒขแƒ”แƒ แƒ˜แƒก แƒกแƒแƒ˜แƒ›แƒ”แƒ“แƒ แƒกแƒœแƒ”แƒžแƒจแƒแƒขแƒ˜แƒ— (แƒ‘แƒแƒ–แƒ˜แƒก แƒกแƒแƒ แƒ”แƒ–แƒ”แƒ แƒ•แƒ), แƒฉแƒ•แƒ”แƒœ แƒ•แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ— แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒ˜แƒก แƒชแƒ•แƒšแƒ˜แƒšแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒก แƒกแƒ”แƒ แƒ˜แƒแƒก แƒ“แƒ แƒแƒ˜แƒก แƒ’แƒแƒ แƒ™แƒ•แƒ”แƒฃแƒš แƒ›แƒแƒ›แƒ”แƒœแƒขแƒแƒ›แƒ“แƒ”.

แƒแƒ› แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ˜แƒก แƒชแƒ˜แƒ•แƒ˜ แƒกแƒแƒ แƒ”แƒ–แƒ”แƒ แƒ•แƒ แƒแƒกแƒšแƒ˜แƒก แƒ’แƒแƒ›แƒแƒกแƒแƒงแƒ”แƒœแƒ”แƒ‘แƒšแƒแƒ“, แƒฉแƒ•แƒ”แƒœ แƒ แƒ”แƒ’แƒฃแƒšแƒแƒ แƒฃแƒšแƒแƒ“ แƒ•แƒแƒ™แƒ”แƒ—แƒ”แƒ‘แƒ— แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ˜แƒก แƒกแƒแƒ แƒ”แƒ–แƒ”แƒ แƒ•แƒ แƒแƒกแƒšแƒก แƒ“แƒ แƒ•แƒ˜แƒœแƒแƒฎแƒแƒ•แƒ— แƒ›แƒแƒก แƒแƒ แƒฅแƒ˜แƒ•แƒจแƒ˜ (GitLab แƒแƒ แƒฅแƒ˜แƒ•แƒ”แƒ‘แƒ˜ แƒชแƒฎแƒแƒ•แƒ แƒแƒ‘แƒก Google แƒฆแƒ แƒฃแƒ‘แƒšแƒแƒ•แƒแƒœแƒ˜ แƒกแƒแƒชแƒแƒ•แƒ˜). แƒฉแƒ•แƒ”แƒœ แƒแƒกแƒ”แƒ•แƒ” แƒ•แƒแƒ™แƒ•แƒ˜แƒ แƒ“แƒ”แƒ‘แƒ˜แƒ— แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ˜แƒก แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒ˜แƒก แƒชแƒ•แƒšแƒ˜แƒšแƒ”แƒ‘แƒ”แƒ‘แƒก แƒฌแƒ˜แƒœแƒแƒกแƒฌแƒแƒ  แƒฉแƒแƒฌแƒ”แƒ แƒ˜แƒก แƒŸแƒฃแƒ แƒœแƒแƒšแƒ˜แƒก แƒ“แƒแƒแƒ แƒฅแƒ˜แƒ•แƒ”แƒ‘แƒ˜แƒ— (แƒฌแƒ˜แƒœแƒแƒกแƒฌแƒแƒ  แƒฉแƒแƒฌแƒ”แƒ แƒ˜แƒก แƒŸแƒฃแƒ แƒœแƒแƒšแƒ˜, แƒฃแƒแƒš). แƒ“แƒ แƒแƒ› แƒงแƒ•แƒ”แƒšแƒแƒคแƒ แƒ˜แƒก แƒ’แƒแƒ—แƒ•แƒแƒšแƒ˜แƒกแƒฌแƒ˜แƒœแƒ”แƒ‘แƒ˜แƒ—, แƒฉแƒ•แƒ”แƒœ แƒจแƒ”แƒ’แƒ•แƒ˜แƒซแƒšแƒ˜แƒ แƒ’แƒแƒ•แƒแƒ™แƒ”แƒ—แƒแƒ— 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?

แƒกแƒแƒ˜แƒœแƒขแƒ”แƒ แƒ”แƒกแƒแƒ, แƒ—แƒฃ แƒ แƒแƒ’แƒแƒ  แƒแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒ”แƒ‘แƒก 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แƒ˜แƒœแƒกแƒขแƒแƒœแƒชแƒ˜แƒ˜แƒก แƒ“แƒแƒฎแƒฃแƒ แƒ•แƒ, แƒžแƒแƒžแƒฃแƒšแƒแƒ แƒ˜แƒ–แƒแƒชแƒ˜แƒ แƒแƒœ แƒ“แƒแƒžแƒแƒฃแƒ–แƒ”แƒ‘แƒ แƒฎแƒ”แƒšแƒแƒฎแƒแƒšแƒ˜ แƒชแƒ“แƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ (แƒ˜แƒก แƒœแƒแƒ’แƒฃแƒšแƒ˜แƒกแƒฎแƒ›แƒ”แƒ•แƒแƒ“ แƒจแƒ”แƒฉแƒ”แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ).

แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ แƒ“แƒแƒฃแƒ‘แƒ แƒฃแƒœแƒ“แƒ แƒ—แƒแƒ•แƒ˜แƒก แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒแƒก แƒแƒ› แƒกแƒแƒ›แƒฌแƒฃแƒฎแƒแƒ แƒ แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒแƒ›แƒ“แƒ”. แƒแƒฎแƒšแƒ แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ—, แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜แƒก แƒ”แƒฅแƒกแƒžแƒแƒ แƒขแƒ˜. แƒฉแƒ•แƒ”แƒœ แƒ”แƒฅแƒกแƒžแƒแƒ แƒขแƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒšแƒ”แƒ˜แƒ‘แƒšแƒ˜แƒก แƒฌแƒแƒจแƒšแƒ˜แƒšแƒ˜ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜ แƒ“แƒ แƒงแƒ•แƒ”แƒšแƒ แƒ‘แƒ›แƒฃแƒšแƒ˜ แƒกแƒแƒ™แƒ˜แƒ—แƒฎแƒ”แƒ‘แƒ—แƒแƒœ แƒ“แƒ แƒ’แƒแƒ”แƒ แƒ—แƒ˜แƒแƒœแƒ”แƒ‘แƒ˜แƒก แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ”แƒ‘แƒ—แƒแƒœ แƒ“แƒ แƒ’แƒแƒ“แƒแƒ•แƒ˜แƒขแƒแƒœแƒ”แƒ— แƒ˜แƒกแƒ˜แƒœแƒ˜ แƒฌแƒแƒ แƒ›แƒแƒ”แƒ‘แƒ˜แƒก แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒแƒจแƒ˜. แƒ—แƒฃ แƒ“แƒแƒœแƒแƒ™แƒแƒ แƒ’แƒ”แƒ‘แƒ˜ แƒคแƒแƒ แƒ—แƒแƒ›แƒแƒกแƒจแƒขแƒแƒ‘แƒ˜แƒแƒœแƒ˜แƒ, แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒฃแƒ‘แƒ แƒแƒšแƒแƒ“ แƒ“แƒแƒแƒฌแƒ˜แƒœแƒแƒฃแƒ แƒแƒ— แƒ แƒ”แƒžแƒšแƒ˜แƒ™แƒ แƒ“แƒ แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒแƒ— แƒ˜แƒ’แƒ˜, แƒ แƒแƒ’แƒแƒ แƒช แƒ›แƒ—แƒแƒ•แƒแƒ แƒ˜. แƒ›แƒแƒ’แƒ แƒแƒ› แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒงแƒ•แƒ”แƒšแƒ แƒชแƒ•แƒšแƒ˜แƒšแƒ”แƒ‘แƒ แƒ˜แƒ› แƒฌแƒ”แƒ แƒขแƒ˜แƒšแƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’, แƒ แƒแƒ›แƒ”แƒšแƒกแƒแƒช แƒฉแƒ•แƒ”แƒœ แƒแƒฆแƒ•แƒแƒ“แƒ’แƒ”แƒœแƒ—, แƒ“แƒแƒ˜แƒ™แƒแƒ แƒ’แƒ”แƒ‘แƒ.

แƒ“แƒ แƒแƒ˜แƒก แƒแƒœแƒแƒ‘แƒ”แƒญแƒ“แƒ”แƒ‘แƒ˜แƒก แƒœแƒแƒชแƒ•แƒšแƒแƒ“, แƒฃแƒ›แƒฏแƒแƒ‘แƒ”แƒกแƒ˜แƒ แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒแƒ— แƒขแƒ แƒแƒœแƒ–แƒแƒฅแƒชแƒ˜แƒ˜แƒก ID-แƒ”แƒ‘แƒ˜. แƒกแƒแƒกแƒแƒ แƒ’แƒ”แƒ‘แƒšแƒแƒ แƒแƒ› ID-แƒ”แƒ‘แƒ˜แƒก แƒฉแƒแƒฌแƒ”แƒ แƒ, แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, DDL แƒ’แƒแƒœแƒชแƒฎแƒแƒ“แƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก (แƒ แƒแƒ’แƒแƒ แƒ˜แƒชแƒแƒ DROP TABLE), แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ— log_statements = 'ddl'. แƒขแƒ แƒแƒœแƒ–แƒแƒฅแƒชแƒ˜แƒ˜แƒก ID แƒ แƒแƒ› แƒ’แƒ•แƒฅแƒแƒœแƒ“แƒ”แƒก, แƒ•แƒ˜แƒฆแƒ”แƒ‘แƒ“แƒ˜แƒ— recovery_target_xid แƒ“แƒ แƒ’แƒแƒ˜แƒฅแƒชแƒ แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒ˜ แƒขแƒ แƒแƒœแƒ–แƒแƒฅแƒชแƒ˜แƒแƒ›แƒ“แƒ” แƒ—แƒฎแƒแƒ•แƒœแƒแƒ›แƒ“แƒ” DELETE.

แƒกแƒแƒ›แƒฃแƒจแƒแƒแƒ–แƒ” แƒ“แƒแƒ‘แƒ แƒฃแƒœแƒ”แƒ‘แƒ แƒซแƒแƒšแƒ˜แƒแƒœ แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜แƒ: แƒฌแƒแƒจแƒแƒšแƒ”แƒ— แƒงแƒ•แƒ”แƒšแƒ แƒชแƒ•แƒšแƒ˜แƒšแƒ”แƒ‘แƒ recovery.conf แƒ“แƒ แƒ’แƒแƒ“แƒแƒขแƒ•แƒ˜แƒ แƒ—แƒ”แƒ— Postgres. แƒ แƒ”แƒžแƒšแƒ˜แƒ™แƒแƒก แƒ›แƒแƒšแƒ” แƒ˜แƒกแƒ”แƒ• แƒ แƒ•แƒ แƒกแƒแƒแƒ—แƒ˜แƒก แƒ“แƒแƒ’แƒ•แƒ˜แƒแƒœแƒ”แƒ‘แƒ แƒ”แƒฅแƒœแƒ”แƒ‘แƒ แƒ“แƒ แƒฉแƒ•แƒ”แƒœ แƒ›แƒ–แƒแƒ“ แƒ•แƒแƒ แƒ— แƒ›แƒแƒ›แƒแƒ•แƒแƒšแƒ˜ แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก.

แƒแƒฆแƒ“แƒ’แƒ”แƒœแƒ˜แƒก แƒฃแƒžแƒ˜แƒ แƒแƒขแƒ”แƒกแƒแƒ‘แƒ”แƒ‘แƒ˜

แƒชแƒ˜แƒ•แƒ˜ แƒกแƒแƒ แƒ”แƒ–แƒ”แƒ แƒ•แƒ แƒแƒกแƒšแƒ˜แƒก แƒœแƒแƒชแƒ•แƒšแƒแƒ“ แƒ“แƒแƒ’แƒ•แƒ˜แƒแƒœแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ แƒ”แƒžแƒšแƒ˜แƒ™แƒ˜แƒ—, แƒ—แƒฅแƒ•แƒ”แƒœ แƒแƒ  แƒ’แƒญแƒ˜แƒ แƒ“แƒ”แƒ‘แƒแƒ— แƒกแƒแƒแƒ—แƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒฎแƒแƒ แƒฏแƒ•แƒ แƒแƒ แƒฅแƒ˜แƒ•แƒ˜แƒ“แƒแƒœ แƒ›แƒ—แƒ”แƒšแƒ˜ แƒกแƒฃแƒ แƒแƒ—แƒ˜แƒก แƒแƒฆแƒ“แƒ’แƒ”แƒœแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก. แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, 2 แƒขแƒ‘ แƒ›แƒ—แƒšแƒ˜แƒแƒœแƒ˜ แƒกแƒแƒ แƒ”แƒ–แƒ”แƒ แƒ•แƒ แƒแƒกแƒšแƒ˜แƒก แƒ›แƒ˜แƒกแƒแƒฆแƒ”แƒ‘แƒแƒ“ แƒฎแƒฃแƒ—แƒ˜ แƒกแƒแƒแƒ—แƒ˜ แƒ’แƒ•แƒญแƒ˜แƒ แƒ“แƒ”แƒ‘แƒ. แƒ“แƒ แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒ—แƒฅแƒ•แƒ”แƒœ แƒ™แƒ•แƒšแƒแƒ• แƒฃแƒœแƒ“แƒ แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒแƒ— แƒ›แƒ—แƒ”แƒšแƒ˜ แƒงแƒแƒ•แƒ”แƒšแƒ“แƒฆแƒ˜แƒฃแƒ แƒ˜ WAL แƒกแƒแƒกแƒฃแƒ แƒ•แƒ”แƒš แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒแƒ›แƒ“แƒ” แƒแƒฆแƒกแƒแƒ“แƒ’แƒ”แƒœแƒแƒ“ (แƒฃแƒแƒ แƒ”แƒก แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜).

แƒ’แƒแƒ“แƒแƒ“แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ แƒ”แƒžแƒšแƒ˜แƒ™แƒ แƒฃแƒ™แƒ”แƒ—แƒ”แƒกแƒ˜แƒ, แƒ•แƒ˜แƒ“แƒ แƒ” แƒชแƒ˜แƒ•แƒ˜ แƒกแƒแƒ แƒ”แƒ–แƒ”แƒ แƒ•แƒ แƒแƒ แƒ˜ แƒ’แƒ–แƒ˜แƒ—:

  1. แƒแƒ  แƒแƒ แƒ˜แƒก แƒกแƒแƒญแƒ˜แƒ แƒ แƒแƒ แƒฅแƒ˜แƒ•แƒ˜แƒ“แƒแƒœ แƒ›แƒ—แƒšแƒ˜แƒแƒœแƒ˜ แƒกแƒแƒ แƒ”แƒ–แƒ”แƒ แƒ•แƒ แƒแƒกแƒšแƒ˜แƒก แƒแƒ›แƒแƒฆแƒ”แƒ‘แƒ.
  2. แƒแƒ แƒกแƒ”แƒ‘แƒแƒ‘แƒก WAL แƒกแƒ”แƒ’แƒ›แƒ”แƒœแƒขแƒ”แƒ‘แƒ˜แƒก แƒคแƒ˜แƒฅแƒกแƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ แƒ•แƒ แƒกแƒแƒแƒ—แƒ˜แƒแƒœแƒ˜ แƒคแƒแƒœแƒฏแƒแƒ แƒ, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒฃแƒœแƒ“แƒ แƒ’แƒแƒœแƒ›แƒ”แƒแƒ แƒ“แƒ”แƒก.

แƒฉแƒ•แƒ”แƒœ แƒแƒกแƒ”แƒ•แƒ” แƒ›แƒฃแƒ“แƒ›แƒ˜แƒ•แƒแƒ“ แƒ•แƒแƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒ—, แƒจแƒ”แƒกแƒแƒซแƒšแƒ”แƒ‘แƒ”แƒšแƒ˜แƒ แƒ—แƒฃ แƒแƒ แƒ PITR-แƒ˜แƒก แƒ“แƒแƒ›แƒ–แƒแƒ“แƒ”แƒ‘แƒ WAL-แƒ“แƒแƒœ แƒ“แƒ แƒฉแƒ•แƒ”แƒœ แƒกแƒฌแƒ แƒแƒคแƒแƒ“ แƒจแƒ”แƒ•แƒแƒ›แƒฉแƒœแƒ”แƒ•แƒ— แƒ™แƒแƒ แƒฃแƒคแƒชแƒ˜แƒแƒก แƒแƒœ แƒกแƒฎแƒ•แƒ แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ”แƒ‘แƒก WAL-แƒ˜แƒก แƒแƒ แƒฅแƒ˜แƒ•แƒ—แƒแƒœ แƒ“แƒแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ‘แƒ˜แƒ—, แƒ’แƒแƒ“แƒแƒ•แƒแƒ“แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ แƒ”แƒžแƒšแƒ˜แƒ™แƒ˜แƒก แƒจแƒ”แƒคแƒ”แƒ แƒฎแƒ”แƒ‘แƒ˜แƒก แƒ›แƒแƒœแƒ˜แƒขแƒแƒ แƒ˜แƒœแƒ’แƒ˜แƒ—.

แƒแƒ› แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒจแƒ˜, แƒแƒฆแƒ“แƒ’แƒ”แƒœแƒแƒก 50 แƒฌแƒฃแƒ—แƒ˜ แƒ“แƒแƒ’แƒ•แƒญแƒ˜แƒ แƒ“แƒ, แƒ แƒแƒช แƒœแƒ˜แƒจแƒœแƒแƒ•แƒก, แƒ แƒแƒ› แƒกแƒ˜แƒฉแƒฅแƒแƒ แƒ” แƒ˜แƒงแƒ 110 แƒ’แƒ‘ WAL แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜ แƒกแƒแƒแƒ—แƒจแƒ˜ (แƒแƒ แƒฅแƒ˜แƒ•แƒ˜ แƒฏแƒ”แƒ  แƒ™แƒ˜แƒ“แƒ”แƒ• แƒฉแƒแƒ แƒ—แƒฃแƒšแƒ˜ แƒ˜แƒงแƒ AWS S3). แƒกแƒแƒ”แƒ แƒ—แƒ แƒฏแƒแƒ›แƒจแƒ˜, แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ แƒ›แƒแƒ•แƒแƒ’แƒ•แƒแƒ แƒ”แƒ— แƒ“แƒ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜ 1,5 แƒกแƒแƒแƒ—แƒจแƒ˜ แƒแƒฆแƒ•แƒแƒ“แƒ’แƒ˜แƒœแƒ”แƒ—.

แƒจแƒ”แƒ“แƒ”แƒ’แƒ”แƒ‘แƒ˜: แƒกแƒแƒ“แƒแƒช แƒ“แƒแƒ’แƒ•แƒ˜แƒแƒœแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ แƒ”แƒžแƒšแƒ˜แƒ™แƒ แƒกแƒแƒกแƒแƒ แƒ’แƒ”แƒ‘แƒšแƒแƒ (แƒ“แƒ แƒกแƒแƒ“ แƒแƒ แƒ)

แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ— แƒ“แƒแƒ’แƒ•แƒ˜แƒแƒœแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ แƒ”แƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ, แƒ แƒแƒ’แƒแƒ แƒช แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒแƒ“แƒ˜ แƒ“แƒแƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒ, แƒ—แƒฃ แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒ˜แƒ— แƒ“แƒแƒ™แƒแƒ แƒ’แƒ”แƒ— แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜ แƒ“แƒ แƒจแƒ”แƒœแƒ˜แƒจแƒœแƒ”แƒ— แƒ”แƒก แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ“แƒแƒ’แƒ•แƒ˜แƒแƒœแƒ”แƒ‘แƒ˜แƒ—.

แƒ›แƒแƒ’แƒ แƒแƒ› แƒ’แƒแƒฎแƒกแƒแƒ•แƒ“แƒ”แƒ—: แƒ แƒ”แƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ แƒแƒ  แƒแƒ แƒ˜แƒก แƒกแƒแƒ แƒ”แƒ–แƒ”แƒ แƒ•แƒ.

แƒกแƒแƒ แƒ”แƒ–แƒ”แƒ แƒ•แƒ แƒ“แƒ แƒ แƒ”แƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒแƒก แƒกแƒฎแƒ•แƒแƒ“แƒแƒกแƒฎแƒ•แƒ แƒ“แƒแƒœแƒ˜แƒจแƒœแƒฃแƒšแƒ”แƒ‘แƒ แƒแƒฅแƒ•แƒก. แƒชแƒ˜แƒ•แƒ˜ แƒกแƒแƒ แƒ”แƒ–แƒ”แƒ แƒ•แƒ แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒ แƒ’แƒแƒ›แƒแƒ’แƒแƒ“แƒ’แƒ”แƒ‘แƒแƒ—, แƒ—แƒฃ แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒ˜แƒ— แƒ’แƒแƒแƒ™แƒ”แƒ—แƒ”แƒ— DELETE แƒแƒœ DROP TABLE. แƒฉแƒ•แƒ”แƒœ แƒ•แƒแƒ™แƒ”แƒ—แƒ”แƒ‘แƒ— แƒกแƒแƒ แƒ”แƒ–แƒ”แƒ แƒ•แƒ แƒแƒกแƒšแƒก แƒชแƒ˜แƒ•แƒ˜ แƒกแƒแƒชแƒแƒ•แƒ˜แƒ“แƒแƒœ แƒ“แƒ แƒแƒฆแƒ•แƒแƒ“แƒ’แƒ”แƒœแƒ— แƒชแƒฎแƒ แƒ˜แƒšแƒ˜แƒก แƒแƒœ แƒ›แƒ—แƒ”แƒšแƒ˜ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ˜แƒก แƒฌแƒ˜แƒœแƒ แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒแƒก. แƒ›แƒแƒ’แƒ แƒแƒ› แƒแƒ›แƒแƒ•แƒ” แƒ“แƒ แƒแƒก แƒ—แƒฎแƒแƒ•แƒœแƒ DROP TABLE แƒ—แƒ˜แƒ—แƒฅแƒ›แƒ˜แƒก แƒ›แƒงแƒ˜แƒกแƒ˜แƒ”แƒ แƒแƒ“ แƒ›แƒ แƒแƒ•แƒšแƒ“แƒ”แƒ‘แƒ แƒกแƒแƒ›แƒฃแƒจแƒแƒ แƒ™แƒšแƒแƒกแƒขแƒ”แƒ แƒ–แƒ” แƒงแƒ•แƒ”แƒšแƒ แƒ แƒ”แƒžแƒšแƒ˜แƒ™แƒแƒจแƒ˜, แƒแƒ›แƒ˜แƒขแƒแƒ› แƒฉแƒ•แƒ”แƒฃแƒšแƒ”แƒ‘แƒ แƒ˜แƒ•แƒ˜ แƒ แƒ”แƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ แƒแƒฅ แƒแƒ  แƒ“แƒแƒ’แƒ•แƒ”แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒ. แƒ แƒ”แƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ แƒ—แƒแƒ•แƒ˜แƒกแƒ—แƒแƒ•แƒแƒ“ แƒ˜แƒœแƒแƒฎแƒแƒ•แƒก แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒแƒก, แƒ แƒแƒ“แƒ”แƒกแƒแƒช แƒชแƒแƒšแƒ™แƒ”แƒฃแƒšแƒ˜ แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ”แƒ‘แƒ˜ แƒฅแƒ˜แƒ แƒแƒ•แƒ“แƒ”แƒ‘แƒ แƒ“แƒ แƒแƒœแƒแƒฌแƒ˜แƒšแƒ”แƒ‘แƒก แƒ“แƒแƒขแƒ•แƒ˜แƒ แƒ—แƒ•แƒแƒก.

แƒ’แƒแƒ“แƒแƒ“แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒแƒกแƒšแƒ˜แƒก แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜แƒช แƒ™แƒ˜, แƒ–แƒแƒ’แƒฏแƒ”แƒ  แƒœแƒแƒ›แƒ“แƒ•แƒ˜แƒšแƒแƒ“ แƒ’แƒ•แƒญแƒ˜แƒ แƒ“แƒ”แƒ‘แƒ แƒชแƒ˜แƒ•แƒ˜ แƒกแƒแƒ แƒ”แƒ–แƒ”แƒ แƒ•แƒ แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒ แƒฃแƒกแƒแƒคแƒ แƒ—แƒฎแƒ แƒแƒ“แƒ’แƒ˜แƒšแƒแƒก, แƒ—แƒฃ แƒ›แƒแƒฎแƒ“แƒ”แƒ‘แƒ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒชแƒ”แƒœแƒขแƒ แƒ˜แƒก แƒฃแƒ™แƒ›แƒแƒ แƒ˜แƒกแƒแƒ‘แƒ, แƒคแƒแƒ แƒฃแƒšแƒ˜ แƒ“แƒแƒ–แƒ˜แƒแƒœแƒ”แƒ‘แƒ แƒแƒœ แƒกแƒฎแƒ•แƒ แƒ›แƒแƒ•แƒšแƒ”แƒœแƒ”แƒ‘แƒ˜, แƒ แƒแƒ›แƒšแƒ”แƒ‘แƒ˜แƒช แƒ“แƒแƒฃแƒงแƒแƒ•แƒœแƒ”แƒ‘แƒšแƒ˜แƒ• แƒแƒ  แƒแƒ แƒ˜แƒก แƒจแƒ”แƒกแƒแƒ›แƒฉแƒœแƒ”แƒ•แƒ˜. แƒ›แƒแƒ แƒขแƒ แƒ’แƒแƒ›แƒ”แƒแƒ แƒ”แƒ‘แƒ แƒแƒฅ แƒแƒ แƒแƒคแƒ”แƒ  แƒจแƒฃแƒแƒจแƒ˜แƒ.

แƒจแƒ”แƒœแƒ˜แƒจแƒ•แƒœแƒ. แƒฌแƒšแƒ˜แƒก GitLab.com แƒฉแƒ•แƒ”แƒœ แƒแƒ›แƒŸแƒแƒ›แƒแƒ“ แƒ•แƒ˜แƒชแƒแƒ•แƒ— แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ“แƒแƒ™แƒแƒ แƒ’แƒ•แƒ˜แƒกแƒ’แƒแƒœ แƒ›แƒฎแƒแƒšแƒแƒ“ แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒ˜แƒก แƒ“แƒแƒœแƒ”แƒ–แƒ” แƒ“แƒ แƒแƒ  แƒแƒฆแƒ•แƒแƒ“แƒ’แƒ”แƒœแƒ— แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒก แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒšแƒ˜แƒก แƒ“แƒแƒœแƒ”แƒ–แƒ”.

แƒฌแƒงแƒแƒ แƒ: www.habr.com

แƒแƒฎแƒแƒšแƒ˜ แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ