Khi quản trị máy chủ, đặc biệt là các hệ thống chạy trên CentOS 7, việc quản lý không gian lưu trữ và tối ưu hóa hiệu suất là vô cùng quan trọng. MariaDB, một hệ quản trị cơ sở dữ liệu mạnh mẽ và phổ biến, lưu trữ toàn bộ dữ liệu của bạn trong một thư mục chuyên biệt. Tuy nhiên, theo thời gian, dung lượng của thư mục này có thể tăng lên, gây áp lực lên ổ đĩa hệ thống và làm giảm hiệu suất. Di chuyển thư mục dữ liệu MariaDB sang một vị trí mới, chẳng hạn như một ổ đĩa riêng có dung lượng lớn hơn hoặc tốc độ nhanh hơn, là một giải pháp hiệu quả. Trong bài viết này, AZWEB sẽ hướng dẫn bạn chi tiết từng bước để thực hiện quy trình này một cách an toàn và chính xác.
Giới thiệu về thư mục dữ liệu của MariaDB và tầm quan trọng của việc di chuyển
Thư mục dữ liệu, thường được biết đến với tên gọi datadir, là trái tim của hệ thống MariaDB. Đây là nơi lưu trữ tất cả các cơ sở dữ liệu, bảng, chỉ mục và các tệp tin hệ thống quan trọng khác. Mọi thao tác đọc, ghi, và cập nhật dữ liệu đều diễn ra trực tiếp tại đây. Mặc định trên CentOS 7, thư mục này được đặt tại /var/lib/mysql. Hiểu rõ vai trò của nó giúp chúng ta nhận thức được tầm quan trọng của việc xử lý nó một cách cẩn thận.
Vậy tại sao chúng ta cần di chuyển thư mục quan trọng này? Có một vài lý do chính. Phổ biến nhất là do vấn đề dung lượng. Khi phân vùng gốc (/) chứa /var/lib/mysql bị đầy, hệ thống của bạn sẽ không thể ghi thêm dữ liệu, dẫn đến việc ứng dụng bị lỗi. Di chuyển datadir sang một ổ đĩa hoặc phân vùng khác có dung lượng lớn hơn sẽ giải quyết triệt để vấn đề này. Một lý do khác là để tối ưu hiệu năng. Bằng cách chuyển thư mục dữ liệu sang một ổ đĩa nhanh hơn như SSD hoặc NVMe, bạn có thể cải thiện đáng kể tốc độ truy vấn và thời gian phản hồi của cơ sở dữ liệu.

Quá trình di chuyển thoạt nghe có vẻ phức tạp, nhưng thực chất khá đơn giản nếu bạn tuân thủ đúng quy trình. Về cơ bản, chúng ta sẽ cần sao lưu toàn bộ dữ liệu để đảm bảo an toàn, dừng dịch vụ MariaDB, sao chép thư mục dữ liệu sang vị trí mới, cập nhật tệp cấu hình để hệ thống biết “nhà mới” ở đâu, và cuối cùng là khởi động lại dịch vụ và kiểm tra. Mỗi bước đều đóng vai trò quan trọng để đảm bảo quá trình chuyển đổi diễn ra suôn sẻ và không làm mất mát dữ liệu.
Chuẩn bị trước khi di chuyển
Trước khi thực hiện bất kỳ thay đổi nào đối với hệ thống cơ sở dữ liệu, khâu chuẩn bị là bước không thể bỏ qua. Đây là giai đoạn quyết định sự thành công và an toàn của toàn bộ quá trình. Việc chuẩn bị kỹ lưỡng giúp bạn tránh được những rủi ro mất mát dữ liệu không đáng có và đảm bảo hệ thống có thể quay trở lại trạng thái ban đầu nếu có sự cố xảy ra.
Sao lưu dữ liệu MariaDB an toàn
Nguyên tắc vàng trong quản trị hệ thống là “Luôn luôn sao lưu trước khi thay đổi”. Việc di chuyển dữ liệu luôn tiềm ẩn rủi ro, dù là nhỏ nhất. Một bản sao lưu đầy đủ sẽ là chiếc phao cứu sinh của bạn. Công cụ mysqldump là một tiện ích dòng lệnh mạnh mẽ đi kèm với MariaDB, cho phép bạn xuất toàn bộ cơ sở dữ liệu ra một tệp tin SQL duy nhất. Lệnh này rất dễ sử dụng và hiệu quả. Bạn có thể tìm hiểu thêm về MariaDB để nắm rõ các công cụ quản lý tại MariaDB.
Để sao lưu tất cả các cơ sở dữ liệu, bạn có thể sử dụng lệnh sau trong terminal:
sudo mysqldump -u [username] -p --all-databases > /path/to/backup/alldatabases.sql
Trong đó, [username] là tên người dùng có quyền truy cập vào MariaDB (thường là root). Hệ thống sẽ yêu cầu bạn nhập mật khẩu. Sau khi thực hiện, một tệp tin alldatabases.sql chứa toàn bộ dữ liệu và cấu trúc của bạn sẽ được tạo ra. Điều quan trọng là bạn phải lưu trữ tệp sao lưu này ở một vị trí an toàn, tốt nhất là trên một máy chủ khác hoặc dịch vụ lưu trữ đám mây, để đảm bảo nó không bị ảnh hưởng bởi quá trình di chuyển.

