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:
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:
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 :
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:
OutputBye
Để đả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:
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:
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
.
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ũ:
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
:
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:
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 Y
và ENTER
. 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:
Ở cuối tệp, bỏ ghi chú dòng dưới đây và thêm quy tắc alias:
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:
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:
OutputJob 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:
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:
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:
Bây giờ bạn đã sẵn sàng để bắt đầu MySQL:
Xác nhận MySQL đang chạy bằng cách kiểm tra trạng thái:
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:
Bây giờ hãy truy vấn lại giá trị của thư mục dữ liệu:
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:
OutputBye
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:
Sau đó khởi động lại MySQL lần cuối:
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:
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