改变 MariaDB 数据库的默认存放位置(通常是从 /var/lib/mysql 迁移到空间更大的目录,如 /data/mysql)是一个经典的系统运维操作。

为了确保数据绝对安全且迁移后服务能正常启动,请严格按照以下五个步骤进行操作:

  1. 停止 MariaDB 服务
    在进行任何数据复制之前,必须先停止数据库服务。如果在服务运行时复制文件,会导致数据库文件损坏或数据不一致。

Bash
sudo systemctl stop mariadb

  1. 复制数据并保留权限
    假设你要将数据迁移到 /data/mysql 目录下。使用 cp -a 或 rsync 极其关键,因为它们能完美保留原文件的所有者、所属组 (mysql:mysql) 以及安全权限。

Bash

创建新目录的基础路径

sudo mkdir -p /data

完整复制原数据并保留所有权限属性

sudo cp -a /var/lib/mysql /data/
复制完成后,确认一下新目录的权限是否正确:

Bash
ls -ld /data/mysql

正常情况应该看到所有者和组都是 mysql

  1. 修改 MariaDB 配置文件
    打开 MariaDB 的配置文件。在 CentOS/RHEL 下通常是 /etc/my.cnf 或 /etc/my.cnf.d/server.cnf;在 Ubuntu/Debian 下通常是 /etc/mysql/mariadb.conf.d/50-server.cnf。

Bash
sudo vi /etc/my.cnf
找到 [mysqld] 标签,修改(或新增)datadir 和 socket 的路径配置:

Ini, TOML
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
(重要提示):为了让本地终端的 mysql 命令在不加参数时依然能直接连上数据库,建议在文件底部加上客户端的 socket 指向:

Ini, TOML
[client]
socket=/data/mysql/mysql.sock

  1. 解决系统安全拦截 (SELinux / AppArmor)
    这是更改路径后最容易导致启动失败(Permission denied)的环节。Linux 的底层安全机制默认只允许数据库读取 /var/lib/mysql。

如果你使用的是 CentOS / RHEL (SELinux):
将原目录的安全上下文直接“克隆”给新目录,并刷新生效:

Bash
sudo semanage fcontext -a -e /var/lib/mysql /data/mysql
sudo restorecon -R -v /data/mysql
(注:如果你的系统没有 semanage 命令,可以通过 setenforce 0 临时关闭 SELinux 来让数据库先跑起来)。

如果你使用的是 Ubuntu / Debian (AppArmor):
修改 AppArmor 的路径别名配置:

Bash
sudo vi /etc/apparmor.d/tunables/alias
在文件末尾新增一行,建立路径映射:

Plaintext
alias /var/lib/mysql/ -> /data/mysql/,
保存后重启 AppArmor 服务:

Bash
sudo systemctl restart apparmor

  1. 重启服务并验证结果
    环境全部调校完毕,重新拉起 MariaDB 服务:

Bash
sudo systemctl start mariadb
sudo systemctl status mariadb
如果服务显示绿色的 active (running),登录进数据库终端进行最后验证:

Bash
mysql -u root -p
执行以下 SQL 语句:

SQL
SHOW VARIABLES LIKE 'datadir';
只要表格中返回的值是你的新路径(/data/mysql/),即代表迁移彻底成功!在系统稳定运行几天确认无误后,你可以放心地使用 rm -rf /var/lib/mysql 清理掉旧文件以释放旧盘空间。

标签: none

添加新评论