---
title: "Cách chuyển toàn bộ dữ liệu của PostgreSQL đến máy chủ mới trên Ubuntu 20.04"
description: "Cách chuyển toàn bộ dữ liệu của PostgreSQL đến máy chủ mới trên Ubuntu 20.04"
url: https://cloudfly.vn/techblog/cach-chuyen-toan-bo-du-lieu-cua-postgresql-den-may-chu-moi-tren-ubuntu-2004
image: https://media.cloudfly.vn/posts/techblog_093I9Rt.png
---

# Cách chuyển toàn bộ dữ liệu của PostgreSQL đến máy chủ mới trên Ubuntu 20.04

## Giới thiệu
Cơ sở dữ liệu phát triển theo thời gian và đôi khi nó lớn hơn dung lượng trên hệ thống file gốc. Khi chúng nằm trên cùng một phân vùng với phần còn lại của hệ điều hành, có thể sẽ dẫn đến tranh chấp I / O.
RAID, Network Block Storage và các thiết bị khác có thể cung cấp khả năng dự phòng và cải thiện khả năng mở rộng cùng với các tính năng khác. Cho dù bạn thêm dung lượng, đánh giá các cách để tối ưu hóa hiệu suất hay đang tìm cách tận dụng các tính năng lưu trữ khác, hướng dẫn này sẽ giúp bạn cách di chuyển lại thư mục dữ liệu của PostgreSQL.
## Điều kiện
Để hoàn thành theo hướng dẫn này, bạn cần có những điều sau:
* Một máy chủ Ubuntu 20.04 với non-**root** user có đặc quyền `sudo`. Bạn có thể tìm hiểu thêm về cách thiết lập người dùng có các đặc quyền này trong hướng dẫn Thiết lập máy chủ ban đầu với Ubuntu 20.04.
* PostgreSQL được cài đặt trên máy chủ của bạn. Nếu bạn chưa thiết lập, hướng dẫn Cách cài đặt và sử dụng PostgreSQL trên Ubuntu 20.04 có thể giúp bạn.

Các ví dụ trong hướng dẫn này sẽ liên quan đến việc di chuyển dữ liệu sang thiết bị Block Storage được gắn tại `/ mnt / volume_nyc1_01`. Nếu bạn đang sử dụng Block Storage trên CloudFly, hãy đọc tài liệu về Cách tạo và thiết lập Volumes để sử dụng máy chủ ảo, để được hướng dẫn cách gắn Volumes của mình trước khi tiếp tục với bài viết này.
Tuy nhiên, bất kể bộ nhớ cơ bản bạn sử dụng là gì, các bước dưới đây có thể giúp bạn di chuyển thư mục dữ liệu đến một vị trí mới.
## Bước 1: Di chuyển Thư mục dữ liệu PostgreSQL
Trước khi chúng ta bắt đầu với việc di chuyển thư mục dữ liệu của PostgreSQL, hãy xác minh vị trí hiện tại bằng cách bắt đầu một phiên PostgreSQL tương tác. Trong lệnh dưới đây, `psql` là lệnh để vào màn hình tương tác và `-u postgres` yêu cầu `sudo` thực thi `psql` với tư cách là người dùng **postgres** của hệ thống:
```command
sudo -u postgres psql
```
Khi bạn đã mở ra PostgreSQL, hãy sử dụng lệnh sau để hiển thị thư mục dữ liệu hiện tại:

```custom_prefix(postgres=#)
SHOW data_directory;
```

```
[secondary_label Output]
       data_directory
-----------------------------
<^>/var/lib/postgresql/12/main<^>
(1 row)
```
Kết quả này xác nhận rằng PostgreSQL đã được cấu hình để sử dụng thư mục dữ liệu mặc định, `/ var / lib / postgresql / 12 / main`, vì vậy đó là thư mục bạn cần di chuyển. Khi bạn đã xác nhận thư mục trên hệ thống của mình, bạn có thể đóng `psql` ngay tức thì bằng cách chạy `\ q` meta-command:
```custom_prefix(postgres=#)
\q
```
Để đảm bảo tính toàn vẹn của dữ liệu, hãy dừng PostgreSQL trước khi bạn thực hiện các thay đổi đối với thư mục dữ liệu:
```command
sudo systemctl stop postgresql
```
`systemctl` không hiển thị kết quả của tất cả các lệnh quản lý dịch vụ. Để xác minh rằng bạn đã dừng dịch vụ thành công, hãy sử dụng lệnh sau:
```command
sudo systemctl status postgresql
```
Output này sẽ cho bạn biết rằng PostgreSQL `inactive (dead)`, có nghĩa là nó đã bị dừng:
```
[secondary_label Output]
● postgresql.service - PostgreSQL RDBMS
Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor pr>
Active: <^>inactive (dead) since Thu 2022-06-30 16:55:53 UTC; 12s ago<^>
Process: 13058 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
Main PID: 13058 (code=exited, status=0/SUCCESS)
```
Bây giờ máy chủ PostgreSQL không còn chạy nữa, hãy sao chép thư mục cơ sở dữ liệu hiện có vào vị trí mới bằng `rsync`. Sử dụng lệnh `-a` để giữ nguyên các quyền và các thuộc tính thư mục khác, và lệnh `-v` cung cấp đầu ra giúp bạn theo dõi tiến trình. Bạn sẽ bắt đầu `rsync` từ thư mục `postgresql` để làm theo cấu trúc thư mục gốc ở vị trí mới. Bằng cách tạo thư mục `postgresql` đó trong thư mục mount-point và giữ quyền sở hữu bởi người dùng PostgreSQL, bạn có thể tránh các vấn đề về quyền cho các bản nâng cấp trong tương lai.

