Database thì tất nhiên là dùng để chứa dữ liệu rồi. Và dữ liệu càng nhiều thì việc lưu trữ càng phải làm tốt, sao cho vẫn dễ quản lý, bảo trì, vẫn đảm bảo hiệu quả hoạt động của database. Cái này thì bên Oracle mình thấy ok, nhưng PostgreSQL thì có vẻ chưa tốt lắm, ít nhất là cho tới thời điểm viết bài này.

 

Nội dung thư mục PGDATA

 

Khi khởi tạo cluster database, ta đã chỉ định đường dẫn thư mục lưu trữ cho cluster database là /u02/pgsql/data. Ta sẽ xem thư mục này có những gì.

 

 

Đầu tiên là các tập tin. Thư mục này chứa các tập tin như sau:

  • postgresql.conf, postgresql.auto.conf, pg_hba.conf, pg_ident.conf: các tập tin cấu hình
  • PG_VERSION: thông tin version database
  • postmaster.opts: chứa câu lệnh start cluster db
  • postmaster.pid: chứa 1 số thông tin khi cluster db hoạt động như master process ID, thư mục data, startup time, port, listen_adress…

Các thư mục con

 

SubdirNội dung bên trong
baseChứa các thư mục database. Mỗi thư mục database chứa các data file của db đó.
globalChứa các cluster table của hệ thống, vd như pg_database
pg_clogChứa các transaction commit status files
pg_dynshmemChứa các file dùng bởi dynamic share memory subsystem
pg_logChứa các tập tin log
pg_logicalChứa status data cho logical decoding
pg_multixactChứa multitransaction status data (dùng cho shared row locks)
pg_notifyChứa Listen/Notify status data
pg_replslotChứa replication slot data
pg_serialChứa thông tin về committed serializable transactions
pg_snapshotsChứa các snapshot được export
pg_statChứa permanent files cho statistics system
pg_stat_tmpChứa temporary files cho statistics system
pg_subtransChứa thông tin về subtransaction
pg_tblspcChứa các symbolic link đến các tablespace
pg_twophaseChứa thông tin 2-phase commit, hay prepared transaction status
pg_xlogChứa các tập tin của WAL (WAL segment hay WAL log)

 

Tablespace

 

Từ version 8, PostgreSQL đưa ra tablespace để quản lý việc lưu trữ. Thực chất, tablespace trong PostgreSQL chỉ là … 1 đường link thư mục, giúp quản lý tập trung các data file.

 

Mặc định khi khởi tạo, cluster db sẽ có 2 tablespace

 

 

pg_global là system tablespace, chứa các system tables, được lưu trong thư mục $PGDATA/global. Còn pg_default là tablespace mặc định dành cho các user, được lưu trong thư mục $PGDATA/base.

 

Ta thử tạo 1 table không chỉ định rõ tablespace và kiểm tra. Đúng là được lưu bên trong thư mục base.

 

 

Ta sẽ thử tạo tablespace mới và tạo table trên đó. Giả sử trên hệ thống đã có các disk /u03, /u04 được set owner là postgres.

 

 

Kiểm tra vị trí lưu trữ của 2 table trên disk

 

 

Kiểm tra thư mục pg_tblspc

 

 

Rõ ràng ta thấy thư mục này đúng chỉ là chứa các symbolic link đến các thư mục trên OS. Vào tiếp bên trong, mỗi thư mục tablespace sẽ có 1 thư mục con với tên có chứa version database

 

 

Tiếp theo là thư mục có tên database ID

 

 

Vào tiếp trong cùng, sẽ thấy data file chứa table của chúng ta.

 

 

Để set tablespace mặc định cho 1 user

 

 

Để set tablespace mặc định cho 1 database

 

 

Note
Cluster database bao gồm nhiều database nhưng dùng chung resource. Như phần memory -> dùng chung các buffer, process cũng dùng chung, và bây giờ tablespace, được định nghĩa ở mức cluster, có thể dùng cho mọi database. Tất nhiên là dữ liệu anh nào thì anh nấy thấy. Khái niệm cluster database này mình sẽ viết 1 bài giải thích rõ hơn.

 

Đối với temporary data, mặc định PostgreSQL sẽ tạo ra temp file, nhưng lại thuộc về 1 schema ảo để tiện dọn dẹp sau khi session sử dụng xong. 

 

 

Trong trường hợp ta muốn quy định 1 temp tablespace để tiện quản lý, ta có thể cấu hình tham số temp_tablespaces như sau

 

 

Sau đó mở session mới và tạo lại temp table và kiểm tra thử, đã thấy nằm trong tablespace temp

 

 

Data file, index files

 

Trong PostgreSQL, mỗi table hay index sẽ được lưu trong file riêng, đặt tên theo filenode. VD ta tạo thêm 1 index trên mytb1 và kiểm tra file path

 

 

Kiểm tra relative file node, chính là nó boring

 

 

Nếu kích thước table, index vượt quá 1GB, PostgreSQL sẽ tạo ra các file lưu trữ tiếp theo, mỗi file có dung lượng 1GB, đặt tên thứ tự, chẳng hạn 16730.1, 16730.2… 

 

Note
Mặc định kích thước data file là 1GB mỗi file. Nếu muốn thay đổi, ta phải dùng option –with-segsize khi cài đặt PostgreSQL.

 

Ngoài file chính này, còn có thể có thêm các file có đuôi _fsm_vm

 

 

  • _fsm: Free Space Map, theo dõi dung lượng trống trong data file
  • _vm: Visibility Map, theo dõi trạng thái record trong data file, phục vụ cho thằng vacuum trong việc dọn dẹp dữ liệu cũ

Database pages (blocks)

 

Đây là cấp độ lưu trữ nhỏ nhất. Các data file bao gồm nhiều pages (mình thích gọi là blocks hơn), với kích thước mặc định là 8KB mỗi page. Tham số này chỉ có thể thay đổi khi configure cài đặt PostgreSQL bằng option –with-blocksize

 

Tổng kết

Tablespace ở đây thực ra chỉ là đối tượng thư mục quản lý tập trung các data file, do đó được cái là sẽ không bị giới hạn dung lượng.

Hiện tại mình thấy có 1 số nhược điểm như sau:

  • Tablespace trỏ đến 1 đường dẫn duy nhất -> nếu hết disk thì phải có cách extend disk, hay chuyển tablespace sang disk mới lớn hơn -> quản lý phức tạp
  • Tên data file đặt theo số, không tường minh
  • Filesize, blocksize cố định, không linh hoạt