centos系统修改MySQL默认存储路径导致无法启动的问题

本文指导如何更改MySQL默认数据存储路径,包括修改配置、迁移数据、处理SELinux权限问题。遇到启动失败时,通过查看错误信息并调整SElinux安全上下文来确保服务正常运行。

更改MySQL默认存储数据存储路径,需要先修改配置,再拷贝数据,然后重启。

1. 为了保证数据的准确性最好是停止mysql 服务,或者把mysql 表的写进行加锁。

mysqladmin -u root -p shutdown

采用命令查询mysql进程:ps aux | grep mysql | grep -v grep 所有有关mysql的进程都关掉了。

2、修改配置文件

/etc/my.cnf

[mysqld]

datadir=/var/lib/mysql

socket=/var/lib/mysql/mysql.sock

user=mysql

假设新的数据存储路径为 /data/mysqldata

修改配置为:

[mysqld]

#datadir=/var/lib/mysql

datadir=/data/mysqldata

socket=/var/lib/mysql/mysql.sock

user=mysql

3.将原数据全部拷贝到新路径

cp  -a /var/lib/mysql/*  /test/mysql/data/

4.更改新路径宿主

chown  mysql:mysql /test/mysql/data

5. 重启mysql服务 systemctl start mysqld

可能遇到问题:

[root@localhost ~]# systemctl start mysqld
Job for mysqld.service failed because the control process exited with error code. See "systemctl status mysqld.service" and "journalctl -xe" for details.

 以下三种查看报错信息方式:

1. systemctl status mysqld.service

[root@localhost ~]# systemctl status mysqld.service
● mysqld.service - MySQL Server
   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
   Active: failed (Result: start-limit) since 六 2020-03-14 03:55:06 CST; 14s ago
     Docs: man:mysqld(8)
           http://dev.mysql.com/doc/refman/en/using-systemd.html
  Process: 73992 ExecStart=/usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid $MYSQLD_OPTS (code=exited, status=1/FAILURE)
  Process: 73975 ExecStartPre=/usr/bin/mysqld_pre_systemd (code=exited, status=0/SUCCESS)
 Main PID: 72217 (code=exited, status=0/SUCCESS)
 
3月 14 03:55:06 localhost.localdomain systemd[1]: Failed to start MySQL Server.
3月 14 03:55:06 localhost.localdomain systemd[1]: Unit mysqld.service entered failed state.
3月 14 03:55:06 localhost.localdomain systemd[1]: mysqld.service failed.
3月 14 03:55:06 localhost.localdomain systemd[1]: mysqld.service holdoff time over, scheduling restart.
3月 14 03:55:06 localhost.localdomain systemd[1]: Stopped MySQL Server.
3月 14 03:55:06 localhost.localdomain systemd[1]: start request repeated too quickly for mysqld.service
3月 14 03:55:06 localhost.localdomain systemd[1]: Failed to start MySQL Server.
3月 14 03:55:06 localhost.localdomain systemd[1]: Unit mysqld.service entered failed state.
3月 14 03:55:06 localhost.localdomain systemd[1]: mysqld.service failed.

2. journalctl -xe

[root@localhost ~]# journalctl -xe
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
-- 
-- Unit mysqld.service has failed.
-- 
-- The result is failed.
3月 14 03:55:04 localhost.localdomain systemd[1]: Unit mysqld.service entered failed state.
3月 14 03:55:04 localhost.localdomain systemd[1]: mysqld.service failed.
3月 14 03:55:05 localhost.localdomain systemd[1]: mysqld.service holdoff time over, scheduling restart.
3月 14 03:55:05 localhost.localdomain systemd[1]: Stopped MySQL Server.
-- Subject: Unit mysqld.service has finished shutting down
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
-- 
-- Unit mysqld.service has finished shutting down.
3月 14 03:55:05 localhost.localdomain systemd[1]: Starting MySQL Server...
-- Subject: Unit mysqld.service has begun start-up
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
-- 
-- Unit mysqld.service has begun starting up.
3月 14 03:55:06 localhost.localdomain mysqld[73992]: Initialization of mysqld failed: 0
3月 14 03:55:06 localhost.localdomain systemd[1]: mysqld.service: control process exited, code=exited status=1
3月 14 03:55:06 localhost.localdomain systemd[1]: Failed to start MySQL Server.
-- Subject: Unit mysqld.service has failed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
-- 
-- Unit mysqld.service has failed.
-- 
-- The result is failed.
3月 14 03:55:06 localhost.localdomain systemd[1]: Unit mysqld.service entered failed state.
3月 14 03:55:06 localhost.localdomain systemd[1]: mysqld.service failed.
3月 14 03:55:06 localhost.localdomain systemd[1]: mysqld.service holdoff time over, scheduling restart.
3月 14 03:55:06 localhost.localdomain systemd[1]: Stopped MySQL Server.
-- Subject: Unit mysqld.service has finished shutting down
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
-- 
-- Unit mysqld.service has finished shutting down.
3月 14 03:55:06 localhost.localdomain systemd[1]: start request repeated too quickly for mysqld.service
3月 14 03:55:06 localhost.localdomain systemd[1]: Failed to start MySQL Server.
-- Subject: Unit mysqld.service has failed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
-- 
-- Unit mysqld.service has failed.
-- 
-- The result is failed.
3月 14 03:55:06 localhost.localdomain systemd[1]: Unit mysqld.service entered failed state.
3月 14 03:55:06 localhost.localdomain systemd[1]: mysqld.service failed.

3、查看日日志,查看日志后可以看到日志中的ERROR信息,不懂的地方可以翻译一下,方便理解,寻找有用的信息。日志路径可通过/etc/my.cnf文件查看

[ERROR] InnoDB: Operating system error number 13 in a file operation.
[ERROR] InnoDB: The error means mysqld does not have the access rights to the directory.
[ERROR] InnoDB: os_file_get_status() failed on './ibdata1'. Can't determine file permissions
[ERROR] InnoDB: Plugin initialization aborted with error Generic error
[ERROR] Plugin 'InnoDB' init function returned error.
[ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
[ERROR] Failed to initialize builtin plugins.
[ERROR] Aborting
                    ↓↓↓↓↓↓
[错误] InnoDB:文件操作中的操作系统错误号13。
[错误] InnoDB:该错误意味着mysqld没有访问该目录的权限。
[错误] InnoDB: os_file_get_status()在上失败。/ibdata1。无法确定文件权限
[错误] InnoDB:插件初始化中止,出现错误一般错误
[错误]插件“InnoDB”初始化函数返回错误。
[错误]插件“InnoDB”注册为存储引擎失败。
[错误]初始化内置插件失败。
[错误]中止

解决方案:

这可能是由于SElinux的安全上下文导致的,可尝试setenforce 0 命令关闭selinux以验证该问题。

[root@localhost ~]# getenforce    //查看selinux状态
Enforcing
[root@localhost ~]# setenforce 0    //临时关闭selinux,重启后失效
 
[root@localhost ~]# getenforce
Permissive
[root@localhost ~]# systemctl start mysqld     //启动mysql服务成功
[root@localhost ~]# ss -antulp | grep :3306
tcp    LISTEN     0      80     [::]:3306               [::]:*                   users:(("mysqld",pid=74057,fd=17))

如此,可证明确实是由selinux导致的,可尝试:

1、查看一下原本的数据目录的该属性

SELinux安全上下文查看方法(超详细):http://c.biancheng.net/view/1149.html

[root@localhost ~]# ls -Z /var/lib/mysql
#使用选项-Z查看文件和目录的安全上下文
-rw-r--r--.root root system_u:object_r:mysqld_db_t:s0 install.log
-rw-r--r--.root root system_u:object_r:mysqld_db_t:s0 install.log.syslog

2、确定了原来数据目录属性为mysqld_db_t,将你的新datadir属性更改为mysqld_db_t:

chcon -R -t mysqld_db_t <你的新datadir>

3、修改完后,查看你的新datadir的属性,ls -Z <你的新datadir>

若发现存在部分目录属性还不是mysqld_db_t,使用命令(chcon -R -t mysqld_db_t <你的目录>)继续修改

4、使用systemctl start mysqld重启即可。

<think>我们正在回答用户的问题:如何修改MySQL默认数据存储路径?根据引用内容,我们可以总结出在Linux系统修改MySQL数据存储路径的通用步骤,包括CentOS和Ubuntu系统。注意,不同MySQL版本(如5.7和8.0)的配置文件路径可能略有不同,但基本思路一致。步骤概述:1.停止MySQL服务2.创建新的数据存储目录3.复制原有数据到新目录并设置权限4.备份并修改MySQL配置文件(my.cnf或mysqld.cnf)5.对于SELinux环境(如CentOS),可能需要更新安全上下文6.启动MySQL服务下面以CentOS7和Ubuntu18.04为例,详细说明操作步骤。假设新的数据存储路径为`/data/mysql`。###📍一、CentOS7修改MySQL数据存储路径(适用于MySQL5.7/8.0)####1.停止MySQL服务```bashsudosystemctlstopmysqld```####2.创建新的数据目录并复制数据```bashsudomkdir-p/data/mysqlsudochown-Rmysql:mysql/data/mysql#修改所有者#复制原数据文件(注意保留原有权限)sudocp-rp/var/lib/mysql/*/data/mysql/```####3.备份并修改配置文件-MySQL默认配置文件路径:`/etc/my.cnf`(或`/etc/mysql/my.cnf`)```bashsudocp/etc/my.cnf/etc/my.cnf.bak#备份sudovi/etc/my.cnf```找到`[mysqld]`段,修改`datadir`和`socket`路径:```ini[mysqld]datadir=/data/mysqlsocket=/data/mysql/mysql.sock#如果原配置有指定socket,则修改```同时修改`[client]`和`[mysql]`段(如果存在)的socket路径:```ini[client]socket=/data/mysql/mysql.sock[mysql]socket=/data/mysql/mysql.sock```####4.处理SELinux安全上下文(仅启用SELinux的系统需要)```bash#安装policycoreutils-python(如果未安装)sudoyuminstallpolicycoreutils-python-y#添加新目录的安全上下文semanagefcontext-a-tmysqld_db_t"/data/mysql(/.*)?"restorecon-Rv/data/mysql```####5.启动MySQL服务```bashsudosystemctlstartmysqld```###📍二、Ubuntu18.04修改MySQL数据存储路径####1.停止MySQL服务```bashsudosystemctlstopmysql```####2.创建新目录并复制数据```bashsudomkdir-p/data/mysqlsudochown-Rmysql:mysql/data/mysqlsudocp-rp/var/lib/mysql/*/data/mysql/```####3.修改配置文件-Ubuntu下MySQL配置文件通常位于:`/etc/mysql/mysql.conf.d/mysqld.cnf````bashsudocp/etc/mysql/mysql.conf.d/mysqld.cnf/etc/mysql/mysql.conf.d/mysqld.cnf.baksudovi/etc/mysql/mysql.conf.d/mysqld.cnf```修改`datadir`和`socket`:```ini[mysqld]datadir=/data/mysqlsocket=/data/mysql/mysql.sock```同时修改客户端配置(如果有独立配置文件,如`/etc/mysql/conf.d/mysql.cnf`):```ini[client]socket=/data/mysql/mysql.sock[mysql]socket=/data/mysql/mysql.sock```####4.修改AppArmor配置(Ubuntu需要)```bashsudovi/etc/apparmor.d/usr.sbin.mysqld```找到原数据目录路径(如`/var/lib/mysql/**`),替换为`/data/mysql/**`,然后重载配置:```bashsudo/etc/init.d/apparmorreload```####5.启动MySQL服务```bashsudosystemctlstartmysql```###📍三、验证数据路径启动服务后,连接MySQL并执行:```sqlSHOWVARIABLESLIKE'datadir';```预期输出为`/data/mysql/`。###⚠️注意事项1.**权限问题**:确保新目录的权限设置为`mysql:mysql`,否则MySQL无法启动。2.**磁盘空间**:新挂载的磁盘空间应足够。3.**配置文件差异**:不同版本或发行版的MySQL配置文件路径可能不同,请根据实际情况调整。4.**符号链接**:不推荐使用符号链接方式迁移数据目录,可能导致性能问题[^1]。§§相关问题§§1.迁移MySQL数据目录后出现权限错误怎么办?2.如何为MySQL数据目录挂载新磁盘?3.MySQL的配置文件有哪些关键参数?</think> 以下是修改 MySQL 默认数据存储路径的完整教程,基于您提供的引用信息和系统实践经验整理: ### 📍 修改 MySQL 默认数据存储路径教程(Linux 系统通用方法) #### ⚠️ 准备工作 1. **备份重要数据** ```bash sudo mysqldump -u root -p --all-databases > full_backup.sql ``` 2. **停止 MySQL 服务** ```bash sudo systemctl stop mysqld # CentOS/RHEL sudo systemctl stop mysql # Ubuntu/Debian ``` --- ### 🔧 详细操作步骤(以迁移到 `/data/mysql` 为例) #### 步骤 1:创建新数据目录 ```bash sudo mkdir -p /data/mysql ``` #### 步骤 2:复制原始数据文件 ```bash sudo cp -rp /var/lib/mysql/* /data/mysql/ ``` #### 步骤 3:修改文件权限(关键步骤) ```bash sudo chown -R mysql:mysql /data/mysql sudo chmod 750 /data/mysql ``` #### 步骤 4:修改配置文件 编辑 MySQL 主配置文件(不同系统路径稍有差异): ```bash # CentOS/RHEL sudo vi /etc/my.cnf # Ubuntu/Debian sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf ``` 修改以下参数: ```ini [mysqld] datadir=/data/mysql # 修改数据存储路径 socket=/data/mysql/mysql.sock # 同时修改socket路径 [client] socket=/data/mysql/mysql.sock # 客户端配置也需修改 ``` #### 步骤 5:安全上下文设置(仅 SELinux 系统需执行) ```bash sudo yum install policycoreutils-python -y sudo semanage fcontext -a -t mysqld_db_t "/data/mysql(/.*)?" sudo restorecon -Rv /data/mysql ``` #### 步骤 6:启动 MySQL 服务 ```bash sudo systemctl start mysqld ``` #### 步骤 7:验证新路径 ```sql SHOW GLOBAL VARIABLES LIKE '%datadir%'; ``` ✅ 应显示: ```ini +---------------+--------------+ | Variable_name | Value | +---------------+--------------+ | datadir | /data/mysql/ | +---------------+--------------+ ``` --- ### ⚠️ 常见问题解决 1. **启动失败报错** - 检查 `/var/log/mysqld.log` 错误日志 - 确认权限设置:`sudo chown -R mysql:mysql /data/mysql` 2. **SELinux 阻止访问** ```bash sudo grep mysqld /var/log/audit/audit.log | audit2why sudo setenforce 0 # 临时关闭SELinux调试 ``` 3. **应用连接失败** 确保所有应用配置文件中的 socket 路径已更新为: `/data/mysql/mysql.sock` --- ### 📊 数据迁移前后对比 | 项目 | 原路径(`/var/lib/mysql`) | 新路径(`/data/mysql`) | |------|--------------------------|-----------------------| | 适用场景 | 默认小规模数据库 | 大型数据库(30GB+) | | 空间限制 | 受系统分区限制 | 可挂载独立大容量硬盘 | | I/O性能 | 与系统共享IO资源 | 专用高性能存储 | | 维护便利性 | ★★★ | ★★★★ | --- ### 🔍 其他注意事项 1.数据库迁移建议使用 `rsync` 替代 `cp`: ```bash sudo rsync -av /var/lib/mysql/ /data/mysql/ ``` 2. 云服务器用户可直接挂载新云盘到 `/data/mysql` 3. 迁移后原数据保留 7 天再删除(`sudo rm -rf /var/lib/mysql_bak`)
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值