Khi làm việc với các hệ quản trị CSDL, có thể bạn đã nghe nói đến tablespace và muốn tìm hiểu nó.

Trong bài viết này tôi sẽ giúp các bạn tìm hiểu tablespace trong PostgreSQL là gì, mục đích và cách quản lý nó.


   Tablespace là gì ?

 

  Tablespace là môt thư mục để lưu trữ dữ liệu ở cấp độ hệ điều hành. Các đối tượng của database như table, index sẽ được lưu trên tablespace. Mặc định khi bạn cài đặt PostgreSQL, có 2 tablespace sẽ được tạo ra, đó là pg_defaultpg_global

  pg_global là tablespace lưu trữ catalog dữ liệu của hệ thống, còn pg_default là tablespace lưu trữ dữ liệu mặc định của người dùng, tức là nếu bạn không tạo thêm 1 tablespace nào khác, PostgreSQL sẽ sử dụng tablespace pg_default để lưu trữ dữ liệu khi cần.

  Mặc dù, tablespace có thể đặt trên 1 thư mục nằm bên ngoài data directory, nó vẫn là một phần của database cluster. Bạn không thể copy thư mục tablespace này sang một database cluster khác và mở nó lên từ database cluster đó được. Tương tự như  vậy, khi bạn làm mất thư mục chứa tablespace, bạn cũng không thể startup database cluster lên.

Đọc thêm  Database Cluster trong PostgreSQL là gì
Đọc thêm  Ý nghĩa các thư mục trong PostgreSQL

   Tác dụng của Tablespace

 

   Tablespace thường sử dụng khi bạn muốn gom nhóm các đối tượng liên quan với nhau lại. Nghe có vẻ giống Schema nhỉ. Đúng thế, chúng đều được sinh ra để phân loại dữ liệu, tuy nhiên, nếu như schema phân loại dữ liệu ở mức logical thì tablespace phân loại dữ liệu ở mức physical.

   Tablespace có thể sử dụng như 1 giải pháp mở rộng dung lượng cho database. Như các bạn đã đọc ở bài “Hướng dẫn cài đặt PostgreSQL trên CentOS 7“, khi cài đặt chúng ta cần chỉ ra thư mục data directory để lưu trữ dữ liệu của database. Tuy nhiên, thư mục thì phải nằm trên một đĩa cứng nào đó, mà đĩa cứng thì đến một ngày có thể bị đầy. Vậy giải pháp tablespace sẽ cho phép chúng ta đặt dữ liệu tại các thư mục (có thể nằm trên các đĩa mới) để tăng khả năng mở rộng của database.

   Tablespace còn giúp người quản trị Database (DBA) tối ưu hóa hiệu năng bằng cách tổ chức dữ liệu theo các mức độ ưu tiên khác nhau. Cụ thể, DBA sẽ tạo ra các tablespace tương ứng trên các đĩa với các tốc độ đọc ghi khác nhau. Với những dữ liệu cần tốc độ đọc/ghi nhanh nhất, DBA sẽ đặt dữ liệu đó vào tablespace ứng với đĩa nhanh nhất, còn đối với dữ liệu không cần tốc độ đọc/ghi cao (Vd như các dữ liệu lịch sử ít dùng), họ sẽ đặt nó vào tablespace ứng với đĩa có tốc độ đọc/ghi thấp hơn.

Đọc thêm  Quản lý Schema trong PostgreSQL
Đọc thêm  Hướng dẫn cài đặt PostgreSQL trên CentOS 7

   Các thao tác quản trị Tablespace

   Xem các tablespace hiện có

Để xem thông tin về các tablespace hiện có các bạn dùng lệnh \db trên psql, hoặc \db+ để xem chi tiết hơn

postgres=# \db
           List of tablespaces
    Name    |  Owner   |     Location     
------------+----------+------------------
 pg_default | postgres | 
 pg_global  | postgres |

   Tạo mới tablespace

Tablespace là một đối tượng ở mức Database cluster. Điều đó có nghĩa là, 1 tablespace có thể được nhiều database sử dụng.

