+3

Migrate PostgreSQL database using pg_dump and pg_restore

Bài toán

  • Mình được giao cho 1 việc migrate 1 database từ db_host của infra cũ sang db_host của infra mới.
  • Anh mentor có hướng dẫn dùng pg_dump, sau đó mình tự tìm hiểu thêm về psql và pg_restore. Dưới đây mình sẽ dùng combo pg_dump and pg_restore luôn nha.
  • Vấn đề gặp phải
    • Không thể drop db của production, do server đang connect để open db
      • lỗi gặp phải ERROR: cannot drop the currently open database
    • Hai infra đều ở remote, mình sẽ gọi là remote1, remote2.

Hướng giải quyết

0. Tìm hiểu

  • pg_dump — extract a PostgreSQL database into a script file or other archive file
    • pg_dump để nén toàn bộ PostgreSQL db thành dạng script hoặc file nén
  • psql — PostgreSQL interactive terminal
    • psql chỉ là tương tác vs Postgresql db, nên việc sử dụng psql sẽ thường là chạy các cmd do mình truyền vào, hoặc chạy các script mình tự viết
    • Mình định dùng psql để drop db nhưng gặp vấn đề ở trên
  • pg_restore — restore a PostgreSQL database from an archive file created by pg_dump
    • câu giải thích cũng nói rõ rằng: restore db từ file nén được tạo bới pg_dump
  • Sau khi có dùng thử psql, mình thấy: nếu db không clean, hoặc phức tạp về các kiểu khóa, sẽ gây ra các error, và các dữ liệu sẽ không được insert hết, thậm chí một vài bảng không được insert do lỗi khóa.
  • vậy nên mình sẽ áp dụng pg_dump -> tạo file nén -> pg_restore
  • Mình thực hiện trên ubuntu 22.04 nhé

1. Dùng pg_dump để kéo db từ remote1 về máy local

pg_dump -h ip_remote1 -U abcpostgres -p 5432 -d abc_db -F t -f dump-db-from-remote1-to-remote2.tar 

Giải thích

  • -h ip_remote1 : host chứa db cần dump là địa chỉ ip của remote1, có thể thay thế bằn url của host cũng được
  • -U abcpostgres : user để truy cập vào postgre db
  • -p 5432 : port để truy cập và postgre, có thể các nơi khác không lấy port mặc định của postgre, cũng nên check cẩn thận
  • -d abc_db : tên của db cần dump dữ liệu về
  • -F t : format output file là dạng nén .tar
  • -f dump-db-from-remote1-to-remote2.tar : đặt tên cho file output, mình đặt là dump-db-from-remote1-to-remote2.tar

Output

2. Dùng pg_restore để đẩy db từ local lên remote2

pg_restore -v -h ip_remote2 -U abcpostgres -p 5432 -d abc_db dump-db-from-remote1-to-remote2.tar -ce

Giải thích

  • -h ip_remote2 : host chứa db cần restore là địa chỉ ip của remote2, cũng có thể thay thế bằn url của host cũng được
  • -U abcpostgres : user để truy cập vào postgre db
  • -p 5432 : port để truy cập và postgre, có thể các nơi khác không lấy port mặc định của postgre
  • -d abc_db : tên của db cần dump dữ liệu về
  • -F t : format output file là dạng nén .tar
  • dump-db-from-remote1-to-remote2.tar : là file nén tar dùng để restore, là đầu ra của pg_dump
  • -ce :
    • -c là option --clean, là xóa hết các thông tin của db (bao gồm các bảng,...) rồi mới restore lại
    • -e là thoát quá trình restore nếu có xảy ra lỗi

Output

Sau đó mình phải lên db check lại 1 lần nữa cho chắc nha

Kết luận

  • Quá trình thực hiện sẽ xảy ra downtime production 1 lúc để chạy pg_restore, tầm ~1p cho file nén tar 2,4GB
  • Mọi người cần chuẩn bị trước cho tình huống downtime đó
  • Mình search mấy cái không thấy áp dụng được hoặc hơi khó nhìn về syntax, tuy nhiên mình vẫn viết để chia sẻ. Đồng thời bắt đầu hành trình chia sẻ tech của mình, xuất phát từ một cậu sinh viên.
  • Hi vọng nhận được sự góp ý của mọi người

All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí