Chi tiết về việc sử dụng không gian bảng trong PostgreSQL - tải game 789 club tài xỉu

| May 4, 2025 min read

Ngày 26 tháng Khuyến Mãi 88king 3 năm 2022 - Máy tính

Không gian bảng (tablespace) trong PostgreSQL cho phép định nghĩa vị trí lưu trữ của các đối tượng cơ sở dữ liệu trong hệ thống tệp. Nói cách khác, đây là cách chỉ định một thư mục để lưu trữ các tệp dữ liệu của bảng, chuỗi (sequence) và chỉ mục (index).

PostgreSQL sử dụng hệ thống tệp của hệ điều hành để lưu trữ dữ liệu. Điều này khác với Oracle, vốn triển khai một “hệ thống tệp” riêng.

Trong PostgreSQL, một không gian bảng có thể được nhiều cơ sở dữ liệu sử dụng; và một cơ sở dữ liệu có thể sử dụng nhiều không gian bảng, tạo thành mối quan hệ “nhiều-nhiều”. Ngược lại, trong Oracle, một không gian bảng chỉ có thể được một cơ sở dữ liệu sử dụng; nhưng một cơ sở dữ liệu có thể sở hữu nhiều không gian bảng, tạo thành mối quan hệ “một-nhiều”.

1 Khi nào nên sử dụng không gian bảng?

  • Kiểm soát bố cục đĩa Khi dữ liệu tăng lên liên tục, hệ thống tệp gốc gần đầy mà không thể mở rộng vì một số lý do. Lúc này, bạn có thể tạo một không gian bảng mới trên hệ thống tệp đã gắn kết khác và di chuyển các đối tượng hiện tại sang không gian bảng mới.
  • Tối ưu hiệu suất Không gian bảng cho phép quản trị viên tối ưu hóa hiệu suất dựa trên mẫu sử dụng của các đối tượng cơ sở dữ liệu. Ví dụ, bạn có thể sử dụng không gian bảng để lưu trữ dữ liệu của các chỉ mục hoặc bảng được sử dụng thường xuyên trên một ổ đĩa có IOPS cao hơn (chẳng hạn như thiết bị rắn đắt tiền); trong khi đó, dữ liệu của các bảng ít được sử dụng hoặc không yêu cầu hiệu suất cao có thể được lưu trữ trên các ổ đĩa rẻ hơn hoặc chậm hơn.

Tóm lại, việc sử dụng không gian bảng giúp tận dụng hiệu quả khả năng và không gian của đĩa, từ đó quản lý các đối tượng cơ sở dữ liệu theo cách lưu trữ vật lý tối ưu nhất.

2 Không gian bảng mặc định

Từ bài viết trước về việc cài đặt PostgreSQL từ nguồn trên CentOS, ta biết rằng khi khởi tạo PostgreSQL, cần chỉ định một thư mục dữ liệu ($PGDATA). Lệnh khởi tạo như sau:

$ initdb -D /usr/local/pgsql/data

Sau khi khởi tạo xong, thư mục này sẽ chứa tất cả những gì PostgreSQL cần để khởi động (các tệp cấu hình, tệp dữ liệu và hàng đợi tin nhắn, v.v.).

Khi PostgreSQL được khởi động, tất cả các tệp dữ liệu của đối tượng cơ sở dữ liệu đều được lưu trữ trong thư mục này.

$ pg_ctl -D /usr/local/pgsql/data -l server.log start

Nội dung của thư mục này như sau:

$ ls -lht /usr/local/pgsql/data
tổng cộng 124K [s6666 đăng nhập](/post/istio-plug-in-ca-certificates/) 
drwx------ 2 postgres postgres 4.0K ngày 28 tháng 3 09:00 pg_stat_tmp
drwx------ 4 postgres postgres 4.0K ngày 8 tháng 3 17:52 pg_logical
drwx------ 2 postgres postgres 4.0K ngày 8 tháng 3 17:48 global
drwx------ 2 postgres postgres 4.0K ngày 8 tháng 3 17:47 pg_stat
-rw------- 1 postgres postgres  87 ngày 8 tháng 3 17:47 postmaster.pid
-rw------- 1 postgres postgres  59 ngày 8 tháng 3 17:47 postmaster.opts
drwx------ 6 postgres postgres 4.0K ngày 13 tháng 5 2021 base
drwx------ 2 postgres postgres 4.0K ngày 13 tháng 5 2021 pg_subtrans
drwx------ 3 postgres postgres 4.0K ngày 13 tháng 5 2021 pg_wal
drwx------ 2 postgres postgres 4.0K ngày 13 tháng 5 2021 pg_xact
-rw------- 1 postgres postgres 1.6K ngày 13 tháng 5 2021 pg_ident.conf
-rw------- 1 postgres postgres 4.7K ngày 13 tháng 5 2021 pg_hba.conf
-rw------- 1 postgres postgres  88 ngày 13 tháng 5 2021 postgresql.auto.conf
-rw------- 1 postgres postgres 28K ngày 13 tháng 5 2021 postgresql.conf
drwx------ 2 postgres postgres 4.0K ngày 13 tháng 5 2021 pg_dynshmem
drwx------ 4 postgres postgres 4.0K ngày 13 tháng 5 2021 pg_multixact
drwx------ 2 postgres postgres 4.0K ngày 13 tháng 5 2021 pg_notify
drwx------ 2 postgres postgres 4.0K ngày 13 tháng 5 2021 pg_replslot
drwx------ 2 postgres postgres 4.0K ngày 13 tháng 5 2021 pg_serial
drwx------ 2 postgres postgres [B88bet Win](/post/threat-modeling/)  4.0K ngày 13 tháng 5 2021 pg_snapshots
drwx------ 2 postgres postgres 4.0K ngày 13 tháng 5 2021 pg_tblspc
drwx------ 2 postgres postgres 4.0K ngày 13 tháng 5 2021 pg_twophase
-rw------- 1 postgres postgres  3 ngày 13 tháng 5 2021 PG_VERSION
drwx------ 2 postgres postgres 4.0K ngày 13 tháng 5 2021 pg_commit_ts

Nói ngắn gọn hơn, không gian bảng là cách thông báo cho máy chủ PostgreSQL nơi lưu trữ vật lý của các đối tượng cơ sở dữ liệu.

Trong psql, lệnh \db+ có thể liệt kê chi tiết về các không gian bảng:

postgres=# \db+
                 Danh sách các không gian bảng
  Tên   | Chủ sở hữu | Vị trí | Quyền truy cập | Tùy chọn | Kích thước | Mô tả
------------+----------+----------+-------------------+---------+--------+-------------
 pg_default | postgres |     |          |     | 31 MB |
 pg_global | postgres |     |          |     | 559 kB |
(2 dòng)

Hai không gian bảng này (pg_defaultpg_global) được tự động tạo ra sau khi khởi tạo PostgreSQL. pg_default là không gian bảng mặc định cho các cơ sở dữ liệu template0template1 (do đó, nó cũng sẽ là không gian bảng mặc định cho các cơ sở dữ liệu khác); pg_global là không gian bảng cho các bảng hệ thống chia sẻ (pg_database, pg_authid, pg_tablespace, pg_shdepend, v.v.) và các chỉ mục của chúng.

Chú ý rằng thông tin trên không hiển thị Vị trí. Điều này là bởi vì chúng luôn tương ứng với hai thư mục con trong thư mục dữ liệu PostgreSQL ($PGDATA): pg_default sử dụng thư mục con base, còn pg_global sử dụng thư mục con global.

3 Sử dụng không gian bảng

3.1 Tạo không gian bảng

Để tạo một không gian bảng mới, cần tạo trước một thư mục trống mới (chú ý là không nên tạo trong thư mục dữ liệu PostgreSQL $PGDATA), và chủ sở hữu của thư mục này phải là người dùng hệ thống postgres. Ví dụ như sau:

$ mkdir -p /data/postgres/testspace
$ chown -R postgres:postgres /data/postgres/testspace

Người dùng siêu quản trị (superuser) có thể sử dụng lệnh CREATE TABLESPACE để tạo một không gian bảng. Ví dụ như sau:

$ psql -U postgres postgres
postgres=# CREATE TABLESPACE myspace LOCATION '/data/postgres/testspace';

Lúc này, kiểm tra thư mục /usr/local/pgsql/data/pg_tblspc, bạn sẽ thấy một liên kết biểu tượng trỏ đến vị trí thư mục của không gian bảng mới được tạo (số 24577 là OID của không gian bảng):

$ ls -lht /usr/local/pgsql/data/pg_tblspc/
lrwxrwxrwx 1 postgres postgres 24 ngày 28 tháng 3 15:17 24577 -> /data/postgres/testspace

Để cho phép người dùng thông thường sử dụng không gian bảng mới, cần cấp quyền CREATE cho người dùng thông thường này. Dưới đây là ví dụ cấp quyền cho người dùng thông thường testuser:

postgres=# GRANT CREATE ON TABLESPACE myspace TO testuser;

Tiếp theo, tất cả các đối tượng sử dụng không gian bảng myspace sẽ lưu trữ dữ liệu trong thư mục này (/data/postgres/testspace). Dưới đây là ví dụ minh họa việc sử dụng người dùng thông thường testuser kết nối vào cơ sở dữ liệu postgres, tạo bảng và chỉ định không gian bảng myspace:

$ psql -U testuser postgres
postgres=> CREATE TABLE foo(id int) TABLESPACE myspace;

Bên cạnh việc chỉ định không gian bảng cho bảng, bạn cũng có thể chỉ định không gian bảng cho chỉ mục hoặc cơ sở dữ liệu. Ví dụ như sau:

postgres=> CREATE INDEX foo_idx ON foo(id) TABLESPACE myspace;
postgres=# CREATE DATABASE testdb TABLESPACE myspace;

3.2 Thay đổi không gian bảng

Sử dụng câu lệnh ALTER tương ứng, bạn có thể di chuyển các đối tượng cơ sở dữ liệu hiện có từ một không gian bảng sang một không gian bảng khác. Dưới đây là ví dụ minh họa việc sử dụng ALTER TABLEALTER INDEX để chỉ định không gian bảng mới cho bảng và chỉ mục:

postgres=> ALTER TABLE foo SET TABLESPACE pg_default;
postgres=> ALTER INDEX foo_idx SET TABLESPACE pg_default;

Bạn cũng có thể sử dụng các câu lệnh sau để di chuyển tất cả các bảng hoặc chỉ mục trong một không gian bảng sang một không gian bảng khác:

postgres=> ALTER TABLE ALL IN TABLESPACE myspace SET TABLESPACE pg_default;
postgres=> ALTER INDEX ALL IN TABLESPACE myspace SET TABLESPACE pg_default;

Khi thay đổi không gian bảng, các bảng hoặc chỉ mục bị ảnh hưởng sẽ bị khóa cho đến khi quá trình di chuyển dữ liệu hoàn tất.

3.3 Cập nhật thuộc tính không gian bảng

Theo các tình huống sử dụng không gian bảng như đã nêu, không gian bảng thường được sử dụng để di chuyển các bảng hoặc chỉ mục sang hệ thống tệp nhanh hơn (IOPS cao hơn). Lúc này, cần thông báo cho quy hoạch viên truy vấn PostgreSQL về tốc độ của không gian bảng mới, để giúp nó đánh giá tốt hơn hiệu suất truy vấn. Nếu bạn phát hiện rằng tốc độ truy cập tuần tự và ngẫu nhiên của không gian bảng mới gấp đôi so với trước, bạn có thể sử dụng câu lệnh sau để cập nhật thuộc tính không gian bảng:

ALTERTABLESPACEmyspaceSET(seq_page_cost=0.5,random_page_cost=0.5);

Chi tiết về các tham số này, xin tham khảo tài liệu seq_page_cost và random_page_cost.

3.4 Không gian bảng tạm thời

PostgreSQL cho phép sử dụng tham số temp_tablespaces để chỉ định không gian bảng tạm thời (có thể chỉ định nhiều không gian bảng bằng cách phân tách bằng dấu phẩy). Không gian bảng tạm thời được sử dụng để xác định vị trí lưu trữ của các bảng tạm thời, chỉ mục tạm thời và các tệp tạm thời có thể được tạo ra bởi các truy vấn SQL lớn (như sắp xếp hoặc tổng hợp dữ liệu lớn). Mỗi lần PostgreSQL tạo ra các đối tượng tạm thời này, nó sẽ ngẫu nhiên chọn và sử dụng từ danh sách các không gian bảng đã chỉ định. Nếu không chỉ định không gian bảng tạm thời, nó sẽ sử dụng không gian bảng mặc định pg_default.

Dưới đây là cách chỉ định không gian bảng tạm thời. Trước tiên, tạo hai thư mục trống và đặt chủ sở hữu là postgres:

$ mkdir /data/postgres/tempspace1
$ mkdir /data/postgres/tempspace2
$ chown -R postgres:postgres /data/postgres/tempspace1
$ chown -R postgres:postgres /data/postgres/tempspace2

Sử dụng superuser để tạo hai không gian bảng mới, vị trí tương ứng với hai thư mục vừa tạo; và cấp quyền CREATE cho người dùng thông thường testuser:

$ psql -U postgres postgres
postgres=# CREATE TABLESPACE tempspace1 LOCATION '/data/postgres/tempspace1';
postgres=# CREATE TABLESPACE tempspace2 LOCATION '/data/postgres/tempspace2';
postgres=# GRANT CREATE ON TABLESPACE tempspace1 TO testuser;
postgres=# GRANT CREATE ON TABLESPACE tempspace2 TO testuser;

Đăng nhập bằng người dùng thông thường và đặt biến temp_tablespaces thành tempspace1, tempspace2:

$ psql -U testuser postgres
postgres=> SET temp_tablespaces = tempspace1, tempspace2;
postgres=> SHOW temp_tablespaces;
  temp_tablespaces
------------------------
 tempspace1, tempspace2
(1 dòng)

Như vậy là đã sử dụng xong. Lưu ý rằng cách thiết lập này chỉ có hiệu lực trong phiên làm việc hiện tại. Nếu muốn áp dụng vĩnh viễn, cần thay đổi cấu hình hệ thống (postgresql.conf).

3.5 Xóa không gian bảng

Một khi không gian bảng đã được tạo, chỉ cần người dùng có quyền, nó có thể được bất kỳ cơ sở dữ liệu nào sử dụng. Để xóa không gian bảng, cần phải loại bỏ tất cả các đối tượng cơ sở dữ liệu đang sử dụng không gian bảng đó trước.

Sau đó, có thể sử dụng lệnh DROP TABLESPACE để xóa một không gian bảng rỗng:

$ psql -U postgres postgres
postgres=# DROP TABLESPACE myspace;

4 Các bảng hệ thống liên quan đến không gian bảng

Ngoài lệnh \db+ đã sử dụng trong psql, PostgreSQL còn có một số bảng hệ thống hoặc thư mục hệ thống liên quan đến không gian bảng.

Xem các không gian bảng đã được tạo:

SELECT*FROMpg_tablespace;-- Tên không gian bảng và vị trí thư mục
SELECTspcname,pg_tablespace_location(oid)FROMpg_tablespace;

Xem không gian bảng nào được sử dụng bởi các bảng hoặc chỉ mục nào:

SELECTc.relnameFROMpg_classc,pg_tablespacetWHEREc.reltablespace=t.oidANDt.spcname='myspace';
SELECT*FROMpg_tablesWHEREtablespace='myspace';SELECT*FROMpg_indexesWHEREtablespace='myspace';

Như vậy, đã hoàn thành việc tóm tắt các trường hợp sử dụng và cách sử dụng không gian bảng trong PostgreSQL.

[1] PostgreSQL: Tài liệu: 14: 23.6. Tablespaces [2] Tất cả về không gian bảng trong PostgreSQL [3] Khi nào nên sử dụng không gian bảng trong PostgreSQL [4] Làm thế nào để biết cái gì nằm trong một không gian bảng PostgreSQL? [5] Không gian bảng của PostgreSQL