About
home
Tmax OpenSQL
home
๐Ÿ’Ž

11. PostgreSQL์˜ WAL 2 (Base Back-up and PITR)

์ž‘์„ฑ์ž
JBH
SJH

Base Back-up

์˜จ๋ผ์ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฐฑ์—…์€ ํฌ๊ฒŒ ๋…ผ๋ฆฌ์ ์ธ ๋ฐฑ์—…(Logacal backup)๊ณผ ๋ฌผ๋ฆฌ์ ์ธ ๋ฐฑ์—…(Physical backup)์œผ๋กœ ๋ถ„๋ฅ˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋…ผ๋ฆฌ์ ์ธ ๋ฐฑ์—…์€ ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ฐฑ์—…์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๊ณ , ๋ณต์›์—๋Š” ๋” ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ๋ฐ˜๋ฉด, ๋ฌผ๋ฆฌ์ ์ธ ๋ฐฑ์—…์€ ์ƒ๋Œ€์ ์œผ๋กœ ์งง์€ ์‹œ๊ฐ„์— ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋ฐฑ์—… ๋ฐ ๋ณต์›ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ ์‹œ์Šคํ…œ์—์„œ ๋งค์šฐ ์ค‘์š”ํ•˜๊ณ  ์œ ์šฉํ•œ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.
PostgreSQL 8.0 ๋ฒ„์ „๋ถ€ํ„ฐ ๋ฌผ๋ฆฌ์ ์ธ ์˜จ๋ผ์ธ ์ „์ฒด ๋ฐฑ์—… (Online physical full backup)์ด ๊ฐ€๋Šฅํ•ด์กŒ์œผ๋ฉฐ, ์‹คํ–‰์ค‘์ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํด๋Ÿฌ์Šคํ„ฐ ์ „์ฒด์˜ ์Šค๋ƒ…์ƒท์— ๋Œ€ํ•œ ๋ฐฑ์—…์„ ๋ฒ ์ด์Šค ๋ฐฑ์—…(Base backup)์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

๋ฐฑ์—… ๋ผ๋ฒจ ํŒŒ์ผ

๋ฐฑ์—… ๋ผ๋ฒจ ํŒŒ์ผ(backup_label)์€ ๊ธฐ๋ณธ ๋””๋ ‰ํ† ๋ฆฌ(Base directory)์˜ ์ตœ์ƒ์œ„ ๋ ˆ๋ฒจ์— ์ƒ์„ฑ๋˜๋ฉฐ ์œ„์—์„œ ์–ป์€ ์ฒดํฌํฌ์ธํŠธ ์œ„์น˜๋ฅผ ๋น„๋กฏํ•œ ๋ฒ ์ด์Šค ๋ฐฑ์—…์— ํ•„์š”ํ•œ ํ•„์ˆ˜์ ์ธ ์ •๋ณด๋“ค์„ ๋‹ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
๋ฐฑ์—… ๋ผ๋ฒจ ํŒŒ์ผ์€ ์•„๋ž˜์˜ ์—ฌ์„ฏ ๊ฐœ์˜ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๊ณ , PostgreSQL 11 ๋ฒ„์ „๋ถ€ํ„ฐ๋Š” ์ผ๊ณฑ ๊ฐœ์˜ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
๋ฐฑ์—… ๋ผ๋ฒจ ํŒŒ์ผ ์ •๋ณด
๋ฐฑ์—… ๋ผ๋ฒจ ํŒŒ์ผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
postgres> cat /usr/local/pgsql/data/backup_label START WAL LOCATION: 0/9000028 (file 000000010000000000000009) CHECKPOINT LOCATION: 0/9000060 BACKUP METHOD: pg_start_backup BACKUP FROM: master START TIME: 2023-2-16 15:47:32 GMT LABEL: Weekly Backup
Shell
๋ณต์‚ฌ

๋ฐฑ์—… ํžˆ์Šคํ† ๋ฆฌ ํŒŒ์ผ

๋ฐฑ์—… ํžˆ์Šคํ† ๋ฆฌ ํŒŒ์ผ์˜ ๋„ค์ด๋ฐ ๋ฐฉ์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
{WAL segment}.{offset value at the time the base backup was started}.backup
Shell
๋ณต์‚ฌ

Operation

