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

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

更改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>嗯,用户的问题是关于CentOS 7.9系统中重启MySQL服务后数据库数量减少的解决方案。我需要先理解问题的具体情况。用户提到重启MySQL数据库数量减少,这可能涉及到数据目录的配置、权限问题,或者数据库文件本身的问题。 首先,我应该考虑数据存储路径是否正确。MySQL的数据通常存储在/var/lib/mysql目录下,但有时候配置可能有误,导致重启后指向了不同的目录。用户需要检查my.cnf配置文件中的datadir设置是否正确,确保指向了实际包含数据库文件的目录。如果配置错误,MySQL可能会使用默认路径,而那里没有原来的数据库,所以看起来数据库减少了。 接下来,文件权限和所有权也是常见问题。如果MySQL服务在重启后以不同的用户身份运行,或者文件权限被修改,可能导致无法读取数据目录中的文件,从而无法正确加载数据库。用户需要检查目录权限是否为mysql用户和组,并确认文件和子目录的权限是否正确,比如755或750。 另外,数据库文件损坏也是一个可能的原因。比如,如果InnoDB表空间文件损坏,MySQL可能无法启动或加载这些数据库。这时候需要查看错误日志,通常位于/var/log/mysql/或/var/log/mysqld.log,根据日志中的具体错误信息来诊断问题。如果发现损坏,可能需要使用innodb_force_recovery参数启动MySQL,然后进行数据导出和恢复。 还有,临时文件系统问题。如果MySQL的数据目录被挂载为临时文件系统,重启后数据会丢失。用户需要检查/etc/fstab中的挂载配置,确保数据目录所在的文件系统是持久化的。 此外,SELinux可能会干扰MySQL的访问。在CentOS 7中,SELinux默认是启用的,如果配置不当,可能导致MySQL无法读取数据文件。用户可以考虑暂时禁用SELinux,或者调整策略,设置正确的上下文标签。 备份和恢复也是重要的步骤。如果之前的备份存在,可以通过mysqldump或物理备份恢复数据。用户提到之前尝试过mysqldump但导致MySQL崩溃,可能需要先修复数据库文件,再尝试导出。 还有,查看MySQL启动状态和日志是关键。使用systemctl status mysqld查看服务状态,确认是否有启动错误。同时,仔细阅读错误日志,寻找权限错误、文件丢失或损坏的信息。 最后,可能需要重新安装MySQL并恢复数据,或者联系数据库恢复专家,如果数据非常重要且无法自行修复的话。 综合这些思路,我需要逐步引导用户检查配置、权限、日志,并提供相应的解决步骤,同时提醒备份的重要性,以防止数据丢失。</think>### 分步解决方案:CentOS 7.9重启MySQL数据库数量减少的排查与修复 #### 1. 验证数据存储路径 - **检查my.cnf配置**: ```bash grep -i "datadir" /etc/my.cnf ``` 确认`datadir=/var/lib/mysql`是否指向实际数据库文件路径。若路径错误,修改后重启服务: ```bash systemctl restart mysqld ``` [^3] #### 2. 检查文件权限与所有权 - **设置正确权限**: ```bash chown -R mysql:mysql /var/lib/mysql chmod -R 750 /var/lib/mysql ``` 错误的权限会导致MySQL无法读取数据库文件[^2] #### 3. 分析错误日志 - **定位日志文件**: ```bash tail -n 100 /var/log/mysqld.log ``` 重点查找以下错误类型: - `[ERROR] Can't open file` - `[Warning] InnoDB: Tablespace not found` - `[ERROR] Found corrupted table` #### 4. 数据库恢复操作 - **强制恢复模式**(慎用): 在`/etc/my.cnf`添加: ```ini [mysqld] innodb_force_recovery=6 ``` 重启服务后立即导出数据: ```bash mysqldump -u root -p --all-databases > backup.sql ``` [^1] #### 5. 验证存储挂载类型 - **检查文件系统挂载**: ```bash df -Th /var/lib/mysql grep "/var/lib/mysql" /etc/fstab ``` 确认未使用tmpfs等易失性存储 #### 6. SELinux策略调整 - **临时禁用SELinux**: ```bash setenforce 0 systemctl restart mysqld ``` 若问题解决,需永久配置策略: ```bash semanage fcontext -a -t mysqld_db_t "/var/lib/mysql(/.*)?" restorecon -Rv /var/lib/mysql ``` #### 7. 数据库文件完整性检测 - **执行表检查**: ```sql mysqlcheck -u root -p --all-databases --check ``` 发现损坏表后使用: ```sql REPAIR TABLE damaged_table; ``` ### 典型问题场景验证表 | 现象 | 可能原因 | 验证命令 | 解决方案 | |------|----------|----------|----------| | 数据库"消失"但文件存在 | 权限问题 | `ls -l /var/lib/mysql` | 修正所有权 | | 服务启动失败 | 表空间损坏 | 查看错误日志 | 启用innodb_force_recovery | | 仅部分数据库可见 | 配置指向错误目录 | `mysqladmin variables | grep datadir` | 修改my.cnf配置 | ### 预防措施 1. 定期执行数据库备份: ```bash mysqldump -u root -p --all-databases | gzip > /backup/mysql_$(date +%F).sql.gz ``` 2. 配置监控告警: ```bash yum install nagios-plugins-mysql ``` 3. 使用事务性存储引擎: ```sql ALTER TABLE important_table ENGINE=InnoDB; ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值