Table of Contents

No table of contents

Cách di chuyển thư mục dữ liệu MySQL đến vị trí mới trên Ubuntu 20.04

Posted on: 9 tháng 11 năm 2022

Ubuntu

Giới thiệu

Cơ sở dữ liệu phát triển theo thời gian, đôi khi tăng thêm dung lượng trên hệ thống tệp. Bạn cũng có thể gặp tranh chấp input/output (I / O) 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. Redundant Array of Independent Disks (RAID), khối lưu trữ mạng (network block storage) và các thiết bị khác, có thể cung cấp khả năng dự phòng và các tính năng mong muốn 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 muốn tận dụng các tính năng lưu trữ khác, bài viết này sẽ hướng dẫn bạn cách di chuyển lại thư mục dữ liệu của MySQL.

Điều kiện

Để hoàn thành hướng dẫn này, bạn sẽ cần:

  • Máy chủ Ubuntu 20.04 với non-root user có đặc quyền sudo và tường lửa được bật. Bạn có thể tìm hiểu thêm về cách thiết lập user 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 của chúng tôi.
  • Máy chủ MySQL. Nếu bạn chưa cài đặt MySQL, hãy xem hướng dẫn của chúng tôi về Cách cài đặt MySQL trên Ubuntu 20.04.

Trong hướng dẫn này, chúng tôi đang di chuyển dữ liệu sang thiết bị block storage được gắn tại /mnt/volume-nyc1-01. Bạn có thể tìm hiểu cách thiết lập một trong tài liệu sau về Block Storage Volumes trên CloudFly.

Bất kể bạn sử dụng bộ nhớ cơ bản nào, hướng dẫn này đều 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 MySQL

Để chuẩn bị cho việc di chuyển thư mục dữ liệu của MySQL, hãy xác minh vị trí hiện tại bằng cách bắt đầu phiên MySQL tương tác bằng thông tin đăng nhập quản trị. Chạy lệnh sau để mở lời nhắc máy chủ MySQL:

  1. sudo mysql

Lưu ý: Nếu bạn đã thiết lập cấu hình root MySQL user của mình để xác thực bằng mật khẩu, bạn có thể kết nối với MySQL với tư cách người dùng này bằng lệnh sau:

  1. mysql -u root -p

Khi được nhắc nhở, hãy cung cấp mật khẩu MySQL user. Sau đó, từ lời nhắc MySQL, hãy chạy câu lệnh SELECT dưới đây. Thao tác này sẽ trả về thư mục dữ liệu đang hoạt động của phiên bản MySQL này, thư mục này luôn được ghi lại trong biến datadir của MySQL :

  1. SELECT @@datadir;
Output
+-----------------+ | @@datadir | +-----------------+ | /var/lib/mysql/ | +-----------------+ 1 row in set (0.00 sec)

Đầu ra này xác nhận rằng MySQL được thiết lập cấu hình để sử dụng thư mục dữ liệu mặc định, /var/lib/mysql/, vì vậy đó là thư mục bạn cần di chuyển. Khi bạn đã xác nhận điều này, hãy ghi exit để rời khỏi màn hình và quay lại dấu nhắc lệnh của bạn:

  1. exit
Output
Bye

Để đảm bảo tính toàn vẹn của dữ liệu, hãy tắt MySQL trước khi thực hiện các thay đổi đối với thư mục dữ liệu:

  1. sudo systemctl stop mysql

Lưu ý rằng systemctl không hiển thị kết quả của tất cả các lệnh quản lý dịch vụ, vì vậy nếu bạn muốn kiểm tra xem mình đã thành công chưa, hãy sử dụng lệnh sau:

  1. sudo systemctl status mysql

Bạn có thể xác nhận rằng nó đã tắt, nếu dòng Active trong output cho biết nó inactive (dead) (không hoạt động) như được đánh dấu trong ví dụ sau:

Output
● mysql.service - MySQL Community Server Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset:> Active: inactive (dead) since Wed 2022-03-23 19:03:49 UTC; 5s ago Process: 3415 ExecStart=/usr/sbin/mysqld (code=exited, status=0/SUCCESS) Main PID: 3415 (code=exited, status=0/SUCCESS) Status: "Server shutdown complete"

Bây giờ máy chủ đã tắt, bạn có thể sao chép thư mục cơ sở dữ liệu hiện có, /var/lib/mysql, sang vị trí mới, /mnt/volume-nyc1-01, bằng rsync. Sử dụng cờ -a để bảo toàn quyền và các thuộc tính thư mục khác, trong khi -v cung cấp đầu ra để bạn có thể theo dõi tiến trình:

Lưu ý: Đảm bảo không có dấu gạch chéo trên thư mục, nhưng nó có thể được thêm vào nếu bạn sử dụng tính năng hoàn thành tab. Khi có dấu gạch chéo ở cuối, rsync sẽ kết xuất nội dung của thư mục vào điểm gắn kết thay vì chuyển nó vào thư mục chứa mysql.

  1. sudo rsync -av /var/lib/mysql /mnt/volume-nyc1-01

Khi lệnh rsync 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 việc di chuyển thành công. Bằng cách đổi tên nó, bạn sẽ tránh được sự nhầm lẫn có thể phát sinh từ các tệp ở cả vị trí mới và cũ:

  1. sudo mv /var/lib/mysql /var/lib/mysql.bak

Bây giờ bạn đã sẵn sàng để tiến hành bước tiếp theo và bắt đầu cấu hình.

Bước 2: Trỏ đến Vị trí Dữ liệu Mới

MySQL có một số cách để ghi đè các giá trị cấu hình. Theo mặc định, datadir được đặt thành / var/lib/mysql trong tệp /etc/mysql/mysql.conf.d/mysqld.cnf. Chỉnh sửa tệp này trong trình soạn thảo văn bản ưa thích của bạn để phản ánh thư mục dữ liệu mới. Ở đây chúng tôi sẽ sử dụng nano:

  1. sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