1.
pg_start_backup ๋ช…๋ น์–ด ์‹คํ–‰
2.
์•„์นด์ด๋น™ ๋ช…๋ น์–ด(ex. cp command)๋ฅผ ์ด์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํด๋Ÿฌ์Šคํ„ฐ ์ „์ฒด ์Šค๋ƒ…์ƒท์„ ํ™•๋ณด
3.
pg_stop_backup ๋ช…๋ น์–ด ์‹คํ–‰

pg_start_backup

pg_start_backup์€ ๋ฒ ์ด์Šค ๋ฐฑ์—…์„ ์ค€๋น„ํ•ฉ๋‹ˆ๋‹ค. WAL Chapter์—์„œ ์„ค๋ช…ํ–ˆ๋“ฏ์ด ๋ณต๊ตฌ(Recovery) ์ ˆ์ฐจ๋Š” REDO ํฌ์ธํŠธ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— pg_start_backup์€ ๋ช…์‹œ์ ์œผ๋กœ REDO ํฌ์ธํŠธ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ๋ฒ ์ด์Šค ๋ฐฑ์—…์„ ์‹œ์ž‘ํ•  ๋•Œ ์ฒดํฌํฌ์ธํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฒ ์ด์Šค ๋ฐฑ์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋™์•ˆ์—๋„ ์ •๊ธฐ์ ์ธ ์ฒดํฌํฌ์ธํŠธ๊ฐ€ ์—ฌ๋Ÿฌ ๋ฒˆ ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์œ„์—์„œ ์–ป์€ ์ฒดํฌํฌ์ธํŠธ์˜ ์œ„์น˜๋ฅผ pg_control ์™ธ์˜ ๋‹ค๋ฅธ ํŒŒ์ผ์— ์ €์žฅํ•ด๋‘ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
pg_start_backup์€ ๋‹ค์Œ ๊ณผ์ •์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.
1.
์ „์ฒด ํŽ˜์ด์ง€ ์“ฐ๊ธฐ ๋ชจ๋“œ(Full-page write mode)๋กœ ๊ฐ•์ œ ์ „ํ™˜
2.
(8.4 ๋ฒ„์ „๋ถ€ํ„ฐ) ํ˜„์žฌ์˜ WAL ์„ธ๊ทธ๋จผํŠธ ํŒŒ์ผ(Current WAL segment file)๋กœ ์Šค์œ„์น˜(Switch)
3.
์ฒดํฌํฌ์ธํŠธ ์ˆ˜ํ–‰
4.
backup_label ํŒŒ์ผ์„ ์ƒ์„ฑ

pg_stop_backup

pg_stop_backup์€ ๋‹ค์Œ ๊ณผ์ •์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.
1.
pg_start_backup์— ์˜ํ•ด ๊ฐ•์ œ๋กœ ์ „์ฒด ํŽ˜์ด์ง€ ์“ฐ๊ธฐ ๋ชจ๋“œ๋กœ ์ „ํ™˜๋˜์—ˆ๋‹ค๋ฉด, ์ด์ „ ๋ชจ๋“œ(Non-full-page writes mode)๋กœ ์ „ํ™˜
2.
๋ฐฑ์—… ์ข…๋ฃŒ(Backup end)์— ๋Œ€ํ•œ XLOG ๋ ˆ์ฝ”๋“œ(Record)๋ฅผ ๋‚จ๊น€
3.
WAL ์„ธ๊ทธ๋จผํŠธ ํŒŒ์ผ(WAL segment file)์„ ์Šค์œ„์น˜
4.
๋ฐฑ์—… ํžˆ์Šคํ† ๋ฆฌ ํŒŒ์ผ(Backup history file)์„ ์ƒ์„ฑ ์ด ํŒŒ์ผ์€ backup_label ํŒŒ์ผ์˜ ๋‚ด์šฉ๊ณผ pg_stop_backup์ด ์ˆ˜ํ–‰๋œ ํƒ€์ž„์Šคํƒฌํ”„๋ฅผ ๋‹ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
5.
backup_label ํŒŒ์ผ์„ ์‚ญ์ œ ์ด ํŒŒ์ผ์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ณต๊ตฌ์— ํ•„์š”ํ•œ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์—, ๋ฐฑ์—… ํžˆ์Šคํ† ๋ฆฌ ํŒŒ์ผ๋กœ ๋ณต์‚ฌ๋˜์—ˆ๋‹ค๋ฉด ๋ฐฑ์—… ๋Œ€์ƒ์ธ ์›๋ž˜์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํด๋Ÿฌ์Šคํ„ฐ(Original database cluster)์—์„œ๋Š” ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

