1. Giới thiệu

Ở bài cài đặt PostgreSQL 13 trên CentOS 7, có một bước tôi đã thực hiện đó là khởi tạo Database Cluster.

Đọc thêm  Hướng dẫn cài đặt PostgreSQL trên CentOS 7

 

Vậy khái niệm Database Cluster trong PostgreSQL là gì?

Trong bài viết này, tôi sẽ giải thích cho các bạn khái niệm hay thuật ngữ Database Cluster.

 

2. Database Cluster là gì?

Trước khi bạn có thể làm bất cứ điều gì trên database, bạn phải khởi tạo một vùng lưu trữ cơ sở dữ liệu trên đĩa. PostgreSQL gọi đây là một Database Cluster.

Database Cluster là một tập hợp các database được quản lý bởi 1 instance.

Sau khi khởi tạo, theo mặc định, database cluster sẽ chứa database có tên là postgres, đây là database mặc định để cho chúng ta sử dụng.

Ví dụ về 1 database cluster khi được khởi tạo

Một database khác được tạo ra trong database cluster trong quá trình khởi tạo được gọi là template1. Ngay cái tên của nó đã cho thấy, nó sẽ được sử dụng làm template cho các database được tạo sau này. Nó có thể sửa đổi lại được, nhưng bạn chỉ nên sử dụng nó để làm template, nó không nên được sử dụng để làm database lưu trữ dữ liệu cho các ứng dụng của bạn.

Ngoài ra còn có 1 database khác cũng được tạo ra khi khởi tạo database cluster, đó là template0. Mục đích của nó cũng là để làm template giống như template1, tuy nhiên, nó không thể sửa đổi.

Trên hệ điều hành, Database cluster là một thư mục trong đó tất cả dữ liệu sẽ được lưu trữ. PostgreSQL gọi đây là data directory hoặc data area. Bạn hoàn toàn có thể lựa chọn thư mục để lưu Database cluster của mình.

 

3. Khởi tạo Database Cluster

Để khởi tạo một Database cluster theo cách thủ công,
Đầu tiên, bạn hãy tạo thư mục để lưu trữ Database Cluster, và nhớ gán đầy đủ quyền sở hữu cho user postgres
 
root# mkdir /usr/local/pgsql
root# chown postgres /usr/local/pgsql
root# su postgres
 
Sau đó, bạn chạy lệnh initdb và chỉ định vị trí thư mục mong muốn cho Database cluster với tùy chọn -D
 
$ initdb -D /usr/local/pgsql/data

 

Lưu ý là bạn phải login vào user postgres để thực hiện câu lệnh trên

Ngoài ra, bạn có thể chạy initdb thông qua câu lệnh pg_ctl như sau:

 

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

 

initdb sẽ bị lỗi nếu thư mục trên đã chứa file; điều này là để ngăn việc vô tình ghi đè cài đặt hiện có.

 

4. Khuyến nghị khi tạo Database Cluster

Dưới đây là các khuyến nghị của tôi khi bạn tạo mới 1 Database Cluster:

  • Nên khởi tạo Database Cluster trên các ổ đĩa (mount point) khác với ổ đĩa “root” của máy chủ. Điều này sẽ giúp tăng khả năng “cô lập” Database Cluster với hệ điều hành, những lỗi liên quan đến Database sẽ ít ảnh hưởng đến hệ điều hành và ngược lại.

Ví dụ: Khi mount point chứa Database Cluster bị full 100%, hệ điều hành vẫn có thể làm việc bình thường.

  • Nếu bạn đã có 1 mount point khác ổ đĩa root để dự định lưu Database Cluster, bạn không nên sử dụng thư mục trên cùng của mount point làm thư mục dữ liệu. Cách hay nhất là tạo một thư mục trong thư mục mount point thuộc sở hữu của user postgres, rồi tạo thư mục dữ liệu trong đó. Điều này tránh được các vấn đề về quyền, đặc biệt là đối với các hoạt động như nâng cấp bằng pg_upgrade, và nó cũng đảm bảo lỗi sẽ rõ ràng nếu mount point đó bị take offline.
  • Về lý thuyết, có thể sử dụng hệ thống tệp NFS để lưu trữ thư mục dữ liệu PostgreSQL. Yêu cầu duy nhất để sử dụng NFS với PostgreSQLNFS phải được mount với tùy chọn hard, nếu không hệ thống có thể bị treo khi đường truyền không ổn định. Tuy nhiên, trên thực tế, tôi chưa thấy hệ thống PostgreSQL nào sử dụng NFS để lưu trữ dữ liệu cả, quá rủi ro!

 

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

