如何改变mariadb-server数据库的存放位置
在 Linux (CentOS 7) 系统中,随着业务的发展,默认的数据库存放路径(通常在系统盘 /var/lib/mysql)很容易被撑爆。将 MariaDB 的数据目录(Data Directory)迁移到容量更大的挂载盘(如 /data/mysql)是一个非常标准的运维操作。
为了确保数据绝对安全且迁移后服务能正常启动,请严格按照以下五个步骤进行操作:
🛠️ 第一步:安全停止 MariaDB 服务
在迁移数据之前,必须先停止数据库服务,否则在复制文件的过程中如果有新数据写入,会导致数据库文件损坏或不一致。
Bash
systemctl stop mariadb
📂 第二步:创建新目录并完整复制原数据
创建新的存放目录(假设你要迁移到 /data/mysql):
Bash
mkdir -p /data/mysql
使用 cp -a 完整复制原数据:
-a 参数极其关键,它能在复制文件的同时,完美保留原文件的所有者、所属组(mysql:mysql)以及安全权限。
Bash
cp -a /var/lib/mysql/. /data/mysql/
检查新目录的权限:
确保新目录的所有者和组确实是 mysql:
Bash
ls -ld /data/mysql
正确输出应该包含:drwxr-xr-x. ... mysql mysql ... /data/mysql
如果所有者不对,手动修正它:
Bash
chown -R mysql:mysql /data/data/mysql
⚙️ 第三步:修改 MariaDB 配置文件
新版 MariaDB 通常在 /etc/my.cnf 或 /etc/my.cnf.d/server.cnf 中配置底层路径。
打开主配置文件:
Bash
vi /etc/my.cnf
在 [mysqld] 标签下方,修改(或添加)datadir 和 socket 的路径:
Ini, TOML
[mysqld]
将原本的 /var/lib/mysql 改为你的新路径
datadir=/data/mysql
socket=/data/mysql/mysql.sock
(极为重要) 为了保证本地命令行工具(如 mysql、mysqldump)在不指定参数时也能正常连接,还需要在配置文件底部加上 [client] 和 [mysql] 的套接字重定向:
Ini, TOML
[client]
socket=/data/mysql/mysql.sock
[mysql]
socket=/data/mysql/mysql.sock
保存并退出 (:wq)。
🛡️ 第四步:调校 CentOS 7 的 SELinux 策略(核心避坑点)
CentOS 7 默认开启的 SELinux 安全策略非常严格,它默认只允许数据库读取 /var/lib/mysql。如果不给新路径放行,启动时会疯狂报错 Permission denied。
终极省心法(临时关闭):
如果你不需要 SELinux,可以直接关闭它:
Bash
setenforce 0
(永久关闭需修改 /etc/selinux/config 将其设为 disabled)。
专业安全法(不关闭 SELinux,仅对新目录赋权):
如果你希望保持系统高安全性,可以把原目录的安全上下文直接“复制”给新目录:
Bash
1. 将 /var/lib/mysql 的安全策略标签同步给 /data/mysql
semanage fcontext -a -e /var/lib/mysql /data/mysql
2. 强行刷新并应用该策略
restorecon -R -v /data/mysql
🚀 第五步:启动服务并验证
重新拉起 MariaDB 服务:
Bash
systemctl start mariadb
验证新路径是否真正生效:
登录进数据库:
Bash
mysql -u root -p
在 MariaDB [(none)]> 命令行中执行以下 SQL 语句查看当前实际存放位置:
SQL
SHOW VARIABLES LIKE 'datadir';
如果表格中漂亮的显示出 Value: /data/mysql/,说明你的数据库存放位置已经完美迁移成功!
清理旧数据(可选):
在新环境稳定运行几天、确认毫无问题后,你可以手动删掉 /var/lib/mysql 下的旧文件来释放系统盘空间:
Bash
rm -rf /var/lib/mysql_old