Point-In-Time Recovery (PITR)

๋ฒ ์ด์Šค ๋ฐฑ์—…๊ณผ ์—ฐ์†์ ์ธ ์•„์นด์ด๋น™ ๋ฐฉ์‹์œผ๋กœ ์ƒ์„ฑ๋œ ์•„์นด์ด๋ธŒ ๋กœ๊ทธ๋ฅผ ์ด์šฉํ•ด ํŠน์ • ์‹œ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋ณต๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ Point-in-time recovery๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๋ฒ ์ด์Šค ๋ฐฑ์—…๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ PostgreSQL 8.0 ๋ฒ„์ „๋ถ€ํ„ฐ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

Outline

12:05 GMT of 23 August, 2022 ์‹œ์ ์— ์‹ค์ˆ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ์ด์ „์— ๋งŒ๋“ค์—ˆ๋˜ ๋ฒ ์ด์Šค ๋ฐฑ์—…์„ ์ด์šฉํ•ด ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋ณต๊ตฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
PITR์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์„ค์ • ํŒŒ์ผ์˜ restore_command์™€ recovery_target_time ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. PostgreSQL 11 ๋ฒ„์ „๊นŒ์ง€๋Š” recovery.conf ํŒŒ์ผ์— ์„ค์ •ํ•ด์•ผ ํ•˜๋ฉฐ, PostgreSQL 12 ๋ฒ„์ „๋ถ€ํ„ฐ๋Š” postgresql.conf ํŒŒ์ผ์— ์„ค์ •์„ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค
PostgreSQL์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ์„ค์ • ํŒŒ์ผ์— ์œ„์˜ ๋‘ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ๊ณ , ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์— backup_label์ด ์žˆ์œผ๋ฉด, PITR ๋ชจ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
recovery.signal file PostgreSQL 12 ๋ฒ„์ „๋ถ€ํ„ฐ recovery.conf ํŒŒ์ผ ์ œ๊ฑฐ๋˜์—ˆ๊ณ , ๊ด€๋ จ ํŒŒ๋ผ๋ฏธํ„ฐ๋“ค์€ postgresql.conf์— ์ž‘์„ฑ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฒ ์ด์Šค ๋ฐฑ์—…์„ ์ด์šฉํ•ด ๋ณต๊ตฌ๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด ๋นˆ ํŒŒ์ผ์ธ recovery.signal ํŒŒ์ผ์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํด๋Ÿฌ์Šคํ„ฐ ๋””๋ ‰ํ† ๋ฆฌ์— ์ƒ์„ฑํ•ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๋งŒ์•ฝ recover_target_time์ด ์„ค์ •๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋ฉด PostgreSQL์€ ์•„์นด์ด๋ธŒ ๋กœ๊ทธ ํŒŒ์ผ์„ ๋๊นŒ์ง€ ์ฝ์–ด์„œ ๋ฆฌํ”Œ๋ ˆ์ด๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

PITR vs Crash Recovery

Crash Recovery์™€ PITR์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋™์ผํ•œ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‘ ๊ฐ€์ง€ ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
โ€ข
WAL ์„ธ๊ทธ๋จผํŠธ ํŒŒ์ผ์„ ์ฝ๋Š” ์œ„์น˜
โ—ฆ
Crash Recovery : ๋ฒ ์ด์Šค ๋””๋ ‰ํ† ๋ฆฌ ์•„๋ž˜์— ์žˆ๋Š” pg_wal ์„œ๋ธŒ ๋””๋ ‰ํ† ๋ฆฌ
โ—ฆ
PITR : archive_command ํŒŒ๋ผ๋ฏธํ„ฐ์— ์„ค์ •๋œ ์•„์นด์ด๋ธŒ ๋””๋ ‰ํ† ๋ฆฌ
โ€ข
์ฒดํฌํฌ์ธํŠธ ์œ„์น˜๋ฅผ ์ฝ๋Š” ํŒŒ์ผ
โ—ฆ
Crash Recovery : pg_control ํŒŒ์ผ
โ—ฆ
PITR : backup_label ํŒŒ์ผ

ํƒ€์ž„๋ผ์ธ

PostgreSQL์—์„œ ํƒ€์ž„๋ผ์ธ์€ ์›๋ณธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํด๋Ÿฌ์Šคํ„ฐ(Original database cluster)์™€ ๋ณต์›๋œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํด๋Ÿฌ์Šคํ„ฐ(Recovered database cluster)๋ฅผ ๊ตฌ๋ถ„ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋ฉฐ, PITR์˜ ํ•ต์‹ฌ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค.

ํƒ€์ž„๋ผ์ธ ์•„์ด๋””

๊ฐ ํƒ€์ž„๋ผ์ธ์€ ํƒ€์ž„๋ผ์ธ ์•„์ด๋””๋ฅผ ๋ถ€์—ฌ๋ฐ›์Šต๋‹ˆ๋‹ค. ํƒ€์ž„๋ผ์ธ ์•„์ด๋””๋Š” 4-byte unsigned integer๋กœ 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
๊ฐ๊ฐ์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํด๋Ÿฌ์Šคํ„ฐ์—๋Š” ๊ฐœ๋ณ„์ ์ธ ํƒ€์ž„๋ผ์ธ ์•„์ด๋””๊ฐ€ ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค. ์ฒ˜์Œ initdb ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ํ†ตํ•ด ์ƒ์„ฑ๋œ ์ดˆ๊ธฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํด๋Ÿฌ์Šคํ„ฐ์˜ ํƒ€์ž„๋ผ์ธ ์•„์ด๋””๋Š” 1์ž…๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ๋ณต๊ตฌ๋  ๋•Œ๋งˆ๋‹ค ํƒ€์ž„๋ผ์ธ ์•„์ด๋””๋Š” 1์”ฉ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ด์ „ ์„น์…˜์—์„œ ๋‹ค๋ค˜๋˜ ์›๋ณธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํด๋Ÿฌ์Šคํ„ฐ๋กœ๋ถ€ํ„ฐ ๋ณต์›๋œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํด๋Ÿฌ์Šคํ„ฐ์˜ ํƒ€์ž„๋ผ์ธ ์•„์ด๋””๋Š” 2์ž…๋‹ˆ๋‹ค.

ํƒ€์ž„๋ผ์ธ ํžˆ์Šคํ† ๋ฆฌ ํŒŒ์ผ

PITR ๊ณผ์ •์ด ์™„๋ฃŒ๋˜๋ฉด โ€˜00000002.historyโ€™๊ณผ ๊ฐ™์€ ์ด๋ฆ„์˜ ํƒ€์ž„๋ผ์ธ ํžˆ์Šคํ† ๋ฆฌ ํŒŒ์ผ์ด ์•„์นด์ด๋ธŒ ๋””๋ ‰ํ† ๋ฆฌ์™€ pg_xlog(๋˜๋Š” pg_wal) ์„œ๋ธŒ ๋””๋ ‰ํ† ๋ฆฌ์— ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ด ํŒŒ์ผ์€ ์–ด๋А ํƒ€์ž„๋ผ์ธ์ด ์–ธ์ œ ๋ถ„๊ธฐ๋˜์—ˆ๋Š”์ง€๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.
ํƒ€์ž„๋ผ์ธ ํžˆ์Šคํ† ๋ฆฌ ํŒŒ์ผ์€ ์ตœ์†Œ ํ•œ ์ค„ ์ด์ƒ์ด ์“ฐ์—ฌ์ ธ ์žˆ๊ณ , ๊ฐ ์ค„์€ ์•„๋ž˜ ๋‚ด์šฉ์„ ๋‹ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
โ€ข
timelineId : ๋ณต๊ตฌ์— ์‚ฌ์šฉ๋œ ์•„์นด์ด๋ธŒ ๋กœ๊ทธ์˜์˜ ํƒ€์ž„๋ผ์ธ ์•„์ด๋””
โ€ข
LSN : WAL ์„ธ๊ทธ๋จผํŠธ ํŒŒ์ผ์˜ ์Šค์œ„์น˜๊ฐ€ ๋ฐœ์ƒํ•œ LSN ์œ„์น˜
โ€ข
reason : ์‚ฌ๋žŒ์ด ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ํ˜•ํƒœ๋กœ ์ž‘์„ฑ๋œ ํƒ€์ž„๋ผ์ธ์ด ๋ณ€๊ฒฝ๋œ ์ด์œ ์— ๋Œ€ํ•œ ์„ค๋ช…
ํ•˜๋‹จ์˜ ํƒ€์ž„๋ผ์ธ ํžˆ์Šคํ† ๋ฆฌ ํŒŒ์ผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•ด์„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
postgres> cat /home/postgres/archivelogs/00000002.history 1 0/A000198 before 2022-6-21 12:05:00.861324+00
Shell
๋ณต์‚ฌ
โ€œํƒ€์ž„๋ผ์ธ ์•„์ด๋””๊ฐ€ 2์ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ํƒ€์ž„๋ผ์ธ ์•„์ด๋”” 1์ธ ๋ฒ ์ด์Šค ๋ฐฑ์—…์œผ๋กœ๋ถ€ํ„ฐ ๋ณต๊ตฌ๋˜์—ˆ๊ณ , ์•„์นด์ด๋ธŒ ๋กœ๊ทธ๋ฅผ 0/A000198 ์œ„์น˜๊นŒ์ง€ ๋ฆฌํ”Œ๋ ˆ์ดํ•จ์œผ๋กœย โ€˜2022-6-21 12:05:00.861324+00โ€™ ์‹œ์  ์ด์ „๊นŒ์ง€ ๋ณต๊ตฌ๋˜์—ˆ๋‹ค.โ€