Dừng dịch vụ MariaDB để tránh lỗi dữ liệu
Sau khi đã có bản sao lưu an toàn, bước tiếp theo là dừng hoàn toàn dịch vụ MariaDB. Tại sao điều này lại cần thiết? Khi MariaDB đang chạy, nó liên tục đọc và ghi dữ liệu vào datadir. Nếu bạn cố gắng sao chép các tệp tin trong khi chúng đang được sử dụng, bạn có thể nhận được một bản sao không nhất quán, bị hỏng hoặc thiếu dữ liệu. Điều này sẽ dẫn đến lỗi nghiêm trọng khi bạn khởi động lại dịch vụ với dữ liệu mới.
Trên CentOS 7, việc quản lý dịch vụ được thực hiện thông qua systemd. Để dừng dịch vụ MariaDB, bạn chỉ cần chạy lệnh đơn giản sau:
sudo systemctl stop mariadb
Để chắc chắn rằng dịch vụ đã dừng hoàn toàn, bạn nên kiểm tra lại trạng thái của nó bằng lệnh:
sudo systemctl status mariadb
Kết quả trả về nên hiển thị trạng thái là “inactive (dead)”. Khi đã xác nhận dịch vụ đã tắt, bạn có thể yên tâm rằng dữ liệu đang ở trạng thái tĩnh và sẵn sàng để được di chuyển một cách an toàn.
Các bước di chuyển thư mục dữ liệu MariaDB sang vị trí mới trên CentOS 7
Khi đã hoàn tất khâu chuẩn bị, chúng ta sẽ bắt đầu quá trình di chuyển thực tế. Giai đoạn này bao gồm việc sao chép dữ liệu sang ngôi nhà mới và cập nhật cấu hình để MariaDB biết đường tìm đến. Hãy thực hiện cẩn thận từng bước để đảm bảo mọi thứ hoạt động trơn tru.
Copy thư mục dữ liệu MariaDB sang thư mục đích
Bước đầu tiên là sao chép toàn bộ nội dung của thư mục /var/lib/mysql sang vị trí mới. Giả sử bạn muốn chuyển dữ liệu sang thư mục /mnt/data/mysql. Có hai công cụ dòng lệnh phổ biến để thực hiện việc này là cp và rsync. Mặc dù cp có thể hoàn thành nhiệm vụ, rsync thường được khuyến nghị hơn vì nó có khả năng bảo toàn quyền sở hữu và quyền truy cập của tệp tin một cách chính xác. Thêm vào đó, nó còn cung cấp một thanh tiến trình, rất hữu ích khi bạn làm việc với lượng dữ liệu lớn.

Sử dụng lệnh rsync với tùy chọn -a (archive mode) để bảo toàn mọi thuộc tính và -v (verbose) để hiển thị chi tiết quá trình:
sudo rsync -av /var/lib/mysql /mnt/data/
Lệnh này sẽ tạo một thư mục tên mysql bên trong /mnt/data, với cấu trúc và nội dung y hệt thư mục gốc. Quá trình này có thể mất một chút thời gian tùy thuộc vào kích thước cơ sở dữ liệu của bạn. Sau khi hoàn tất, bạn đã có một bản sao hoàn chỉnh của dữ liệu tại vị trí mới.
Chỉnh sửa tập tin cấu hình MariaDB (my.cnf)
Bây giờ, bạn cần “chỉ đường” cho MariaDB đến thư mục dữ liệu mới. Điều này được thực hiện bằng cách chỉnh sửa tệp tin cấu hình chính của MariaDB. Trên CentOS 7, tệp cấu hình này thường nằm ở /etc/my.cnf. Tuy nhiên, đôi khi nó có thể bao gồm các tệp cấu hình khác từ thư mục /etc/my.cnf.d/. Bạn nên kiểm tra tệp /etc/my.cnf trước. Tham khảo thêm Kernel Linux để hiểu cấu trúc hệ thống sâu hơn.
Mở tệp cấu hình bằng một trình soạn thảo văn bản như nano hoặc vi:
sudo nano /etc/my.cnf
Bên trong tệp, tìm đến mục [mysqld]. Bạn sẽ thấy một dòng có nội dung datadir=/var/lib/mysql. Đây chính là tham số chúng ta cần thay đổi. Hãy cập nhật nó với đường dẫn mới:
datadir=/mnt/data/mysql
Ngoài datadir, đôi khi bạn cũng cần kiểm tra và cập nhật tham số socket. Nếu socket được đặt trong thư mục dữ liệu cũ, bạn cũng cần di chuyển nó. Thông thường, nó được đặt tại /var/lib/mysql/mysql.sock. Bạn cũng nên cập nhật đường dẫn này để trỏ đến vị trí tương ứng trong thư mục mới:
socket=/mnt/data/mysql/mysql.sock
Sau khi chỉnh sửa, hãy lưu và đóng tệp tin cấu hình lại. Bước tiếp theo sẽ là đảm bảo quyền truy cập cho thư mục mới này.
Thiết lập quyền truy cập và chủ sở hữu cho thư mục dữ liệu mới
Sau khi đã sao chép dữ liệu và cập nhật cấu hình, một bước cực kỳ quan trọng nhưng thường bị bỏ qua là thiết lập lại quyền sở hữu và phân quyền cho thư mục dữ liệu mới. MariaDB chạy dưới một người dùng hệ thống đặc biệt tên là mysql. Nếu người dùng này không có quyền đọc và ghi trên thư mục dữ liệu mới, dịch vụ sẽ không thể khởi động. Đây là một trong những nguyên nhân gây lỗi phổ biến nhất sau khi di chuyển.