Tìm dòng bắt đầu bằng datadir=. Bỏ ghi chú dòng bằng cách xóa dấu thăng (#), và thay đổi đường dẫn để phản ánh vị trí mới. Trong trường hợp này, nội dung tệp được cập nhật sẽ như sau:

/etc/mysql/mysql.conf.d/mysqld.cnf
. . .
datadir=/mnt/volume-nyc1-01/mysql
. . .

Sau khi bạn thực hiện cập nhật này, hãy lưu và thoát khỏi tệp. Nếu đang sử dụng nano, bạn có thể thực hiện việc này bằng cách nhấn CTRL + X, sau đó nhấn YENTER. Bây giờ đã gần đến lúc khởi động lại MySQL, nhưng trước đó, còn một thứ nữa cần phải thiết lập cấu hình để thành công.

Bước 3: Thiết lập cấu hình quy tắc kiểm soát truy cập AppArmor

Trong bước này, bạn cần yêu cầu AppArmor cho phép MySQL ghi vào thư mục mới bằng cách tạo một bí danh giữa thư mục mặc định và vị trí mới. AppArmor là một mô-đun bảo mật trong trung tâm Linux, nó cho phép quản trị viên hệ thống hạn chế khả năng của chương trình thông qua cấu hình chương trình, chứ không phải chính người dùng. Bắt đầu bằng cách mở và chỉnh sửa tệp alias AppArmor:

  1. sudo nano /etc/apparmor.d/tunables/alias

Ở cuối tệp, bỏ ghi chú dòng dưới đây và thêm quy tắc alias:

/etc/apparmor.d/tunables/alias
. . .
alias /var/lib/mysql/ -> /mnt/volume-nyc1-01/mysql/,
. . .

Khi bạn hoàn tất, hãy lưu và thoát khỏi tệp.

Để các thay đổi có hiệu lực, hãy khởi động lại AppArmor:

  1. sudo systemctl restart apparmor

Lưu ý: Nếu bạn bỏ qua bước cấu hình AppArmor, bạn sẽ nhận được thông báo lỗi sau:

Output
Job for mysql.service failed because the control process exited with error code. See "systemctl status mysql.service" and "journalctl -xe" for details.

Vì thông báo này không tạo kết nối rõ ràng giữa AppArmor và thư mục dữ liệu, nên có thể mất một chút thời gian để tìm ra lỗi này.

Khi bạn đã thiết lập cấu hình AppArmor đúng cách, bạn có thể chuyển sang bước tiếp theo.

Bước 4: Khởi động lại MySQL

Bây giờ đã đến lúc khởi động MySQL. Tuy nhiên, nếu bạn làm vậy, bạn sẽ gặp phải một lỗi khác. Thay vì sự cố AppArmor, lỗi này do mysql-systemd-start, một tập lệnh hỗ trợ quản lý MySQL thông qua systemd gây ra. Bạn có thể kiểm tra tập lệnh này bằng lệnh sau:

  1. nano /usr/share/mysql/mysql-systemd-start

Tập lệnh này kiểm tra sự tồn tại của một thư mục, -d hoặc một liên kết tượng trưng, -L, khớp với đường dẫn thư mục dữ liệu mặc định. Nếu không tìm thấy một trong hai điều này, tập lệnh sẽ kích hoạt lỗi và ngăn MySQL khởi động:

/usr/share/mysql/mysql-systemd-start
. . .
if [ ! -d /var/lib/mysql ] && [ ! -L /var/lib/mysql ]; then
 echo "MySQL data dir not found at /var/lib/mysql. Please create one."
 exit 1
fi

if [ ! -d /var/lib/mysql/mysql ] && [ ! -L /var/lib/mysql/mysql ]; then
 echo "MySQL system database not found. Please run mysql_install_db tool."
 exit 1
fi

. . .

Sau khi bạn đã kiểm tra tệp này, hãy đóng tệp mà không thực hiện bất kỳ thay đổi nào.

Vì bạn cần một thư mục hoặc liên kết tượng trưng thích hợp để khởi động máy chủ, bạn phải tạo cấu trúc thư mục tối thiểu để vượt qua kiểm tra môi trường của tập lệnh:

  1. sudo mkdir /var/lib/mysql/mysql -p

Bây giờ bạn đã sẵn sàng để bắt đầu MySQL:

  1. sudo systemctl start mysql

Xác nhận MySQL đang chạy bằng cách kiểm tra trạng thái:

  1. sudo systemctl status mysql
Output
● mysql.service - MySQL Community Server Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset:> Active: active (running) since Wed 2022-03-23 20:51:18 UTC; 4s ago Process: 17145 ExecStartPre=/usr/share/mysql/mysql-systemd-start pre (code=> Main PID: 17162 (mysqld) Status: "Server is operational" Tasks: 38 (limit: 1132) Memory: 376.7M CGroup: /system.slice/mysql.service └─17162 /usr/sbin/mysqld

Để đảm bảo rằng thư mục dữ liệu mới đang thực sự được sử dụng, hãy khởi động trình theo dõi MySQL:

  1. mysql -u sammy -p

Bây giờ hãy truy vấn lại giá trị của thư mục dữ liệu:

  1. SELECT @@datadir;
Output
+----------------------------+ | @@datadir | +----------------------------+ | /mnt/volume-nyc1-01/mysql/ | +----------------------------+ 1 row in set (0.01 sec)

Sau khi bạn đã khởi động lại MySQL và xác nhận rằng nó đang sử dụng vị trí mới, hãy tận dụng cơ hội để đảm bảo rằng cơ sở dữ liệu của bạn hoạt động đầy đủ. Khi bạn đã hoàn tất, hãy thoát khỏi cơ sở dữ liệu như sau và quay lại dấu nhắc lệnh:

  1. exit
Output
Bye

Bây giờ bạn đã xác minh tính toàn vẹn của mọi dữ liệu hiện có, bạn có thể xóa thư mục dữ liệu sao lưu:

  1. sudo rm -Rf /var/lib/mysql.bak

Sau đó khởi động lại MySQL lần cuối:

  1. sudo systemctl restart mysql

Và cuối cùng, hãy xác nhận rằng nó đang hoạt động như mong đợi bằng cách kiểm tra trạng thái:

  1. sudo systemctl status mysql
Output
● mysql.service - MySQL Community Server Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset:> Active: active (running) since Wed 2022-03-23 20:53:03 UTC; 4s ago Process: 17215 ExecStartPre=/usr/share/mysql/mysql-systemd-start pre (code=> Main PID: 17234 (mysqld) Status: "Server is operational" Tasks: 38 (limit: 1132) Memory: 368.9M CGroup: /system.slice/mysql.service └─17234 /usr/sbin/mysqld

Nếu dòng Active hiện trạng thái active(running) (đang chạy), điều này xác nhận rằng MySQL đang hoạt động.

Kết luận

Trong hướng dẫn này, bạn đã học cách di chuyển thư mục dữ liệu của MySQL đến vị trí mới và cập nhật danh sách kiểm soát truy cập AppArmor của Ubuntu để phù hợp với việc điều chỉnh. Mặc dù chúng ta đang sử dụng thiết bị block storage, nhưng các hướng dẫn ở đây phải phù hợp để xác định lại vị trí của thư mục dữ liệu bất kể công nghệ cơ bản là gì.

Để biết thêm thông tin về cách quản lý thư mục dữ liệu của MySQL, hãy xem các phần sau trong tài liệu MySQL chính thức:

  • Thư mục dữ liệu MySQL
  • Thiết lập nhiều thư mục dữ liệu

0 replies