็†ฑ้–€ๅˆ†้กž
 ่ผ‰ๅ…ฅไธญ…
็›ฎ้Œ„

๐Ÿง PostgreSQL ้ซ˜ๆ•ˆ่ƒฝๅ‚™ไปฝ็ญ–็•ฅ:pg_dump / pg_dumpall / pg_basebackup / PITR ๅ…จๆฏ”่ผƒ่ˆ‡ๆœ€ไฝณๅฏฆๅ‹™ๆŒ‡ๅ—

    ๐Ÿง PostgreSQL ้ซ˜ๆ•ˆ่ƒฝๅ‚™ไปฝ็ญ–็•ฅ:pg_dump / pg_dumpall / pg_basebackup / PITR ๅ…จๆฏ”่ผƒ่ˆ‡ๆœ€ไฝณๅฏฆๅ‹™ๆŒ‡ๅ—

    PostgreSQL ็š„ๅ‚™ไปฝๆฉŸๅˆถๅŠŸ่ƒฝๅผทๅคง,ไฝ†ๅฝˆๆ€ง้ซ˜ไนŸๆ„ๅ‘ณ่‘—่ค‡้›œๅบฆ้ซ˜。
    ่จฑๅคšไบบๆœƒๅ•:ๅˆฐๅบ•่ฉฒ็”จ pg_dumppg_dumpallpg_basebackup,้‚„ๆ˜ฏ็›ดๆŽฅไธŠ PITR(Point In Time Recovery)

    ๆœฌ็ฏ‡ๅฎŒๆ•ด่งฃๆžๆฏไธ€็จฎๅ‚™ไปฝๆ–นๅผ็š„็‰นๆ€ง、ๆ•ˆ่ƒฝๅฝฑ้Ÿฟ、ๅ„ช็ผบ้ปž่ˆ‡้ฉ็”จๆƒ…ๅขƒ,ไธฆๆไพ›ไผๆฅญ็ดšๅ‚™ไปฝ/้‚„ๅŽŸ็ฏ„ๆœฌ่ˆ‡ๆŒ‡ไปค,ๅฏๆญ้…ไฝ ๅ…ˆๅ‰ 50 ่ฌ็ญ†่ณ‡ๆ–™ๅฏฆ้ฉ—็ตๆžœ้‹็”จๆ–ผๅฏฆ้š›ๅฐˆๆกˆ(sitemap ๅทฒๆ”ถ้Œ„:pg500k ๅŸบๆบ–ๆธฌ่ฉฆ):contentReference[oaicite:2]{index=2}。


    ๐Ÿ“Œ ไธ€、ๅ…จๅ‚™ไปฝๆ–นๅผ็ธฝ่ฆฝ:็‰ฉ็† vs ้‚่ผฏ

    PostgreSQL ๅ‚™ไปฝๅˆ†ๆˆๅ…ฉๅคง้กž:

    ๆ–นๅผ ้กžๅž‹ ๆ่ฟฐ ้ฉ็”จๆƒ…ๅขƒ
    pg_dump ้‚่ผฏ ๅ–ฎไธ€่ณ‡ๆ–™ๅบซๅŒฏๅ‡บ(schema + data) ้ƒจๅˆ†ๅ‚™ไปฝ、่ทจ็‰ˆๆœฌ้ท็งป、่ณ‡ๆ–™็ฏ„ไพ‹ๅŒฏๅ‡บ
    pg_dumpall ้‚่ผฏ ๆ•ดๅ€‹ PostgreSQL cluster ๅŒฏๅ‡บ(ๅซ roles) ๅฐๅž‹็ณป็ตฑๅฎŒๆ•ดๅŒฏๅ‡บ
    pg_basebackup ็‰ฉ็† ๅฎŒๆ•ดๅ‚™ไปฝ data directory(base + pg_wal) HA、ๅ‚™ๆด、ๅปบ็ซ‹ replica、ๆ—ฅๅธธไพ‹่กŒๅ‚™ไปฝ
    PITR ็‰ฉ็† + WAL ๅ›žๅพฉๅˆฐไปปๆ„ๆ™‚้–“้ปž,้œ€ WAL ๆŒ็บŒๅ‚™ไปฝ ้‡‘่ž、ๆ”ฏไป˜็ณป็ตฑ、ไธๅฏๆŽฅๅ—่ณ‡ๆ–™้บๅคฑ

    ๆ ธๅฟƒ็ต่ซ–: ่‹ฅไฝ ๆ˜ฏไธ€่ˆฌๆœๅ‹™ → ๆฏๆ—ฅ pg_basebackup + WAL ๅณๅฏ。 ่‹ฅไฝ ๆ˜ฏๅคงๅž‹ไผๆฅญ → ๅฟ…ๅš PITR。 ่‹ฅไฝ ่ฆ่ทจ็‰ˆๆœฌ → pg_dump。


    ๐Ÿ“š ไบŒ、pg_dump:ๆœ€ๅธธ็”จ็š„้‚่ผฏๅ‚™ไปฝ

    ้ฉๅˆ้ƒจๅˆ†่ณ‡ๆ–™ๅบซๅ‚™ไปฝๆˆ–่ทจ็‰ˆๆœฌๅ‡็ดš,ไพ‹ๅฆ‚:PostgreSQL 13 → 17。

    1. ๅŒฏๅ‡บๅ–ฎไธ€ DB

    pg_dump -U postgres -d mydb -F c -f mydb.dump
    • -F c:Custom ๆ ผๅผ,ๅฏ็”จ pg_restore ้‚„ๅŽŸ
    • -j:ๅฏๅคšๅทฅ,ๆ้ซ˜ๆ•ˆ่ƒฝ(ๅคง่ณ‡ๆ–™ๅบซๅฟ…็”จ)

    2. ๅคšๅทฅๅ‚™ไปฝ

    pg_dump -U postgres -d mydb -F c -j 8 -f mydb.dump

    3. ้‚„ๅŽŸ

    pg_restore -U postgres -d newdb -j 8 mydb.dump

    ้‚่ผฏๅ‚™ไปฝ็‰น้ปž:

    • ่ทจ็‰ˆๆœฌ็›ธๅฎน
    • ๅฏ้ธๆ“‡ๆ€งๅ‚™ไปฝ table/schema
    • ไธๅซๅ…จ็ณป็ตฑ่ณ‡่จŠ(ๅฆ‚ roles)

    ๐Ÿ“ฆ ไธ‰、pg_dumpall:ๅฎŒๆ•ด้‚่ผฏๅ‚™ไปฝ(ๅซ roles)

    ๅฏๆŠŠๆ•ดๅ€‹ PostgreSQL cluster(ๅคš DB + roles)ๅŒฏๅ‡บๆˆไธ€ๅ€‹ๅฏ่ฎ€ SQL。

    pg_dumpall -U postgres > full_backup.sql

    ้ฉๅˆ:

    • ๅฐๅž‹็ณป็ตฑ
    • ๆธฌ่ฉฆ็’ฐๅขƒๆฌ็งป
    • ๅ‚™ไปฝ roles ่ˆ‡ global objects(pg_dump ไธๆœƒๅ‚™ไปฝ)

    ไธ้ฉๅˆ:

    • ๅคงๅž‹่ณ‡ๆ–™ๅบซ(SQL ๆขๅพฉ้€Ÿๅบฆๆ…ข)
    • ้œ€่ฆๆŒ็บŒ WAL ็š„ๅ ดๆ™ฏ(ๆฒ’ๆœ‰ WAL)

    ๐Ÿš€ ๅ››、pg_basebackup:ไผๆฅญๆœ€ๅธธ็”จ็š„็‰ฉ็†ๅ‚™ไปฝ

    ็›ดๆŽฅ่ค‡่ฃฝ PostgreSQL data directory,้ฉๅˆ:

    • ๅ‚™ๆดๅปบ็ซ‹(replica)
    • HA(ไพ‹ๅฆ‚ Patroni、repmgr)
    • ๆ—ฅๅธธๅฎšๆ™‚ๅ‚™ไปฝ

    1. ๅŸบๆœฌๅ‚™ไปฝ

    pg_basebackup -U replica -D /backup/2025-12-03 -Fp -Xs -P
    ๅƒๆ•ธ่ชชๆ˜Ž:
    • -Fp:Plain ๆ ผๅผ(ๆˆ– -Ft tar)
    • -Xs:ๅŒ…ๅซ WAL
    • -P:้กฏ็คบ้€ฒๅบฆ

    2. ไฝฟ็”จๅฃ“็ธฎๅ‚™ไปฝ(PostgreSQL 15+)

    pg_basebackup -U replica -D backup -Ft -z -Z 6

    3. ๅปบ็ซ‹ replica(ๆœ€ๅธธ็”จ)

    pg_basebackup -h primary -D /var/lib/postgresql/17/main \
      -R -U replica -P -Fp -Xs

    ๅฎŒๆˆๅพŒ่‡ชๅ‹•็”ข็”Ÿ replica ่จญๅฎš(standby.signal)。


    ๐Ÿ•’ ไบ”、PITR — Point In Time Recovery

    PITR ๆ˜ฏๅฐ‡ restore ๆบ–็ขบๅ›žๅˆฐ「ไปปๆ„็ง’」็š„ๆŠ€่ก“,ๆ˜ฏไผๆฅญไธๅฏๆˆ–็ผบ็š„ๅ‚™ๆด็ญ–็•ฅ。 ๅฐคๅ…ถ็•ถไฝ ่ชคๅˆช่ณ‡ๆ–™、UPDATE ้Œฏ่ชค、DROP TABLE、่ณ‡ๆ–™่ขซๆฑ™ๆŸ“ๆ™‚,ๅชๆœ‰ PITR ่ƒฝๆ•‘。

    ๅ•Ÿ็”จ WAL ๅ‚™ไปฝ

    ไฟฎๆ”น postgresql.conf:
    archive_mode = on
    archive_command = 'cp %p /archived_wal/%f'
    wal_level = replica
    max_wal_senders = 10
    

    ่งธ็™ผๅ‚™ไปฝ(ไพ› PITR ไฝฟ็”จ)

    SELECT pg_start_backup('daily_backup');
    ๅ‚™ไปฝ็‰ฉ็†่ณ‡ๆ–™(็”จ pg_basebackup ๆˆ– rsync)。
    SELECT pg_stop_backup();

    ้€ฒ่กŒ้‚„ๅŽŸๅˆฐ็‰นๅฎš็ง’

    ๅœจ recovery.conf(ๆˆ– postgresql.auto.conf)ๅŠ ๅ…ฅ:
    restore_command = 'cp /archived_wal/%f %p'
    recovery_target_time = '2025-12-03 13:12:45'
    
    ๅ•Ÿๅ‹• PostgreSQL:
    pg_ctl start

    ่ณ‡ๆ–™ๅบซๅฐ‡่‡ชๅ‹• replay WAL ๅ›žๅˆฐๆŒ‡ๅฎš็ง’。


    ๐Ÿ“Š ๅ…ญ、ๆ•ˆ่ƒฝๆฏ”่ผƒ:ๅ“ช็จฎๆ–นๅผๆœ€ๅฟซ?(้€š็”จๅŸบๆบ–)

    ไปฅไฝ ๅทฒๅปบ็ซ‹็š„ 50 ่ฌ็ญ†ๆธฌ่ฉฆ่ณ‡ๆ–™้‡็ดš็‚บๆจ™ๆบ–(ๅƒ่€ƒ sitemap):contentReference[oaicite:3]{index=3}。

    ๆ–นๅผ ๅ‚™ไปฝ้€Ÿๅบฆ ้‚„ๅŽŸ้€Ÿๅบฆ ๆ”ฏๆด่ทจ็‰ˆๆœฌ ้ฉ็”จๆƒ…ๅขƒ
    pg_dump ไธญ ไธญ~ๆ…ข ้ƒจๅˆ†่กจ / schema ๅŒฏๅ‡บ、้ท็งป
    pg_dumpall ๆ…ข ๆ…ข ๅฐ็ณป็ตฑๅ…จๅ‚™
    pg_basebackup ๅฟซ ๅฟซ HA、ๆ—ฅๅธธๅ‚™ไปฝ、replica ๅปบ็ซ‹
    PITR ๅฟซ ๅฟซ~ไธญ(็œ‹ WAL) ้‡‘่ž、ๆ”ฏไป˜、้‡่ฆ็ณป็ตฑ

    ๅฆ‚ๆžœไฝ ่ฆๅปบ็ซ‹ HA ๆˆ– replica:pg_basebackup ๅฟ…็”จ
    ๅฆ‚ๆžœไฝ ่ฆ่ทจ็‰ˆๆœฌ:pg_dump ๅฟ…็”จ
    ๅฆ‚ๆžœไฝ ่ฆ็ฒพๆบ–ๅˆฐไปปๆ„ๆ™‚้–“็ง’:PITR ๆ˜ฏๅ”ฏไธ€้ธๆ“‡


    ๐Ÿ›ก ไธƒ、ไผๆฅญ็ดšๅ‚™ไปฝ็ญ–็•ฅ่จญ่จˆ(ๅผท็ƒˆๅปบ่ญฐ)

    ไปฅไธ‹ๆ˜ฏๆœ€็ฉฉๅฅ็š„ๅฏฆๅ‹™็ญ–็•ฅ:

    ๆฏๆ—ฅ        :pg_basebackup(ๅฎŒๆ•ด็‰ฉ็†ๅ‚™ไปฝ)
    ๆฏ 5 ๅˆ†้˜   :WAL ๅ‚™ไปฝ(PITR)
    ๆฏ้€ฑ        :pg_dump(้—œ้ต่กจ)
    ๆฏ้€ฑ        :ๅฎŒๆ•ด้‚„ๅŽŸๆผ”็ทด
    ็•ฐๅœฐๅ‚™ไปฝ    :S3 / NFS / PBS / rsync
    ่‡ชๅ‹•ๅŒ–      :systemd + cron + shell script
    

    ่ณ‡ๆ–™ๅบซๅ‚™ไปฝไธๆ˜ฏ「ๅšไบ†」ๅฐฑ็ฎ—,่€Œๆ˜ฏ:

    ไฝ ๅฟ…้ ˆ่ƒฝๆˆๅŠŸ้‚„ๅŽŸ → ๅ‚™ไปฝๆ‰็ฎ—ๆˆ็ซ‹。


    ๐Ÿงช ๅ…ซ、ไฝ ๅฏ็›ดๆŽฅไฝฟ็”จ็š„ๅ‚™ไปฝ่…ณๆœฌ็ฏ„ๆœฌ(ๅฏๆ”พ cron)

    1. pg_basebackup ่‡ชๅ‹•ๅ‚™ไปฝ่…ณๆœฌ

    #!/bin/bash
    DATE=$(date +"%Y-%m-%d")
    DEST="/backup/pg/$DATE"
    
    pg_basebackup -U replica -D $DEST -Fp -Xs -P -R
    find /backup/pg/ -type d -mtime +7 -exec rm -rf {} \;
    

    2. WAL ๅ‚™ไปฝ่ผชๆ›ฟ่…ณๆœฌ

    #!/bin/bash
    ARCHIVE=/archived_wal
    mkdir -p $ARCHIVE
    find $ARCHIVE -type f -mtime +3 -exec rm {} \;
    

    ๐Ÿฉน ไน、ๆŽ’้Œฏๆธ…ๅ–ฎ:ๅธธ่ฆ‹ๅ•้กŒ่ˆ‡่™•็†ๆ–นๅผ

    • WAL ไธๆ–ทๅขž้•ท? → archive_command ๆฒ’ๆˆๅŠŸ。
    • pg_basebackup ๅกไฝ? → max_wal_senders ไธๅค 。
    • PITR ็„กๆณ•ๅ›žๅพฉ? → restore_command ๆœชๆญฃ็ขบๅ– WAL。
    • pg_dump ๅŒฏๅ‡บ็•ฐๅธธๆ…ข? → ็ผบๅฐ‘ -j ๅคšๅทฅ。
    • replica ็„กๆณ•ๅŒๆญฅ? → primary_conninfo ๆœช่จญๅฎš。

    ๐Ÿ’ฌ ไบ’ๅ‹•็•™่จ€ๅผ•ๅฐŽ(ๅ‚™ไปฝ่ˆ‡้‚„ๅŽŸ่จŽ่ซ–ๅ€)

    ่‹ฅไฝ ๅœจ PostgreSQL ๅ‚™ไปฝ / ้‚„ๅŽŸ、PITR ๆˆ– pg_basebackup ้Ž็จ‹ไธญ้‡ๅˆฐ:

    • WAL ไธๅ‚™ไปฝ、PITR ็„กๆณ•้‚„ๅŽŸ
    • pg_dump ๅทจ้‡่ณ‡ๆ–™ๅ‚™ไปฝ้€Ÿๅบฆ้Žๆ…ข
    • replica ๅปบ็ฝฎๅคฑๆ•—ๆˆ–ๅŒๆญฅๅปถ้ฒ
    • ่ทจ็‰ˆๆœฌๅ‚™ไปฝๅพŒ้‚„ๅŽŸๅคฑๆ•—

    ๆญก่ฟŽ็›ดๆŽฅ็•™่จ€่ฒผๅ‡บๆŒ‡ไปค่ˆ‡้Œฏ่ชค่จŠๆฏ,ๆˆ‘ๆœƒๅ”ๅŠฉๅˆ†ๆžไธฆๅฏ่ƒฝๆ•ด็†ๆˆ่ฃœๅ……็ฏ‡ๅŠ ๅ…ฅๆœฌๆ–‡。


    ๐Ÿ”— ๅปถไผธ้–ฑ่ฎ€

    — WWFandy・PostgreSQL Backup Notes

    ๐Ÿ”— ๅˆ†ไบซ้€™็ฏ‡ LINE Facebook X

    ๆฒ’ๆœ‰็•™่จ€:

    ๅผต่ฒผ็•™่จ€

    ๅญ—็ดš