Hiện tại, tôi có tổ chức đều đặn các khóa học về quản trị Oracle Database, tôi sẽ để thông tin ở đây, để bạn nào quan tâm về lịch học cũng như chương trình học có thể theo dõi nhé.

KHOÁ DÀNH CHO NGƯỜI MỚI

KHÓA HỌC: QUẢN TRỊ ORACLE DATABASE THẬT LÀ ĐƠN GIẢN (ADMIN 1)

CÁC KHOÁ NÂNG CAO:

KHÓA HỌC ORACLE NÂNG CAO: QUẢN TRỊ KIẾN TRÚC MULTITENANT 12c

KHÓA HỌC ORACLE NÂNG CAO: QUẢN TRỊ HỆ THỐNG DATA GUARD

CÁC KHOÁ COMBO:

COMBO 1: ADMIN 1 + MULTITENANT 12c

COMBO 2: ADMIN 1 + DATA GUARD

COMBO 3: ADMIN 1 + MULTITENANT 12c + DATA GUARD

LỊCH HỌC:

Mời bạn xem tại đây: LỊCH HỌC CÁC LỚP ORACLE 

ĐĂNG KÝ:

https://forms.gle/MtCAoRQFenP886y79

Hãy tham gia group “Kho tài liệu kiến thức database” để cùng học hỏi và chia sẻ nhé.

7 bình luận

  1. Bài viết rất có ích, cảm ơn tác giả nhiều.

    Cho mình hỏi một vài câu.

    1. Trên Window nếu mình initdb ở một nơi bất kỳ trong hệ thống, thì làm sao cấu hình cho Pgadmin biết rằng Database Cluster hiện tại đang ở đâu?
    2. Product của mình có gặp 1 vài trường hợp Database Cluster bị mất hết dữ liệu khi đĩa OS bị đầy, vì Database Cluster nằm cũng vị trí với đĩa OS, mình triển khai WAL để đề phòng việc này thì có đúng không? Hay đơn giản mình chỉ cần initdb ở đĩa khác với OS thì sẽ giải quyết được vấn đề mà không cần phải làm nhiều thứ khác?
    1. Hi Minh Sự,

      1. PostgreSQL sử dụng giá trị của biến môi trường PGDATA để tiến hành tạo database cluster khi initdb bạn nhé. Bạn chỉ cần thay đổi giá trị PGDATA này nếu muốn đặt database cluster ở vị trí khác là đc.
      2. WAL không dùng trong trường hợp này bạn ạ, tốt hơn là bạn di chuyển thư mục của database cluster ra khỏi ổ C lưu Ó. Sau đó, bạn cấu hình archive mode và đặt job định kỳ backup. Nếu cẩn thận và có kinh phí hơn nữa thì bạn xây dựng 1 hệ thống dự phòng bằng Streaming Replication. Cách làm mấy cái này, tôi có bài trên blog hết rồi đó anh em nhé, anh em tự search nhé 😀
      1. À, sorry Minh Sự, câu 1 mình đọc nhanh quá nên hiểu sai ý anh em. PgAdmin nó connect dựa trên IP, username/password của anh em thôi, ko liên quan gì data directory

        1. Như vậy thì vai trò của PgAmin không khác gì Client App, nó chỉ việc Connect tới Server thôi còn việc thao tác và truy vấn phụ thuộc vào thằng Postgres Services đúng không bạn? Mình mở Service của Postgres là thấy nó có dùng Command này để Start Services, vậy mình chỉ cần thay đồi Command này là được đúng không bạn?

          "C:\Program Files\PostgreSQL\11\bin\pg_ctl.exe" runservice -N "postgresql-x64-11" -D "C:\Program Files\PostgreSQL\11\data" -w
          

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *