Backup ба сэргээлт
Сервер доголдоно, дискэнд гэмтэл гарна, хэн нэгэн буруу DELETE хийнэ — энэ бүхэн болох л байдаг. Backup бол "болох уу?" биш "хэзээ болох вэ?" гэсэн асуудал. PostgreSQL нь хэд хэдэн backup аргатай бөгөөд тус тусын давуу болон сул талтай. Энэ хичээлийг дуусаад та өгөгдлийн санаа найдвартай хадгалж, шаардлагатай үед сэргээж чадна.
pg_dump — логик backup
pg_dump нь өгөгдлийн сангийн бүтэц ба өгөгдлийг SQL хэлбэрт хөрвүүлж хадгалдаг хамгийн нийтлэг арга. PostgreSQL ажиллаж байх үед хийж болох бөгөөд бусад хэрэглэгчдийн ажлыг тасалдуулахгүй:
# Нэг өгөгдлийн санг backup хийх
pg_dump --host=localhost --username=postgres --dbname=myapp \
--file=myapp_backup.sql
# Шахсан форматаар (илүү уян хатан, хурдан сэргээгддэг)
pg_dump --host=localhost --username=postgres --dbname=myapp \
--format=custom --file=myapp_backup.dump
# Зөвхөн бүтцийг (schema only) backup хийх
pg_dump --schema-only --dbname=myapp --file=myapp_schema.sql
# Зөвхөн өгөгдлийг (data only) backup хийх
pg_dump --data-only --dbname=myapp --file=myapp_data.sql
# Тодорхой хүснэгтүүдийг backup хийх
pg_dump --table=orders --table=products --dbname=myapp \
--format=custom --file=orders_products.dump
--format=custom нь дараа нь тодорхой хүснэгт сонгож сэргээх боломж олгодог тул энгийн SQL файлаас илүү тохиромжтой.
pg_restore — сэргээлт
# SQL файлаас сэргээх
psql --host=localhost --username=postgres --dbname=myapp_new \
--file=myapp_backup.sql
# Custom форматаас сэргээх
pg_restore --host=localhost --username=postgres --dbname=myapp_new \
--verbose myapp_backup.dump
# Зөвхөн тодорхой хүснэгт сэргээх
pg_restore --host=localhost --username=postgres --dbname=myapp_new \
--table=orders myapp_backup.dump
# Зэрэгцээ сэргээлт (том backup-д хурдасгах)
pg_restore --host=localhost --username=postgres --dbname=myapp_new \
--jobs=4 myapp_backup.dump
-- Сэргээхийн өмнө шинэ хоосон өгөгдлийн сан үүсгэх
CREATE DATABASE myapp_new;
-- Сэргээлтийн дараа шалгах
\c myapp_new
SELECT COUNT(*) FROM orders;
SELECT COUNT(*) FROM products;
pg_dumpall — бүх өгөгдлийн санг backup хийх
# PostgreSQL сервер дээрх БҮГД өгөгдлийн санг хамт backup хийх
# (role, global тохиргоо орно)
pg_dumpall --host=localhost --username=postgres \
--file=all_databases.sql
# Зөвхөн global объектуудыг (role, tablespace) backup хийх
pg_dumpall --globals-only --username=postgres \
--file=globals.sql
# Бүгдийг сэргээх
psql --host=localhost --username=postgres --file=all_databases.sql
Автомат backup — cron ашиглах
Гараар backup хийхийг санах боломжгүй — автоматжуулах хэрэгтэй:
# /usr/local/bin/pg_backup.sh файл үүсгэх
#!/bin/bash
BACKUP_DIR="/var/backups/postgresql"
DATE=$(date +%Y%m%d_%H%M%S)
DB_NAME="myapp"
KEEP_DAYS=7
mkdir -p "$BACKUP_DIR"
# Backup хийх
pg_dump \
--username=postgres \
--format=custom \
--file="$BACKUP_DIR/${DB_NAME}_${DATE}.dump" \
"$DB_NAME"
# 7 хоногоос хуучин backup-уудыг устгах
find "$BACKUP_DIR" -name "*.dump" -mtime +$KEEP_DAYS -delete
echo "Backup амжилттай: ${DB_NAME}_${DATE}.dump"
# crontab -e дээр нэмж өдөр бүр шөнийн 2:00-д backup хийх
0 2 * * * /usr/local/bin/pg_backup.sh >> /var/log/pg_backup.log 2>&1
Point-in-Time Recovery (PITR)
pg_dump нь тухайн үеийн агшин зуурын (snapshot) backup юм. WAL архивлалтыг идэвхжүүлбэл ямар ч цаг мөч рүү буцах боломжтой болдог:
# postgresql.conf дээр WAL архивлалт идэвхжүүлэх
archive_mode = on
archive_command = 'cp %p /var/lib/postgresql/wal_archive/%f'
-- Алдаатай DELETE хийгдсэн цагийг тодорхойлох
SELECT pg_walfile_name(pg_current_wal_lsn());
-- recovery.conf дээр буцах цагийг зааж сэргээх
-- recovery_target_time = '2024-06-15 14:30:00'
Жижиг системд pg_dump + cron хангалттай. Том, чухал системд PITR зайлшгүй шаардлагатай.
Дараагийн хичээлд:
PostgreSQL-д суулгасан болон гуравдагч талын extension-уудыг идэвхжүүлж, UUID, PostGIS, pg_trgm зэрэг хүчирхэг боломжуудыг ашиглах аргыг сурна.