Thủ tục restore Postgres data dir sang server mới hoặc docker

Hi Vtitans,
Trong một số tình huống, thay vì file dump của Postgres, bạn có trong tay bản back up của data directory và cần restore sang một server mới dựng. Sẽ phát sinh những câu hỏi như cần copy vào đâu và set permission như thế nào, bài này mình note lại thủ tục mình đã làm nhé.
Nhanh thôi, mình không điều tra cặn kẽ vì không cần, nếu bạn làm điều tương tự trên production thì hãy kiểm tra chặt chẽ gấp đôi.

Thông tin quản trị cơ bản của Postgres

OS: Ubuntu 20, Postgres 12, mình note bạn tự đối chiếu sang case của bạn.

OS: Ubuntu 20, Postgres 12
Port: 5432
Tên service: postgresql
Tên user: postgres
Lệnh cài đặt: apt install postgres postgres-contrib
Lệnh mở client console: psql
Lệnh dump: pg_dump
File config chính: /etc/postgresql/12/main/postgresql.conf 

Làm thôi

As root:

# Tạo folder data
mkdir /var/lib/postgresql/data
# Copy. Folder source của mình là mẹ của file PG_VERSION.
cp -r /home/vtidev/bck/postgresql/* /var/lib/postgresql/data/
# Set permission
chown -R postgres:postgres /var/lib/postgresql/data
chmod 0700 /var/lib/postgresql/data #hoặc 0750
# Config data_directory:
vi /etc/postgresql/12/main/postgresql.conf 

File config được sửa như sau:

#data_directory = '/var/lib/postgresql/12/main' #default
data_directory = '/var/lib/postgresql/data' #modified
# Restart service
systemctl restart postgresql
# Check log
tail /var/log/postgresql/postgresql-12-main.log
# Kiểm tra bằng console
su - postgres
psql
\l #list databases
\dt #list tables
\q #quit

Trường hợp Docker

Ở trên folder mình chọn là /var/lib/postgresql/data, đây là folder default trong trường hợp sử dụng postgres:12 image.
Image này rất thuận tiện cho dev, không cần làm gì cả, bạn chỉ cần add volumes như trong file docker-compose ví dụ sau:

services:
  postgres:
    image: postgres:12.2
    ports:
      - 5432:5432
    volumes:
      - ./your-local-data-dir:/var/lib/postgresql/data

Bổ sung là khi start container, docker-entrypoint.sh sẽ kiểm tra folder data, nếu rỗng sẽ thực hiện init sử dụng file sql do bạn copy vào thư mục thể hiện như dưới đây:

# docker-entrypoint.sh
docker_setup_db
docker_process_init_files /docker-entrypoint-initdb.d/*

Do vậy trên môi trường dev local, để có data test, bạn có thể sử dụng data dir chuẩn bị sẵn, hoặc sử dụng file sql.
Nếu bạn thắc mắc vậy file config đâu, hoặc có nghi vấn folder data default không giống như của mình, hãy sử dụng một vài cách kiểm tra như dưới đây, mình nghĩ là image đó không có file config mà hoàn toàn dùng biến môi trường:

# docker inspect postgres:12.2
"Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/lib/postgresql/12/bin",
                "GOSU_VERSION=1.12",
                "LANG=en_US.utf8",
                "PG_MAJOR=12",
                "PG_VERSION=12.2-2.pgdg100+1",
                "PGDATA=/var/lib/postgresql/data" <= Bingo
#
# docker exec -it your_container /bin/bash
# Khi đã "ở trong container": 
export
declare -x PGDATA="/var/lib/postgresql/data"
# Hoặc sử dụng psql
su - postgres
psql
SHOW data_directory;

Hi vọng bài viết giúp bạn rút ngắn thời gian tìm hiểu,
Thân, from Châu D9

Leave a Reply

Your email address will not be published. Required fields are marked *