<$>[note]
**Lưu ý:** Hãy chắc chắn rằng không có dấu gạch chéo trên thư mục, nhưng bạn có thể thêm vào nếu sử dụng `TAB` hoàn thành. Nếu bạn làm bao gồm dấu gạch chéo, `rsync` sẽ loại bỏ nội dung của thư mục vào điểm gắn kết thay vì sao chép qua chính thư mục đó.
<$>

Thư mục phiên bản `12` không hoàn toàn cần thiết vì bạn đã xác định vị trí một cách rõ ràng trong tệp `postgresql.conf`, nhưng việc tuân theo quy ước dự án chắc chắn sẽ không ảnh hưởng gì, đặc biệt nếu trong tương lai có nhu cầu chạy nhiều phiên bản của PostgreSQL:
```command
sudo rsync -av /var/lib/postgresql <^>/mnt/volume_nyc1_01<^>
```
Khi quá trình sao chép hoàn tất, hãy đổi tên thư mục hiện tại bằng phần mở rộng `.bak` và giữ nó cho đến khi bạn xác nhận rằng quá trình di chuyển thành công. Điều này sẽ giúp tránh phát sinh nhầm lẫn khi có các thư mục có tên giống nhau ở cả vị trí mới và vị trí cũ:
```command
sudo mv /var/lib/postgresql/12/main /var/lib/postgresql/12/main.bak
```
Bây giờ bạn đã sẵn sàng định cấu hình PostgreSQL để truy cập vào thư mục dữ liệu ở vị trí mới của nó.
## Bước 2: Cấu hình PostgreSQL trên server mới
Theo mặc định, cấu hình chỉ thị `data_directory` được đặt thành `/var/lib/postgresql/12/main` trong tệp `/etc/postgresql/12/main/postgresql.conf`. Chỉnh sửa tệp này để phản ánh thư mục dữ liệu mới:
```command
sudo nano /etc/postgresql/12/main/postgresql.conf
```
Tìm dòng bắt đầu bằng `data_directory` và thay đổi đường dẫn dưới đây để phản ánh vị trí mới. Trong ngữ cảnh của hướng dẫn này, chỉ thị cập nhật sẽ được viết là:
```nginx
[label /etc/postgresql/12/main/postgresql.conf]
. . .
data_directory = '<^>/mnt/volume_nyc1_01/postgresql/12/main<^>'
. . .
```
Lưu và đóng tệp bằng cách nhấn `CTRL + X`, `Y`, sau đó `ENTER`. Đây là tất cả những gì bạn cần làm để cấu hình PostgreSQL sử dụng vị trí thư mục dữ liệu mới. Tại thời điểm này, tất cả những gì còn lại là khởi động lại dịch vụ PostgreSQL và kiểm tra xem nó có thực sự trỏ đến đúng thư mục dữ liệu hay không.
## Bước 3: Khởi động lại PostgreSQL
Sau khi thay đổi chỉ thị `data-directory` trong tệp `postgresql.conf`, hãy tiếp tục và khởi động máy chủ PostgreSQL bằng `systemctl`:
```command
sudo systemctl start postgresql
```
Để xác nhận rằng máy chủ PostgreSQL đã khởi động thành công, hãy kiểm tra lại trạng thái của nó bằng cách sử dụng `systemctl`:
```command
sudo systemctl status postgresql
```
Nếu service khởi động chính xác, dòng `Active` sẽ cho biết `active (exited)` trong output của lệnh:
```
[secondary_label Output]
● postgresql.service - PostgreSQL RDBMS
     Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor pr>
     Active: <^>active (exited) since Thu 2022-06-30 16:58:17 UTC; 2s ago<^>
    Process: 13143 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
   Main PID: 13143 (code=exited, status=0/SUCCESS)
```
Cuối cùng, để đảm bảo rằng thư mục dữ liệu mới đang thực sự được sử dụng, hãy mở yêu cầu PostgreSQL ngay:
```command
sudo -u postgres psql
```
Kiểm tra lại giá trị cho thư mục dữ liệu:
```custom_prefix(postgres=#)
SHOW data_directory;
```
```
[secondary_label Output]
            data_directory
-----------------------------------------
<^>/mnt/volume_nyc1_01/postgresql/12/main<^>
(1 row)
```
Điều này xác nhận rằng PostgreSQL đang sử dụng vị trí thư mục dữ liệu mới. Sau đó, hãy dành một chút thời gian để đảm bảo rằng bạn có thể truy cập cơ sở dữ liệu của mình cũng như tương tác với dữ liệu bên trong. Sau khi đã xác minh toàn bộ mọi dữ liệu hiện có, bạn có thể xóa thư mục dữ liệu sao lưu:
```command
sudo rm -Rf /var/lib/postgresql/12/main.bak
```
Như vậy, bạn đã di chuyển thành công thư mục dữ liệu PostgreSQL của mình sang một vị trí mới.
## Kết luận
Nếu bạn đã theo dõi, cơ sở dữ liệu của bạn sẽ chạy cùng với thư mục dữ liệu của nó ở vị trí mới và bạn đã hoàn thành một bước quan trọng để có thể mở rộng bộ nhớ của mình. Bạn cũng có thể tham khảo 5 Thiết lập Máy chủ Chung cho Ứng dụng Web của Bạn để có thêm ý tưởng về cách tạo cơ sở hạ tầng máy chủ giúp bạn mở rộng quy mô và tối ưu hóa các ứng dụng web.