Gán quyền sở hữu người dùng mysql cho thư mục mới
Mặc dù rsync -a thường giữ lại quyền sở hữu, việc kiểm tra và thiết lập lại một cách tường minh là một thói quen tốt để đảm bảo an toàn. Bạn cần chắc chắn rằng cả người dùng mysql và nhóm mysql đều là chủ sở hữu của thư mục dữ liệu mới và tất cả các tệp tin, thư mục con bên trong nó. Lệnh chown với tùy chọn -R (recursive) sẽ giúp bạn thực hiện điều này một cách nhanh chóng.
Chạy lệnh sau để gán quyền sở hữu:
sudo chown -R mysql:mysql /mnt/data/mysql
Lệnh này sẽ đi qua toàn bộ thư mục /mnt/data/mysql và thay đổi chủ sở hữu của mọi đối tượng bên trong thành người dùng mysql và nhóm mysql. Bước này đảm bảo rằng tiến trình MariaDB sẽ có đủ quyền để truy cập và quản lý các tệp dữ liệu của chính nó.
Thiết lập phân quyền phù hợp với bảo mật và hoạt động MariaDB
Ngoài quyền sở hữu, phân quyền (permissions) cũng đóng vai trò quan trọng trong việc bảo vệ dữ liệu. Các tệp cơ sở dữ liệu chứa thông tin nhạy cảm, vì vậy không nên cho phép bất kỳ người dùng nào khác ngoài mysql có thể đọc hoặc sửa đổi chúng. Phân quyền không chính xác không chỉ gây ra lỗi khởi động mà còn tạo ra lỗ hổng bảo mật nghiêm trọng.
Sử dụng lệnh chmod để thiết lập lại phân quyền. Một cấu hình phổ biến và an toàn là cấp quyền đọc, ghi, thực thi (750) cho các thư mục và quyền đọc, ghi (640) cho các tệp tin cho người dùng mysql. Tuy nhiên, để đơn giản và đảm bảo tính nhất quán với cài đặt mặc định, bạn có thể chỉ cần đảm bảo rằng chủ sở hữu (mysql) có toàn quyền. Lệnh chown đã thực hiện ở bước trên thường là đủ. Nếu bạn gặp sự cố, hãy kiểm tra lại bằng ls -l /mnt/data/mysql để xem các quyền hiện tại và điều chỉnh nếu cần. Một lưu ý quan trọng khác trên CentOS là SELinux. Nếu SELinux đang ở chế độ Enforcing, bạn cần cập nhật ngữ cảnh bảo mật cho thư mục mới. Nếu không, SELinux sẽ chặn MariaDB truy cập vào thư mục này, ngay cả khi quyền sở hữu đã đúng.
sudo semanage fcontext -a -t mysqld_db_t "/mnt/data/mysql(/.*)?"sudo restorecon -Rv /mnt/data/mysql

Khởi động lại dịch vụ MariaDB và kiểm tra hoạt động sau di chuyển
Đây là thời điểm quan trọng nhất: khởi động lại dịch vụ và xác minh rằng mọi thứ hoạt động như mong đợi. Nếu bạn đã thực hiện cẩn thận các bước trước đó, quá trình này sẽ diễn ra suôn sẻ. Tuy nhiên, đây cũng là lúc các lỗi tiềm ẩn sẽ xuất hiện, vì vậy việc kiểm tra kỹ lưỡng là rất cần thiết.
Khởi động lại MariaDB bằng systemctl
Sau khi đã sao chép dữ liệu, cập nhật cấu hình và thiết lập quyền truy cập, bạn đã sẵn sàng để “bật công tắc”. Sử dụng systemctl để khởi động lại dịch vụ MariaDB. Lệnh này sẽ yêu cầu systemd đọc lại tệp cấu hình mới và khởi chạy tiến trình mysqld với các thiết lập đã được cập nhật.
Thực hiện lệnh sau trong terminal:
sudo systemctl start mariadb
Sau khi chạy lệnh, hãy chờ vài giây để dịch vụ có thời gian khởi động. Tiếp theo, ngay lập tức kiểm tra trạng thái của nó để xem liệu nó đã khởi động thành công hay chưa:
sudo systemctl status mariadb
Nếu bạn thấy trạng thái “active (running)” màu xanh lá, xin chúc mừng! Quá trình di chuyển về cơ bản đã thành công. Nếu dịch vụ không khởi động được và hiển thị trạng thái “failed”, đừng lo lắng. Đây là lúc chúng ta cần chuyển sang bước xác minh và xử lý lỗi.

