+6

Cách import 1.000.000 records vào table của PostgreSQL DB trong Docker container

Trong công việc, đôi khi chúng ta cần import một lượng lớn dữ liệu fake hoặc dữ liệu từ môi trường staging vào local để hỗ trợ quá trình debug, testing hay tối ưu hóa các truy vấn... Nếu chỉ sử dụng các công cụ quản lý PostgreSQL như pgAdmin, DBeaver, Navicat... thì gần như điều này là không khả thi. Bài viết này sẽ hướng dẫn bạn cách import một table với hàng triệu bản ghi hoặc thậm chí cả một cơ sở dữ liệu lên đến hàng chục GB một cách chi tiết step-by-step.

Giới thiệu về PostgreSQL

PostgreSQL, thường được gọi là Postgres, là một hệ thống quản lý cơ sở dữ liệu quan hệ (RDBMS) mạnh mẽ và mã nguồn mở. Với bộ tính năng mạnh mẽ và sự chú trọng vào khả năng mở rộng và tuân thủ tiêu chuẩn, PostgreSQL đã xứng đáng là một trong những hệ thống cơ sở dữ liệu tiên tiến và phổ biến nhất trong thế giới phát triển phần mềm hiện đại.

1. Import file table CSV vào docker Postgresql database

Đầu tiên bạn cần 1 file CSV, có thể là file CSV fake data hoặc file CSV bạn export được từ một DB khác.

Bước kế tiếp, bạn sẽ cần biết tên của container PostgreSQL. Đơn giản nhất, bạn có thể chạy lệnh docker ps để kiểm tra danh sách các container đang chạy. image.png

Như bạn có thể thấy, trong danh sách bên trên, tên container Postgres của mình là project-postgres-1 . Sau khi bạn xác định được tên container, tiếp theo chúng ra copy file CSV từ máy tính của bạn vào bên trong container PostgreSQL bằng lệnh sau:

docker cp ./name_of_file.csv project-postgres-1:/name_of_file_in_docker.csv

Lưu ý rằng:

  • Đảm bảo bạn đang chạy lệnh từ thư mục chứa file CSV thực tế.
  • Thay project-postgres-1 bằng tên hoặc ID của container PostgreSQL của bạn.
  • Nếu có nhiều file, hãy đặt chúng trong một thư mục và copy thư mục đó để tiết kiệm thời gian.

Tiếp theo, khởi chạy container PostgreSQL và chọn cơ sở dữ liệu cần nhập CSV bằng lệnh dưới đây:

  • -U: user của cơ sở dữ liệu
  • -d: chọn database muốn import CSV
docker exec -it project-postgres-1 psql -U db_user -d your_database

Bước cuối cùng để đảm bảo quá trình import CSV thành công, thực hiện lệnh sau bên trong container PostgreSQL:

  • table: table muốn import
  • name_of_file_in_docker.csv: file đã copy vào container ở bước trên.

Chú ý: lệnh này phải được chạy trong Postgres container

//import CSV
\copy table from '/name_of_file_in_docker.csv' delimiter ',' CSV HEADER;

Nếu bạn thấy thông báo giống như COPY 10 (với 10 là số lượng bản ghi trong file) xuất hiện trên terminal, bạn có thể chắc chắn rằng quá trình import đã thành công. Lệnh này chạy khá nhanh, mình từng thử với file có 1,3 triệu record chỉ mất có 30 - 40s.

2. Import/ Export database

Nếu bạn muốn import export databse hay chỉ đơn giản muốn backup database thì có thể tham khảo lệnh bên dưới.

Export:

docker exec -i project-postgres-1 psql -U db-user your_database > path/to/backup.sql

Import: Tương tự lệnh export nhưng đổi > thành <

docker exec -i project-postgres-1 psql -U db-user your_database < path/to/backup.sql

Mình có thử Import, Export một DB khoảng gần chục GB (gồm nhiều bảng có hơn 1 triệu record). Thì thấy việc này chạy rất lâu, mất đến 10 -15p.

3. Một vài lệnh hay dùng trong Postgres

  • \l: Hiển thị danh sách cơ sở dữ liệu
  • \c + database: Chọn cơ sở dữ liệu
  • \dt: Hiển thị danh sách bảng trong cơ sở dữ liệu
  • \d + tablename: Hiển thị chi tiết cấu trúc bảng, cột nào là index, unique, nullable

Với các lệnh này, bạn có thể thực hiện nhanh chóng các thao tác quan trọng trong PostgreSQL mà không cần vào trình quản lý cơ sở dữ liệu.

4. Kết luận

Chúng ta đã cùng nhau khám phá cách import từ file CSV vào container PostgreSQL, bao gồm cả việc import toàn bộ cơ sở dữ liệu. Bài viết cũng cung cấp một số lệnh quan trọng trong PostgreSQL giúp quản lý dữ liệu một cách hiệu quả.

Với những hướng dẫn chi tiết và lệnh hữu ích, hi vọng có thể giúp bạn quản lý cơ sở dữ liệu PostgreSQL của mình trong môi trường Docker một cách dễ dàng và hiệu quả.

Cảm ơn bạn đã đọc bài viết.


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.