Để tạo mới một tablespace, bạn sử dụng câu lệnh CREATE TABLESPACE và tham số LOCATION để chỉ ra thư mục đặt tablespace

create tablespace tbs_data2021 as '/data/data2021';

Chú ý: Thư mục này phải thuộc sở hữu của user postgres của hệ điều hành, và phải là thư mục trống.

Kết quả

postgres=# \db
             List of tablespaces
     Name     |  Owner   |      Location      
--------------+----------+--------------------
 pg_default   | postgres | 
 pg_global    | postgres | 
 tbs_data2021 | postgres | /data/tbs_data2021

 

Sau khi tạo xong tablespace rồi, khi tạo 1 đối tượng, các bạn có thể chỉ ra tablespace sẽ lưu đối tượng đó. Ví dụ như sau:

CREATE TABLE test(id int) TABLESPACE tbs_data2021;

Bạn kiểm tra lại bằng lệnh:

select tablename, tablespace from pg_tables where tablename='test';
 tablename | tablespace 
-----------+------------
 test      | tbs_data2021

Chú ý: Nếu bạn không chỉ ra tham số TABLESPACE khi tạo 1 đối tượng thì mặc định đối tượng đó sẽ được lưu trong default tablespace

   Default Tablespace

Default tablespace là tablespace mặc định sẽ được sử dụng nếu trong khi tạo ra 1 đối tượng mà chúng ta không chỉ ra tablespace để lưu nó. Ban đầu khi bạn mới cài đặt, PostgreSQL sẽ sử dụng tablespace pg_defaultdefault tablespace. Tuy nhiên bạn hoàn toàn có thể thay đổi điều này.

Tham số cấu hình default_tablespace sẽ cho phép bạn thực hiện điều đó. Bạn hãy thay đổi tham số default_tablespace về giá trị là tablespace mà bạn muốn sử dụng làm tablespace mặc định.

postgres=# alter system set default_tablespace ='tbs_data2021';
ALTER SYSTEM
postgres=# 
postgres=# select pg_reload_conf();
 pg_reload_conf 
----------------
 t
(1 row)

postgres=# 
postgres=# show default_tablespace ;
 default_tablespace 
--------------------
 tbs_data2021
(1 row)
Đọc thêm  Cấu hình tham số trong PostgreSQL

Bây giờ bạn thử tạo lại 1 đối tượng mà không chỉ ra tablespace xem.

postgres=# create table test2 (id int);
CREATE TABLE
postgres=# 
postgres=# select tablename, tablespace from pg_tables where tablename='test2';
 tablename |  tablespace  
-----------+--------------
 test2     | tbs_data2021
(1 row)

   Xóa bỏ tablespace

Bạn chỉ có thể xóa 1 tablespace một khi đã xóa hết tất cả các đối tượng bên trong nó. Nếu nó không trống, khi drop bạn có thể gặp lỗi sau:

postgres=# drop tablespace tbs_data2021;
ERROR:  tablespace "tbs_data2021" is not empty

Để kiểm tra các đối tượng đang có trong tablespace (ví dụ ở đây là tablespace tbs_data2021), bạn có thể dùng lệnh sau:

postgres=# select relname from pg_class where reltablespace=(select oid from pg_tablespace where spcname='tbs_data2021');
 relname 
---------
test2
(1 row)

Ở ví dụ trên, tôi chỉ có 1 table test2 thuộc tablespace tbs_data2021, tôi sử dụng lệnh sau để xóa table này:

postgres=# drop table test2;
DROP TABLE

Sau đó, tôi đã có thể xóa tablespace tbs_data2021

postgres=# drop tablespace tbs_data2021;
DROP TABLESPACE

 

Nguồn: https://dangxuanduy.com/

Xin cho tôi được biết, bạn cảm thấy bài viết này như thế nào? Ý kiến của bạn sẽ giúp tôi nâng cao chất lượng bài viết của mình.

    Hãy chia sẻ bài viết này nếu bạn thấy có ích nhé
    0 0 votes
    Article Rating
    Subscribe
    Notify of
    guest
    0 Comments
    Inline Feedbacks
    View all comments