Xác minh MariaDB hoạt động ổn định với thư mục mới
Ngay cả khi dịch vụ đã chạy, bạn vẫn cần thực hiện một vài kiểm tra để đảm bảo rằng nó đang thực sự sử dụng thư mục dữ liệu mới và dữ liệu của bạn vẫn còn nguyên vẹn. Đầu tiên, hãy kiểm tra tệp log lỗi của MariaDB. Đây là nơi ghi lại mọi vấn đề phát sinh trong quá trình khởi động và hoạt động.
sudo tail -f /var/log/mariadb/mariadb.log
Nếu không có thông báo lỗi đáng ngờ, bước tiếp theo là thử kết nối vào cơ sở dữ liệu và thực hiện một vài truy vấn đơn giản. Đăng nhập bằng client mysql:
mysql -u [username] -p
Sau khi đăng nhập thành công, hãy thử liệt kê các cơ sở dữ liệu:
SHOW DATABASES;
Nếu bạn thấy danh sách các cơ sở dữ liệu của mình, đó là một dấu hiệu rất tốt. Để chắc chắn hơn, hãy chọn một cơ sở dữ liệu cụ thể và truy vấn một bảng trong đó để xác thực rằng dữ liệu vẫn còn đó. Nếu tất cả các bước này đều thành công, bạn có thể tự tin rằng quá trình di chuyển đã hoàn tất.
Xử lý lỗi thường gặp khi di chuyển thư mục dữ liệu MariaDB
Không phải lúc nào quá trình di chuyển cũng diễn ra hoàn hảo. Đôi khi, bạn có thể gặp phải một số lỗi khiến dịch vụ MariaDB không thể khởi động. Hiểu rõ nguyên nhân và cách khắc phục các lỗi phổ biến sẽ giúp bạn tiết kiệm rất nhiều thời gian và công sức. Dưới đây là hai sự cố thường gặp nhất.

Lỗi MariaDB không khởi động được do quyền truy cập
Đây là lỗi phổ biến nhất. Dấu hiệu nhận biết là khi bạn chạy systemctl status mariadb, bạn sẽ thấy các thông báo lỗi liên quan đến “Permission denied” (Quyền truy cập bị từ chối) trong phần log hiển thị. Tệp log tại /var/log/mariadb/mariadb.log cũng sẽ ghi lại các lỗi tương tự, cho biết tiến trình mysqld không thể đọc hoặc ghi vào một tệp tin nào đó trong thư mục dữ liệu mới.
Nguyên nhân gốc rễ hầu như luôn là do quyền sở hữu hoặc phân quyền sai. Hãy kiểm tra lại hai yếu tố này. Đầu tiên, đảm bảo người dùng mysql và nhóm mysql sở hữu toàn bộ thư mục:
sudo ls -l /mnt/data/
Kết quả phải cho thấy mysql mysql là chủ sở hữu của thư mục mysql. Nếu không, hãy chạy lại lệnh chown -R mysql:mysql /mnt/data/mysql. Thứ hai, và đặc biệt quan trọng trên CentOS, là bối cảnh SELinux. Nếu bạn chưa cập nhật ngữ cảnh bảo mật cho thư mục mới, SELinux sẽ chặn truy cập. Hãy chạy lại các lệnh semanage và restorecon đã đề cập ở phần trước để khắc phục.
Lỗi cấu hình sai đường dẫn datadir
Một lỗi đơn giản nhưng cũng khá phổ biến khác là gõ sai đường dẫn trong tệp cấu hình my.cnf. Một lỗi chính tả nhỏ, một dấu gạch chéo (/) bị thiếu hoặc thừa cũng đủ để MariaDB không tìm thấy thư mục dữ liệu của nó và không thể khởi động.
Khi gặp lỗi này, log hệ thống thường sẽ chỉ ra rằng không thể tìm thấy các tệp hệ thống cơ bản của MariaDB tại đường dẫn đã chỉ định. Cách khắc phục rất đơn giản: hãy mở lại tệp cấu hình /etc/my.cnf và kiểm tra kỹ lưỡng giá trị của tham số datadir. Hãy chắc chắn rằng đường dẫn bạn nhập là hoàn toàn chính xác và tồn tại trên hệ thống. Bạn có thể dùng lệnh ls -ld /mnt/data/mysql để xác nhận lại đường dẫn và sự tồn tại của thư mục. Sau khi sửa lỗi, hãy lưu tệp và thử khởi động lại dịch vụ MariaDB.
Best Practices
Để đảm bảo quá trình di chuyển thư mục dữ liệu MariaDB trên CentOS 7 diễn ra an toàn, hiệu quả và giảm thiểu rủi ro, việc tuân thủ các quy tắc và thực tiễn tốt nhất là điều cần thiết. Những kinh nghiệm này được đúc kết từ thực tế quản trị hệ thống và giúp bạn tránh được những sai lầm phổ biến.

Luôn sao lưu dữ liệu trước khi thay đổi: Đây là quy tắc bất di bất dịch. Dù bạn tự tin đến đâu, một bản sao lưu đầy đủ là tấm vé bảo hiểm duy nhất cho dữ liệu của bạn. Hãy chắc chắn rằng bản sao lưu được lưu trữ ở một nơi an toàn và riêng biệt.
Dừng hoàn toàn dịch vụ trước khi di chuyển: Đừng bao giờ cố gắng sao chép các tệp dữ liệu khi MariaDB đang chạy. Điều này chắc chắn sẽ dẫn đến dữ liệu bị hỏng. Hãy dùng systemctl stop và kiểm tra lại bằng systemctl status để đảm bảo dịch vụ đã ở trạng thái “inactive”.
Đảm bảo phân quyền chính xác: Sai sót về quyền sở hữu (chown) và bối cảnh SELinux là nguyên nhân hàng đầu gây ra lỗi khởi động. Hãy kiểm tra kỹ và áp dụng đúng quyền cho người dùng mysql trên thư mục dữ liệu mới.
Kiểm tra kỹ log và test hoạt động sau khi chuyển đổi: Đừng cho rằng dịch vụ “active (running)” có nghĩa là mọi thứ đều ổn. Hãy đọc tệp log lỗi để tìm các cảnh báo và thực hiện các truy vấn thử nghiệm để xác thực tính toàn vẹn của dữ liệu.
Tránh di chuyển dữ liệu trong giờ cao điểm: Quá trình di chuyển đòi hỏi dịch vụ phải ngừng hoạt động. Hãy lên kế hoạch thực hiện vào thời điểm có ít người dùng truy cập nhất (ví dụ: ban đêm hoặc cuối tuần) để giảm thiểu ảnh hưởng đến hoạt động kinh doanh của bạn.
Kết luận
Di chuyển thư mục dữ liệu MariaDB trên CentOS 7 là một nhiệm vụ quản trị quan trọng, giúp giải quyết các vấn đề về không gian lưu trữ và tối ưu hóa hiệu suất hệ thống. Mặc dù có vẻ phức tạp, quy trình này hoàn toàn có thể được thực hiện một cách an toàn và hiệu quả nếu bạn tuân thủ một kế hoạch chi tiết và cẩn thận trong từng bước. Từ việc chuẩn bị kỹ lưỡng bằng cách sao lưu dữ liệu và dừng dịch vụ, đến việc sao chép chính xác, cập nhật cấu hình và thiết lập lại quyền truy cập, mỗi giai đoạn đều đóng một vai trò thiết yếu.
Qua bài viết này, AZWEB đã cung cấp một hướng dẫn toàn diện, bao gồm cả cách xử lý các lỗi thường gặp và các phương pháp thực hành tốt nhất. Chìa khóa thành công nằm ở việc không bỏ qua bất kỳ bước nào, đặc biệt là việc sao lưu và kiểm tra kỹ lưỡng sau khi hoàn tất. Bằng cách làm theo hướng dẫn này, bạn có thể tự tin di chuyển dữ liệu MariaDB của mình mà không lo mất mát dữ liệu và đảm bảo hệ thống tiếp tục hoạt động ổn định, hiệu quả hơn.