Operation

1.
REDO ํฌ์ธํŠธ๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด ๋‚ด๋ถ€ ํ•จ์ˆ˜์ธ read_backup_label์„ ์ด์šฉํ•ด backup_label ํŒŒ์ผ์— ์žˆ๋Š” โ€˜CHECKPOINT LOCATIONโ€™์„ ์ฝ์Œ
2.
PITR ๊ด€๋ จ ํŒŒ๋ผ๋ฏธํ„ฐ์ธ restore_command, recovery_target_time๋ฅผ ์„ค์ • ํŒŒ์ผ๋กœ๋ถ€ํ„ฐ ์ฝ์Œ
โ€ข
PostgreSQL 11 ๋ฒ„์ „๊นŒ์ง€ : recovery.conf
โ€ข
PostgreSQL 12 ๋ฒ„์ „๋ถ€ํ„ฐ : postgresql.conf
3.
WAL ๋ฐ์ดํ„ฐ๋ฅผ ๋ฆฌํ”Œ๋ ˆ์ด
โ€ข
restore_command์— ์˜ํ•ด ์•„์นด์ด๋ธŒ ์˜์—ญ(Archival area)์—์„œ ์ž„์‹œ ์˜์—ญ(Temporary area)์œผ๋กœ ๋ณต์‚ฌ๋œ ์•„์นด์ด๋ธŒ ๋กœ๊ทธ๋ฅผ ์ฝ์–ด์„œ XLOG ๋ ˆ์ฝ”๋“œ(XLOG record)๋ฅผ ๋ฆฌํ”Œ๋ ˆ์ดํ•ฉ๋‹ˆ๋‹ค. ์ž„์‹œ ์˜์—ญ์œผ๋กœ ๋ณต์‚ฌ๋œ ๋กœ๊ทธ ํŒŒ์ผ๋“ค์€ ์‚ฌ์šฉ๋œ ํ›„์— ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค.
โ€ข
์ด ์žฅ์—์„œ ๋‹ค๋ฃฌ ์˜ˆ์‹œ์—์„œ๋Š” ํƒ€์ž„์Šคํƒฌํ”„(timestamp) โ€˜2022-8-24 12:05:00โ€™ ์ด์ „ ์‹œ์ ๊นŒ์ง€์˜ WAL ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฆฌํ”Œ๋ ˆ์ด ๋ฉ๋‹ˆ๋‹ค.
โ€ข
๋งŒ์•ฝ ์„ค์ • ํŒŒ์ผ(recovery.conf ๋˜๋Š” postgresql.conf)์— recovery_target_time์ด ์„ค์ •๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด ์•„์นด์ด๋ธŒ ๋กœ๊ทธ์˜ ๋๊นŒ์ง€ ๋ ˆํ”Œ๋ ˆ์ด ๋ฉ๋‹ˆ๋‹ค.
โ€ข
WAL ๋ฐ์ดํ„ฐ ์ค‘ Commit/abort ๋ ˆ์ฝ”๋“œ์—๋Š” ํƒ€์ž„์Šคํƒฌํ”„๊ฐ€ ์ ํ˜€์žˆ๊ธฐ ๋•Œ๋ฌธ์— recovery_target_time๊นŒ์ง€์˜ ์ˆ˜ํ–‰์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
4.
ํƒ€์ž„๋ผ์ธ ํžˆ์Šคํ† ๋ฆฌ ํŒŒ์ผ(Timeline history file)์„ ์ƒ์„ฑ
โ€ข
๋ณต๊ตฌ๊ฐ€ ๋๋‚˜๋ฉด โ€˜00000002.historyโ€™๊ณผ ๊ฐ™์€ ์ด๋ฆ„์˜ ํƒ€์ž„๋ผ์ธ ํžˆ์Šคํ† ๋ฆฌ ํŒŒ์ผ์ด pg_xlog ๋˜๋Š” pg_wal ์„œ๋ธŒ ๋””๋ ‰ํ† ๋ฆฌ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
โ€ข
๋งŒ์•ฝ ์•„์นด์ด๋ธŒ ๋กœ๊ทธ๊ฐ€ ํ™œ์„ฑํ™” ๋˜์–ด ์žˆ๋‹ค๋ฉด ์•„์นด์ด๋ธŒ ๋””๋ ‰ํ† ๋ฆฌ์—๋„ ๋™์ผํ•œ ์ด๋ฆ„์˜ ํŒŒ์ผ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
โ€ข
ํ•ด๋‹น ํŒŒ์ผ์ด ๋‹ด๋Š” ๋‚ด์šฉ๊ณผ ์—ญํ• ์€ ๋‹ค์Œ ์„น์…˜์—์„œ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.
ํƒ€์ž„๋ผ์ธ ํžˆ์Šคํ† ๋ฆฌ ํŒŒ์ผ์€ ๋‘ ๋ฒˆ์งธ์™€ ๊ทธ ์ดํ›„์˜ PITR ๊ณผ์ •์—์„œ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ ๋ณต๊ตฌ๋ฅผ ์‹œ๋„ํ•˜๋Š” ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด ํ™•์ธ์„ ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
ํƒ€์ž„๋ผ์ธ ์•„์ด๋””๊ฐ€ 2์ธ ์ด๋ฏธ ํ•œ ๋ฒˆ ๋ณต์›๋œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์šด์˜ ์ค‘์— 12:15:00 ์‹œ์ ์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
recovery.conf(๋˜๋Š” postgresql.conf)์˜ ์„ค์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
โ€ข
recovery_targte_time์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ ์‹œ์ ์œผ๋กœ ์„ค์ •ํ•˜๋ฉฐ, recovery_target_timeline์€ ํ•ด๋‹น ํƒ€์ž„๋ผ์ธ์„ ๋”ฐ๋ผ ๋ณต๊ตฌํ•˜๊ธฐ๋ฅผ ์›ํ•˜๋Š” ํƒ€์ž„๋ผ์ธ ์•„์ด๋””๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
restore_command = 'cp /mnt/server/archivedir/%f %p' recovery_target_time = "2022-8-24 12:15:00 GMT" recovery_target_timeline = 2
Shell
๋ณต์‚ฌ
PostgreSQL์„ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๋ฉด PITR ๋ชจ๋“œ๋กœ ๋Œ์ž…ํ•˜๋ฉฐ ํƒ€์ž„๋ผ์ธ ์•„์ด๋”” 2๋ฅผ ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ณต๊ตฌ๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆผ 10.5๋Š” ์ด ์ƒํ™ฉ์„ ์„ค๋ช…ํ•˜๋ฉฐ ์ˆ˜ํ–‰ ์ ˆ์ฐจ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
1.
PostgreSQL์€ backup_label ํŒŒ์ผ์—์„œ โ€˜CHECKPOINT LOCATIONโ€™์˜ ๊ฐ’์„ ์ฝ์Œ
2.
PostgreSQL์€ recovery.conf(๋˜๋Š” postgresql.conf) ํŒŒ์ผ์—์„œ restore_command, recovery_target_time, recovery_target_timeline์˜ ๊ฐ’์„ ์ฝ์Œ
3.
PostgreSQL์€ recovery_target_timeline ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’์— ํ•ด๋‹นํ•˜๋Š” ํƒ€์ž„๋ผ์ธ ํžˆ์Šคํ† ๋ฆฌ ํŒŒ์ผ โ€˜00000002.historyโ€™์„ ์ฝ์Œ
4.
PostgreSQL์€ WAL ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์Œ ์ ˆ์ฐจ์— ๋”ฐ๋ผ ๋ฆฌํ”Œ๋ ˆ์ด ํ•จ
a.
REDO ํฌ์ธํŠธ๋ถ€ํ„ฐ 00000002.historyํŒŒ์ผ์— ๊ธฐ๋ก๋œ LSN โ€˜0/A000198โ€™๊นŒ์ง€ ํƒ€์ž„๋ผ์ธ ์•„์ด๋”” 1์— ํ•ด๋‹นํ•˜๋Š” ์•„์นด์ด๋ธŒ ๋กœ๊ทธ๋ฅผ ์ฝ์–ด์„œ WAL ๋ฐ์ดํ„ฐ๋ฅผ ๋ฆฌํ”Œ๋ ˆ์ด
b.
LSN โ€˜0/A000198โ€™ ์ดํ›„๋ถ€ํ„ฐ ํƒ€์ž„์Šคํƒฌํ”„ โ€˜2022-8-24 12:15:00โ€™์‹œ์ ๊นŒ์ง€ ํƒ€์ž„๋ผ์ธ ์•„์ด๋”” 2์— ํ•ด๋‹นํ•˜๋Š” ์•„์นด์ด๋ธŒ ๋กœ๊ทธ๋ฅผ ์ฝ์–ด์„œ WAL ๋ฐ์ดํ„ฐ๋ฅผ ๋ฆฌํ”Œ๋ ˆ์ด
5.
๋ณต๊ตฌ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด, ํƒ€์ž„๋ผ์ธ ์•„์ด๋””๋Š” 3์œผ๋กœ ์ฆ๊ฐ€ํ•˜๋ฉฐ ์ƒˆ๋กœ์šด ํƒ€์ž„๋ผ์ธ ํžˆ์Šคํ† ๋ฆฌ ํŒŒ์ผ์ธ 00000003.history ํŒŒ์ผ์ด pg_xlog(๋˜๋Š” pg_wal) ์„œ๋ธŒ ๋””๋ ‰ํ† ๋ฆฌ์™€ ์•„์นด์ด๋ธŒ ๋””๋ ‰ํ† ๋ฆฌ์— ์ƒ์„ฑ๋จ
postgres> cat /home/postgres/archivelogs/00000003.history 1 0/A000198 before 2022-8-24 12:05:00.861324+00 2 0/B000078 before 2022-8-24 12:15:00.927133+00
Shell
๋ณต์‚ฌ
ํ•œ ๋ฒˆ์ด๋ผ๋„ PITR์„ ์ˆ˜ํ–‰ํ–ˆ๋‹ค๋ฉด, ์ ์ ˆํ•œ ํƒ€์ž„๋ผ์ธ ํžˆ์Šคํ† ๋ฆฌ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ํƒ€์ž„๋ผ์ธ ์•„์ด๋””๋ฅผ ๋ช…์‹œํ•ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด์ฒ˜๋Ÿผ ํƒ€์ž„๋ผ์ธ ํžˆ์Šคํ† ๋ฆฌ ํŒŒ์ผ์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํด๋Ÿฌ์Šคํ„ฐ์˜ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๊ธฐ๋กํ•  ๋ฟ ์•„๋‹ˆ๋ผ PITR ๊ณผ์ •์— ๋Œ€ํ•œ ๋ณต๊ตฌ ์ง€์นจ ๋ฌธ์„œ์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.
์ง€๊ธˆ๊นŒ์ง€ PostgreSQL์˜ WAL 2 (Base Back-up and PITR)์— ๊ด€ํ•ด ์•Œ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค
โ€˜PostgreSQL์˜ WAL 3 (Streaming Replication)โ€™๋ฅผ ๋ฐ”๋กœ ์ด์–ด์„œ ํ™•์ธํ•ด๋ณด์„ธ์š”!

์ž์œ ๋กญ๊ฒŒ ๋Œ“๊ธ€์„ ๋‚จ๊ฒจ์ฃผ์„ธ์š”